Solidity
您如何在 Solidity 中實現具有後端功能的前端合約?
您如何創建一個呼叫後端的前端契約,以便能夠升級或更改後端契約而無需重新部署前端契約?
可升級智能合約有不同的方法
最簡單的方法之一是前端合約引用後端合約,而不是硬編碼地址,而是使用 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 天然氣津貼)。代理合約的地址保持穩定,但所有者可以隨時更改實現。