Solidity

您如何在 Solidity 中實現具有後端功能的前端合約?

  • January 23, 2022

您如何創建一個呼叫後端的前端契約,以便能夠升級或更改後端契約而無需重新部署前端契約?

可升級智能合約有不同的方法

最簡單的方法之一是前端合約引用後端合約,而不是硬編碼地址,而是使用 ENS ( https://ens.domains )。當需要新的後端合約時,ENS 條目會更新。

請注意,智能合約的一個顯著好處是它們的去信任性,而可升級性會嚴重破壞這種信任,例如: https ://medium.com/consensys-diligence/upgradeability-is-a-bug-dba0203152ce

如果後端合約是有狀態的並且應該在升級過程中保持其狀態,那麼通常的做法是部署兩層後端合約。第一層是一個代理合約,它保留儲存並委託服務於幾乎所有對第二層合約的呼叫。二級後端合約的地址儲存在代理的儲存中,並且可以更改。代理合約可能如下所示:

contract BackendProxy {
 address private backendImplementation;
 address private owner;

 constructor (address _backendImplementation) public {
   backendImplementation = _backendImplementation;
   owner = msg.sender;
 }

 function () external payable {
   if (msg.data.length > 0) {
     address oldBackendImplementation = backendImplementation;
     address oldOwner = owner;

     bool status;
     bytes memory data;
     (status, data) = backendImplementation.delegatecall (msg.data);
     require (oldBackendImplementation == backendImplementation);
     require (oldOwner == owner);

     if (status) {
       assembly {
         return (add (data, 0x40), mload (data))
       }
     } else {
       assembly {
         revert (add (data, 0x40), mload (data))
       }
     }
   }
 }

 function setBackendImplementation (address _backendImplementation) public {
   require (msg.sender == owner);
   backendImplementation = _backendImplementation;
 }
}

因此,代理合約將所有內容委託給backendImplementation除了更改地址之外backendImplementation(以確保所有者不會通過將代理指向錯誤的實現而失去合約,以及沒有數據的傳輸(一旦委託,將不適合 2300 天然氣津貼)。代理合約的地址保持穩定,但所有者可以隨時更改實現。

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