Catapultのトランザクションの中身

Catapultの開発コードもA,B,C,D,Eと続き、次はいよいよリリースビルド候補となるFを残すだけ？となりました。
ノードへアナウンスするデータ構造もほぼ固まってきたので、ここでバイナリレベルでどのような構成になっているのか見てみましょう。


これがアグリゲートトランザクションの一例です。

```
5C010000FD779D1D31E30D0D80346F0DDD1F946B52BFF3FCF9D582F96AAE642810BCCC663C99C1AEC0CA1118C751928B925A9D9DBF6AB4DA5B3861DE6C5793F5E73F700FFF6E61F2A0440FB09CA7A530C0C64A275ADA3A13F60D1EC916D7F1543D7F057402904141000000000000000047CA8B9F17000000E000000070000000FF6E61F2A0440FB09CA7A530C0C64A275ADA3A13F60D1EC916D7F1543D7F0574039054419081FCCB41F8C8409A9B99E485E0E28D23BD6304EF7215E01A1C000100E697A5E69CACE8AA9EE381A7E38282E5A4A7E4B888E5A4ABE38082D787D9329996A177000000000000000070000000FF6E61F2A0440FB09CA7A530C0C64A275ADA3A13F60D1EC916D7F1543D7F0574039054419081FCCB41F8C8409A9B99E485E0E28D23BD6304EF7215E01A1C000100E697A5E69CACE8AA9EE381A7E38282E5A4A7E4B888E5A4ABE38082D787D9329996A1770000000000000000
```

？？？
何を書いているのか全くわかりませんね。
それではもう少しわかりやすくしてみましょう。

```
5C010000
FD779D1D31E30D0D80346F0DDD1F946B52BFF3FCF9D582F96AAE642810BCCC663C99C1AEC0CA1118C751928B925A9D9DBF6AB4DA5B3861DE6C5793F5E73F700F
FF6E61F2A0440FB09CA7A530C0C64A275ADA3A13F60D1EC916D7F1543D7F0574
0290
4141
0000000000000000
47CA8B9F17000000
E0000000
70000000
FF6E61F2A0440FB09CA7A530C0C64A275ADA3A13F60D1EC916D7F1543D7F0574
0390
5441
9081FCCB41F8C8409A9B99E485E0E28D23BD6304EF7215E01A1C
00
01
00
E697A5E69CACE8AA9EE381A7E38282E5A4A7E4B888E5A4ABE38082
D787D9329996A177
0000000000000000
70000000
FF6E61F2A0440FB09CA7A530C0C64A275ADA3A13F60D1EC916D7F1543D7F0574
0390
5441
9081FCCB41F8C8409A9B99E485E0E28D23BD6304EF7215E01A1C
00
01
00
E697A5E69CACE8AA9EE381A7E38282E5A4A7E4B888E5A4ABE38082
D787D9329996A177
0000000000000000
```
だいぶん見やすくなりましたね。僕レベルになると30秒ぐらいで改行を入れていくことができるようになります。
ここで改行を入れてくれとぼんやり光の筋が見えるのです。はい、病気ですね。

例えば1行目 `5C010000` について説明します。
 `5C 01 00 00` と二文字ずつ区切ってそれぞれが1バイトになります。
一番左が一番小さい桁を表し、右に行くにつれ大きな桁を意味します。つまり反転させて、 `0000015C` がこの項目の意味する値になります。これはデータ長を表すので 0x15C = 348 となり、トランザクションのデータの長さが348であることをノードに伝えます。

すべて反転するわけではありません。
署名や公開鍵、アドレスはそのまま文字列として扱います。

それでは最後に構造を説明します。

[角カッコ]が該当するデータの意味になります。数字はバイト数です。
switch で（丸カッコ）に該当する部分だけを読み取ります。
for eachで(丸カッコ)　で指定された回数だけ繰り返してください。

```
[データ長:4]
[署名:64]
[手数料:8]
[署名者:32]
[バージョン:2]
[トランザクション区分:2]
[締め切り:8]
switch (トランザクション区分)
{
	(転送:0x4154)
		[受信アドレス:25]
		[メッセージ長:2]
		[モザイク数:1]
		[メッセージ区分:1]
		[メッセージ:(メッセージ長)]
		for each(モザイク数)
			[モザイクID:8]
			[モザイク量:8]
	(モザイク定義)
		[ノンス:4]
		[モザイクID:8]
		[1:固定値]
		[フラグ:1]
		[可分性:1]
		[期間指定あり？:1]
		[期間指定:8]
	(モザイク供給量変更)
		[モザイクID:8]
		[増減区分:1]
		[増分:8]
	(ロック)
		[モザイクID:8]
		[期間:8]
		[ハッシュ:32]
	(ネームスペース登録)
		[ネームスペース区分:1]
		[期間:8]
		[ネームスペースID:8]
		[ネームスペース名長:1]
		[ネームスペース名:(ネームスペース名長)]
	(アドレスエイリアス)
		[アクション区分:1]
		[ネームスペースID:8]
		[アドレス:25]
	(モザイクエイリアス)
		[アクション区分:1]
		[ネームスペースID:8]
		[モザイクID:8]
	(シークレットロック)
		[モザイクID:8]
		[期間:8]
		[ハッシュアルゴリズム区分:1]
		[シークレット文字:32]
		[受信アドレス:25]
	(シークレット証明)
		未検証
	(アカウント制限アドレス)
		[アカウント制限区分:1]
		[変更数:1]
		[変更区分:1]
		[アドレス:25]
	(アカウント制限モザイク)
		[アカウント制限区分:1]
		[変更数:1]
		[変更区分:1]
		[モザイクID:8]
	(アカウント制限操作)
		[アカウント制限区分:1]
		[変更数:1]
		[変更区分:1
		[制限トランザクション区分:2]
	(リンクアカウント)
		[公開鍵:32]
		[アクション区分:1]
	(マルチシグ修正)
		[最小削除数:1]
		[最小承認数:1]
		[修正数:1]
		for each(修正数)
		{
			[修正区分:1]
			[署名公開鍵:32]
		}
	
	(アグリゲートトランザクション ボンド or コンプリート]
		[データ長:4]
		for each(データ個数=指定なし走査し終えるまで)
			[データ長:4]
			[署名者:32]
			[バージョン:2]

			switch [トランザクション区分]
			{	//上記と同じ
				[転送]
				[モザイク定義]
				[モザイク供給量変更]
				[ロック]
				[ネームスペース登録]
				[アドレスエイリアス]
				[モザイクエイリアス]
				[シークレットロック]
				[シークレット証明]
				[アカウント制限アドレス]
				[アカウント制限モザイク]
				[アカウント制限操作]
				[リンクアカウント]
				[マルチシグ修正]
			}
}


```


Catapultのノードに対して操作でできることはこれがすべてになります。
送金だけではなく、アカウントの状態変更、ネームスペースやモザイクの定義、さまざまな定義が可能です。
アグリゲートトランザクションを絡ませることで、その組み合わせ数は無数となります。

最後に動くもの紹介しておきます。
[Transaction Analyzer](https://s3-ap-northeast-1.amazonaws.com/xembook.net/xembook-sdk/snapshot/20190619/examples/001_analyzer.html)

みなさんもいろいろなトランザクションを入力して分解してみてください。