Contract-Development

如果兩個人創建相同的智能合約,它會被儲存兩次嗎?

  • February 9, 2018

在很多情況下,同一個合約會被多次部署。現在顯然每個合約都有自己的持久數據儲存和一切,但每個合約的字節碼是否也在乙太坊節點的電腦上多次佔用空間?或者是否有某種機制可以對合約程式碼進行重複數據刪除,而不是一次又一次地保存所有程式碼,可以只儲存一次,然後在隨後創建相同的合約時可以保存類似的東西<same as contract 0xABC...>

據我所知,字節碼只會儲存一次。我從黃皮書的第 4.1 節得出這個結論

賬戶狀態包括以下四個欄位:

隨機…

平衡…

儲存根…

codeHash:此帳戶的 EVM 程式碼的雜湊值 - 這是該地址收到消息呼叫時執行的程式碼;它是不可變的,因此與所有其他欄位不同,它在建構後無法更改。所有這些程式碼片段都包含在狀態數據庫中相應的雜湊下,以供以後檢索。

如果 2 個不同合約的字節碼的雜湊值相同,那麼它應該只在這個雜湊值下儲存在狀態數據庫中一次。至少沒有理由不以這種方式實現它。為了確定,我們需要查看特定實現的原始碼。

節點軟體可以隨心所欲地處理這個問題。我假設他們只在他們的數據庫中儲存一次,但程式碼的雜湊將儲存在這兩個位置。

當然,這並不能在部署期間節省 gas,因為您部署的每字節合約程式碼仍需支付 200 gas。一個很好的解決方案是複製/代理合約,它使用委託呼叫將所有呼叫/返迴轉發到另一個合約地址,這意味著它在複製合約的儲存上下文中執行另一個合約的程式碼。我們開發了一個只用 96 個字節執行此操作的合約,可以在此處找到。

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