Try   HackMD

IOTA MAM 筆記

MAM架構

MAM 使用 Merkle tree based signature scheme 作為其簽章的基礎,並且採用其所產生的 Markle tree root 作為MAM的廣播地址,也同時是驗證 MAM 所使用的 publicKey (可以想像成平常交易使用的地址),此外,注意此處使用的「廣播」二字,即表達 MAM 的通訊是單向而非雙向的,並且監聽頻道的使用者無法向前追溯訊息。加密則是採用了one-time symmetric key encryption。

在這樣的架構之下,MAM 提供 Channel spliting 和多種廣播的方式:

  • Public
  • Private
  • Restricted

根據官方的說法,MAM中訊息之間的結構也可以理解成父資料夾與子資料夾之間的關係,皆可以隱藏或是加密(對應到 Private 和 Restricted)
以下皆是針對 Public 模式說明

  • subscribed: []
  • channel:
    • side_key: String Encryption key
    • mode: String (public private restricted)
    • next_root: String
    • security: Int 1,2,3
    • start: Int
    • count: 1,
    • next_count: 1,
    • index: 0
  • seed: String
構造一個 MAM 訊息需要以下部份:
- `message`: `String` Tryte-encoded plain text
- `merkleTree`: `Object` Merkle tree
- `index`: `Int` Index of the merkle tree leaf key
- `nextRoot`: `String` Root of the next merkle tree
- `channelKey`: `String` Channel key (used for data encryption)

建立後程式會回傳下一個訊息使用的金鑰`nextKey` ,
其實就是 hash(`channelKey`+ 1 + salt ),

在一個 MAM 訊息中,有以下幾個部份,並且在tag部份帶有每次加密時皆會使用到的 salt:

  • root: String Root of the merkle tree
  • nextRoot: String Root of the next merkle tree
  • nextKey: String Tryte-encoded key for the next message in this chain
  • message: String Tryte-encoded message

rootnextRoot 指的是 Markle tree root

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

以上 A, B, C, D, E, F, G, H 皆是由同一個 seed 所產生的 key (注意,此非加密時使用的 key )

MAM 特色

IOTA在Medium上的MAM文章中提到一句 "MAM uses a Merkle tree based signature scheme to sign the cipher digest of an encrypted message." 但實際上IOTA上的實做與該文章不同,
而是在結合了加密貨幣的address這個概念後,更進一步的利用Merkel tree的特點,以merkle tree root作為訊息傳送的地址大量簡化了流程,驗證時即是利用獲得的 key 以及其餘 merkle tree 的節點 hash 來重組出root,再檢查 root == message address 即為通過驗證。

Merkle tree的葉節點數量表示可以在該 root(address) 上發送幾次訊息,下一次廣播訊息時就直接使用其他葉節點作為 key,也就是說能證明自己擁有 merkle tree 就是證明自己是該 channel 的"擁有者"。

public mode: publish to root, use root to encrypt
private mode: publish to hash(root), use root to encrypt
restricted mode: publish to hash(root+side_key), use root+side_key to encrypt

MAM 流程

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

問題

  • 與不同對象的通訊需要使用多個seed產生不同的markle tree嗎? -> 需要
  • MAM是將訊息丟向某個廣播地址,如果帶 token 應該是拿不回來? -> 對
  • MAM的地址由seed產生,所以是否跟平常使用之地址無異呢? -> 是的

參考資料

https://github.com/iotaledger/mam.client.js/blob/master/Overview.md
https://blog.iota.org/introducing-masked-authenticated-messaging-e55c1822d50e