Solidity

動態委託代理合約

  • April 6, 2020

我熟悉使用“delegatecall”將代理合約與邏輯合約分開的可靠代理合約。有沒有一種簡單的方法可以根據我傳遞給呼叫的參數來選擇邏輯合約,而不是永久“升級”合約?

我覺得我已經看到人們在各種契約中這樣做了,但我還沒有真正看到它的文件,所以我不確定它叫什麼。我認為它是動態代理,但它可能被稱為別的東西。

基本上,我希望我的代理合約根據我傳遞給函式呼叫的參數指向許多邏輯合約中的一個。所以說我正在呼叫一個函式“GetValue”,我想將一個數字作為參數傳遞給它。我在想一種方法是傳遞一個額外的參數,告訴代理合約使用哪個邏輯合約。看來我必須在我的代理契約中使用一些彙編程式碼才能實現這一目標。因此代理合約將讀取數據的前幾個字節並使用它來確定要呼叫的邏輯合約。然後它將呼叫委託給邏輯合約(可能沒有那個額外的參數……)

Openzeppelin 可能有這樣做的東西。我個人更喜歡使用 Python 進行乙太坊開發,而不是 javascript。由於 Openzeppelin 的工具往往依賴於 javascript,所以除了遵循它們的可靠模式之外,我並沒有真正使用它們。

注意:我知道我可以將代理合約保持原樣,並將子代理保留在我的邏輯合約中。但是,當這應該是代理契約的目的時,這似乎是不必要的。

額外的想法:所以在我上面連結的程式碼中,幾乎就像我每次呼叫契約時都呼叫“upgradeTo”一樣。但是,無需升級邏輯合約的成本,只需選擇將委託呼叫轉發到哪個邏輯合約即可。

來自 OpenZeppelin 社區論壇的回答:https ://forum.openzeppelin.com/t/proxy-that-routes-to-multiple-logic-contracts-based-on-param/2595/2

您是否有理由不能使用 OpenZeppelin 可升級合約而只有一個邏輯合約?請參閱升級智能合約學習指南。我建議先看一下它是否滿足您的需求。

我會非常謹慎地滾動您自己的升級機制,並建議您創建的任何此類機制都經過適當的測試和審核。(OpenZeppelin 執行安全審計:https ://openzeppelin.com/security-audits/ )

Nick Mudge一直在研究一些替代升級機制,包括ethereum/EIPs#2535,如果你走這條路,你可以看看。

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