Contract-Development
如何使圖書館地址可更新
我想編寫一個使用庫的契約。這個庫應該是可交換的。
這意味著我希望契約有一個可更新的(僅由所有者)地址變數,始終指向庫的目前版本。
因此,我可以編寫和部署一個新庫,只需告訴合約新庫的地址即可。無需更新和重新部署整個契約。
我確信這是可能的,但我無法找出正確的語法/架構。
這是一種方法的草圖,但請注意,這不適合膽小的人。
- 使用指向目前庫的全域變數創建一個基礎合約。
- 創建從基礎合約繼承的合約(主機)。還為它創建第一個真正的庫。
- 創建一個從基礎合約繼承的庫(代理)。(這將允許它讀取主機合約的變數)這個庫應該只有一個回退函式,它立即用於
delegatecall
將呼叫數據發送到目前庫。- 部署所有合約,將代理連結到主機合約。Solidity 不會知道代理庫實際上並沒有實現實際庫的介面——它所看到的只是地址。
- 當您要升級庫時,只需更改主機合約中的全域變數即可。
正如我警告的那樣,這不適合膽小的人。您可能會用頭撞到各種牆壁、桌子和各種硬質表面,以使這一切正常工作。然後您可以計算其中涉及的工作量,而不是一開始就重新部署契約。除非你真的,真的不想重新部署契約,否則你最好這樣做。