記事のディレクトリ
まず、状態ツリー
:イーサネット広場アカウントの図書に基づいており、次のように、アカウントのアドレスとアカウントの状態をマップするために必要である
私たちは、この要件を完了するために、適切なデータ構造を検索してみてください。
- 非常に効率的に、ハッシュテーブルの形式で保存された状態データを取得する場合は、アカウントのステータスデータを更新するが、唯一のブロック本体に保存された状態データから、光が、そうマークル木の構築を検討ノードマークル証明することは困難です。
- マークル木に編成簡単なアカウントデータは、ソート、あなたはすべての放出を遮断する必要がない場合は、一貫したルートハッシュを確保するためにアカウントが、桁違いが大きすぎ現実的ではありません。唯一のアカウントステータスの変更を発表した場合、それがすべての原因になりますルートノードのハッシュ矛盾ではなく、コンセンサス。
- あなたはマークル木ソートを使用する場合は、各ノードのルートハッシュは同じになりますが、あなたはコストがかかりすぎる、Merkle木を再構築する必要があり、アカウントを高めます。また、Merkle木はすぐに、更新状況データを見つけることができません。そこで我々は、新しいデータ構造マークルパトリシアトライを検討する必要があります。
1.トライ
トライプレフィックスツリーは、情報検索がより便利に、辞書です。一般的には、ジェネシスは、Goは、神が、そこならば良いが、 これらの言葉、トライ組成物は、以下のように:
トライは、次の特性があります。
- 分岐素子の各ノード26の英語の文字と終了フラグ、27分岐の最大上記例えば、範囲に依存します。エーテル(0〜F)は、終了フラグ、17のブランチの最大と一緒に、アカウントを表さ16進数で16平方。
- 効率は、キー、訪問のより見た目より長く、キー値の長さに依存して下さい。アカウント40桁の16進数でエーテルスクエアので、40の固定された長さを求めます。
- 衝突が発生していない、問題のハッシュテーブルの衝突があります。
- 入力のセットを考えると、同じ設定をトライ。
- 更新されたデータは、ちょうど地元の支店を訪問し、非常に簡単です。
2.パトリシアツリー(トライ)
また、検索および検索効率を向上させるために訪問の数を削減しながら圧縮パスプレフィックスツリーと呼ばれるパトリシア・ツリーは、あなたは、ストレージスペースを節約することができます。パトリシアツリーのトライ改良例の実施形態では、以下のように:
以下に示すような効果を圧縮データのキー値のパトリシアツリー疎分布は、より明白である
160bitを使用して衝突を防ぐために、正方形エーテル、長い非常にまばらな、アカウント、および使用パトリシアツリーデータ構造に適し。
3.パトリシア・マークル木(トライ)
パトリシア・ツリー・ポインタは、すべてのハッシュポインタを置き換え、それが構築マークルパトリシアツリーとなり、ハッシュ値のルートは、ヘッダ領域に格納され、計算することができます。
- ルートハッシュツリーが改ざんされていないことで保証され、各アカウントのステータスが改ざんされていません。
- マークル証明することにより、このような口座残高として、いずれかのアカウントの状態を証明するために使用することができます。
- マークル証明することで、あなたはアカウントが存在しないことを証明することができます。
4.変更マークルパトリシアツリー(トライ)
スクエアイーサネットマークルパトリシアツリーの修正版を使用して、マークルパトリシアツリーの間には本質的な違いはありません。例えば、図7に4つのアドレス、口座残高格納された情報(値)が、ツリー内の3つのノード、ノードの各ストレージノードに関連付けられたハッシュ値があります。
- 拡張ノード:拡張ノード、圧縮されたデータ・ストレージ・パス、バイナリデータを格納されている、すなわち、16共有ニブル。
- 支店ノード:分岐ノードは、圧縮できません。
- リーフノード:リーフノード、アカウント・ステータス・データを保存します。
また、新しいリリース時のブロック、いくつかの状態のアカウントが変更され、新しい地区はすぐに再確立ブランチへの変更、ほとんど同じデータブロックのが指している分岐履歴を占めるので、ブロック間の意志ますほとんどの州は、同じブランチを共有しています。以下に示すよう:
利点は歴史的な状態を維持するために:逆推力を行うことは容易ではない勝利への分岐点の一時的なロールバックが原因インテリジェント契約の実装に、ブロックを継続していない、と録画の開始端を保持して、ロールバックは、より便利でした。
5.アカウントの状態値記憶
アカウントステータスデータ列記憶RLP(再帰長プレフィックス)後、RLPシリアライゼーションは比較的容易に実現するために、単純な比較いるProtobuf、支持文字のみネストされた配列(バイトのネストされた配列)です。
6.ブロックコード分析
次のようにヘッダ構造領域が定義されている:
ParentHash親ハッシュブロックを示し、UncleHashハッシュブロックは叔父を表し、鉱山労働者はCoinbaseアカウントのアドレスを表し、ルートがルートハッシュツリーの状態を表し、TxHashトランザクションは、ルートハッシュツリーを表しますReceiptHashは、ツリーのルートハッシュの受信を示し、(必要に応じて調整する)難易度が難しい採掘表し、(効率的なクエリ結果が特定の条件を満たしているため)、ブルームブルームフィルタを発現GasLimitガソリンに関連付けGasUsed、時間ブロックを表します。おおよその世代時間は、MixDigest一部はナンスから計算した後、カラムから、マイニング・プロセスに関連付けられた、乱数ノンスは、マイニングの回答を表します。
// Header represents a block header in the Ethereum blockchain.
type Header struct {
ParentHash common.Hash `json:"parentHash" gencodec:"required"`
UncleHash common.Hash `json:"sha3Uncles" gencodec:"required"`
Coinbase common.Address `json:"miner" gencodec:"required"`
Root common.Hash `json:"stateRoot" gencodec:"required"`
TxHash common.Hash `json:"transactionsRoot" gencodec:"required"`
ReceiptHash common.Hash `json:"receiptsRoot" gencodec:"required"`
Bloom Bloom `json:"logsBloom" gencodec:"required"`
Difficulty *big.Int `json:"difficulty" gencodec:"required"`
Number *big.Int `json:"number" gencodec:"required"`
GasLimit uint64 `json:"gasLimit" gencodec:"required"`
GasUsed uint64 `json:"gasUsed" gencodec:"required"`
Time uint64 `json:"timestamp" gencodec:"required"`
Extra []byte `json:"extraData" gencodec:"required"`
MixDigest common.Hash `json:"mixHash"`
Nonce BlockNonce `json:"nonce"`
}
:ブロック構造を以下に示す
ヘッダ領域、トランザクション取引リストのブロック内のポインタを指すように領域ヘッダ(ヘッダ)ポインタ、叔父叔父を指すようにヘッダ。
// Block represents an entire block in the Ethereum blockchain.
type Block struct {
header *Header
uncles []*Header
transactions Transactions
// caches
hash atomic.Value
size atomic.Value
// Td is used by package core to store the total difficulty
// of the chain up to and including the block.
td *big.Int
// These fields are used by package eth to track
// inter-peer block relay.
ReceivedAt time.Time
ReceivedFrom interface{}
}
ブロック解除情報:
ヘッダ領域、トランザクションのリスト、叔父・エリア・ヘッダを含むネットワークへの情報のブロック解除にextblock。
// "external" block encoding. used for eth protocol, etc.
type extblock struct {
Header *Header
Txs []*Transaction
Uncles []*Header
}