在比特幣發展的過程中,曾多次出現因私鑰被盜導致交易所倒閉和比特幣用戶損失大量資金的情況。比特幣系統每個用戶都擁有一個經過編碼的34個字符比特幣地址,用于接受比特幣。每個比特幣地址都有一個對應的32個字符的私鑰,可以使用它來發送比特幣。私鑰必須被安全地管理好,只有你簽署一筆轉賬時才需要用到,比特幣地址可以自由地分發到全世界。這就是比特幣錢包的原理。當你的私鑰是安全的,那么一切都好,如果你失去了你的私鑰,那么你的所有資金都沒有了。
為了解決當私鑰被盜后,盡量減少損失,在2011和2012年出現了多重簽名交易。普通的交易只要一個私鑰簽名即可完成轉賬,多重簽名交易關聯兩個及以上私鑰,只有當其中兩個或更多私鑰對該交易進行簽名,才能完成一筆轉賬。最常見的是2/3組合,意思是三個私鑰中有兩個私鑰做了簽名該轉賬有效。多重簽名交易可以有效保證資金安全,同時在商業上也很有應用價值。可以基于多重交易實現第三方交易擔保,以保證交易的順利進行。
以太坊根據自身平臺特點采用智能合約實現多重簽名功能,一般在錢包合約中實現該功能。智能合約可以簡單的理解為一段可執行的程序片段,具體的代碼由發布人使用特定的編程語言來編寫(以太坊使用的是Solidity編程語言,類似JavaScript),在本地編譯成功后可以發布到區塊鏈上。而以太坊的智能合約也可以理解為一個特殊的交易(包括可執行代碼的),被發送出去后會被礦工打包記錄在某一個區塊中,當需要調用這個智能合約的方法時只需要向這個智能合約的地址發送一筆交易即可。下圖為以太坊智能合約模型:
主流的以太坊錢包(如MIST、PARITY等)均提供多重簽名功能。新建錢包合約時選擇多重簽名,輸入相應的多重簽名組合及對應的賬號信息即可。錢包內置的錢包合約代碼與這些輸入信息通過SOLC編譯為二進制碼,然后通過一筆交易發送給以太坊網絡,一旦以太坊網絡節點把該交易打包記錄到以太坊區塊鏈中,該智能合約則部署成功。部署成功后會生成該智能合約地址,后續調用該智能合約只需要向該地址發送交易或者事件即可。
在測試private網中進行測試,運行MIST程序進入錢包首頁。程序進入賬戶總覽頁:
點擊“新增錢包”,進入新錢包合約界面。
這里我們選擇“多重簽名的錢包合約”:
上圖是多重簽名的參數設置,表示該合約由3個賬號控制,每天消費超過5以太幣則啟動多重簽名功能,合約由MAIN ACCOUNT賬戶擁有,ACCOUNT 2和ACCOUNT 3參與多重簽名確認。設置好了相關參數后,點擊“創建”則開始創建錢包合約,過程中MIST會提示輸入MAIN ACCOUNT的操作口令,創建成功后在錢包界面上會出現該錢包合約信息。
其實這里的W1錢包合約,大家可以理解為就是一個賬號,只不過這個賬號受多人控制而已,這些我們可以向W1合約轉賬了,轉賬過程和普通交易一樣,這兒不再啰嗦。
下面講如何通過W1錢包合約向其他賬戶轉賬,多重簽名的功能主要也就體現在這兒。
首先我們得確保W1合約里面有充足的余額,我們通過MAIN ACCOUNT已經轉了100以太幣到W1合約。我們現在新增一個賬戶ACCOUNT 4。使用W1合約給ACCOUNT
4分別轉1以太幣和5以太幣。我們首先轉1以太幣,MIST錢包只提示了MAIN
ACCOUNT口令認證。再轉5以太幣,此時轉出的以太幣數量已經超過了W1合約設置的每天5以太幣。
點擊界面上的“發送”后,會彈出如下窗口:
注意這兒是執行W1合約,而不是執行交易。MAIN ACCOUNT向W1合約發送執行合約的交易命令,因此需要輸入MAIN ACCOUNT的口令。RAW DATA就是合約執行的二進制參數,包括轉到的目的賬戶和金額等。
當執行合約的交易發送給了以太坊網絡后,則等待以太坊確認該交易,一旦以太坊網絡確認了該交易,則在賬戶總覽界面上會立即彈出下面信息:
點擊“批準”后,MIST會彈出“選擇一個賬戶”的對話框:
對話框上面可以選擇確認的賬戶是之前在創建W1合約時,選擇的ACCOUNT 2和ACCOUNT 3。我們選擇其中一個進行合約確認,轉賬成功。
MIST錢包實現的錢包合約代碼中有兩個關鍵函數execute()和confirm()。當合約發布者執行交易時,execute()負責啟動錢包合約,在執行該合約之前需要該合約發布者和相關賬號的簽名才能執行。當execute()函數在執行過程中發現需要進行多次簽名時,會自動調用confirm()請求其它賬號進行簽名。Confirm()函數負責通知其它賬號進行簽名并確認,該函數根據錢包合約設定的參數多次被調用。直到賬號簽名的次數滿足原先預定值后,execute()完成執行,此時錢包合約執行交易操作。
以太坊基于智能合約實現多重簽名,具有很強的靈活性,應用非常廣泛,尤其在當前火爆的ICO眾籌中大量應用。但智能合約代碼需要非常嚴謹,稍有不慎出現BUG導致大量資金損失,如parity錢包因智能合約BUG導致15萬以太幣被盜事件。