NO IMAGE

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

是否存在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應用開發,適合入門。