最近何かと話題のnemのウリの機能「アポスティーユ」について、すこし掘り下げてみます。
nemにアポスティーユという機能は無い
これだけnemのアポスティーユはすげぇすげぇ言ってますが、実のところアポスティーユなんて機能は実装されていないんです。
ではどうゆうことなのか、を解説していきます。
パブリックとプライベート
アポスティーユにはパブリックアポスティーユとプライベートアポスティーユがあります。
ここでは、nemネットワークにアクセスできれば誰でも確認できるパブリックアポスティーユについて述べます。
アポスティーユの正体
ではなんとなくOpenApostilleを開いたら目についた、ジャパンカップ予想のアポスティーユを例にしてみます。
ジャパンカップ予想.docx - OpenApostille
NIS API(HugeAlice)への問い合わせを開いたトランザクションのmessage.payload
を確認してください。
fe4e545903560fc41a6f8c9495ee7e7e18322973c50e9e2f4fbb91fa892343412586d9a808
このメッセージは固定長で5つのセクションに分けます。
fe 4e5459 0 3 560fc41a6f8c9495ee7e7e18322973c50e9e2f4fbb91fa892343412586d9a808
最初のfe
はメッセージが16進数文字列であることを示す固定値です。
次の4e5459
はアポスティーユであることを示す固定値です。
0
はパブリックアポスティーユであることを示します。プライベートの場合は9
となります。
3
はハッシュアルゴリズムを示します。それぞれの割り当ては以下の通りです。
アルゴリズム | 値 |
---|---|
md5 | 1 |
sha1 | 2 |
sha256 | 3 |
sha3-256 | 8 |
sha3-512 | 9 |
後に続く文字列はファイルのハッシュ値です。
この場合、ハッシュアルゴリズムは3
なのでsha256
によるファイルのハッシュとなります。
ということで、元ファイルはsha256でハッシュ値を取ると、560fc41a...a808
になるはずです。
試してみましょう。元ファイルはオープンアポスティーユからダウンロードできます。
$ sha256sum "ジャパンカップ予想 -- Apostille TX 797ae3b488f7808bf3b7ad46c7f487f2b02645175f09256ca532eb74b274d319 -- Date 2017-11-25.docx"
560fc41a6f8c9495ee7e7e18322973c50e9e2f4fbb91fa892343412586d9a808 ジャパンカップ予想 -- Apostille TX 797ae3b488f7808bf3b7ad46c7f487f2b02645175f09256ca532eb74b274d319 -- Date 2017-11-25.docx
一致しました。
NanoWalletでは、ファイル名のトランザクションハッシュからハッシュ値が記録されたメッセージを取得し、
先のようにメッセージから取り出したハッシュ値と算出したファイルのハッシュ値を突き合わせて完全性を証明しています。
また存在証明はそのトランザクションのタイムスタンプを利用します。
この二つが合わさることで「ある時点」で「このファイル」が存在していたことを証明できるのがnemのアポスティーユです。
なので、トランザクションハッシュが分かっていれば、ファイル名がこの形式でなくても問題ありません。
(もっともNanoWalletのD&Dすればすぐ確認できるのでわざわざ変更するメリットはなさそうですが)
もし自前でアポスティーユの実装や検証を行う場合は参考にしてみてください。
まとめ
というわけで、アポスティーユは単なるトランザクションの応用に過ぎませんでした。
NanoWalletに実装されている投票機能も同様に専用の機能があるわけではなく、通常のトランザクションを応用しています。
わざわざ専用の機能を実装することなく、このようなことが実現できてしまう応用性がすごいと思います(小並感)