「IOTA 大撒幣」為 2017 年 MOPCON 在台灣時間 10 月 29 日講題「透過區塊鏈打造行動化數位證書」的加值活動,活動辦法為會眾將自己的錢包位址 (address) 填入大撒幣網站,讓網站後端的電子錢包以及配合的節點發給 100 Ki
~ 5 Mi
不等的隨機紅包。但由於當天該講題為 3 廳聯播(約 700 多個聽眾),加上該場次提供直播服務,活動在開始的幾分鐘後系統即進入效能低落的情況,造成給幣效益不彰。
圖1 為「IOTA 大撒幣」的系統架構示意,系統以 node0
主機作為前端伺服器,提供 web wallet,node0
在接收會眾的 IOTA address 後亦即以 devorg
主機為 light node 進行交易,交易的 issuer 為一個帶有 value 的錢包,receiver 端即為會眾所填入的帳號 (IOTA Address),交易完畢後,node0
即回應一交易明細網址給會眾作為憑證。
圖1. IOTA 大撒幣架構圖
Web server 延遲
Web server 在等待 IOTA Node 交易期間 (特別是 tip selection 與 AttactToTangle(PoW)) 為同步的延遲狀態。此狀態會依照 node 算力與 Tangle 網路自身狀態而有所不同,在平常狀態下約 30 秒內交易完畢。但在 Tangle 網路不穩定的狀態之下,交易時間會隨之變得很不穩定。
當日 Tangle 網路狀態
我們可以由錢包的狀態得知,當天 Tangle 上的 coordinator 效率並不太好,「大撒幣」發了 218 多筆交易,但大多數的 Transaction 是 pending 的狀態,(168 筆交易 pending 而只有 50 筆交易被確認。詳細 帳本 或見圖2. IOTA 大量的 pending 交易),pending 狀態的交易目前仰賴 coordinator 做確認,但被確認的機率與交易本身的比重息息相關,影響比重的因素可能來自於雙重支付或是不合法的 tips。
圖2. IOTA 大量的 pending 交易 (詳細 帳本 )
交易 pending 的原因
影響交易 pending (亦即無法被 coordinator 所確認)的原因很多,我們先排除不可能發生的問題,意思是,一個 IOTA transaction 的發起,需要經過以下四個步驟:簽名(signature)、選擇兩筆尚未確認的交易(tips selection)、工作證明(POW)、廣播(broadcast)。
簽名(signature)與工作證明(POW)的錯誤會直接導致交易無法 Attach to Tangle,但這不符合於現實情況。而 broadcast 失敗會導致交易無法同步於分散式帳本,雙方也無法在 IOTA Tangle Explorer 查詢交易明細,這也不符合於現實情況。現實為大量的交易已經被傳送至 Tangle 上但狀態為 pending,由此得知問題的根源在 tips selection 的錯誤上。
我們可以由 iota.dance 確認,當天的 Tangle Network 效率其實相當低落。由圖3 可得知,Tangle 在當下,每分鐘僅有 30~40 筆不到的交易,且大多數交易為 SPAM (空交易),只有一筆帶值 (with IOTA token) 交易。
圖3. 每分鐘交易量 34 筆,34 筆 SPAM 1 筆帶值
而交易被確認的機率也偏低,由圖4 可得知,交易的確認量從 09:20 開始一直在每分鐘 35 筆以下,一直到 12:20 更下降到每分鐘 30 筆。
圖4. 交易確認量一直在每分鐘 35 筆以下
IOTA 目前不會提供 coordinator 在 Tangle 上不確認這些交易的理由,但官方錢包提供了 re-attach to the Tangle 的功能讓交易發起人重新做一次交易 (圖5),所謂 re-attach to the Tangle 的原理為重新做一次 tips selection 和 PoW,但以大撒幣而言,所有的錢包參數都是固定的,故 POW 的結果並不會改變,re-attach to the Tangle 只會改變 tips 選擇的結果。這部份「大撒幣」在伺服器端缺乏對應實做,所以 pending 的交易,僅能依靠 issuer 手動重做一次交易。
圖5. re-Attach to the Tangle
IOTA Node API 延遲
IOTA Node 本身一次可同時處理 32 筆 API rquest,但牽涉到交易的 API 大多為同步 (synchronized),例如 tips selection 的 getTransactionToApproveStatement 或是 POW 的 attachToTangleStatement 等等。這會造成 IRI 在密集交易的時候效率低落,我們可以由圖6 得知,在「大撒幣」服務開放的瞬間,IRI 在 BLOCK 中的 Task Thread 內容,這樣的 thread 會上升到 32 個,詳細情況可參考 jstack 命令觀察的結果。
也因為 IRI 的這個特性,我們選擇不調整 Apache 的最大連線數(MaxKeepAliveRequests
) 或 PostgreSQL 的相同設定。因為在相同的時間內,IRI 還是會先讓這些同步的 method 執行完畢之後,才會允許下一個 task 存取。
圖6. Thread: BLOCK State (詳細情況)
Tips selection 與 PoW 成本
由上述得知,IRI 在交易的實做上,為了保證同時間只會有一個 thread 存取特定資源,在 tips selection 以及 POW 上都用上了同步 (synchronized) 的 Java 方法,這代表 IOTA node 無論如何在同一時間都只能動用一個 thread 來處理交易的主要工作 (tips selection 和 PoW),因此保持 IOTA node 在同一時間內的 BLOCK threads 數量在一定的數目以下是必要的。
也就是說,「大撒幣」勢必要讓交易的 tips selection 及 PoW 工作能夠在同一時間內分擔到各個能夠協助執行的 IOTA node 上,也就是必須要實現交易代理人機制,事實上「證書區塊鏈」的專案中一直保持有這個想法,但尚未導入在本次實驗中。詳情可參考圖7「證書區塊鏈」的系統架構圖:
圖7.「證書區塊鏈」系統架構圖
以下的程式碼為大撒幣中主要的交易程式 (發起交易),以選用的 IOTA Node 在一般狀況下,交易的速度約為 30 秒內:
Code section (send. py):
Output:
我們在 IOTA Node 端觀察 BLOCK 的 thread 數量變化情形:
Output:
而在交易發起時,BLOCK thread 的數量會由 0 增加到 1.
接著我們開始在同一時間內,發起大量的交易,假定一次發起 20 筆交易,那麼在第 1 筆交易完成之前,會有 19 筆交易被卡在 BLOCK 的狀態。
發起 20 筆交易 Code section:
Output:
在 IOTA Node 上的觀察亦可得知,BLOCK thread 數目增加到 20,如圖8:
圖8. BLOCK thread
上述的測試案例我們可以得知:
然而一個 IOTA Node 在短時間內發出的多筆交易,因不明原因,不容易被 coordinator 所確認,原本應在 2 分鐘內確認的交易,現在我們在 Tangle Explorer 上觀察,20 分鐘之後仍然無法被確認,如圖9所示:
圖9. pending 中的交易
截至本文件撰寫完畢的最後一次觀察,交易已經過了 1 小時,短時間內大量發送的交易只被確認了2 筆 (BUNDLE Hash:MAJ9MMXWDQYHYWAMKFVFTPYNDCOWPOMDIDEQTSYUMTVYM9FYBROWPVZZQMLHSKLTWBZLXUJEVZST99999
至 VJPNOOPJ9QQWDDNNWMPRBKRFQXZJMT9GBVARZDDABMSFIDNDYKMDGKSWPEKOLOAEKANOHVS9DCFB99999
一共 20 筆交易全部 pending 超過 1 小時,其餘交易(約 20 筆)皆為正常。),細節可參考 Tangle Explorer 上的交易明細。
因此適度的將交易分散出去是必要的,我們可以做一個粗淺的實驗來證明這一點,下面的程式碼一樣是發起 20 筆交易,但單數號碼的交易,由 http://node.deviceproof.org:14265 完成,雙數號碼的交易由 http://node0.puyuma.org:14265 完成。
Code section:
Output:
由上述實驗得知:
devorg
的最後一筆交易,完成時間為: 174718 millisecondsnode0
的最後一筆交易,完成時間為: 207400 milliseconds未做 relay 之前由 devorg 獨立完成所有的交易,最後一筆交易則是需要花費 388316 milliseconds!效能增進了有 180916 milliseconds(約為 3 分鐘)。
即便以 relay 的方式優化交易的 performance,但同一個 Node 在短時間內發起的多筆交易,似乎很不容易被 coordinator 所確認,原因尚待確認,截至本文結束時,交易的 BUBDLE HASH 從 BVSSBPPIBIXQE9BSOZKJGYPSEM9T9BHKIEHTYVGGASHQUVAYR9ALPYJCYNGNO9SKDJFBMJJSSUBM99999 至 SSXDCCGFTZDAPEJ99LAO9E9SWSMUTJDQMBAVALYRAPTXNCLZTEZVTYPICRX9HTCRUJUMBWOGAHHHZ9999 的 20 筆交易中,一共只被 coordinator 確認了 7 筆。