レシートハッシュを求める(Symbol,Catapult,Fushicho4)


はじめに

あるブロックチェーンの/block/1の応答。

レシートハッシュ(receiptsHash)にある、

8D3DEE3481284DEA5E0C0C6E6D1410F6E0B6B95439ACD3FACC2E5E2B854E5C5E

を計算で求めてみようと思います。

レシートの情報

レシートの情報は、/block/1/receiptsにあります。

mosaicResolutionStatementstransactionStatementsがあります。

おそらく、これらの情報をシリアライズして、ハッシュ化すると、レシートハッシュが求められると思います。

シリアライズ

さて、シリアライズの方法を探していきます。

Symbol SDKを参考にします。Fushicho4なので、0.16.5を見てますが、0.17でも変わらないかと思います。

Transaction Statement

ReceiptVersionReceiptTypeReceiptSourceを結合したのち、各レシートをシリアライズして結合したものをハッシュするようです。

レシートのシリアライズは次を参考にします。

ReceiptVersionReceiptTypeMosaicIdAmountPublicKeyを結合するようです。

データにすると、前半が010043e10000000000000000、後半が01004321a84582052890a95100000000000000009be93593c699867f1b4f624fd37bc7fb93499cdec9929088f2ff1031293960ffとなります。

これのSHA3は8EA9EEA135F10FECFA55ED908593C6A3D24E672F1259E9DA776554BF67E722F7となります。

Mosaic Resolution Statement

ReceiptVersionReceiptTypeNamespaceIdを結合したのち、各レシートをシリアライズして結合したものをハッシュするようです。

レシートのシリアライズは、ReceiptSourceMosaicIdを結合するようです。

データにすると、前半が010043f2eeaff441ba994be7、後半が0500000000000000a84582052890a951となります。

これのSHA3はA91F73FBD1169356F3D9D83D86DCB9646356947BADDB18A46169B2C351E105A7となります。

マークルルート

それぞれのStatementのハッシュが出たので、これでマークルツリーを作っていきます。

今回は2つしかないので、結合してハッシュをとります。

その値は8D3DEE3481284DEA5E0C0C6E6D1410F6E0B6B95439ACD3FACC2E5E2B854E5C5Eとなります。

ブロックの情報のreceiptsHashと一致しました。

REST

/block/1/receipt/{hash}/merkleでは、マークルツリーを計算するための情報が返ってきます。

TransactionStatementのハッシュを入れると、

MosaicResolutionStatementのハッシュを入れると、

といった情報が返ってきます。

ノードに保存されているデータ

ノードのブロックが入っているフォルダには、.stmtというファイルがあります。

これを見てみます。

$ sudo hexdump -C 00000/00001.stmt
00000000  01 00 00 00 00 00 00 00  00 00 00 00 01 00 00 00  |................|
00000010  38 00 00 00 01 00 43 21  a8 45 82 05 28 90 a9 51  |8.....C!.E..(..Q|
00000020  00 00 00 00 00 00 00 00  9b e9 35 93 c6 99 86 7f  |..........5.....|
00000030  1b 4f 62 4f d3 7b c7 fb  93 49 9c de c9 92 90 88  |.ObO.{...I......|
00000040  f2 ff 10 31 29 39 60 ff  00 00 00 00 01 00 00 00  |...1)9`.........|
00000050  ee af f4 41 ba 99 4b e7  01 00 00 00 05 00 00 00  |...A..K.........|
00000060  00 00 00 00 a8 45 82 05  28 90 a9 51              |.....E..(..Q|
0000006c

これを項目分けしてみます。

項目
何か 0100000000000000
項目
何か 0000000001000000

Transaction Statementのレシートっぽいですね。

項目
Size 38000000
Version 0100
Type 4321
Mosaic ID a84582052890a951
Amount 0000000000000000
Public Key 9be93593c699867f1b4f624fd37bc7fb93499cdec9929088f2ff1031293960ff
項目
何か 0000000001000000

Mosaic Resolution Statementっぽいですね。

項目
Unresolved eeaff441ba994be7
Version 0100
Type 0000
Source 0500000000000000
Resolved a84582052890a951

全部はわからなかったけど、レシートの情報が入っていることが見て取れます。