📌 置頂: 請把任何比你弱勢的用路人當作你的至親對待。跟前車保持安全車距 (2秒以上)。

深入理解 IOTA 交易發起方式

In

Tags:



by

本文將深入介紹 IOTA 如何發起一筆交易。

0. 在開始之前

請務必先行閱讀以下兩篇文章:

  1. Bundles – IOTA Documentations
  2. Making a Transaction – IOTA Documentations

這將讓你了解有關 IOTA 交易的基本知識。

1. 交易發起的步驟詳解

  1. 製作 Bundle
    1. 準備輸出的交易 (output transaciton)
    2. 準備輸入的交易直到滿足輸出數量 (input transaction)
    3. 封起 bundle 取得 bundle hash,並將 bundle hash 填入所有的交易中
    4. 針對輸入交易簽名
  2. 取得兩個 tip 作為 trunk 以及 branch hash
    1. 經由 IRI 的 getTransactionsToApprove
  3. 工作量證明
    1. 將 trunk 以及 branch 填入所有交易中
    2. 如果沒有 tag,填入 obsolete tag
    3. 填入 timestamp
    4. 使用 pearl diver 計算 nonce 並且取得 transaction hash

至此,我們變能取得符合規則的 transaction trytes,也就是完整的交易內容。

2. 製作 Bundle

以 Bundle 的觀點而言,有三種不同型態的交易,分別是輸入輸出、以及元/普通交易。

  • 輸入:交易額為負數 (提供交易額的交易)
  • 輸出:交易額為正數 (接收交易額的交易)
  • 元/普通:交易額為 0,可作為簽名承載的交易,或是作為存放其他訊息的交易。

舉個例子,A 有三個從同一個種子出來的地址以及一些餘額:

index 0: AAAAAAAA, balance: 50
index 1: BBBBBBBB, balance: 70
index 2: CCCCCCCC, balance: 20

當 A 想要傳送 100i 到 B 的地址 DDDDDDDD 的時候,IOTA 會做下面這些事情:

  • 準備輸出到 B 的交易,並且放入 bundle
  • 準備相對應的輸入交易
  • 針對每個輸入交易加入元交易
    • 元交易會根據地址的 security level 來加入,預設的 security level 為 2,因此會插入一個元交易,如果是三的話就會插入兩個,一就不會插入。
  • 如果此時 bundle 的 balance 還是正數,加入一個地址來轉送剩餘的餘額。
  • 封起 bundle
    • 確認 bundle balance 為 0
    • 產生 bundle hash
      • 使用 Kerl absorb 所有的交易的 validate item (address, value, obsolete, tag, timestamp, current index, last index)
      • squeeze 出 bundle trits 並且轉成 bundle hash
      • 將 bundle hash 全部填入交易並且初始化交易的 signature message fragment
      • 注意:在這個步驟完成時,各個交易內的 trunk, branch, signature 以及 nonce 都還沒有被填入,只有 bundle hash 而已。
  • bundle 簽名
    • 從 seed 取得 key generator
    • 針對輸出交易簽名
      • 從輸出交易的 index 並透過 key generator 取得 private key
      • 透過 private key 以及 bundle hash 取得 signature fragment 並且填入交易中。
      • 如果 security level 為 2,代表前面取得的 signature fragment 需要填入兩個交易中 (輸出交易以及元交易)

結束時。我們將可以得到一串的交易內容,包含 bundle hash 以及相對應的簽名。在實做中會以相反方向取得 (從 last index 到 0 index)。

3. 取得 tips

透過 IRI getTransactionsToApprove 取得 tips 作為 trunk 以及 branch hash。本文不會解釋 MCMC 演算法的運作原理。

4. 工作量證明

最後這個 PoW 步驟,我們會將前面取得的 tips 填入所有交易中,同時進行 PoW 取得交易的 nonce。

前面的 bundles 文件有提到,在 tangle 中是以 bundle 作為單位,因此一個 bundle 中的 tips 都是同一組。

實際在運作的時候,會從 bundle 中 last index 的交易開始走向 0 index 的交易,填入 trunk,branch hash,timestamp,以及進行 PoW (pearl diver) 來尋找 nonce,產生交易 hash 並且驗證 PoW 結果。

last index 的交易,其 trunk 以及 branch 會指向前面取得的 tips,其他的交易的 trunk 會指向後一個交易,branch 則指向 trunk 交易。

一個典型 bundle 中的 trunk 與 branch 狀況圖。

如果所有事情都安然無恙,我們將會取得一串可用的交易字串!

5. 以 Python 寫成的 PoC 程式碼

6. 結論

我們在這邊解釋了 IOTA 實做上如何建立一個完整的交易。了解 bundle hash, transaction hash, nonce, tips 等何時才會被確立出來。

我們可以從這邊清楚的發現,IoT 裝置最小只需要運行簽署交易的部份,其餘的工作可以不用由 IoT 裝置運行。


Comments

2 responses to “深入理解 IOTA 交易發起方式”

  1. purplecity avatar
    purplecity

    老哥你好! 请教一个问题. 如果交易所有100 0000 个充币地址。 那么交易所是如何检测这些地址的充值情况的呢?难道是固定频率每隔一段时间就发起100 0000个请求去getBalance吗

    1. louie.lu avatar
      louie.lu

      直接查詢 local 的 rocksdb 會比較快喔。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.