Solidity
一個合約可以訪問另一個合約的程式碼嗎?
使用 web3.js,合約的 EVM(字節碼)可以通過
web3.eth.getCode(addressOfContract)
. 這可以通過使用另一個合約地址的合約來執行嗎?如果是這樣,怎麼做?address.code
不在 Solidity 中。
黃皮書提到了一個
EXTCODECOPY
將賬戶程式碼複製到記憶體的 EVM 操作碼。答案似乎是肯定的:一個合約可以訪問另一個合約的程式碼。Solidity
0.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) } } }