首先,我們來快速回顧一下我上期定義的合併交易:在我這個名叫自動販賣機的信任賬本的應用中,我只需要用區塊鏈來完成賬單的記錄。因此,合併交易就是為了滿足我這個需求。每當有新的賬單時,自動販賣機的錢包賬戶就會透過傳送合併交易把賬單的資訊放到鏈上。當合並交易傳送成功時,會自動更新和該筆賬單有關的相關方的錢包賬戶裡的利潤金額。因此保證賬單資訊不可篡改、分成資料絕對真實。
那麼,要編寫、部署、以及使用這麼一個交易,共有以下幾個程式設計步驟:
第一步,發鏈。
透過 Forge 開發框架提供的工具 Forge CLI 就可以輕鬆的發鏈。透過forge start這個命令就會在本地啟動一個節點。
第二步,編寫新的交易協議。
編寫新的交易協議,需要完成以四個檔案:
•protocol.proto
protocol.proto 用於定義交易的資料結構,也就是一種型別的交易長什麼樣子,包含了什麼資訊。在 Forge 開發框架裡,交易共分為內外兩層,簡單理解,外層(transaction)囊括了所有交易共有的資訊(例如,該交易的傳送者,傳送時間)而內層(inner transaction)就是每個交易特有的資訊。而我們透過 proto 檔案就是定義這個內層 --inner transaction 的結構和內容。
•protocol.yml
我們是透過protocol.yml裡定義的 pipeline 來告訴鏈應該如何處理這個新的交易協議。Forge 將處理交易的流程分成了三大步:
1.Check。就是當 Forge 節點收到交易時,會簡單檢查下有沒有明顯的問題 (例如,有沒有資訊是沒有填寫的)。
2.Verify。Verify 相較於 Check,是一個更加徹底的檢查。透過 Verify 的交易可以被認定是完全沒有問題的。
Check 和 Verify 就像我們在機場過安檢時,都得經歷的兩個步驟:一個是檢查一下你的證件和你的登機牌是否一致,另外就是你和行李都要透過 X 光被徹徹底底的檢查,沒問題後才可以登機。
3.Update。Update 會在交易被 Verify 後更新整個鏈上資料和狀態。
Forge 開發框架提供了很多已經定義好的“pipe”,讓開發者可以像搭積木一樣隨意組合搭配。但開發者也可以選擇自定義新的 pipe,例如在 Update 這一步,因為不同的交易型別會 update 不同的資料,所以我們通常需要自定義這裡的 pipe。
•protocol.ex
我們透過protocol.ex來自定義 pipe。這個檔案程式語言是 elixir,雖然看著有點眼生,但運用的邏輯卻很簡單。想了解更多 Elixir 的程式設計詳情,請瀏覽我們的文件。
•config.yml
config.yml 記錄了這個交易協議的基本資訊。它把前三個檔案串聯在一起,供鏈來使用。並且,它包括了當前的版本數。每次修改協議內容時,都要更新當前的數字。如果我們忘記更改這個數字,當我們想要部署一個修改過的協議時就不會成功。
第三步,部署交易協議。
這個步驟可以透過 Forge CLI 輕鬆完成。透過遵循我們文件提供的步驟,就可以部署交易協議到鏈上。
第四步,試用交易協議。
我們可以在 Forge 的 remote console 裡試用我們新部署好的交易協議,這裡用的是 Elixir SDK,使用起來也非常簡單。但因為我更喜歡用 Python,所以這裡將會展示用 Python SDK 試用的方法。用 Python SDK 試用主要分為三步:
•編譯交易協議。透過 google 提供的緩衝編譯器,我們就可以把我們的protocol.proto編譯成 Python 支援的檔案。
protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/protocol.proto
•建立錢包賬戶。我上期提到,錢包賬戶是鏈上所有活動交易的發起者和接收者。我們只需要知道對方的錢包地址,就可以和對方進行交易互動。因此,我要為自動販賣機,也就是合併交易的發起方,和各位相關方,也就是接收方,各建立一個錢包賬戶。透過 Python SDK 建立錢包可以透過以下指令來完成。錢包的地址和餘額也可以輕鬆的檢視。
from forge_sdk import ForgeConn
f = ForgeConn('127.0.0.1:28210')
rpc = f.rpc
vm = rpc.create_wallet(moniker='vending_machine', passphrase='vm1234')
addr = vm.wallet.address
rpc.get_account_balance(address)
•最後,傳送交易。透過以下指令就可以傳送我的合併交易啦。傳送後會獲得這次交易的 hash 值,透過 hash 值可以看看這次交易傳送到鏈上是否成功。
itx = protos.AggregateTx(sku=sku, value=value, time=time, operator=op.wallet.address, manufacturer=ma.wallet.address, supplier=su.wallet.address, location=lo.wallet.address)
itx2 = utils.encode_to_any(type_url="fg:t:aggregate", data=itx)
rpc.send_itx(tx=itx2, wallet=vm.wallet, token=vm.token, nonce=0)
rpc.is_tx_ok('[return-hash]')
以上就是要編寫部署一個新的交易協議的步驟。如果沒有問題,鏈上的任務就基本完成了。接下來,我們就可以專注做我們最熟悉的鏈下的設計。
在使用 Forge 開發框架部署了新的交易協議之後,我最大的感受是:用 Forge 開發框架真的很簡單。它不僅幫我們解決了區塊鏈底層複雜的技術,同時它也幫我們遮蔽掉了很多當我們只是想純粹做個 DApp 時並不需要了解的知識和技術。透過提供模版化的步驟,Forge 開發框架大大降低了 DApp 開發的難度。在下一篇部落格裡,我將為大家展示我的 DApp 和介紹我是怎麼完成我鏈下的部分。我也非常期待我的應用最後會是一個什麼模樣。另外,在目前這三週的學習和實踐中,我也收穫了很多心得,對區塊鏈這個技術,以及它究竟可以透過怎樣的方式來改變我們的生活有了更深的領悟。這也會在下一篇部落格裡和大家分享。那我們下次再見!