Constructor

如何在不部署的情況下從創建字節碼和建構子參數中獲取實際的執行時字節碼

  • March 11, 2021

Solidity 編譯器的可能輸出包括創建字節碼和部署(執行時)字節碼。然而,這個編譯後的部署字節碼可能與實際部署在區塊鏈上的字節碼不同。如果合約需要建構子參數來初始化不可變變數,則可能會出現這種情況。那麼,我如何使用上述工件(創建字節碼、部署字節碼、建構子參數)並生成實際部署的字節碼,而不實際部署它。一種可能的選擇是部署到(本地)測試網,然後查看已部署的字節碼,但這似乎有點矯枉過正。

好的,為了讓事情更清楚,這是命名法(我沒有編造:字節碼、初始化碼、部署字節碼、創建字節碼和執行時字節碼有什麼區別?):

deployed bytecode = runtime bytecode

actual deployed bytecode = actual runtime bytecode

這個問題涉及這樣一個事實,即有時會出現以下情況:

deployed bytecode (as predicted by compilation) =/= actual deployed bytecode (after deployment)

事實上,當合約使用不可變變數時,最後一個公式通常成立。

這個 GitHub 問題幫助我找到了答案。基本上我需要的模組可以實現ethereumjs-vm

const VM = require("ethereumjs-vm").default;
const BN = require("bn.js");
const vm = new VM();

vm.runCode({
   code: Buffer.from(creationBytecode + abiEncodedConstructorArguments, "hex"),
   gasLimit: new BN(...),
}).then(results => {
   const actualDeployedBytecode = results.returnValue.toString("hex");
   console.log(actualDeployedBytecode);
});

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