Etherscan

使用 solcjs 和 remix 的不同字節碼

  • July 13, 2021

在任何合約中使用 solcjs 最終會產生比使用 ​​remix 更長的字節碼

例如這個簡單的智能合約

pragma solidity >=0.8.0;

contract test {
   uint256 public c;
   function add(uint256 a, uint256 b) public {
       c = a + b;        
   }
}

使用 solcj 0.8.4 生成此字節碼:

solcjs –bin ./filename.sol

60806040523480156100115760006000fd5b50610017565b61020a806100266000396000f3fe60806040523480156100115760006000fd5b506004361061003b5760003560e01c8063771602f714610041578063c3da42b81461005d5761003b565b60006000fd5b61005b600480360381019061005691906100ba565b61007b565b005b610065610097565b6040516100729190610109565b60405180910390f35b80826100879190610125565b60006000508190909055505b5050565b60006000505481566101d3565b6000813590506100b3816101b8565b5b92915050565b60006000604083850312156100cf5760006000fd5b60006100dd858286016100a4565b92505060206100ee858286016100a4565b9150505b9250929050565b6101028161017c565b825250505b565b600060208201905061011e60008301846100f9565b5b92915050565b60006101308261017c565b915061013b8361017c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156101705761016f610187565b5b82820190505b92915050565b60008190505b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b565b6101c18161017c565b811415156101cf5760006000fd5b505b565bfea264697066735822122023e6550dca95b7639bddac283c9a25eeffea2cec5b91baf6becf24c3c9034fd064736f6c63430008040033

在混音中使用 0.8。4(無優化)00000000000000600052601160045260246000fd5b6101a481610162565b81146101af57600080fd5b5056fea26469706673582212205733a2d0235d969fa16994d7de6e82cf2340b83c0e583155bdc54777eed9ce6564736f6c63430008040033

兩個程式碼都按預期執行(即使是更詳細的合約)

因此,使用 solcjs 生成的程式碼無法在 etherscan 中進行驗證,在驗證期間生成的字節碼與使用 remix 獲得的字節碼相同。

對這種差異有什麼解釋嗎?solcjs 是否預設使用了一些解決這些差異的選項?

該問題似乎是 solcj 中的錯誤,請參見此處

Usingsolcjs --bin ./filename.sol不表示優化標誌,那麼它應該是假的,但事實並非如此。正如@Kamil 在上面的連結中所描述的,這產生的程式碼不等同於將優化設置為 false,也不等於 true。

因此,生成的程式碼根本沒有優化(使用 optimize false 仍將執行 peephole 優化器和 jumpdest 移除器)。

然後程式碼更長,因為根本沒有優化,但它是正確的程式碼。有關該錯誤的更多資訊,請參見此處

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