TransferTransactionのスキーマを読み解こうその４

# トランザクションのスキーマを読み解く

:::note
ここの部分を読み解く上で重要なキーワードが３つあります

・シリアライズ
複数の要素を一列に並べる操作や処理のこと。単にシリアライズといった場合には、
プログラムの実行状態や複雑なデータ構造などを
一つの文字列やバイト列で表現する「直列化」を指すことが多い。

様々な要素を組み合わせた複合的なデータや、
コンピュータで実行中のプログラムがメインメモリ上に展開しているオブジェクトなどを、
一定のデータ形式や変換規則に従って文字列やバイト列に変換し、
保存したり送受信できるようにすることを指す。
:::

:::note
・エンティティ
実体、存在、実在（物）、本質、本体などの意味を持つ英単語。
ITの分野では、何らかの標識や識別名、所在情報によって指し示される、
独立した一意の対象物をエンティティということが多い。

具体的にどんな存在のことをエンティティと呼ぶかは分野や製品によって異なるため一概には言えないが、
一つの物事を表すひとまとまりのデータの集合などを意味することが多い。
類義語には「インスタンス」（instance）、「オブジェクト」（object）などがある。
:::

:::note
・プレフィックス（英：prefix）とは

その単語なり何なりの前（頭）にくっつく文字のこと
ITの分野では、番号や符号、識別名などの先頭部分に付加し、
何らかの意味や情報を表す短い部分のことをプレフィックスということが多い。
例えば、プログラムコード中の変数名や関数名などで、
「strSomeStringValue」の “str” や「getSomeProperty（）;」の “get” のように、
データ型や機能などを示す先頭の短い符号がプレフィックスである。
:::

```
abstract struct Transaction
	inline SizePrefixedEntity
	inline VerifiableEntity
	inline EntityBody

	# transaction type
	type = TransactionType

	# transaction fee
	fee = Amount

	# transaction deadline
	deadline = Timestamp
```

まずabstractとなっているので、これは色々な形で継承されるという認識でいます。
（つまるところ展開先でいい感じに追加項目とかあるよ見たい感じですかね）

そして

```
	inline SizePrefixedEntity
	inline VerifiableEntity
	inline EntityBody
```

この三つのスキーマを展開しています。

https://github.com/symbol/symbol/blob/dev/catbuffer/schemas/symbol/entity.cats

このページでそれぞれ確認できるのですが

### SizePrefixedEntity

こちらはプレフィックス（ヘッダ）としてサイズが明記されているエンティティのシリアライズ

エンティティのサイズ（バイト）を指定します

このサイズにはエンティティのヘッダーとペイロードが全て含まれます。
すなわち、サイズフィールドは構造体のドキュメントで報告されたサイズと一致します。（もしあれば変数部分も）

となっています。

ちなみに定義上はこのような感じになっています。

```
# Serialization of an entity that has its size stated as a prefix (header).
サイズをプレフィックス（ヘッダ）として記述した実体をシリアライズする。
inline struct SizePrefixedEntity
	# Entity size in bytes.
	#
	# This size includes the header and the full payload of the entity.
	# I.e, the size field matches the size reported in the structure documentation
	# (plus the variable part, if there is any).
　　　　　　　　# エンティティのサイズ（バイト）。
	#
	# このサイズにはエンティティのヘッダとペイロード全体が含まれます。
	# すなわち、サイズフィールドは構造体文書で報告されたサイズと一致します。
	# (変数がある場合はその部分も加えて)。
	size = uint32
```

つまりSizePrefixedEntityはsizeをuint32の型情報の変数として持ちますという定義になります

![スクリーンショット 2022-06-24 2.13.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/8d186622-c63e-b800-6ab8-c9b8b69e4f0d.png)


### VerifiableEntity

```
inline struct VerifiableEntity
	# Reserved padding to align Signature to an 8-byte boundary.
　　　　　　　　Signatureを8バイト境界に揃えるための予約パディング。
	verifiable_entity_header_reserved_1 = make_reserved(uint32, 0)

	# Entity's signature generated by the signing account.
　　　　　　　　署名用アカウントで生成されたエンティティの署名。
	signature = Signature
```

まずはSizePrefiexdEntityが４バイトだったので、探すのが大変になるので、８バイトの区切りになるように
verifiable_entity_header_reserved1という４バイトが定義されます。

![スクリーンショット 2022-06-24 2.21.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/c92edccf-5a07-e695-fb4f-3539d6ca917c.png)


ここではアカウントによって署名されるべき実体のシリアライズとなっています。

https://github.com/symbol/symbol/blob/dev/catbuffer/schemas/symbol/types.cats#L100-L103

Signatureはここで定義されていて、

```
# A 64-byte (512 bit) array certifying that the signed data has not been modified.
署名されたデータが変更されていないことを証明する64バイト（512ビット）の配列。
#
# Symbol currently uses [Ed25519](https://ed25519.cr.yp.to/) signatures.
using Signature = binary_fixed(64)
```

![スクリーンショット 2022-06-24 2.25.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/e2760711-727e-f536-6538-8571954a74fd.png)


### EntityBody

```
# Serialization of an entity. エンティティの直列化。
#
# An entity could be a [Block](/concepts/block.html) or a エンティティは、[Block](/concepts/block.html)や
# [Transaction](/concepts/transaction.html).[Transaction](/concepts/transaction.html).
inline struct EntityBody
	# Public key of the signer of the entity.
    エンティティの署名者の公開鍵。
	signer_public_key = PublicKey
	# Reserved padding to align end of EntityBody to an 8-byte boundary.
    EntityBody の末尾を 8 バイト境界に揃えるための予約パディング。
	entity_body_reserved_1 = make_reserved(uint32, 0)
	# Version of this structure.
    この構造体のバージョン。
	version = uint8
	# Network on which this entity was created.
    このエンティティが作成されたネットワーク。
	network = NetworkType
```

networkTypeはここで定義されています。

https://github.com/symbol/symbol/blob/dev/catbuffer/schemas/symbol/entity.cats#L4



```
# Enumeration of network types.
ネットワークの種類を列挙したもの。
enum NetworkType : uint8
	# Public network.
	MAINNET = 0x68

	# Public test network.
	TESTNET = 0x98
```

![スクリーンショット 2022-06-24 2.32.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/b6ebf68f-ee43-730b-0b7a-2dec12aa7fab.png)


## 残るはこのスキーマのみです

```
	# transaction type
	type = TransactionType

	# transaction fee
	fee = Amount

	# transaction deadline
	deadline = Timestamp
```

TransactionTypeはuint16の型です。

Amountはuint64の型です

Timestampはuint64の型です

![スクリーンショット 2022-06-24 2.34.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/932df12b-d53c-979f-a779-97894bc02caf.png)

最後にまとめるとこんな感じかな？

![スクリーンショット 2022-06-24 10.15.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/59ff1479-8858-254f-071d-83d8e266927a.png)


これ確かに８バイト区切りになってるわ。

次はトランスファートランザクションボディです。