美文网首页罗韭菜的solidity学习笔记与踩过的坑
罗韭菜的solidity学习(五)地址Address

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

作者: 罗雪Melody | 来源:发表于2018-04-09 21:49 被阅读0次

    基本常识

    • 钱包地址就是个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 较安全

    相关文章

      网友评论

        本文标题:罗韭菜的solidity学习(五)地址Address

        本文链接:https://www.haomeiwen.com/subject/zwyihftx.html