Solidity

已部署合約的字節碼不可見

  • December 26, 2021

以下是用於僅使用字節碼部署其他合約的合約。

我嘗試使用 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塊),有些事情看起來不正確:

  1. mstore用於將 32 字節放入記憶體。第一個參數是記憶體中的目標位置,第二個參數是值。在您的情況下,您將指針儲存到bytecode記憶體位置的開頭0
  2. create接受 3 個參數valuelocation of deployment codelength of deployment code. 在您的情況下,您將部署程式碼的位置固定為0xa0,這並不總是正確的。您還使用calldatasize作為部署程式碼的長度,但您實際上並沒有使用 calldata,所以這也是不正確的。

我將提出以下更改:

  1. 去除那個mstore
  2. 將 更改create為具有以下參數:(0對於值),add(bytecode, 32)(對於數據位置),mload(bytecode)(對於數據長度)。

讓我們詳細看一下數據位置和數據長度參數:

要了解這些值,了解 abytes在 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 文件中找到

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