Contract-Design
為什麼不是所有的合約都被編譯?
出於不同的原因,有許多添加預編譯合約的提議。不過,我不明白為什麼預編譯的合約會比實際的合約更有效。如果是這樣,那是否意味著 EVM 沒有得到充分優化?是什麼阻止了乙太坊編譯每一份合約;也許使用 LLVM?
據我了解,預編譯的合約實際上是協議補貼的。也就是說,雖然給定地址有技術程式碼,但汽油價格遠低於手動執行的價格。如果我正確理解黃皮書,ECDSARECOVER 只需 3000 gas。
這是可行的,因為可以為各種實現編寫更有效的外部程式碼(如果它不存在的話),然後在合約執行時插入。但對於區塊鏈之外的一些隨機合約,情況不一定如此。
我相信 geth 有一個有限的智能合約 JIT 編譯器,這導致編譯每個合約的另一個問題:空間。只有這麼多空間可以合理地留出記憶體已編譯的合約,尤其是考慮到潛在的攻擊者。geth 目前似乎預設將其限制為 64 個合約,而且我聽說過有關 gitter 算法(不一定與 geth 相關)的重要討論,以選擇哪些合約。
馬修的回答是正確的。但是,我要補充一點,乙太坊 2.0 的目標之一是擺脫那些預編譯的合約。由於它們必須由所有客戶端實施,因此遇到分段問題的風險很高。通過將預編譯合約的數量保持在極小範圍內(目前為 4 個;在即將到來的 1 月更新 IIRC 中還有 4 個),可以減輕這種風險。
如果鏈上合約實現預編譯合約或呼叫實現它們的鏈上庫合約,則可以避免預編譯合約。我相信這是從遺留 EVM 程式碼遷移到 eWASM 的眾多設計目標之一,eWASM 將擁有足夠快的 VM 來支持此功能。