天天看點

如何更新或者更新智能合約?

如果合約發送方想要有一種方法來更新智能合約代碼,以便賬戶資料和其他東西接通,可以有什麼辦法嗎?可以在不改變合約位址的情況下進行,還是總是需要新的位址?

是否存在

annex

機制,在不需要重寫的情況下向智能合約中添加一些新的功能?

問題解答

一旦合約已經部署在區塊鍊中,它就是最終版了并不能再被改變。當然,可以通過允許原始代碼改變某些參數,來做些改變。

更新合約的一種方法是使用版本控制系統。例如,你可以有一個入口通道合約,它将所有調用轉發到合同的最新版本,由可更新的位址參數定義。你還可以使用名稱系統資料庫,并将其更新為指向最近的合約版本。

另一種方法是将邏輯代碼放在庫中,然後使用CALLCODE特性,通過Solidity中的庫調用位于指定的、可更新的位址的代碼。這樣,使用者資料在版本之間仍然存在。但這也就限制了邏輯合約的ABI必須保持不變。

官方說法:

從Homestead release釋出開始,有一個

DELEGATECALL

操作碼。這基本上允許你向前調用一個單獨的合約,同時保持

msg.sender

和所有存儲。

例如,你可以擁有一個保持相同位址和存儲的合同,但将所有調用轉發到存儲在變量中的位址:

contract Relay {
    address public currentVersion;
    address public owner;

    function Relay(address initAddr){
        currentVersion = initAddr;
        owner = msg.sender;
    }

    function update(address newAddress){
        if(msg.sender != owner) throw;
        currentVersion = newAddress;
    }

    function(){
        if(!currentVersion.delegatecall(msg.data)) throw;
    }
}           

原文《以太坊常見問題和錯誤》中的:

http://cw.hubwiz.com/card/c/ethereum-FAQ/1/1/17/

另外推薦幾個很受歡迎全網稀缺的互動教程:

  • python以太坊 ,主要是針對python圍繞web3.py進行區塊鍊以太坊應用開發的講解。
  • web3j ,主要是針對java和android程式員圍繞web3j庫進行區塊鍊以太坊開發的講解。
  • php以太坊 ,主要是介紹使用php進行智能合約開發互動,進行賬号建立、交易、轉賬、代币開發以及過濾器和事件等内容。
  • 以太坊開發 ,主要是介紹使用node.js、mongodb、區塊鍊、ipfs實作去中心化電商DApp實戰,适合進階。
  • 以太坊教程 ,主要介紹智能合約與dapp應用開發,适合入門。