Solidity
在部署合約之前將合約列入白名單的可證明方法?
我想證明將要部署的合約與特定程式碼匹配,並且也可能與特定狀態匹配。
例如,Bob 說他將部署一個如下所示的合約:
pragma solidity ^0.4.0; contract SimpleStorage { uint storedData; function set(uint x) public { storedData = x; } }
在他部署它之前,我想在我自己的契約中將該契約*列入白名單。*例如,也許我保留了一個能夠呼叫我的函式的已批准地址的映射。不過,問題是,我不知道 Bob 的合約地址是什麼。
SimpleStorage
但我確實知道他的契約將有這個確切的程式碼,並且函式將被呼叫過(即是空
storedData
的)。根據我對 EVM 的了解,每個部署的合約都被指定為默克爾樹使用的雜湊值。對合約的任何狀態更新都會稍微改變這個雜湊值。我認為這可能是一種方法,因為我可以將雜湊而不是地址列入白名單,但我不確定在部署之前是否可以預測此雜湊。
所以也許主要問題是:
- 這種對合約雜湊的理解正確嗎?
- 你能知道合約散列在部署之前會有什麼嗎?例如,僅從程式碼的外觀來看,並假設從未呼叫過任何函式。
- 如果 (2) 沒有,你可以將它部署到測試網,檢查雜湊,並假設它在主網上是一樣的嗎?
也許你可以指出一個更好的方法來做到這一點。例如,也許我可以將 Bob 的地址列入白名單並信任他部署的所有合約。但這有一個問題,他可以部署任何合約而不僅僅是
SimpleStorage
,這將成為我的合約的攻擊向量。很想听聽你的想法,謝謝!
一種方法是使用
create2
操作碼。使用此操作碼時(例如通過合約工廠),合約的地址將取決於部署程式碼。部署程式碼執行建構子來初始化儲存並將合約程式碼儲存在區塊鏈上。有了這個,您可以提前計算合約的地址並將其用於白名單。這個過程被稱為反事實部署,被著名的乙太坊工具使用,例如Gnosis Safe或OpenZepplin