Solidity

在 Solidity 中將函式作為參數傳遞

  • May 9, 2017

你可以在 Solidity 中將函式作為參數傳遞嗎?

*我的猜測:*在 Solidity中有一個概念address,但它們代表contracts。合約可以有備份功能,但我認為你不能給它們參數。考慮像在 C 中那樣通過地址將函式作為參數傳遞。

是否有一種將函式作為參數傳遞的合法方法,或者如果沒有,是否有一種 hacky 方法?

如果有,怎麼做?如果沒有,為什麼不呢?

函式(又名方法)由 ABI 指定,並具有方法 ID,即方法簽名的 sha3 (Keccak-256) 的前 4 個字節。

someFunction這是呼叫on的範例contractcontract.call(bytes4(sha3("someFunction()")))

這是一個經過測試的函式,將 amethodId作為參數傳遞:

contract C1 {
   uint public _n;  // public just for easy inspection in Solidity Browser

   function foo(uint n) returns(uint) {
       _n = n;
       return _n;
   }

   function invoke(bytes4 methodId, uint n) returns(bool) {
       return this.call(methodId, n);
   }
}

在 Solidity 瀏覽器中使用"0x2fbebd38", 9as 的參數對其進行測試invoke,然後查看_n等於9

筆記:

  • 0x2fbebd38bytes4(sha3("foo(uint256)"))(不要忘記使用規範類型的需要,在這種情況下uint256,根據ABI。
  • >

call 和 callcode 的返回值是布爾值,呼叫成功或呼叫失敗。不可能從呼叫中返回值,因為這需要合約事先知道返回類型。

引用自:https://ethereum.stackexchange.com/questions/3342