solidity学习之地址(Address)类型

网友投稿 322 2022-09-21

solidity学习之地址(Address)类型

【概述】

以太坊地址的长度,大小​​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); } }

此时我们运行合约

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

成功向账户addr1转账了10 ether

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringBoot + Thymeleaf 实现发送验证码计时器功能
下一篇:PR人:微信直播,直奔带货?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~