Solidity

一個合約可以訪問另一個合約的程式碼嗎?

  • September 26, 2017

使用 web3.js,合約的 EVM(字節碼)可以通過web3.eth.getCode(addressOfContract). 這可以通過使用另一個合約地址的合約來執行嗎?如果是這樣,怎麼做? address.code不在 Solidity 中。

黃皮書提到了一個EXTCODECOPY將賬戶程式碼複製到記憶體的 EVM 操作碼。答案似乎是肯定的:一個合約可以訪問另一個合約的程式碼。

Solidity0.3.1現在提供extcodecopy和其他操作碼作為其內聯彙編功能的一部分:

以下範例提供庫程式碼來訪問另一個合約的程式碼並將其載入到字節變數中。使用“plain Solidity”根本不可能做到這一點,其想法是彙編庫將用於以這種方式增強語言。

library GetCode {
 function at(address _addr) returns (bytes o_code) {
   assembly {
     // retrieve the size of the code, this needs assembly
     let size := extcodesize(_addr)
     // allocate output byte array - this could also be done without assembly
     // by using o_code = new bytes(size)
     o_code := mload(0x40)
     // new "memory end" including padding
     mstore(0x40, add(o_code, and(add(add(size, 0x20), 0x1f), bnot(0x1f))))
     // store length in memory
     mstore(o_code, size)
     // actually retrieve the code, this needs assembly
     extcodecopy(_addr, add(o_code, 0x20), 0, size)
   }
 }
}

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