更新时间:2019-08-27 02:02
蚂蚁区块链合约平台主要支持两种合约调用方式,分别为 call
和 delegatecall
。
call
类型的合约调用主要是通过调用其他合约代码获取某个方法的调用结果。同时,在执行该合约时,被调用合约的变量会被修改(即修改的是被调用合约的内存),调用执行成功时返回 true,失败则返回 false。如果被调用合约不存在,则返回执行调用合约的 fallback
函数。
id.call(bytes4(keccak256(data), args)) returns (bool result)
参数 | 必选 | 类型 | 说明 |
---|---|---|---|
id | 是 | identity | 被调用合约 ID |
data | 是 | string | 被调用合约方法签名 |
args | 是 | var | 被调用合约方法传入参数 |
参数 | 必选 | 类型 | 说明 |
---|---|---|---|
result | 是 | bool | 方法返回值,成功为 true,否则为 false。 |
delegatecall
类型的合约调用也是调用其他合约的方法,与 call
不同的是,delegatecall
修改的是合约调用方的内存。此方法的主要目的在于让合约能够在不传输自身状态(如 balance
、storage
)的情况下使用其他合约的代码。delegatecall
不支持传输 value。
id.delegatecall(bytes4(keccak256(data), args)) returns (bool result)
参数 | 必选 | 类型 | 说明 |
---|---|---|---|
id | 是 | identity | 被调用合约 ID |
data | 是 | string | 被调用合约方法签名 |
args | 是 | var | 被调用合约方法传入参数 |
参数 | 必选 | 类型 | 说明 |
---|---|---|---|
result | 是 | bool | 方法返回值,成功为 true,否则为 false。 |
call
与 delegatecall
均会将本合约所有可用的 gas 传输过去。call
可以使用 .value
传 gas 给被调用合约。nameReg.call("somefunction")
以及 nameReg.delegatecall("somefunction")
:nameReg.call
以 nameReg 合约的身份在 nameReg 中执行 somefunction
。nameReg.delegatecall
以 contract_test 合约的身份在 nameReg 中执行 somefunction
。delegatecall
的目的就是让合约在不用传输自身状态(如 balance
、storage
)的情况下可以使用其他合约的代码。
在文档使用中是否遇到以下问题
更多建议
匿名提交