1はじめに
イーサリアム2.0(Eth2)は、シャードPoSプロトコルを初期段階(フェーズ0と呼ばれる)で採用し、既存のPoWチェーン(Eth1チェーンと呼ばれる)と並行して実行されます。Eth1はマイナーによって駆動され、PoSチェーン(別名ビーコンチェーン)はバリデーターによって駆動されます。
ビーコンチェーンでは、バリデーターの役割は次の責任があります。
- 1)新しいブロックを作成(提案)します
- 2)新しいブロックを証明する
ビーコンチェーンのコンセンサスプロトコルは、主に次の重要なガジェットに基づいています。
- 1)フレンドリーファイナリティガジェットをキャスパーしてブロックを固めます。
- 2)フォーク選択ルールとしてのLMDGHOST
- 3)乱数を生成するRANDAO 。
上記のコンセンサスプロトコルは、バリデーターの大多数が忠実である場合に安全性と活性を保証します。
バリデーターセットは動的です。つまり、新しいバリデーターをいつでも追加でき、古いバリデーターを取り消すこともできます。新しいバリデーターの場合、一定量のEtherをステークとしてデポジットし、Eth1ネットワークを介して特定のコントラクト(デポジットコントラクトと呼ばれる)にトランザクションを送信する必要があります。すべてのデポジット履歴はデポジット契約に記録され、ビーコンチェーンはそこからデータを取得して動的バリデーターセットを維持できます。(ただし、対応する入金プロセスは後で変更されます。)
関連するコードは次のとおりです。
- https://github.com/celo-org/optics-monorepo/blob/main/solidity/optics-core/libs/Merkle.sol(Solidity)
- https://github.com/zcash/incrementalmerkletree(錆)
- https://github.com/ethereum/consensus-specs/blob/master/solidity_deposit_contract/deposit_contract.sol(Solidity)
マークルツリー関連のブログは次のとおりです。
- マークルツリーとそのブロックチェーンおよびその他の分野での応用
- マークルツリープルーフ
- Utreexo:ノードのストレージスペースを節約するためのビットコインUTXOマークルツリープルーフ
- Zcashのマークルツリー
2.保証金契約
Vyper言語で記述された預金契約では、預金履歴を効率的に保存するためにMekrleツリーデータ構造が導入されています。新しい預金を受け取ると、Merkleツリーは動的に更新されます(つまり、リーフノードは左から順番に増加します。右)。
現在の預金契約におけるマークルツリーの高さは32であり、最大2 32 2^{32}の保管をサポートします。232デポジット。マークルツリーは非常に大きいため、新しいデポジットがあると、ツリー全体が再構築されるたびにツリー全体が表示されるわけではありません。
必要な時間とスペースを削減し、ガスコストを導入するために、預金契約はインクリメンタルマークルツリーアルゴリズムを採用しています。インクリメンタルアルゴリズムはO(h)O(h)のみを必要としますO (h )高さhhのマークルツリーを再構築する(のルートを正確に計算する)ための時空間計算量h、直感的なアルゴリズムにはO(2 h)O(2 ^ h)(2 _h)時間または空間の複雑さ。インクリメンタルアルゴリズムは、2つの長さのhhhの配列は、更新されたツリーが再構築されるたびに、新しいリーフ(つまり新しいデポジット)からルートまでのチェーンのみを計算する必要があり、チェーンの計算方法は2つの配列のみを必要とします。木の高さと同じ値を達成します。線形関係の時間と空間の複雑さ。
ランタイム検証でバグが見つかりました。すべての葉が埋められている場合、マークルルートの計算は間違っています。詳細については、以下を参照してください。
sha2-256を使用して、高さが32ですべての要素が0のマークルツリーの場合、各レイヤーのハッシュ値は次のようになります。
[ '0x0000000000000000000000000000000000000000000000000000000000000000',
'0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b',
'0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71',
'0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c',
'0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c',
'0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30',
'0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1',
'0x87eb0ddba57e35f6d286673802a4af5975e22506c7cf4c64bb6be5ee11527f2c',
'0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193',
'0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1',
'0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b',
'0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220',
'0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f',
'0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e',
'0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784',
'0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb',
'0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb',
'0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab',
'0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4',
'0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f',
'0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa',
'0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c',
'0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167',
'0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7',
'0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0',
'0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544',
'0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765',
'0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4',
'0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1',
'0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636',
'0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c',
'0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7' ]
keccak256(sha3)を使用して、高さが32ですべての要素が0のマークルツリーの場合、各レイヤーのハッシュ値は次のようになります。
// keccak256 zero hashes
bytes32 internal constant Z_0 =
hex"0000000000000000000000000000000000000000000000000000000000000000";
bytes32 internal constant Z_1 =
hex"ad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5";
bytes32 internal constant Z_2 =
hex"b4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30";
bytes32 internal constant Z_3 =
hex"21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85";
bytes32 internal constant Z_4 =
hex"e58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344";
bytes32 internal constant Z_5 =
hex"0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d";
bytes32 internal constant Z_6 =
hex"887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968";
bytes32 internal constant Z_7 =
hex"ffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83";
bytes32 internal constant Z_8 =
hex"9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af";
bytes32 internal constant Z_9 =
hex"cefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0";
bytes32 internal constant Z_10 =
hex"f9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5";
bytes32 internal constant Z_11 =
hex"f8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892";
bytes32 internal constant Z_12 =
hex"3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c";
bytes32 internal constant Z_13 =
hex"c1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb";
bytes32 internal constant Z_14 =
hex"5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc";
bytes32 internal constant Z_15 =
hex"da7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2";
bytes32 internal constant Z_16 =
hex"2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f";
bytes32 internal constant Z_17 =
hex"e1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a";
bytes32 internal constant Z_18 =
hex"5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0";
bytes32 internal constant Z_19 =
hex"b46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0";
bytes32 internal constant Z_20 =
hex"c65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2";
bytes32 internal constant Z_21 =
hex"f4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9";
bytes32 internal constant Z_22 =
hex"5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377";
bytes32 internal constant Z_23 =
hex"4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652";
bytes32 internal constant Z_24 =
hex"cdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef";
bytes32 internal constant Z_25 =
hex"0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d";
bytes32 internal constant Z_26 =
hex"b8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0";
bytes32 internal constant Z_27 =
hex"838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e";
bytes32 internal constant Z_28 =
hex"662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e";
bytes32 internal constant Z_29 =
hex"388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322";
bytes32 internal constant Z_30 =
hex"93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735";
bytes32 internal constant Z_31 =
hex"8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9";
参考文献
[1]イーサリアム2.0デポジットマークルツリー
[2]イーサリアム2.0デポジット契約のフォーマル検証(パートI)
[3]2020年论文イーサリアム2.0デポジットスマートコントラクトのエンドツーエンドフォーマル検証[
4]2021年论文Dafnyを使用したインクリメンタルマークルツリーアルゴリズム