本稿について
本稿では、The ZILLIQA Technical Whitepaper Version0.1の「IV. Data Layer」の日本語訳を掲載します。プログラム的な構造体や変数を主に意図して記載されている語(プログラムの自体で記述されている語)に関しては日本語ではなく英語のまま記載します。
原文はこちらになります。
スポンサードサーチ
4. データレイヤ
大まかに言って、データレイヤ(the data layer)はZILLIQAのグローバルステートを構成するデータを定義する。その延長上で考えると、ZILLIQA内の異なるエンティティが自身のグローバルステートを更新するために必要としているデータも定義する。
A. アカウントとアドレス、ステート
ZILLIQAは(Ethereumのように)アカウントベースのシステムである。アカウントにはノーマルアカウント(normal account)とコントラクトアカウント(contract account)の2種類がある。ノーマルアカウントはEC-Schnorrの秘密鍵を生成するにより作られる。コントラクトアカウントは別のアカウントにより作られる。
それぞれのアカウントはその種類に応じて別々に導かれるアドレス(an address)で識別される。ノーマルアカウントのアドレスはそのアカウントの秘密鍵から導かれる。所与の秘密鍵skに関して、アドレスAnormalは次のように計算される160bitの値である。
Anormal = LSB160(SHA3-256(PubKey(sk)))
ここで、LSB160(·)はインプットの右端のフィールド160bit分を返し、PubKey(·)はインプットとなる秘密鍵に対応する公開鍵を返す。コントラクトアカウントのアドレスは、その作成者のアドレスとアカウント作成者が送信したトランザクション量、いわゆるアカウントナンス(account nonce)(以下で説明)から計算される。
Acontract = LSB160(SHA3-256(address||nonce))
ここで、addressは作成者のアカウントのアドレスで、nonceは作成者のナンスの値である。
各アカウント(ノーマルかコントラクトか)はアカウントステート(account state)と関連している。アカウントステートはキーバリューストアで以下に示すキーで構成される。
- account nonce(64bit):ノーマルアカウントから送信されるトランザクション数を数えるカウンタ(0から始まる)。コントラクトアカウントの場合は、当該のアカウントが行ったコントラクト生成の数をカウントする。
- balance(128bit):非負整数。アカウントが別のアカウントからトークンを受け取るたびに、受け取った量がアカウントのbalanceに加算される。アカウントが別のアカウントにトークンを送ると、当該の量がbalanceから差し引かれる。
- code hash(256bit):コントラクトのコードのSHA3-256ダイジェストを保存する。ノーマルアカウントに関しては、コードハッシュは空の文字列のSHA3-256ダイジェストである。
- storage root(256bit):各アカウントはさらに256bitのキーと256bitの値を持つキーバリューストアのストレージを持つ。storage rootはこのストレージを表すSHA3-256ダイジェストである。例えば、ストレージがトライ木であればstorage rootはトライ木のルートのダイジェストである。
ZILLIQAのグローバルステート(state)はアカウントアドレスとアカウントステートとの間のマッピングである。stateはトライ木のようなデータ構造を用いて実装される。
B. トランザクション
トランザクションは常にノーマルアカウントのアドレスから送信されて、ZILLIQAのグローバルステートを更新する。トランザクションは以下のフィールドを持つ。
- version(32bit):現行のバージョン。
- nonce(64bit):このトランザクションの送信者が送信したトランザクションの数と等しいカウンタ。
- to(160bit):宛先のアカウントアドレス。トランザクションが新規コントラクトアカウントを作成する場合、このフィールドは空の文字列のSHA3-256の右端160bitである。
- amount(128bit):宛先アドレスに移動するトランザクションの量。
- gas price(128bit):ガス(gas)はコンピュテーションの最小単位として定義される。gas priceはトランザクション処理で負担するコンピュテーションに関して送信者がガス単位に支払ってもよいと考える量である。
- gas limit(128bit):トランザクションの処理中に使用しても良いガスの最大量。
- code(無制限):コントラクトのコードを指定する拡張可能なバイト配列。トランザクションが新規コントラクトアカウントを作成する場合に限り存在する。
- data(無制限):トランザクションの処理に利用しても良いデータを指定する拡張可能なバイト配列。宛先のアドレスでコントラクトへのコールを呼び出す場合に限り存在する。
- pubkey(264bit):署名の検証に利用してよいEC-Schnorrの公開鍵。また、pubkeyフィールドはトランザクションの送信者アドレスを決定する。
- signature(512bit)データ全体に対するEC-Schnorr署名。
それぞれのトランザクションはtransaction IDでユニークに識別される。transaction IDはsignatureフィールドを除くトランザクションデータのSHA3-256ダイジェストである。
C. ブロック
ZILLIQAのプロトコルは2種類のブロック(と、これにより2つのブロックチェーン)を導入している。2種類のブロックとはトランザクションブロック(transaction blocks, TX-Block)とディレクトリサービスブロック(directory service blocks, DS-Block)である。TX-Blockはユーザが送信したトランザクションを含み、DS-Blockはコンセンサスプロトコルに参加するマイナーについてのメタデータを含む。
1)DSブロック
DS-Blockはheaderとsignatureの2つの部分に分かれる。DS-Blockのheader部分は以下のフィールドからなる。
- version(32bit):現行のバージョン。
- previous hash(256bit):親ブロックのヘッダのSHA3-256ダイジェスト。
- pubkey(264bit):このブロックヘッダに対してプルーフオブワークを行ったマイナーの公開鍵。
- difficulty(64bit):親ブロックのディフィカルティとブロックナンバーから計算できる。PoW問題の難易度を指す。
- number(256bit):祖先ブロックの数。ジェネシスブロック(the genesis block)のブロックナンバーは0である。
- timestamp(64bit):このブロックが生成された時点のUnixのtime()。
- mixHash(256bit):nonceから計算されるダイジェストで、DoS攻撃を検出できる。
- nonce(64bit):PoWの解。
DS-Blockのsignature部分は以下のフィールドからなる。
- signature(512bit):この署名はDSノードがDS-Blockのヘッダに対して署名したEC-Schnorrベースのマルチシグである。
- bitmap(1024bit):どのDSノードがマルチシグに参加したのかを記録する。bitmapをビットベクトルBで表現する。ここで、i番目のノードがヘッダに署名したのであればB[i] = 1であり、それ以外であればB[i] = 0である。
DS-BlockはDSブロックチェーン(a DS blockchain)を形成する。
2)トランザクションブロック
先に述べたように、DS-Blockはトランザクションについてコンセンサスを形成したノードに関する情報を含む。TX-BlockはどのトランザクションがDS-Block内のノードによって合意されたかに関する情報を含む。1つ1つのDS-Blockは複数のTX-Blockにリンクされる。TX-Blockはheader、data、signatureの3つの部分を持つ。headerは以下のフィールドからなる。
- type(8bit):TX-Blockは2種類ある。マイクロブロック(micro block)(0x00)とファイナルブロック(final block)(0x01)である。これらについてのさらなる情報をセクション5のDで示す。
- version(32bit):現行のバージョン。
- previous hash(256bit):親ブロックのヘッダのSHA3-256ダイジェスト。
- gas limit(128bit):1ブロックあたりのガス消費に関する現行の上限。
- gas used(128bit):個のブロック内のトランザクションにより使用されたガスの合計。
- number(256bit):祖先ブロックの数。ジェネシスブロックのブロックナンバーは0である。
- timestamp(64bit):このブロックが生成された時点のUnixのtime()。
- state root(256bit):全トランザクションが実行されファイナライズされた後のグローバルステートを表すSHA3-256ダイジェスト。
- transaction root(256bit):このブロック内に存在する全トランザクションを保存するマークルツリーのルートを表すSHA3-256ダイジェスト。
- tx hashes(それぞれ256bit):トランザクションのSHA3-256ダイジェストの一覧。トランザクションのsignature部分もハッシュ化される。
- pubkey(264bit):ブロックを提案したリーダー(leader)のEC-Schnorrの公開鍵。
- pubkey micro blocks(無制限):EC-Schnorrの公開鍵(それぞれ264bitの長さ)の一覧。このリストにはトランザクションを提案したリーダーの公開鍵が含まれる。このフィールドはファイナルブロックである場合に限り存在する。
- parent block hash(256bit):前のファイナルブロックのヘッダのSHA3-256ダイジェスト。
- parent ds hash(256bit):親DS-BlockのヘッダのSHA3-256ダイジェスト。
- parent ds block number(256bit):親DS-Blockのブロックナンバー。
TX-Blockのdata部分はトランザクションまとまりを含んでいる。以下のフィールドからなる。
- tx count(32bit):このブロック内のトランザクション数。
- tx list(無制限):トランザクションの一覧。
TX-Blockのsignature部分はEC-Schnorrベースのマルチシグを含んでいる。以下のフィールドからなる。
- signature(512bit):この署名はノードの集団がTX-Blockのヘッダに対して署名したEC-Schnorrベースのマルチシグである。署名はマイクロブロックかファイナルブロックかに応じて異なるノードの集団により生成される。署名者に関する詳細情報はセクション5のDに示す。
- bitmap(1024bit):どのノードがマルチシグに参加したのかを記録する。bitmapをビットベクトルBで表現する。ここで、i番目のノードがヘッダに署名したのであればB[i] = 1であり、それ以外であればB[i] = 0である。
ファイナルブロックがトランザクションブロックチェーン(the transaction blockchain)を形成する。トランザクションブロックにはマイクロブロックは含まれない。
(ZILLIQAホワイトペーパー日本語訳3 ←← 前)|(次 →→ ZILLIQAホワイトペーパー日本語訳5)
免責
邦訳には誤りがある場合がございます。予めご承知おき下さい。
確実な情報を知るためには冒頭に示した原文をご参照くださいますようお願いいたします。