トランザクションのスキーマを読み解く
ここの部分を読み解く上で重要なキーワードが3つあります
・シリアライズ
複数の要素を一列に並べる操作や処理のこと。単にシリアライズといった場合には、
プログラムの実行状態や複雑なデータ構造などを
一つの文字列やバイト列で表現する「直列化」を指すことが多い。
様々な要素を組み合わせた複合的なデータや、
コンピュータで実行中のプログラムがメインメモリ上に展開しているオブジェクトなどを、
一定のデータ形式や変換規則に従って文字列やバイト列に変換し、
保存したり送受信できるようにすることを指す。
・エンティティ
実体、存在、実在(物)、本質、本体などの意味を持つ英単語。
ITの分野では、何らかの標識や識別名、所在情報によって指し示される、
独立した一意の対象物をエンティティということが多い。
具体的にどんな存在のことをエンティティと呼ぶかは分野や製品によって異なるため一概には言えないが、
一つの物事を表すひとまとまりのデータの集合などを意味することが多い。
類義語には「インスタンス」(instance)、「オブジェクト」(object)などがある。
・プレフィックス(英: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
この三つのスキーマを展開しています。
このページでそれぞれ確認できるのですが
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の型情報の変数として持ちますという定義になります
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が4バイトだったので、探すのが大変になるので、8バイトの区切りになるように
verifiable_entity_header_reserved1という4バイトが定義されます。
ここではアカウントによって署名されるべき実体のシリアライズとなっています。
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)
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はここで定義されています。
# Enumeration of network types.
ネットワークの種類を列挙したもの。
enum NetworkType : uint8
# Public network.
MAINNET = 0x68
# Public test network.
TESTNET = 0x98
残るはこのスキーマのみです
# transaction type
type = TransactionType
# transaction fee
fee = Amount
# transaction deadline
deadline = Timestamp
TransactionTypeはuint16の型です。
Amountはuint64の型です
Timestampはuint64の型です
最後にまとめるとこんな感じかな?
これ確かに8バイト区切りになってるわ。
次はトランスファートランザクションボディです。