罗韭菜的solidity学习(五)地址Address

基本常识

  • 钱包地址就是个160位的整数,恰好能能通过uint160存储。
  • 以太坊地址长度为20字节,1byte=8bit, 因此共160bit。
    //0x(十六进制)+ 40个数字, 由于十六位,一个数字=二进制4个数字 所以正好是160位。
  • 用uint160(address)可以转换成十进制整数。

合约相关

  • 合约拥有者
    msg.sender就是当前调用方法时的发起人
    而第一次部署合约时,花费gas的人即合约拥有者
    默认属性里的_owner就是合约拥有者,可以用以下代码保存合约拥有者,并且在if _owner==msg.sender里写一些只属于合约拥有者的骚操作。
    会根据字节码(input)判断大概需要花费多少gas
    from 地址 即 msg.sender


    image.png
pragma solidity ^0.4.4;


contract Test {
   
   address public _owner;
   
   uint public _number;

   function Test() {
       _owner = msg.sender;
       _number = 100;
   }
   
   function msgSenderAddress() constant returns (address) {
       return msg.sender;
   }
   
   function setNumberAdd1() {
       _number = _number + 5;
   }
   
   function setNumberAdd2() {
       if (_owner == msg.sender) {
           _number = _number + 10;
       }
   }
   
}

// 0xca35b7d915458ef540ade6068dfe2f44e8fa733c
  • 合约地址
    部署合约后产生了合约地址,用于之后利用这个地址来调用合约的api
    重新部署一次(create一次)就会重新产生一个合约对象,重新产生一个新的合约地址
    this 指的是当前合约对象的地址

合约地址支持的运算符

<= < == != >= >

成员变量和函数

1. balance

pragma solidity ^0.4.4;

contract addressBalance{
    
    function getBalance(address addr) constant returns (uint){
        return addr.balance;
    }
    // this is current contract address
    function getCurrentAddressBalance()constant returns(uint){
        return this.balance;
    }

}

合约地址也是合法的钱包地址,所以用.balance也可以查看该合约的余额
2. transfer

  • msg.value指的是当前部署合约的钱包的要填入的value
  • 凡是关于转账相关的需要在函数名后面加payble
pragma solidity ^0.4.4;

contract PayableKeyword{ 
    
    
    // 从合约发起方向 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c 地址转入 msg.value 个以太币,单位是 wei
    function deposit() payable{
        
        address Account2 = 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c;
        Account2.transfer(msg.value);
    }
  
  
    // 读取 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c 地址的余额
    function getAccount2Balance() constant returns (uint) {
        
        address Account2 = 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c;

        return Account2.balance;
    }  
    
    // 读取合约发起方的余额
    function getOwnerBalance() constant returns (uint) {
        
        address Owner = msg.sender;
        return Owner.balance;
    } 
    
}

3.send方法转账

  • transfer 当发起方余额不足时会抛出异常,但是send只返回false
  • 代码类似,需要return
pragma solidity ^0.4.4;

contract PayableKeyword{ 
    
    
    function deposit() payable returns (bool){
        
        address Account2 = 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c;
        return Account2.send(msg.value);
    }
  
  
    function getAccount2Balance() constant returns (uint) {
        
        address Account2 = 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c;

        return Account2.balance;
    }  
    
    
    function getOwnerBalance() constant returns (uint) {
        
        address Owner = msg.sender;
        return Owner.balance;
    } 
    
}

注意:

  • send调用递归深度不能超过1024
  • 如果gas不够,执行会失败
  • 所以使用这个方法要检查成功与否
  • transfer相对send 较安全
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容