solc 的 bin 字節碼與 bin 執行時有什麼區別?
Solc 說這
bin-runtime
是合約的執行時部分。字節碼部分到底是什麼runtime
,它與bin
字節碼輸出有何不同?
TL; 博士
bin-runtime
是實際放置在區塊鏈上的程式碼。正常bin
輸出是放置在區塊鏈上的程式碼加上將此程式碼放置在區塊鏈上所需的程式碼,即建構子的程式碼。更長的答案
乙太坊虛擬機的基礎知識在乙太坊黃皮書的第 9.1 節中定義。
要完整回答這個問題,您必須首先了解智能合約是如何創建的。通過發送帶有空“to”欄位的交易來創建智能合約。完成後,乙太坊虛擬機 (EVM) 執行在init字節數組中設置的字節碼
$$ 1 $$這是一個可以包含 EVM 字節碼的欄位——用於在乙太坊上執行邏輯的二進制程式碼。然後儲存在區塊鏈上的 EVM 字節碼是通過在 EVM 上執行init的內容返回的值。字節碼可以通過操作碼引用自己
CODECOPY
。這會將目前執行的字節碼傳輸到 EVM 記憶體。操作碼讀取堆棧上的CODECOPY
三個值,其中兩個值是指向字節碼的指針,一個標記開始,一個標記應該複製到記憶體的內容的結束。然後RETURN
使用操作碼以及放置在堆棧上的正確值,從 EVM 程式碼的初始執行返回字節碼。RETURN
讀取並刪除兩個來自堆棧的指針。這些指針定義了作為返回值的記憶體部分。初始合約創建執行字節碼的返回值定義了儲存在區塊鏈上並與您創建智能合約的地址相關聯的字節碼。 因此,已編譯但未儲存在區塊鏈上的程式碼是在區塊鏈上儲存正確程式碼所需的程式碼,也是合約(潛在)建構子中包含的任何邏輯。bin-runtime 參數可用於驗證某些特定的 Solidity 原始碼是否放置在特定地址上。編譯一個人聲稱代表區塊鏈地址上的智能合約的原始碼,並將其與實際儲存在地址上的二進制程式碼進行比較
eth.getCode(contractaddress)
意味著您可以確定合約的原始碼是什麼。有關如何創建智能合約,請參閱乙太坊黃皮書第 4.3 節。