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

# はじめに

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/6ea3e957-61f6-9fe4-5967-68d31670c255.png)

レシートハッシュ（receiptsHash）にある、

`8D3DEE3481284DEA5E0C0C6E6D1410F6E0B6B95439ACD3FACC2E5E2B854E5C5E`

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

## レシートの情報

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/be6d6e9e-16fe-2d36-75ab-cb41f0fe94e1.png)

`mosaicResolutionStatements`と`transactionStatements`があります。

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

## シリアライズ

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

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

### Transaction Statement

https://github.com/nemtech/symbol-sdk-typescript-javascript/blob/v0.16.5/src/model/receipt/TransactionStatement.ts

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

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

https://github.com/nemtech/symbol-sdk-typescript-javascript/blob/v0.16.5/src/model/receipt/BalanceChangeReceipt.ts

`ReceiptVersion`と`ReceiptType`、`MosaicId`、`Amount`、`PublicKey`を結合するようです。

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

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

### Mosaic Resolution Statement

https://github.com/nemtech/symbol-sdk-typescript-javascript/blob/v0.16.5/src/model/receipt/ResolutionStatement.ts

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

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

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

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

## マークルルート

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

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

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

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

### REST

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/04370b75-3222-7850-2604-9899e4b6012a.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/f6e0a02b-a936-4ec9-442f-3e5430a6fa1d.png)

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

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

ノードのブロックが入っているフォルダには、`.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|

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