timeline-arrowインテグレーションガイド

zERC20 をアプリケーションにインテグレーションする方法

circle-info

SDK を使いたい場合(プライベート送信・Scan・Wrap / Unwrap など)は SDK ガイド を参照してください。このページはより低レベルなコントラクトインテグレーションとオラクル利用を対象としています

概要

zERC20 インテグレーションには3つの方法があります:

  1. トークンインテグレーション:DeFiプロトコル・ウォレット・dApp で zERC20 を標準 ERC-20 トークンとして利用

  2. オラクルインテグレーション:zERC20 の Transfer Merkle Tree をオンチェーンオラクルとして活用し、ZKP で転送履歴を検証

  3. セルフホスト型 Indexer:最大限のプライバシー確保のために自前の Indexer ノードを実行し、送受信者の紐付け漏洩を防止

新しい zERC20 トークンを作成する

独自トークンの zERC20 バージョン(例:zUNI、zUSDT)を立ち上げたい場合は、zerc20.io/integratearrow-up-right から zERC20 チームにお問い合わせください。デプロイと設定をサポートします。

トークンインテグレーション

zERC20 は完全な ERC-20 互換です。ERC-20 トークンをサポートするあらゆるアプリケーションで zERC20 を使えます。

コントラクトアドレス

各チェーンのデプロイアドレスは コントラクトアドレス を参照してください。

標準 ERC-20 インターフェース

Wrap と Unwrap

LiquidityManager コントラクトを使って、原資産トークンと zERC20 を相互変換できます。

使用例:

Wrapリワードと Unwrap手数料の詳細は 手数料とリワード を参照してください。

オラクルとしての zERC20

zERC20 は ZKP に適した Poseidon Hash 関数を用いて、全転送の完全な履歴を Merkle Tree として管理しています。外部開発者はこの Transfer Merkle Tree をオンチェーンオラクルとして活用し、転送履歴を検証できます。

リーフ構造

Transfer Merkle Tree の各リーフは1件の転送を表します:

フィールド
説明

from

address

送信者アドレス(フィールド要素に変換)

to

address

受信者アドレス(フィールド要素に変換)

value

uint256

転送金額(フィールド要素に変換)

ツリー構造

Merkle Root には2種類あります:

Root の種別
説明
ツリーの高さ

Local Transfer Root

チェーンごとの転送 Merkle Root

40

Global Transfer Root

クロスチェーン集約 Merkle Root

46(40 + 6)

Global Transfer Tree は、全チェーンの Local Transfer Root を集約ツリー(高さ6・最大64チェーン対応)で集約して構築されます。

コントラクトから Merkle Root を読み取る

外部コントラクトは Verifier コントラクトから証明済み Merkle Root を照会できます:

使用例:

Merkle Proof の検証はスマートコントラクト上でオンチェーンに行う方法と、ZKP 回路を使ってオフチェーンで行う方法があります。用途に応じて選択してください:

  • オンチェーン検証:ガスコストが許容範囲内のシンプルなメンバーシップ証明に適しています

  • ZKP 検証:プライバシー保護アプリケーションや、オンチェーンでは高コストになる複雑なロジックに最適です

Poseidon Hash の互換性

zERC20 が使っている Poseidon Hash は circomlib の Poseidon ライブラリarrow-up-right と完全に互換性があります:

用途
circomlib テンプレート
説明

リーフハッシュ

Poseidon(3)

Poseidon(from, to, value)

ノードハッシュ

Poseidon(2)

Poseidon(left, right)

この互換性により、開発者は circomlib を使ったカスタム ZK 回路を構築して、zERC20 の Transfer Merkle Tree に対するメンバーシップ証明を検証できます。

Merkle Proof を取得する

Local Transfer Merkle Proof

Indexer ノードに照会して Local Transfer Merkle Proof を取得します:

エンドポイント: POST /proofs

リクエスト:

レスポンス:

フィールド
説明

target_index

証明対象のツリーインデックス(スナップショット)

leaf_index

ツリー内のリーフの位置

root

target_index 時点の Merkle Root

hash_chain

target_index 時点の Hash Chain 値

siblings

証明パスの40個の兄弟ハッシュの配列

補助エンドポイント — ツリーインデックスを取得:

GET /tree-index?chain_id={chainId}&token_address={address}&transfer_root={root}

指定した Merkle Root に対応するツリーインデックスを返します。

Global Transfer Merkle Proof

Global Merkle Proof は以下を連結して構築します:

  1. Local Transfer Merkle Proof(40個の兄弟ハッシュ)

  2. 集約ツリー Proof(6個の兄弟ハッシュ)

構築アルゴリズム:

Hub コントラクトの集約状態:

Hub コントラクトの AggregationRootUpdated イベントが、全 Local Root のスナップショットを提供します:

自前の Indexer を実行する

送受信者の紐付け漏洩を防いで最大限のプライバシーを確保するには、自前の Indexer インスタンスを実行してください。

Docker Compose

設定

環境変数を設定します:

完全なサービス設定はリポジトリルートの docker-compose.yml を参照してください。

最終更新