俺は何がわからないのかを知るところから始める

# ことのあらまし

https://www.youtube.com/watch?v=hqvgXGcCVT0

解説動画を作るつもりが何も解説できなかった。のでまず、何がわかっていなかったのか？を徹底的に洗い出す。

ブロックごとに分けてわからなかったところを出していけば、ポイントが見えてくるはず。

そういった感じでやっていこう。

# トランザクションのデータの構成

まずこのトランザクションのデータの構成を調べるところが難しい。
どうすればいいのか？となっている。

おそらくpayloadを取得すればいいのだから。。。

payload,,,payload,,,ん？
待てよ、そういえばpayloadってsymbol-sdk v2でトランザクションを実施したときに取れたよな。

```
symbol-ts-lesson$ npx ts-node transactions/transaction-create.ts 
Payload: C70000000000000026B3758873B49AB88846F4357C34000B40C998A3E6BF2487D989ACC3564DE86789A00AB2A9566BE64498EA2CB2B66A2E5C66444DD55D5298D34D5305C9B3BD018DEB6986E0B9DC5F4A71E0F73BB437567B156730BFCD3F133B977B43152EF4920000000001985441BC4D000000000000124E70B7030000009826EF1876CC413F231C3D9BC850E80FF6ACCB1A9EDB7BF41700010000000000C8B6532DDB16843A8096980000000000005468697320697320612074657374206D657373616765
Transaction Hash: 0EEB86EB4844CC9B653316E6455C36CF5B87CB2A7E4ECA3B320828BF657DB93F
TransactionAnnounceResponse {
  message: 'packet 9 was pushed to the network via /transactions'
}
```

とれたはsymbol-sdkv2ではそうそう

```
  const signedTransaction = account.sign(transferTransaction, networkGenerationHash!);
  console.log('Payload:', signedTransaction.payload);
```

アカウントで署名するときにpayloadが取れるんやった。

多分そっからpayloadを取ってきてその構成を調べとるんやな。

```
  C700000000000000 // size reserved1
  26B3758873B49AB8 // signature開始
  8846F4357C34000B
  40C998A3E6BF2487
  D989ACC3564DE867
  89A00AB2A9566BE6
  4498EA2CB2B66A2E
  5C66444DD55D5298
  D34D5305C9B3BD01 // signatureここまで
  8DEB6986E0B9DC5F // signer開始
  4A71E0F73BB43756
  7B156730BFCD3F13
  3B977B43152EF492 // signerここまで
  0000000001985441 // reserved2 version networkType txType
  BC4D000000000000 // deadline
  124E70B703000000 // fee
  9826EF1876CC413F // recipientAddress　ここから
  231C3D9BC850E80F
  F6ACCB1A9EDB7BF4 // recipientAddress ここまで
  1700010000000000 // messageSize mosaicCount txReserved
  C8B6532DDB16843A // mosaicId
  8096980000000000 // mosaicAmount
  0054686973206973 // message　ここから
  2061207465737420
  6D657373616765　　　　　　// message ここまで
```

まずここで詰まっている。

https://qiita.com/nem_takanobu/items/09b6b687f3cbe10af945

こっちの記事でのPayloadの構成と微妙に異なっているので、この違いはなんで発生しているのかもわからないし。。。
難しい。

最後の // messageのところは可変長タイプらしくその３行上にあるmessageSizeで長さが変わっていくみたいになるそうです。

# トランザクションのデータ構成仕様

```
struct TransferTransaction
	TRANSACTION_VERSION = make_const(uint8, 1)
	TRANSACTION_TYPE = make_const(TransactionType, TRANSFER)

	inline Transaction
	inline TransferTransactionBody
```

実際には３つぐらいページには定義されている感じがあって


