- Concepts_Overview
- What is Casper?
- Design
- Economics
- アカウントと暗号鍵
- キー(Key)の型への理解
- Transactions(トランザクション)
- トランザクションのライフサイクル
- グローバルステート
- スマートコントラクト
- 認証鍵
- コールスタックへの理解
- Dictionaries(辞書)
- Binary Serialization Standardバイナリシリアライズ規格
- dAppsについて
- Glossary(用語集)
Type Serialization(型のシリアライゼーション)
Account Action Thresholds
特定のタイプのアクションを実行するときに必要となるweight(重み)の最小閾値。以下のように3つの連続したu8値としてシリアライズされます。
- deployment:u8値としてデプロイメントアクションを実行するために必要な重みの最小閾値
- key_management:u8値として鍵管理アクションを実行するために必要な重みの最小閾値
Account Config
アカウントの公開鍵、メイン財布の残高、バリデータの設定を含むaccounts.toml内における個々のアカウント設定
- public_key それ自体のバイト表現でシリアライズされるアカウントの公開鍵
- balance U512値でシリアライズされるアカウントのメイン財布の残高
- validator Option(オプション)でシリアライズされるアカウントのバリデータ設定
Account Hash
ユーザのアカウントのアドレスを表す、公開鍵のblake2bハッシュです。アカウントハッシュは、アカウントハッシュのバイトを含む32バイトのバッファとしてシリアライズされます。
Account Identifier
アカウントを検索するための識別子。ほとんどの場合、以下のいずれかで構成されます:
- PublicKey:アカウントの公開鍵
- AccountHash:アカウントの公開鍵のblake2bハッシュ
Activation Point
関連するプロトコルバージョンが適用される最初のeraです。u8タグでシリアライズされ、そのeraが genesis(初期)であるかどうかを示します。これがジェネシスである場合、続くバイトはタイムスタンプとなり、そうでない場合はera_idを示します。
- era_id:プロトコルバージョンがアクティブになる際のeraを識別するEra ID newtype
- timestamp:アクティベーションポイントがジェネシス変数の場合にtimestampとなる
AddressableEntityHash
それ自体のバイト表現にシリアライズされたアドレス指定可能なエンティティの16進数にエンコードされたアドレスです。
Approval
署名と署名者の公開鍵を含む構造体
- signature:署名のバイト表現としてシリアライズされた承認署名。署名内の最初のバイトは、Ed25519署名の場合は1となりSecp256k1の場合は2となる
- signer:PublicKeyのバイト表現にシリアライズされた承認署名者の公開鍵。PublicKeyがEd25519鍵の場合はシリアライズバッファの最初のバイトは1となり、その後に鍵そのもののバイトが続く。それ以外のSecp256k1の場合は最初のバイトが2となる
ApprovalsHash
bytesreprエンコードされた承認セットの暗号化ハッシュでありdigestとしてシリアライズされます。
AssociatedKey
マルチシグなどを目的としたAccountに限定的な権限を付与された鍵。これは、最初の4バイトはその中に保持されるキーの数と重みを表すu32値を表すBTreeMapとしてシリアライズされます。残りの部分は、シリアライズされた名前付き鍵と最初の4バイトで指定された長さの重みの繰り返しパターンで構成されています。
- account_hash:関連する鍵のaccount hash
- weight:u8値でシリアライズされる関連する鍵の重み
AvailableBlockRange
切れ目のないブロックの包括的な範囲。以下2つのフィールドを含む連続した2つのu64値としてシリアライズされる:
- low:範囲の包括的下限
- high:範囲の包括的上限
BalanceHoldAddr
バランス(残高)を保有するアドレス。以下のようにバランス(残高)を保有するアドレスタイプを記述するBalanceHoldAddrTagとしてシリアライズされます:
- Gasは、0のBalanceHoldAddrTagに保有分用のお財布URefとblock_timeが続くものとしてシリアライズされる
- Processingは、1のBalanceHoldAddrTagに保有分用のお財布URefとblock_timeが続くものとしてシリアライズされる
BalanceHoldAddrTag
BalanceHoldAddrタイプを記述するタグで、単一のu8値としてシリアライズされます。
BalanceResponse
BalanceResponseは、残高クエリへのレスポンスを行う構造体です。以下のフィールドで構成されています:
- total_balance:U512値としてシリアライズされる保有分を考慮しないお財布の合計残高
- available_balance:U512値としてシリアライズされる総残高からすべてのアクティブな保有合計を引いた利用可能残高
- total_balance_proof:与えられた値がMerkle trieに存在することの証明。TrieMerkleProofとしてシリアライズされ、鍵、値、proof_stepにて構成
- balance_holds:balance上の、時間に関連するアクティブなホールド。最初の4バイトがBlockTimeとBalanceHoldsWithProof内に保持されているBalanceHoldsWithProofの数を表すu32値を表すBTreeMapとしてシリアライズされます。残りは、最初の4バイトで決まる長さのシリアライズされたBlockTimesとBalanceHoldsWithProofsの繰り返しパターンで構成される
Bid
バリデータマップのエントリ。以下フィールドによって構造は成り立っています:
- validator_public_key:バリデータの公開鍵。PublicKeyとしてシリアライズされる
- bonding_purse:ボンディングに使用する財布。Urefとしてシリアライズされる
- staked_amount:バリデータが賭けたトークンの量 (デリゲータは含まない)。U512値としてシリアライズされる
- delegation_rate:入札のデリゲート率。32ビット整数プリミティブで署名されたi32としてシリアライズされる
- vesting_schedule:genesis(ジェネシス)バリデータの権利確定スケジュール。非ジェネシスのバリデータの場合はNone(指定なし)。オプションとしてシリアライズされる
- delegators:publicキーでインデックスされたバリデータのデリゲータ。デリゲータはBTreeMap形式でシリアライズされ、最初の4バイトがu32型の値でPublicKeyとデリゲータの数を表します。残りは、シリアライズされたPublickeysと最初の4バイトで決まるデリゲータの長さの繰り返しパターンで構成される
- inactive:バリデータが追い出された場合。1バイトでシリアライズされるブール値で、trueは1、falseは0にマップされる
BidAddr
BidAddr は、オークションシステムコントラクトの入札に関連するデータを管理します。BidAddr は、入札の種類を表す単一のu8タグとしてシリアライズされ、その後に入札自体に関する情報が続きます。以下のいずれかになります:
- Unified:古い(レガシー)バージョンと結合した入札のBidAddr。u8の0にレガシービッド(入札)を識別するaccount_hashが続く形でシリアライズされる
- Validator:バリデータの入札。u8の1とバリデータのaccount_hashでシリアライズされる
- Delegator:デリゲータの入札。u8 の 2 の後に関連付けられたバリデータの account_hashが続き、その後にデリゲータのaccount_hashが続く
- Credit:オークションのクレジットを表すBidAddr。u8の4の後にバリデータの account_hashおよび該当するクレジットのEraIdを続けた形式でシリアライズされる
BidKind
オークションの入札変数
下記表にあるように入札毎の型を表示するu8値としてシリアライズされます:
| BidKind | u8 | Description |
| Unified | 0 | 与えられたバリデータに対する全てのデリゲータを持つ古いデータ |
| Validator | 1 | バリデータのデータのみを持つ入札レコード |
| Delegator | 2 | デリゲータのデータのみを持つ入札レコード |
BlockGlobalAddr
特定のブロックに関連付けされたシングルトンの値のアドレスです。ブロックのタイムスタンプや、ブロックの実行中に発行されたメッセージの総カウントなど、ブロックの実行中に計算または設定される値です。
これは2つのu8値としてシリアライズされ、最初のu8値はカテゴリーを表し、その後に以下のように基礎となる値が続きます:
- BlockTimeはu8の0で始まり、ブロック時間のu8が続く
- MessageCountはu8の1で始まり、u8のメッセージ数が続く
BlockIdentifier
ブロックを取得するための識別子。殆どの場合、下記いずれかによって構成されています。
- hash:ハッシュでブロックの識別と取得を行います。BlockHashは、ハッシュそのもののバイト表現としてシリアライズされます
- height:Blockをその高さとともに識別および取得します。高さは、1個のu64値としてシリアライズされます
- state_root_hash:Blockをそのステート・ルート・ハッシュで識別および取得します。こ れは、ステート・ルート・ハッシュのバイト表現にシリアライズされます。state_root_hashのシリアライズされたバッファは32バイト長です
BlockSignatures
1つのブロックに対する署名のコレクションであり関連するブロックのハッシュとera IDが含まれています。
BlockSignaturesには2つのバージョンがあり、どちらかのバージョンを示すu8タグが先頭に付きます。
- BlockSignaturesV1はu8の0の後にBlockSignaturesV1が続く形でシリアライズされる
- BlockSignaturesV2はu8の1の後にBlockSignaturesV2が続く形でシリアライズされる
BlockSignaturesV1
BlockSignaturesV1は、Casper 2.0 リリース以前に作成されたブロックに適用される BlockSignaturesのレガシーバージョンです。構造は以下の通り:
- block_hash:関連ブロックのブロックハッシュ。ハッシュ自体のバイト表現としてシリアライズされる
- era_id:このブロックが作成されたeraのID。単一のu64値としてシリアライズされる
- proofs:ブロックハッシュに対するバリデータの署名を集めたブロックの証明。それは、BTreeMapとしてシリアライズされ最初の4バイトはu32値にてその中に含まれるPublicKeysとsignatures(署名)の数を表す。残りの部分は、最初の4バイトで指定された長さの公開鍵と署名の繰り返しで構成される
BlockSignaturesV2
BlockSignaturesV2は、Casper 2.0リリース以降に作成されたブロックに適用される BlockSignaturesの最新バージョンです。構造は以下の通り:
- block_hash:関連ブロックのブロックハッシュ。ハッシュ自体のバイト表現としてシリアライズされる
- block_height:ブロックの高さ。単一のu64値としてシリアライズされる
- era_id:このブロックが作成されたeraのID。単一のu64値としてシリアライズされる
- chain_name_hash:関連するブロックのチェーン名のハッシュ。ハッシュ自体のバイト表現としてシリアライズされる
- proofs: ブロックハッシュに対するバリデータの署名を集めたブロックの証明。BTreeMapとしてシリアライズされ、最初の4バイトはu32値にてその中に含まれるPublicKeys(公開鍵)とsignatures(署名)の数を表す。残りの部分は、最初の4バイトで指定された長さにてシリアライズされた公開鍵と署名の繰り返しパターンで構成される
BlockSyncStatus
個々のブロックの同期ステータス。該当ブロックのblock hashのバイト表現としてシリアライズされ、その後にブロックの高さのu64を表すオプションが続き、残りはstring(文字列)としてのacquisition_stateのバイト表現となります。
BlockTime
単一のu64値としてシリアライズされたブロック時間
BTreeMap
BTreeMapは、Casperネットワーク内のキーと値をマッピングする方法です。BTreeMapは、最初の4バイトがu32値でシリアライズされ、鍵と値の数を表しています。残りの部分は、シリアライズされた鍵と最初の4バイトで指定された長さの値の繰り返しパターンで構成されます。
BTreeSet
BTreeSetは、Casperネットワーク内に値のセットを格納する方法です。BTreeSetは、最初の4バイトがu32値でシリアライズされ、その中に保持される値の数をu32表現にて表します。残りは、最初の4バイトで指定された長さの値の繰り返し系列で構成されます。
ByteCode
コントラクトのWasmバイトのコンテナ。単一u8のBidKindとしてシリアライズされ、その後に残りのByteのサイズを表すu32値、そして記述されたとおりのByteが続きます。
Bytes
バイトの長さを表すu32値としてシリアライズされ、その後にバイトそのものが続くHex(16進数に)エンコードされたバイトです。
ByteCodeKind
単一のu8値としてシリアライズされたバイトコードのタイプ(型)。0は空のバイトコードを示し、1は最初のバージョンのCasper実行エンジンで実行されるV1CasperWasmを示します。2は最初のバージョンのCasper実行エンジンで実行されるV2CasperWasmを示します。
Caller
Callerは、呼び出し元のエンティティのIDである。これは、後述の2つのうちどちらかにてシリアライズされる:
- Initiatorは全体的な呼び出しアカウントであり、u8タグ0の後に呼び出しアカウントのaccount_hashが続くものとしてシリアライズされる
- Entityは、スマートコントラクトやシステムコントラクトのような呼び出し側のエンティティである。u8タグの1とそれに続くpackage_hashとentity_hashとしてシリアライズされる
CallStackElement
CallStackElementは、Casper 2.0リリース以前に作成されたレガシー列挙型で、コールスタック内のサブコールの起点を表す。u8タグで始まり、以下のように呼び出し元のタイプを記述する:
- Session:u8タグ0の後に呼び出し元のアカウントのaccount_hashが続く形でシリアライズされるセッションコード
- StoredSession:u8の1、続いてaccount_hash、contract_package_hash、contract_hashとしてシリアライズされるセッションへのストアドアクセス
- StoredContract:u8タグの2、contract_package_hash、contract_hashの順にシリアライズされるコントラクト
ChainNameDigest
チェーン名の暗号化ハッシュで、ハッシュ自体のバイト表現としてシリアライズされます。
ChainspecRegistry
ChainspecRegistryは、ファイル名とファイル自体のハッシュとのマッピングを含む一意のキーの変数です。このマップはChainspec.tomlを含み、Accounts.tomlとGlobalState.tomlを含むことがあります。このマップは BTreeMap としてシリアライズされ、最初の 4 バイトは文字列とダイジェスト(digest)として保持される名前の数を表すu32値を表します。残りの部分は、直列化された文字列と最初の4バイトで指定された長さのダイジェストの繰り返しパターンで構成されます。
- chainspec_raw_hashは常に含まれる
- genesis_accounts_raw_hashは、特定の状況において含まれることがある
- global_state_raw_hashは、特定の状況において含まれることがある
ChecksumRegistry
チェックサムレジストリ。BTreeMapとしてシリアライズされ、最初の4バイトはチェックサム名の文字列とダイジェストの数を表すu32値を表します。残りの部分は、シリアライズされた文字列の繰り返しパターンと最初の4バイトで指定された長さのダイジェストで構成されます。
ContractRuntimeTag
コントラクトのランタイムタグのタグであり、VmCasperV1では0、VmCasperV2では1のu8タグとしてシリアライズされます。
Delegator
バリデータ(または “デリゲート”)にステークを委任する当事者を表す。構造は以下フィールドから成り立っています:
- delegator_public_key:PublicKeyとしてシリアライズされるデリゲータの公開鍵
- staked_amount: U512値としてシリアライズされる委任者が賭けた金額
- bonding_purse:URef型の値としてシリアライズされる委任に関連付けられたボンディング財布
- validator_public_key:PublicKeyとしてシリアライズされるバリデータの公開鍵
- vesting_schedule:指定したデリゲータの入札の権利確定スケジュール。非ジェネシスのバリデータの場合はNone(指定なし)でありOptionとしてシリアライズされる
Digest
blake2bハッシュダイジェストです。ダイジェストはハッシュのバイト表現としてシリアライズされる。
DisabledVersions
無効になったコントラクトのバージョン以下を含む:
- contract_version:u32値としてシリアライズされるプロトコルのメジャーバージョン内のコントラクトのバージョン
- protocol_version_major:u32値としてシリアライズされるこのコントラクトが対応しているプロトコルのメジャーバージョン
Effects
transformのベクトルとしてシリアライズされ、実行中に生成されたすべてのトランスフォームのログ。
Entity Action Thresholds
特定のタイプのアクションを実行するときに必要な重みの最小閾値です。以下のように連続した3つのu8値としてシリアライズされます。
- deployment:デプロイメントアクションを実行するために必要な重みの最小閾値をu8値で表したもの
- upgrade_management:アップグレード管理アクションを実行するために必要な重みの最小閾値をu8値で表したもの
- key_management:鍵管理アクションを実行するために必要な重みの最小閾値をu8値で表したもの
EntityAddr
AddressableEntityのアドレス。u8 EntityKindTagに続き、以下のようにhash_addrのバイトを含む32バイトのバッファとしてシリアライズされる:
- System:u8の0としてシリアライズされその後にhash_addrが続くhash_addrが続くネイティブコントラクトの実装に関連付けられたパッケージ
- Account:u8の1としてシリアライズされその後にhash_addrが続くAccountハッシュに関連付けられているパッケージ
- SmartContract:u8の2としてシリアライズされその後にhash_addrが続くチェーン上に保存されたWasmに関連付けられたパッケージ
EntityKind
タイプを記述するu8 EntityKindTagとしてシリアライズされ、さらに以下のようなデータが続くPackageのタイプです:
- System:ネイティブ・コントラクト実装に関連付けられたパッケージ。u8の0に SystemEntityTypeが続く形でシリアライズされる
- Account:Accountハッシュに関連付けられたパッケージ。u8の1にaccount_hashが続く形でシリアライズされる
- SmartContract:u8の2にcontract runtime tagが続く形でシリアライズされ、チェーン上に保存されたWasmに関連付けられたパッケージ
EntityKindTag
Systemは0、Accountは1、SmartContractは2のu8タグとしてシリアライズされるEntityKindの変数タグです。
EntityVersionKey
u32値としてシリアライズされるProtocolVersionとEntityVersionを組み合わせた主な要素です。
EntityVersions
最初の4バイトがAddressableEntityHashesにマッピングされたEntityVersionKeysの数を示す u32値のBTreeMapとしてシリアライズされたエンティティバージョンのコレクションです。残りの部分は、シリアライズされた最初の4バイトで指定された長さであるEntityVersionKeyとAddressableEntityHashの繰り返しパターンで構成されています。
EntryPoint (Contract)
署名方法の型です。名前だけでなくインデックスでも参照できるため引数の順序は重要です。
- name:Stringとしてシリアライズされたエントリーポイントの名前
- args:このメソッドの引数。エントリーポイントに渡される引数を表す各パラメータであるParameterのリストとしてシリアライズされる
- ret:Unitとしてシリアライズされるメソッドの戻り値の型
- access:コントラクトエントリーポイントで可能なアクセス制御オプションを記述した列挙型。u8の値 1 (public) または 2 (authorized usersのList) でシリアライズされる
- entry_point_type:エントリーポイントのタイプを識別する。Sessionの場合は0、Contractの場合は1でシリアライズされる
EntryPoint (Entity)
メソッドの型シグネチャ。構造は以下フィールドにて成り立っています:
- name:Stringとしてシリアライズされたエントリーポイントの名前
- args: このメソッドの引数。エントリーポイントに渡される引数を表す各パラメータであるParameterのリストとしてシリアライズされる
- ret:Unitとしてシリアライズされるメソッドの戻り値の型
- access:コントラクトエントリーポイントで可能なアクセス制御オプションを記述した列挙型。u8の値 1 (public) または 2 (authorized usersのList) でシリアライズされる
- entry_point_type
- entry_point_payment
EntryPointAddr
エントリーポイントのアドレス。以下の2種類のいずれかでシリアライズされる:
- VmCasperV1:V1エントリーポイント。u8の0の後にEntityAddrとname_bytes (エントリーポイント名の32バイトハッシュ) が続く形でシリアライズされる
- VmCasperV2:V2 のエントリーポイント。u8の1の後にEntityAddr、Selector(u32)の順にシリアライズされる
EntrypointPayment
エントリーポイントの呼び出しと実行の代金を誰が支払うかを指定する列挙型。1つのu8バイトタグとして以下のようにシリアライズされる:
- Caller:0としてシリアライズされ、呼び出し元がコストを負担しなければならないことを示す
- DirectInvocationOnly:1としてシリアライズされ、そのコントラクトが自分自身を実行するためのコストは支払うがそれ以降のコントラクトの呼び出しの実行コストは支払わないことを示す
- SelfOnward:2としてシリアライズされ、コントラクトが自分自身とそれ以降のコントラクトの呼び出しの実行コストを支払うことを示す
EntrypointType
メソッド実行のコンテキスト。以下のいずれかとしてシリアライズされます:
- Caller:単一のu8, 0b00000000としてシリアライズされます
- DirectInvocationOnly:単一のu8, 0b00000001としてシリアライズされます
- SelfOnward:単一のu8, 0b10000000としてシリアライズされます
EntrypointV2
V2 Casper VMのエントリーポイント。セレクタを表すu32にフラグを表すu32が続く形でシリアライズされます。
EntryPoints
指定されたエンティティのエントリーポイントであり、最初の4バイトはString to EntryPointsの数を表すu32値を表すBTreeMapとしてシリアライズされます。残りの部分は、直列化されたStringと最初の4バイトで指定された長さのEntryPointsの繰り返しパターンで構成されます。
EraID
Era IDのnewtype。単一のu64値としてシリアライズされます。
EraInfo
各eraに記録されるオークションのメタデータ。これはseigniorage allocations(シニョリッジの割当)のListとしてシリアライズされます。
ExecutableDeployItem
u8の識別タグとそれに続く以下の追加バイトとしてシリアライズされるDeployの実行可能コンポーネントです:
- ModuleBytes:u8タグ0とそれに続くバイト数およびruntimeargsとしてシリアライズされます
- StoredContractByHash:AddressableEntityHashとしてのコントラクトハッシュ、エントリーポイント名のStringとruntimeargsが続く形でu8タグの1にシリアライズされます
- StoredContractByName:2のu8タグとしてシリアライズし、その後に名前付き鍵を String、エントリー・ポイント名をString、runtimeargsを指定します
- StoredVersionedContractByHash:3のu8タグにPackageHash、Optionとしてバージョン、エントリーポイントにStringとruntimeargsを指定してシリアライズします
- StoredVersionedContractByName:名前付き鍵にString、バージョンにOption、エントリポイント名にStringとruntimeargsを指定し4のu8タグにシリアライズされます
- Transfer:5のu8タグとruntimeargsでシリアライズされます
ExecutionEffect
シングルデプロイによる実行変換のジャーナル。
ExecutionResultV1
1回のデプロイの結果。Failureを0、Successを1として示すu8タグとしてシリアライズされます。以下の適切な構造に従っています:
Failure(実行に失敗した結果)
- effect:デプロイの実行effect(効果)
- transfers:deploy実行中に処理された転送の記録。Listとしてシリアライズされます
- cost:U512値としてシリアライズされるデプロイ実行コスト
- error_message:文字列としてシリアライズされる実行したデプロイに関連するエラーメッセージ
Success(実行に成功した結果)
- effect:デプロイの実行effect(効果)
- transfers:deploy実行中に処理された転送の記録。Listとしてシリアライズされます
- cost:U512値としてシリアライズされるデプロイ実行コスト
ExecutionResultV2
単一トランザクションの結果。Failureを0、Successを1として示すu8タグとしてシリアライズされます。以下の適切な構造に従っています:
Failure(実行に失敗した結果)
- effects:トランザクションの実行effect(効果)
- transfers:Listとしてシリアライズされるトランザクション実行中に処理された転送の記録
- cost:U512値としてシリアライズされるトランザクション実行コスト
- error_message:文字列としてシリアライズされる実行したトランザクションに関連するエラーメッセージ
Success(実行に成功した結果)
- effects:トランザクションの実行effect(効果)
- transfers:Listとしてシリアライズされるトランザクション実行中に処理された転送の記録
- cost:U512値としてシリアライズされるトランザクション実行コスト
Gas
Gas構造体はU512のガス量としてシリアライズされます。
Group
「ユーザーグループ」とラベルされています。バージョン管理されたコントラクトの各メソッドは、そのメソッドの呼び出しを許可された1つ以上のユーザーグループと関連付けることができます。ユーザーグループはStringとしてシリアライズされます。
Groups
最初の4バイトはユーザーグループの数を表すu32値と、その中に保持されるURefのBTreeSetsを表すBTreeMapとしてシリアライズされます。残りの部分は、シリアル化されたユーザーグループと最初の4バイトで指定された長さのBTreeSetsの繰り返しパターンで構成されます。
Keys
Global Stateにおけるkeyは以下のデータ型の何れかとなります:
- 32バイトのアカウント識別子 (呼称:”account identity key”)
- 32バイトのイミュータブルなコントラクトの識別子 (呼称:”hash key”)
- 32バイトの参照識別子 (呼称:”unforgeable reference”)
- 32バイトのtransfer(転送)識別子
- 32バイトのデプロイ情報識別子
- 32バイトの残高識別子
- 32バイトのオークションビッド(入札)識別子
- 32バイトのオークション出金識別子
- 32バイトの辞書(Dictionary)識別子
- 32バイトのシステムコントラクトの登録
- 32バイトのオークションアンボンド識別子
- 32バイトのChainspec登録
ここで注意すべき1つの例外は、EraInfoの識別子であり実際にはu64値としてシリアライズされタグ用に1バイトが追加されるということです。
Account Identity Key
このキー(鍵)の型は、グローバル・ステートのアカウント専用に使用されます。システム内のすべてのアカウントは、アカウント識別キーの元に格納されなければなりません。この鍵を表す32バイトの識別子は、関連するアカウントの作成に使われた公開鍵のblake2b256ハッシュから派生したものです(詳細はアカウントを参照)。
Hash Key
このキー(鍵)の型は、コントラクトを永久に保存するために使われます。一旦ハッシュキーにコントラクトが書き込まれると、そのコントラクトが変更されることはありません。このキーを表す32バイトの識別子は、deployハッシュのblake2b256ハッシュ(詳細はblock-structure-headを参照)に4バイトのシーケンシャルIDを連結したものである。IDはデプロイごとに0から始まり、コントラクトが格納されるたびに1ずつ増加します。このIDの目的は、同じデプロイに格納された各コントラクトが一意のキーを持つようにすることです。
Unforgeable Reference (URef)
大まかに言うと、URefは値の格納やURefに格納された値と対話するためのパーミッションの管理に使用できます。URefは、値が格納されているアドレスと、URefへのアクセス権を含むタプルです。URefの管理方法の詳細については、「Unforgeable Reference」のセクションを参照してください。
Transfer Key
このキータイプは、グローバル・ステートでのtransfer(転送)にのみ使用されます。システム内のすべての転送は、転送キーに格納されなければならず他のタイプでは格納されません。このキーを表す32バイトの識別子は、指定された転送に関連付けられた転送アドレスのblake2b256ハッシュから派生します。
DeployInfo Key
このキータイプは、特にグローバル・ステートのデプロイに関連する情報を格納するために使用されます。与えられたデプロイ情報はこのキーにのみ格納されます。このキーを表す32バイトの識別子はデプロイ自体のblake2b256ハッシュから派生します。
EraInfo Key
このキータイプは、特に特定のeraのAuctionメタデータに関連する情報を格納するために使用されます。このキーに格納されるデータ型は、指定されたeraのシニョリッジの割当てのベクトルです。このキーの識別子は、プリミティブなu64データ型をラップした新しい型でありオークション情報が格納されたeraの番号に関連します。
このキータイプは、特にグローバル・ステートのオークション入札の関連情報の格納に使用され入札情報はこのキーにのみ格納されます。このキーを表す32バイトの識別子は、関連するアカウントの作成に使用された公開鍵のblake2b256ハッシュから派生したものです(詳細はアカウントを参照)。
このキータイプは、特にグローバル・ステートにおけるオークションの出金に関連する情報の格納に使用され出金情報はこの鍵にのみ保存されます。この鍵を表す32バイトの識別子は、関連するアカウントの作成に使用された公開鍵のblake2b256ハッシュから派生したものです(詳細はアカウントを参照)。
キーのシリアライゼーション
キーのデータ型にはさまざまな種類があり、それぞれ異なるシリアライズが行われます。この章では、各変数がどのようにシリアライズされるかを詳しく説明します。シリアライズされたバッファの先頭のバイトは、シリアライズされたvariant(変数)を示すタグとして動作します。
Key | Serialization Tag |
|---|---|
Account | 0 |
Hash | 1 |
URef | 2 |
Transfer | 3 |
DeployInfo | 4 |
EraInfo | 5 |
Balance | 6 |
Bid | 7 |
Withdraw | 8 |
Dictionary | 9 |
SystemContractRegistry | 10 |
EraSummary | 11 |
Unbond | 12 |
ChainspecRegistry | 13 |
ChecksumRegistry | 14 |
BidAddr | 15 |
| Package | 16 | | AddressableEntity | 17 | | ByteCode | 18 | | Message | 19 |
- Account は、基礎となるAccountHashのバイト表現を含む32バイト長のバッファとしてシリアライズされます
- Hash は、基礎となるHash自体のバイト表現を含む32バイト長のバッファとしてシリアライズされます
- URef は、URefのアドレスとそのURefへのアクセス権を含むタプルです。URefのシリアライズされた表現は33バイト長です。最初の32バイトはURefアドレスのバイト表現であり、最後のバイトはURefのアクセス権に対応するビットを含んでいます。AccessRightsのシリアライズ方法については、この章のCLValueセクションを参照してください
- Transfer は、転送のハッシュのバイト表現を含む32バイト長のバッファとしてシリアライズされます
- DeployInfo は、Deployハッシュのバイト表現を含む32バイト長のバッファとしてシリアライズされます。Deployハッシュのシリアライズ方法については、上記のDeploy のセクションを参照してください
- EraInfoは、u64のリトルエンディアン・バイト表現を含むu64プリミティブ型をシリアライズします
- Balance は、URefアドレスのバイト表現を含む32バイトのロングバッファとしてシリアライズされます
- BidとWithdrawはどちらも識別子としてAccountHashを含むため、Accountのバリアントと同じ方法でシリアライズされます
- Dictionaryは、辞書項目の識別名をハッシュ化したシードURefのバイト表現を含む32バイト長のバッファとしてシリアライズされます
- SystemContractRegistry は、ゼロの32バイト長のバッファとしてシリアライズされます
- EraSummary は 32バイト長のゼロのバッファとしてシリアライズされる
- Unbond は識別子としてAccountHashを含むため、Accountのバリアントと同じ方法でシリアライズされます
- ChainspecRegistry は、32バイト長の1のバッファとしてシリアライズされます
- ChecksumRegistry は、32バイト長のゼロのバッファとしてシリアライズされます
- BidAddr は3種類のうちの1つである:
- Unified は、タグ0の後にレガシービッドのバイト表現を含む32バイト長のバッファが続くものとしてシリアライズされる
- Validator は、タグ1とその後にバリデータのハッシュをバイト単位で格納した32バイト長のバッファを持つものとしてシリアライズされる
- Delegator はタグ2の後に関連するバリデータのハッシュを格納した32バイト長のバッファと指定されたデリゲータのハッシュを格納した32バイト長のバッファを付加してシリアライズされる
Permissions
値に対して実行できるアクションには、read、write、addの3種類があります。addがwriteとは別に呼び出されるのは、可換性をチェックするためです。利用可能なアクションは、キータイプとコンテキストに依存します。あるキータイプは、コントラクトAPIを介してスマート・コントラクトによる制御されたアクセスのみを許可し、他のキータイプはシステム自体によって生成され使用される値を参照し、スマート・コントラクトには全くアクセスできないが、オフチェーン・クエリによって読み取ることができます。以下の表にまとめています:
| Key | Type Available Actions |
|---|---|
| Account | Read + Add (via API) |
| Hash | Read |
| URef | Read + Write and/or Add |
| Transfer | System |
| Deploy | System |
| EraInfo | System |
| Balance | Read (via API) |
| Bid | System |
| Withdraw | System |
| Dictionary | Read (via API) |
| SystemContractRegistry | Read (via API) |
| Unbond | System |
| ChainspecRegistry | Read (via API) |
URefの場合のパーミッション管理方法については、URef permissionsをご参照くださいませ。
MessageTopics
コントラクトレベルのメッセージのトピック。BTreeMapとして最初の4バイトはu32値でシリアライズされ、その中に含まれるtopic_name文字列とtopic_name_hashの数を表します。残りの部分は、最初の4バイトで指定された長さの、シリアライズされたtopic_nameと topic_name_hashの繰り返しパターンで構成されます。
MessageTopicSummary
グローバル・ステートに格納されるメッセージ・トピックの概要。message_countのu32値の後にBlockTimeが続くものとしてシリアライズされます。
Motes
U512値としてシリアライズされたMotesの数を表す構造体です。
NamedArg
コントラクトの名前付き引数。Stringと関連するCLValueの組み合わせでシリアライズされます。
NamedKey
Casper Key型への文字列識別子のマッピング。BTreeMapとしてシリアライズされ、最初の4 バイトが名前付き鍵と値の数を表すu32値を表します。
- name:エントリの名前。文字列としてシリアライズされる
- key:エントリーの値で、Casper Key型である
アカウント構造の名前付きキーの部分は、ここで説明するように文字列から Casper Key 値へのマッピングとしてシリアライズされます。
NamedKeyAddr
EntityAddrとしてシリアライズされたNamedKeyアドレスの後に、文字列の長さを表すu8と文字列自体の32バイト表現が続きます。
NamedKeyValue
NamedKey値。CLValueとしてシリアライズされたnamed_keyの後に、同じくCLValueとしてシリアライズされたキーの名前が続きます。
NamedKeys
名前付きキーのコレクション。BTreeMapとしてシリアライズされ、最初の4バイトは名前とキーの数を表すu32値です。残りの部分は、最初の 4 バイトで指定された長さの名前とキーの繰り返しパターンで構成されます。
Operation
デプロイの実行中に行われる操作。以下を含む:
- key:Stringとしてシリアライズされたフォーマットされたキーの文字列
- kind: OpKind、実行された操作のタイプ。以下の表に基づきシングルバイトとしてシリアライズされる:
| OpKind | Serialization |
|---|---|
| Read | 0 |
| Write | 1 |
| Add | 2 |
| NoOp | 3 |
Package
エンティティ、メタデータ、セキュリティ・コンテナを定義する構造体。この構造体は以下のフィールドで構成される:
- access_key
- versions: 与えられたハッシュに関連するエンティティバージョンの配列
- disabled_versions
- groups
- lock_status
PackageHash
AddressableEntityに関連付けられたパッケージの16進数にエンコードされたアドレスで、それ自身のバイト表現としてシリアライズされます。
PackageStatus
パッケージのロック状態。trueはロックされたパッケージを表し、falseはアンロックされたパッケージを表すbooleanとしてシリアライズされます。
Parameter
名前の後にCLTypeが続く構造になっているメソッドへのパラメータです。これは、CLTypeが続くStringとしてシリアライズされます。
ProtocolVersion
Casperプラットフォームのプロトコルバージョンを示すnewtypeです。各バージョン、メジャー、マイナー、パッチを順に示す3つのu32値としてシリアライズされます。
PublicKey
アルゴリズム・タグの接頭辞を含む、16進数にエンコードされた暗号化公開鍵。PublicKeyにてシリアライゼーションを確認できます。
RewardedSignatures
特定の過去のブロックに対する最終署名の識別子のリスト。これは、単一の先祖ブロックに対する署名を記述するSingleBlockRewardedSignaturesのベクトルとしてシリアライズされます。最初のエントリは親ブロックのシグネチャを表し、2番目は親の親のシグネチャを表す 等。
RuntimeArgs
スマートコントラクトに渡される引数のコレクションを表します。タプルで構成されるListとしてシリアライズされます。
SeigniorageAllocation
シニョリッジ割り当てに関する情報。
その通貨割り当てがバリデータのものである場合は、バリデータのPublicKeyの後にU512の金額が続く形でシリアライズされます。
デリゲータの場合は、デリゲータのPublicKeyとバリデータのPublicKey、そしてU512の順にシリアライズされます。
SemVer
メジャーバージョンとマイナーバージョン、そしてパッチバージョンを表す3つのu32としてシリアライズされるセマンティックバージョンの構造体です。
Signature
signature(署名)は暗号プリミティブ署名のバイト表現をシリアライズします。シグネチャの最初のバイトは、Ed25519シグネチャの場合は1、Secp256k1の場合は2となります。
Stored Values
グローバル・ステートに格納される値はStoredValueです。StoredValueは、以下の3種類のうちの1つの変数となります:
CLValueとcontractについては後述します。アカウントについての詳細はaccounts-headにてご確認いただけます。
各StoredValueは、グローバル・ステートに書き込まれる際にシリアライズされます。シリアライズのフォーマットは、StoredValueのどの変数であるかを示すシングルバイトのタグと変数のシリアライズからなります。各変数のタグは以下の通りです:
- CLValue is 0
- Account is 1
- Contract is 2
CLTypeのシリアライゼーションの詳細は以下のセクションにあります。CLValueのシリアライゼーション・フォーマットをベースにし、contractとaccountのシリアライゼーション・ルールを簡潔に書くことができます:
- contract は、CLTypeがTuple3(List(U8), Map(String, Key), Tuple3(U32, U32, U32))に等しいデータと同じようにシリアライズされる
- account は、CLTypeがTuple5(ByteArray(U8, 32), Map(String, Key), URef, Map(ByteArray(U8, 32), U8), Tuple2(U8, U8))に等しいデータと同じようにシリアライズされる
注:Tuple5は現在サポートされているCLTypeではないが、タプル1、タプル2、タプル3の場合ジェネラライズ方法はどのサイズのタプルでもルールは明確です。
SystemContractRegistry
SystemContractRegistryは、システムコントラクトの名前とContractHashのマッピングを行う一意のキーです。これには、Mint、Auction、HandlePaymentそしてStandardPayment が含まれます。これはBTreeMapとしてシリアライズされ、最初の4バイトは文字列としての名前とその中に保持されるContractHashesの数を表すu32値を表します。残りの部分は、シリアライズされた文字列と、最初の4バイトで指定された長さのContractHashの繰り返しパターンで構成されます。
SystemEntityType
以下の表に従って、コントラクトを識別する単一のu8タグとしてシリアライズされるシステムコントラクトのエンティティタイプ:
| Tag | System Contract |
|---|---|
| 0 | Mint |
| 1 | HandlePayment |
| 2 | StandardPayment |
| 3 | Auction |
TimeDiff
シングル u64値としてシリアライズされる人間が読み取り可能な2つのタイムスタンプの間隔
Timestamp
単一のu64値にシリアライズされRFC 3339に従ってフォーマット化されたタイムスタンプ
TopicNameHash
トピック名のblake2bハッシュ。トピック名のハッシュバイトを持つ32バイトバッファにシリアライズされるトピック名のハッシュ
TransferAddr
それ自体のバイト表現にシリアライズされる16進数にエンコードされたtransfer(転送)アドレス
TransformKindV1
デプロイ実行時に実行される実際の変換。以下の表に従って、実行されたトランスフォームのタイプを示す単一のu8値としてシリアライズされます。残りのバイトは、記載されている情報とシリアライズを表します。
| Transform Type | Serialization | Description |
|---|---|---|
| Identity | 0 | 影響のない変換 |
| Write_CLValue | 1 | 与えられたCLValueをグローバルステートへ書き込みます |
| Write_Account | 2 | 与えられたAccountをグローバルステートへ書き込みます |
| Write_Contract_WASM | 3 | スマートコントラクトのWasmをグローバルステートへ書き込みます |
| Write_Contract | 4 | スマートコントラクトをグローバルステートへ書き込みます |
| Write_Contract_Package | 5 | contract packageをグローバルステートへ書き込みます |
| Write_Deploy_Info | 6 | 与えられたDeployInfoをグローバルステートへ書き込みます |
| Write_Transfer | 7 | 与えられたTransferをグローバルステートへ書き込みます |
| Write_Era_Info | 8 | 与えられたEraInfoをグローバルステートへ書き込みます |
| Write_Bid | 9 | 与えられたBidをグローバルステートへ書き込みます |
| Write_Withdraw | 10 | 与えられたWithdrawをグローバルステートへ書き込みます |
| Add_INT32 | 11 | 与えられたi32の追加 |
| Add_UINT64 | 12 | 与えられたu64の追加 |
| Add_UINT128 | 13 | 与えられたU128の追加 |
| Add_UINT256 | 14 | 与えられたU256の追加 |
| Add_UINT512 | 15 | 与えられたU512の追加 |
| Add_Keys | 16 | 与えられた名前付き鍵のコレクションの追加 |
| Failure | 17 | エラーメッセージを含む失敗した変換 |
TransformKindV2
デプロイ実行時に実行される実際の変換。以下の表に従って、実行されたトランスフォームのタイプを示す単一のu8値としてシリアライズされます。残りのバイトは、記載されている情報とシリアライズを表します。
| Transform Type | Serialization | Description |
|---|---|---|
| Identity | 0 | グローバルステートから読み取った結果として作成され影響のない変換 |
| Write | 1 | グローバルステートに新しい値を書き込みます |
| AddInt32 | 2 | 与えられたi32の追加 |
| AddUInt64 | 3 | 与えられたu64の追加 |
| AddUInt128 | 4 | 与えられたU128の追加 |
| AddUInt256 | 5 | 与えられたU256の追加 |
| AddUInt512 | 6 | 与えられたU512の追加 |
| AddKeys | 7 | 与えられた名前付き鍵のコレクションの追加 |
| Failure | 8 | エラーメッセージを含む失敗した変換 |
| Prune | 9 | 指定されたキーのグローバルステートエントリへのパスを削除します。刈り込まれた要素は、以前に生成されたグローバルステートのルート・ハッシュから到達可能なままですが、次に生成されるグローバルステートのルート・ハッシュとそれ以降の状態には含まれません。 |
TransformEntry
デプロイ実行中に実行された変換
TransformV1
A legacy transform struct serialized as a String of the key followed by the transformkindv1.
Transformv2
実行されたトランスフォームを表す構造体で、キーの後にtransformkindv2が続くStringとしてシリアライズされます。
UnbondingPurse
アンボンディングに使用する財布(パース)。以下によって成り立っている構造体です:
- bonding_purse:URefとしてシリアライズされるボンディングパース
- validator_public_key:PublicKeyとしてシリアライズされるバリデータの公開鍵
- unbonder_public_key:PublicKeyとしてシリアライズされるボンドしていない公開鍵
- era_of_creation:EraIdのnewtypeとしてu64値にシリアライズされる対象のアンボンドリクエストが作成されたEra
- amount:U512値としてシリアライズされるアンボンドする合計値
- new_validator:公開鍵を含むOptionとしてシリアライズされる再度デリゲートされるバリデータの公開鍵
ValidatorBid
バリデータマップのエントリ。この構造体は以下のフィールドで構成される:
- validator_public_key:PublicKeyとしてシリアライズされデリゲータがデリゲートするバリデータの公開鍵
- bonding_purse:URef型の値としてシリアライズされるデリゲーション(委任)に紐づいたボンディングパース
- staked_amount:U512値としてシリアライズされるデリゲータ(委任者)がステークしいる合計
- delegation_rate:u8値としてシリアライズされるデリゲート(委任)レート
- vesting_schedule:Optionでシリアライズされる提供されたデリゲータービッドの権利確定スケジュール。非ジェネシスのバリデータである場合はNone(指定なし)となります。
- inactive:booleanでシリアライズバリデータの無効状態
ValidatorChange
以下の通りu8としてシリアライズされる2つのera間におけるバリデータの状態変化:
| Tag | Change |
|---|---|
| 0 | Added |
| 1 | Removed |
| 2 | Banned |
| 3 | Cannot Propose |
| 4 | Seen as Faulty |
ValidatorConfig
bonded_amountにシリアライズされu8としてdelegation_rateが後続するバリデータアカウントの設定
ValidatorCredit
バリデータクレジットの記録を表記する以下フィールドを持つ構造体:
- validator_public_key:バリデータの公開鍵
- era_id:クレジットが作成されたera ID
- amount:U512によるクレジット合計値
WithdrawPurse
1.5にてUnbondingPurseに置き換えられた案ボンディングに使用されたお財布(パース)。1.5以前のWithdrawPursesはUnbondingPursesとされており現在は履歴データで構成されています。