Bytecode

字節碼、初始化碼、部署字節碼、創建字節碼和執行時字節碼有什麼區別?

  • June 6, 2021

我經常看到不同類型的字節碼,但不知道它們分別是什麼。字節碼、初始化碼、部署字節碼、創建字節碼和執行時字節碼有什麼區別?

我寫了一篇文章,深入探討了這些資訊。我會在這裡總結一下。


tl;dr - 乙太坊上只有兩種類型的字節碼,但有五個不同的名稱來描述它們。

創建字節碼

這是大多數人在說字節碼時所指的程式碼。這是生成執行時字節碼的程式碼——它包括智能合約的建構子邏輯和建構子參數。創建字節碼相當於創建合約的交易的輸入數據,前提是交易的唯一目的是創建合約。

當您編譯合約時,會為您生成創建字節碼。松露生成的 ABI 將創建字節碼稱為字節碼 (*)。這也是在 Remix 上點擊合約的“編譯詳細資訊”時顯示的字節碼。

可以使用鏈上檢索此程式碼type(ContractName).creationCode

可以通過getTransactionByHashJSON RPC 呼叫離線檢索創建字節碼。

(*) Truffle 生成的字節碼對應於創建字節碼減去建構子參數(因為 Truffle 在編譯時不知道它們)。因此,創建字節碼等於與包含建構子參數資訊的一些字節連接的 Truffle 字節碼。例如,如果建構子將UINT256“123”和BOOL“TRUE”作為參數,則將生成的創建程式碼傳遞為部署交易的數據參數,將:塊塊MATECODE BYTECODE +“000000000000000000000000/000000000000/48000000/00000000000000/00000000000000000000/0000000000000000/> . 對於字元串、字節、數組等動態類型,編碼比較複雜

執行時字節碼

這是儲存在鏈上的描述智能合約的程式碼。此程式碼包括合約的建構子邏輯或建構子參數,因為它們與用於實際創建合約的程式碼無關。

合約的執行時字節碼可以通過使用組裝塊和呼叫在鏈上檢索extcodecopy(a)。執行時字節碼的雜湊從extcodehash(a). 此操作碼是隨EIP 1052引入的,並包含在君士坦丁堡硬分叉中。

執行時字節碼也可以通過使用Solidity 的類型資訊在鏈上檢索。檢索字節碼的 Solidity 程式碼是type(ContractName).runtimeCode.

最後,此程式碼由 JSON RPC 呼叫返回,getCode.

字節碼

這應該用作包含執行時字節碼和創建字節碼的總稱,但它更常用於描述執行時字節碼。

部署的字節碼

該術語僅由 truffle 生成的 ABI 使用,指的是合約的執行時字節碼。我沒有看到它在這些文件之外使用。

初始化程式碼

此程式碼與創建字節碼相同。它是創建儲存在鏈上的字節碼的程式碼。該術語常用於文章中,指的是使用操作碼時所需的字節create2碼。 

結論

我認為唯一應該使用的術語是執行時字節碼和創建字節碼,因為它們明確地描述了程式碼是什麼。我認為字節碼應該是一個涵蓋上述兩個術語的總稱。

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