1. 程式人生 > >區塊鏈開源專案Ripple三、交易的完整生命週期

區塊鏈開源專案Ripple三、交易的完整生命週期

修改區塊鏈的唯一方法是提交交易,待交易通過共識後即可寫入區塊鏈,同時修改區塊,下面對整個交易的生命週期做詳細說明。

rippled底層提供了交易提交的API(詳細請參考https://ripple.com/build/rippleapi):submit 後面跟交易的已簽名BLOB,簽名可以掉呼叫rippled的RPC命令Sign,也可直接用submit 後面跟私鑰。不過這種方式一般只在筆者做內部測試用,正式給客戶使用時絕不可把私鑰提交到伺服器上,這樣違背了“去中心化”的初衷,在筆者的實際開發中,一般用Ripple-lib從當呼叫的中間層,通過ws與底層通訊,下面以呼叫RIpple-LIb指令碼呼叫為例,先介紹二個API

  1.preparePayment(address, payment,option)

  2.sign(prepared.txJSON, secret);

第一個對交易payment校驗,填上必須的欄位,如費用,區塊序號和賬戶序號等。

第二個對用私鑰對交易簽名。返回值就可以用submit提交。

有幾個注意的地方:

1.區塊序號和賬戶序號

LastLedgerSequence:上一個區塊的序號,若干個區塊構成區塊鏈,每一個區塊對應一個遞增的序號。

 Sequence:賬戶序號 區塊鏈上有若干賬號,每一個賬號的交易序號都是從1開始遞增。

2.共識達成的最大區塊序號

ripple-lib指令碼傳送交易時,preparePayment可以有三個引數,第一個引數:公鑰 第二個引數,交易JSON,第三個欄位,限制選項。限制選項中有個maxLedgerVersion,這個意為達成共識的最大區塊序列號,如果在這個區塊上還沒有達成的話,那麼交易失效。

提交到本地後,本地先驗證交易的合法性,比如必須欄位是否已經填寫(參看交易的必須欄位參考在src\ripple\protocol\impl\TxFormats.cpp)

,這幾步對應檔案src\ripple\app\tx\impl\Payment.cpp,判斷結構非常清晰,123步驟逐漸深入).

本地驗證通過後,啟動一個工作者執行緒advanceThread(對應檔案src\ripple\app\ledger\impl\LedgerMaster.cpp),裡面呼叫doAdvance,這個函式以後介紹同步還會詳細說明,對於本地驗證通過後的交易,釋出到網路上參與共識。

共識通過後,各節點取得這個區塊,寫到本地資料庫中。

自此,一個交易的完整生命週期結束。