solidity学习之地址(Address)类型

   日期:2020-09-06     浏览:245    评论:0    
核心提示:【概述】以太坊地址的长度,大小20个字节,20 * 8 =160位,所以可以用一个uint160编码。地址是所有合约的基础,所有的合约都会继承 地址对象,通过合约的地址串,调用合约内的函数。【基本操作】属性/方法 含义 备注 balance 获取余额 属性,其余的都是方法 send 转账 不建议使用 transfer 转账 建议使用 call 合约内部调用合约 delegatecall 调...

【概述】

 以太坊地址的长度,大小20个字节20 * 8 = 160位,所以可以用一个uint160编码。地址是所有合约的基础,所有的合约都会继承   地址对象,通过合约的地址串,调用合约内的函数。

【基本操作】

属性/方法 含义 备注
balance 获取余额 属性,其余的都是方法
send 转账 不建议使用
transfer 转账 建议使用
call 合约内部调用合约  
delegatecall   调底层代码,别用
callcode   调底层代码,别用

注意:上面的这三个方法call(),delegatecall() ,callcode() 都是底层的消息传递调用,最好仅在万不得已才进行使用,因为他们破坏了Solidity的类型安全。

1.获取地址

//指定编译器版本,版本标识符
pragma solidity ^0.4.16;


//关键字 contract 跟java的class一样  智能合约是Inbox      
contract Inbox{


    //账户地址
    address public addr = 0xca35b7d915458ef540ade6068dfe2f44e8fa733c;
    
    //获取地址
    function getAddr() view returns(uint160){
        return uint160(addr);
    }

    //地址address类型本质上是一个160位的数字,可以进行加减,需要强制转换
    function add() public view returns(uint160) {
        return uint160(addr) + 10;
    }
   
}

运行结果:

2.获取余额

//指定编译器版本,版本标识符
pragma solidity ^0.4.16;


//关键字 contract 跟java的class一样  智能合约是Inbox      
contract Inbox{


    //账户地址
    address public addr = 0xca35b7d915458ef540ade6068dfe2f44e8fa733c;
    

    //1. 匿名函数:没有函数名,没有参数,没有返回值的函数,就是匿名函数
    //2. 当调用一个不存在的方法时,合约会默认的去调用匿名函数
    //3. 匿名函数一般用来给合约转账,因为费用低
    function () public  payable {

    }


    //获取当前账户余额
    function getBalance() public view returns(uint256) {
        return addr.balance;
    }

    //获取合约余额
    function getContractBalance() public view returns(uint256) {
        //this代表当前合约本身
        //balance方法,获取当前合约的余额
        return address(this).balance;
    }

   
}

对于上面获取合约余额的代码我们还可以这样写:

function getContractBalance() public returns  (uint){

        return this.balance; // <<----此处使用this代替
    }

3.转账(send,transfer)

send和transfer函数提供了由合约向其他地址转账的功能。

对比项 send transfer 备注
参数 转账金额 转账金额 wei单位
返回值 true/false 无(出错抛异常) transfer更安全
//指定编译器版本,版本标识符
pragma solidity ^0.4.16;


//关键字 contract 跟java的class一样  智能合约是Inbox      
contract Inbox{

    // 
    address public addr0 = 0xca35b7d915458ef540ade6068dfe2f44e8fa733c;
    address public addr1 = 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c;


    //1. 匿名函数:没有函数名,没有参数,没有返回值的函数,就是匿名函数
    //2. 当调用一个不存在的方法时,合约会默认的去调用匿名函数
    //3. 匿名函数一般用来给合约转账,因为费用低
    function () public  payable {

    }

    function getBalance() public view returns(uint256) {
        return addr1.balance;
    }

    function getContractBalance() public view returns(uint256) {
        return address(this).balance;
    }

    //由合约向addr1 转账10以太币
    function transfer() payable {
        //1. 转账的时候单位是wei
        //2. 1 ether = 10 ^18 wei (10的18次方)
        //3. 向谁转钱,就用谁调用tranfer函数
        //4. 花费的是合约的钱
        //5. 如果金额不足,transfer函数会抛出异常
        addr1.transfer(msg.value);
    }

    //send转账与tranfer使用方式一致,但是如果转账金额不足,不会抛出异常,而是会返回false
    function sendTest() payable {
        addr1.send(msg.value);
    }

   
}

此时我们运行合约

然后我们可以看到没转账之前这两个账户的余额如下所示

点击transfer这个函数运行结果如下:

成功向账户addr1转账了10 ether

 

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服