如何驗證我們是否部署了智能合約?
我想要一個從 Solidity 呼叫的方法
- 驗證整個智能合約程式碼的雜湊,或
- 閱讀契約公開的一些不可變的 EVM 屬性,說明誰部署了它們,例如我們之前部署的工廠契約
案例是我想要一個 addHook(contractAddress, methodSignature) 函式,當發生某些變化(例如新的統計數據或投票)時,其他合約可以呼叫該函式以得到通知。但是我們不能允許添加任何合約和方法作為掛鉤處理程序,因為它們可以簡單地呼叫 while(1) 並銷毀我們的合約。
但是,我們確實希望能夠在建構合約之後 addHook() ,但只呼叫我們自己編寫的合約的方法,並將上面的 1 或 2 硬編碼到暴露的合約中
addHook
。契約的所有者財產不會這樣做,因為它不是一成不變的,所以另一個契約可以偽造它。
讀取合約暴露的一些不可變的 EVM 屬性
嗯……不知道你讀了什麼。關於簽署交易(或契約)部署契約的賬戶,肯定有不可變的區塊鏈資訊,但我認為這就像事件,無法從 Solidity 訪問。可能其他人會用一種方法來插話。
您的問題的實際解決方案在於以下要求:
我們自己寫的契約
這簡化了事情,因為您只需要跟踪您所做的事情。
例如,在以合約工廠作為中心的中心輻射模式中,它可以跟踪已部署的合約。假設集線器有:
mapping(address => bool) public isTrusted;
那麼它只需要實現訪問控制來限制對“可信”合約的訪問:
modifier onlyTrusted { require(isTrusted[msg.sender], "I don't know you."); _;
可能 Hub 不是唯一與訪問控制有關的契約,因為拓撲結構更加複雜。儘管如此,您只需要每個感興趣的契約都知道權限的來源並詢問:
modifier onlyTrusted { require(whiteListContract.isTrusted(msg.sender), "It doesn't know you."); _; }
有一些標準化的契約可以實現這種事情。我建議查看 Open Zeppelin“白名單”和“訪問控制”。他們每個人都有從受信任的事物列表中添加和刪除地址的方法。列表的維護本身就是一個值得擁有自己的訪問控制的功能(onlyOwner?),但它可以在分散的環境中工作,例如只信任這個工廠自己製作的合約:
function deployNewContract() public returns(address) { // anyone can MyThing t = new MyThing(); // now add address(t) to the whitelist, depending on which implementation you choose return address(t); }
你知道t 是一種特定的合約,因為它來自哪裡,所以沒有意外的行為。
希望能幫助到你。