全部产品

合约间调用

更新时间:2019-08-27 02:02

蚂蚁区块链合约平台主要支持两种合约调用方式,分别为 calldelegatecall

call

call 类型的合约调用主要是通过调用其他合约代码获取某个方法的调用结果。同时,在执行该合约时,被调用合约的变量会被修改(即修改的是被调用合约的内存),调用执行成功时返回 true,失败则返回 false。如果被调用合约不存在,则返回执行调用合约的 fallback 函数。

函数原型

  1. id.call(bytes4(keccak256(data), args)) returns (bool result)

请求参数

参数 必选 类型 说明
id identity 被调用合约 ID
data string 被调用合约方法签名
args var 被调用合约方法传入参数

返回值

参数 必选 类型 说明
result bool 方法返回值,成功为 true,否则为 false。

delegatecall

delegatecall 类型的合约调用也是调用其他合约的方法,与 call 不同的是,delegatecall 修改的是合约调用方的内存。此方法的主要目的在于让合约能够在不传输自身状态(如 balancestorage)的情况下使用其他合约的代码。delegatecall 不支持传输 value。

函数原型

  1. id.delegatecall(bytes4(keccak256(data), args)) returns (bool result)

请求参数

参数 必选 类型 说明
id identity 被调用合约 ID
data string 被调用合约方法签名
args var 被调用合约方法传入参数

返回值

参数 必选 类型 说明
result bool 方法返回值,成功为 true,否则为 false。

call 与 delegatecall 对比分析

相同点

  • 调用时,calldelegatecall 均会将本合约所有可用的 gas 传输过去。
  • 执行失败时均返回 false。

不同点

  • call 可以使用 .value 传 gas 给被调用合约。
  • 假设在 contract_test 合约中分别有 nameReg.call("somefunction") 以及 nameReg.delegatecall("somefunction")
    • nameReg.call 以 nameReg 合约的身份在 nameReg 中执行 somefunction
    • nameReg.delegatecall 以 contract_test 合约的身份在 nameReg 中执行 somefunction
  • delegatecall 的目的就是让合约在不用传输自身状态(如 balancestorage)的情况下可以使用其他合约的代码。