```
import "transaction.cats"

# Shared content between TransferTransaction and EmbeddedTransferTransaction.
inline struct TransferTransactionBody
	# recipient address
	recipient_address = UnresolvedAddress

	# size of attached message
	message_size = uint16

	# number of attached mosaics
	mosaics_count = uint8

	# reserved padding to align mosaics on 8-byte boundary
	transfer_transaction_body_reserved_1 = make_reserved(uint8, 0)

	# reserved padding to align mosaics on 8-byte boundary
	transfer_transaction_body_reserved_2 = make_reserved(uint32, 0)

	# attached mosaics
	@sort_key(mosaic_id)
	mosaics = array(UnresolvedMosaic, mosaics_count)

	# attached message
	message = array(uint8, message_size)

# Send mosaics and messages between two accounts.
struct TransferTransaction
	TRANSACTION_VERSION = make_const(uint8, 1)
	TRANSACTION_TYPE = make_const(TransactionType, TRANSFER)

	inline Transaction
	inline TransferTransactionBody

# Embedded version of TransferTransaction.
struct EmbeddedTransferTransaction
	TRANSACTION_VERSION = make_const(uint8, 1)
	TRANSACTION_TYPE = make_const(TransactionType, TRANSFER)

	inline EmbeddedTransaction
	inline TransferTransactionBody
```

まずこういったファイルの読み方がわからん。（.cats拡張子なんて聞いたことねーし）

なるほど、つまるとことcatbufferのファイルの読み方を理解するところからスタートですね。

https://qiita.com/kazumasamatsumo/items/e35e5978b7d564f3e732

作りました。

これによると
structでは構造体を定義しますよという形になるので。

```
struct TransferTransaction
	TRANSACTION_VERSION = make_const(uint8, 1)
	TRANSACTION_TYPE = make_const(TransactionType, TRANSFER)

	inline Transaction
	inline TransferTransactionBody
```

これは言葉に直すと、

1. TransferTransactionという構造体を定義します
1. その中に定数が二つあります。
1. １つ目はTRANSACTION_VERSIONという名前にして、make_constから定数を作成します。この場合はmake_constはuint8の型で、数値は1を設定する定数になります
1. TRANSACTION_TYPEはmake_constから定数を作成したものになります。make_constの第一引数には型や構造体、enumなどの定義されたものが入ると思われ、第二引数にはその対応する数値、もしくは型に適応したパラメータが入ると思われます。
1. inline Transactionはトランザクション構造体を展開します
1. inline TransferTransactionBodyはトランスファートランザクションボディの構造体を展開します。


それぞれ定義されている場所を参照して、どのような定義になっているのかを確認しましょう。

そうなると、その定義の中にもいろいろinlineされているものなどがわかってくるので、それを一つずつ読み解いていく必要があります。

なのでまずはこのトランザクションの構造体がどのように定義されていて、定義ファイルはネストされているはず、別ファイルに格納されて、独立している（多分この考え方かなあと）

https://e-words.jp/w/DRY%E5%8E%9F%E5%89%87.html#:~:text=DRY%E5%8E%9F%E5%89%87%E3%81%A8%E3%81%AF%E3%80%81%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2,%E9%81%BF%E3%81%91%E3%82%8B%E3%81%B9%E3%81%8D%E3%81%A8%E3%81%99%E3%82%8B%E8%80%83%E3%81%88%E6%96%B9%E3%80%82


なので、読みにくくなるんよな、構造体とかどこのファイルに読みにいけばいいのかリンクもないからGithubのコードやと見るのに結構コツがいるんよな。

なので最終的な結果を以下のようにしていると思われます。

```
inline Transaction
	inline SizePrefixedEntity
		size = uint32
	inline VerifiableEntity
		verifiable_entity_header_reserved_1 = make_reserved(uint32, 0)
		signature = Signature
			using Signature = binary_fixed(64)
	inline EntityBody
		signer_public_key = PublicKey
			using PublicKey = binary_fixed(32)
		entity_body_reserved_1 = make_reserved(uint32, 0)
		version = uint8
		network = NetworkType
			enum NetworkType : uint8
	type = TransactionType
		enum TransactionType : uint16
	fee = Amount
		using Amount = uint64
	deadline = Timestamp
		using Timestamp = uint64
inline TransferTransactionBody
	recipient_address = UnresolvedAddress
		using UnresolvedAddress = binary_fixed(24)
	message_size = uint16
	mosaics_count = uint8
	transfer_transaction_body_reserved_1 = make_reserved(uint8, 0)
	transfer_transaction_body_reserved_2 = make_reserved(uint32, 0)
	@sort_key(mosaic_id)
		mosaics = array(UnresolvedMosaic, mosaics_count)
			mosaic_id = UnresolvedMosaicId
				using UnresolvedMosaicId = uint64
			amount = Amount
				using Amount = uint64
	message = array(uint8, message_size)
```