Solidity
已部署合約的字節碼不可見
以下是用於僅使用字節碼部署其他合約的合約。
我嘗試使用 deployBytecode 函式部署合約,合約被部署但只有 0x 顯示為字節碼。請任何人幫助解決這個問題。
pragma solidity ^0.5.5; contract DeployBytecode { // Create contract from bytecode function deployBytecode(bytes memory bytecode) public returns (address) { address retval; assembly{ mstore(0x0, bytecode) retval := create(0,0xa0, calldatasize) } return retval; } }
首先:對您的問題更具體可能會有所幫助。這個問題是關於
DeployBytecode
契約還是關於應該部署的契約以及bytecode
你在使用什麼?查看您的
deployBytecode
功能(尤其是assembly
塊),有些事情看起來不正確:
mstore
用於將 32 字節放入記憶體。第一個參數是記憶體中的目標位置,第二個參數是值。在您的情況下,您將指針儲存到bytecode
記憶體位置的開頭0
。create
接受 3 個參數value
:location of deployment code
和length of deployment code
. 在您的情況下,您將部署程式碼的位置固定為0xa0
,這並不總是正確的。您還使用calldatasize
作為部署程式碼的長度,但您實際上並沒有使用 calldata,所以這也是不正確的。我將提出以下更改:
- 去除那個
mstore
- 將 更改
create
為具有以下參數:(0
對於值),add(bytecode, 32)
(對於數據位置),mload(bytecode)
(對於數據長度)。讓我們詳細看一下數據位置和數據長度參數:
要了解這些值,了解 a
bytes
在 Solidity 中的儲存方式很重要。的變數值bytes
是數據在記憶體中的位置。在記憶體中,字節的儲存首先是字節的長度,然後是數據,這導致以下模式:在指向<32-bytes length><data>
的位置。bytecode
現在,如果我們想使用數據,
create
我們首先指向原始數據的開頭,即長度之後。因此,我們將 32(長度所需的空間)添加到儲存在bytecode
變數中的位置。這是第一個參數。對於第二個參數,我們使用從記憶體中讀取長度mload
。由於長度是位置的前 32 個字節,bytecode
我們可以通過呼叫來讀取長度mload(bytecode)
。可以在此處找到用於生產的完整範例:https ://github.com/gnosis/safe-contracts/blob/1.3.0-libs.0/contracts/libraries/CreateCall.sol#L22-L29
更多關於組裝/yul 的資訊可以在Solidity 文件中找到