智能合约语言 Solidity 教程 – 地址类型介绍

智能合约语言 Solidity 教程 – 地址类型介绍

电报联系方式

智能合约语言 Solidity 教程 - 地址类型介绍

地址类型(Address)

地址类型address是一个值类型

地址: 20字节(一个以太坊地址的长度),地址类型也有成员,地址是所有合约的基础
支持的运算符:

  • <=, <, ==, !=, >= 和 >

地址类型的成员

balance 属性及transfer() 函数,这里是地址类型相关成员的快速索引。”balance”属性用于检查账户中的余额,而”transfer()”函数用于以wei为单位发送以太币

address x = 0x123;
address myAddress = this;
if (x.balance < 10 && myAddress.balance >= 10) x.transfer(10);

如果x是合约地址,合约的回退函数(fallback 函数)会随transfer调用一起执行(这个是EVM特性),如果因gas耗光或其他原因失败,转移交易会还原并且合约会抛异常停止。

回退函数简单来说是合约中无函数名函数。

send()”函数与”transfer()”函数类似,但它更底层。不同之处在于,如果”send()”函数执行失败,它会返回false,而”transfer()”函数则不会因为异常而停止执行。

“send()”函数存在一些风险:如果调用栈深度超过1024或者gas用尽,交易将会失败。因此,为了确保安全性,必须检查”send()”的返回值。如果交易失败,必须执行回退操作以恢复以太币。使用”transfer()”函数可能更为安全。

要与非ABI协议的合约进行交互,您可以使用”call()”函数。这函数允许您向另一个合约发送原始数据,并支持任何类型和数量的参数。每个参数都会按照ABI协议的规则打包成32字节,并按顺序拼接在一起。需要注意的一点是,如果第一个参数恰好是4个字节,系统会将其解释为函数签名,而不是消息体。如果您只想发送消息体而不带函数签名,请确保第一个参数不是4个字节。以下是一个示例:

address nameReg = 0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2;
nameReg.call(“register”, “MyName”);
nameReg.call(bytes4(keccak256(“fun(uint256)”)), a);

call函数返回一个bool值,以表明执行成功与否。正常结束返回true,异常终止返回false。但无法获取到结果数据,因为需要提前知道返回的数据的编码和数据大小(因不知道对方使用的协议格式,所以也不会知道返回的结果如何解析)。

还可以提供**.gas()**修饰器进行调用:

namReg.call.gas(1000000)(“register”, “MyName”);

类似还可以提供附带以太币:

nameReg.call.value(1 ether)(“register”, “MyName”);

可以在智能合约中混合使用多个修饰器,并且它们的调用顺序可以是任意的,不会影响其效果。

delegatecall()”方法与”call()”方法不同之处在于,它执行的是另一个合约的代码,但在执行过程中使用的是当前合约的数据,包括存储、余额等。”delegatecall()”通常用于执行另一个合约中的库代码。开发者需要确保两个合约中的存储变量兼容,以确保”delegatecall()”能够顺利执行。在Homestead升级之前,只有一个受限的”callcode()”方法可用,但该方法不提供对”msg.sender”和”msg.value”的访问权限。

这三个方法,即”call()”, “delegatecall()”, 和 “callcode()”,都属于底层的消息传递调用方法,最好只在绝对必要的情况下使用,因为它们可能破坏Solidity的类型安全。

在这些函数中,您可以使用”.gas()”来指定要分配给调用的gas数量。然而,需要注意的是,”delegatecall()”函数不支持”.value()”,因为它主要用于执行代码而不是向其他合约发送以太币。

地址常量(Address Literals)

只有当一个十六进制常量具备地址格式的校验和(checksum),比如”0xdCad3a6d3569DF655070DEd06cb7A1b2Ccd1D3AF”,它才会被识别为一个合法的以太坊地址。然而,如果一个十六进制常量长约39到41位,并且没有通过地址格式的校验,系统会发出警告,并将其视为普通的有理数常量。

开发联系:DEXDAO

 

 

© 版权声明

相关文章

暂无评论

暂无评论...