Evm
最大程式碼大小限制是否也適用於初始化程式碼?
已部署的字節碼(即合約創建返回的字節碼)應該最多
0x6000
= 24576 字節長。此限制是否適用於
- 初始化程式碼作為使用者觸發的合約創建的輸入數據傳遞
- 創建和創建2,
從某種意義上說,他們的第三個堆棧參數,
size
即從記憶體中讀取並作為初始化程式碼傳遞的字節數,最多也應該是0x6000
?
是的。
通常,工廠合約包含要部署的程式碼。工廠的規模包括這一點。
希望能幫助到你。
似乎答案是否定的。這是有道理的,因為這個程式碼大小限制旨在阻止的 DOS 攻擊是以非常低的成本從數據庫中載入大量字節碼給攻擊者。但是初始化程式碼不會出現這個問題(在交易的輸入數據中提供或從正在執行的智能合約的 RAM 中收集,在任何一種情況下都不會呼叫數據庫。)
我依靠 Geth 來證實這一點。Geth 定義
MaxCodeSize = 24576
並且這個數字在程式碼中被引用三次。對這個問題重要的唯一參考是core/vm/evm.go
. 相關程式碼片段在第create
455 行的方法中:// Check whether the max code size has been exceeded, assign err if the case. if err == nil && evm.chainRules.IsEIP158 && len(ret) > params.MaxCodeSize { err = ErrMaxCodeSizeExceeded }
它比較返回到
MaxCodeSize
. 即它確保將部署在鏈上的字節碼最多包含 24576 個字節。