
導入
元のリンク:
https://ethresear.ch/t/effici...
導入
Ethereum 2.0 のステートレス クライアントのアイデアに従って、効率的なオンチェーンの動的マークル ツリー (マークル ツリー) を実装しました。
オンチェーン封じ込め検証。
オンチェーン追加/インプレース更新。
O(1) 保管スペースのコスト。
背景
背景
マークル ツリーは、Uniswap オンチェーン エアドロップなど、非常に低いストレージ コストでチェーン上の多数のメンバーを認証するために広く使用されています。チェーン上のすべてのユーザーについて大量のエアドロップ情報 (住所、数量など) をアップロードする必要はなく、エアドロップは次の方法でコストを大幅に節約できます。
ツリーのルート ハッシュをオンチェーンに保存する
オフチェーン計算を使用したユーザー報酬の証明
ユーザーはチェーン上にプルーフを送信することで報酬を受け取ります
さらに、オンチェーンの動的マークル ツリーにも関心が集まっています。有名な会計事務所アーンスト アンド ヤング (EY) は、動的なマークル ツリー (https://github.com/EYBlockcha...5)。ツリーのすべてのノードではなく「境界」ノードのみを保存することでツリーのストレージ コストを節約しますが、操作を追加する際の書き込みコストは O(log2(N)) となり、EVM でかなりのガスを消費する可能性があります。
基本的な考え方
マークル証明を使用して包含を検証する既存の静的マークル ツリーと同様に、オンチェーン動的ツリーの基本的な考え方は、マークル証明を再利用して、包含検証後にツリーのルート ハッシュを更新することです。ツリーを更新する手順は次のとおりです。
LeafIndex、oldLeafHash、newLeafHash、oldRootHash、proof が与えられた場合
oldLeafHash と証明を使用して rootHash を計算します。計算された rootHash != oldRoothHash の場合、包含検証は失敗します。それ以外の場合は続行します。
newLeafHash と証明を使用して newRootHash を計算します。証明が再利用される場合、newRootHash は更新されたツリーのルート ハッシュになります。
応用
応用
Merklized ERC20
ERC20 標準は、(口座、残高) のツリーをメルクライズするように変更できます。マークルプルーフは、ミント/書き込み/転送の操作に必要です。マーク化された ERC20 アプリケーションは次の可能性があります。
オンチェーン投票 - ガバナンス提案投票では、ERC20 バランス変更 (複合) やオフチェーン スナップショットのすべての履歴を保持することなく、ERC20 スナップショットを安価に使用し、スナップショットに基づいてオンチェーン投票を計算できます。
リモート流動性マイニング - リモート チェーン上のコントラクトは、ローカル ERC20 ユーザーに対してエアドロップ/流動性マイニングを実行します。ERC20 スナップショットは、分散型オラクルを通じて別のチェーンに定期的に転送されます。
サンプルコードはここにあります。
https://github.com/QuarkChain...
/SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "hardhat/console.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "./DynamicMerkleTree.sol";contract MerklizedERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => uint256) private _indices1;
uint256 private _totalSupply;
string private _name;
string private _symbol;


