1はじめに
メインコードを参照してください:
- https://github.com/AztecProtocol/aztec-connect-bridges(Solidity)
- https://github.com/AztecProtocol/defi-bridge-hackathon(JavaScript)
この記事では、主にElementFinanceのAztecConnectContract契約を使用して説明します。
1.1キーワードの説明
- プリンシパルトークン:貸し手がdefiに預け入れた担保を表します。
- 利回りトークン:担保を預けるために貸し手が生成する変動金利を表します。
2.aztecコネクトブリッジ統合ソリューション
Element Financeには、aztecコネクトブリッジ契約に役立つプロセスがいくつかあります。
- 1)AMMからプリンシパルトークンを一定の割引価格で購入し、スケジュールどおりに保持して利用します。
- 2)一括償還。
- 3)ミントの自動ロールオーバー。ミントを自動的に蓄積します。
サポートする最も簡単なプロセスは、AMMからトークンを購入し、トークンの引き換えをサポートすることです。
デポジットされたアセットとサポートしたい粒度に応じて、3つの潜在的な実装があります。
- 1)直接非同期ブリッジフロー:ユーザーはzk.moneyに対応するソース資産を持っているか、zk.moneyに資産を預けるためにガス料金を支払う用意があります。
2.1スキーム1-直接非同期ブリッジフロー
ユーザーはzk.moneyに対応するソース資産を持っているか、zk.moneyに資産を預けるためにガス料金を支払う用意があります。
Elementでサポートされるアセットタイプは、DAI / USDC / WBTC、およびcrv3cryptoやsteCRVなどの複合アセットです。
対応するユーザーフローは次のとおりです。
- 1)aztec L2レイヤーで、ユーザーはサポートされている資産のシールドされた残高を選択し、DeFi預金トランザクションを開始します。
- 2)aztecL2レイヤーとEthereumL1レイヤーの間のロールアッププロバイダーは、L2レイヤーのトランザクションをnnごとのレートでパッケージ化しますn本のペンのセット。
- 3)ロールアッププロバイダーは、パッケージ化されたトランザクションをイーサリアムL1レイヤーのAztecロールアップコントラクトに送信します。
- 4)イーサリアムのL1レイヤーのアステカロールアップコントラクトは、L1レイヤーにデプロイされた対応するエレメントのブリッジコントラクトを呼び出します。ブリッジ契約は、Aztec Rollup契約からの集約されたトランザクションの対象となります。ブリッジ契約では、次のようになります。
- 4.1)入力アセットに複数の要素プールがある場合、DBCは
auxData
それを使用して正しいプールの有効期限を選択する必要があります。 - 4.2)プリンシパルトークンは、指定された入力アセットERC20トークンを使用してElementAMMから購入されます
totalInputValue
。 - 4.3)購入インタラクション操作のインタラクションナンス値と購入したプリンシパルトークンの量を記録します。
- 4.4)相互作用のナンス値と対応する有効期限を記録して、非同期トランザクションを次の日に終了できるようにします。
- 4.5)L1層のAztecRollup契約に戻り
isAsync=true
ます。
- 4.1)入力アセットに複数の要素プールがある場合、DBCは
ブリッジコントラクトには、ファイナライズできるブリッジのリストを返すパブリック関数が必要です。
返されたブリッジinteractionNonce
値ごとに、AztecRollupコントラクトを呼び出してRollupContract.processAsyncDefiInteraction(uint256 interactionNonce)
ブリッジコントラクトをファイナライズするEthereumトランザクションを作成できます。
// Aztec Rollup合约
function processAsyncDeFiInteraction(uint256 interactionNonce) external {
// call canFinalise on the bridge
// call finalise on the bridge
DefiInteraction storage interaction = defiInteractions[
interactionNonce
];
require(
interaction.bridgeAddress != address(0),
"Rollup Contract: UNKNOWN_NONCE"
);
(uint256 outputValueA, uint256 outputValueB, bool interactionComplete) = IDefiBridge(
interaction.bridgeAddress
).finalise(
interaction.inputAssetA,
interaction.inputAssetB,
interaction.outputAssetA,
interaction.outputAssetB,
interaction.interactionNonce,
uint64(interaction.auxInputData)
);
.......
}
Elementブリッジコントラクトでは、そのfinalise
機能は次のことを行います。
- 1)元の担保とプリンシパルトークンを交換します。
- 2)このサービスを提供する、
block.coinbase
またはmsg.sender
料金を支払う。ガス乗数として計算し、collateral.redemptionから支払うことができます。 - 3)基礎となる担保と利息をアステカのロールアップ契約に戻し
outputAssetA
、正しい値を返します。
// Element Bridge合约
// serves as the 'off ramp' for the transaction
// converts the principal tokens back to the underlying asset
function finalise(
AztecTypes.AztecAsset calldata,
AztecTypes.AztecAsset calldata,
AztecTypes.AztecAsset calldata outputAssetA,
AztecTypes.AztecAsset calldata,
uint256 interactionNonce,
uint64
) external payable returns (uint256 outputValueA, uint256 outputValueB, bool interactionComplete) {
require(msg.sender == rollupProcessor, "ElementBridge: INVALID_CALLER");
// retrieve the interaction and verify it's ready for finalising
Interaction storage interaction = interactions[interactionNonce];
require(interaction.expiry != 0, "ElementBridge: UNKNOWN_NONCE");
require(
interaction.expiry <= block.timestamp,
"ElementBridge: BRIDGE_NOT_READY"
);
require(!interaction.finalised, "ElementBridge: ALREADY_FINALISED");
// convert the tokens back to underlying using the tranche
console.log("Withdrawing %s principal tokens", interaction.quantityPT);
console.log("Total supply %s", ITranche(interaction.trancheAddress).totalSupply());
outputValueA = ITranche(interaction.trancheAddress).withdrawPrincipal(
interaction.quantityPT,
address(this)
);
// approve the transfer of funds back to the rollup contract
ERC20(outputAssetA.erc20Address).approve(rollupProcessor, outputValueA);
// interaction is completed. clean up the expiry heap
interaction.finalised = true;
popInteraction(interaction, interactionNonce);
console.log("Successfully finalised interaction: ", interactionNonce);
interactionComplete = true;
}
2.1.1オプション1-ガスコスト分析
ユーザーがAztecにソース資産を持っていると仮定すると、さまざまなバッチサイズのガスコストは次のようになります。
アイテム | ガス | ユーザーシェア |
---|---|---|
連鎖のためのJoinSplit | 7500 | 1 |
DeFiブリッジデポジット | 7500 | 1 |
要素AMM購入インタラクション | 18000 | 1 / n |
エレメントwithDrawPrincipal() |
150000〜750000 | 1 / n |
DeFiクレームプルーフ | 7500 | 1 |
全体の出入りコストは次
のとおりです。メインネット:330000〜930000
バッチサイズ10:ガス= 55,500-111,500〜6-10x
バッチサイズ50:ガス= 29,100-41,500〜10-20x
バッチサイズ100:ガス= 25,800-31,800〜12-40x
2.1.2オプション1-長所と短所の分析
オプション1の主な利点は次のとおりです。
- 1)非常にシンプル
- 2)必要なAztecトランザクションは1つだけで、入口と出口のガスコストを共有できます。
- 3)資産と利息は、AztecL2レイヤーのユーザーアカウントに自動的に返されます。
オプション2の主な欠点は次のとおりです。
- 1)ユーザーは取引できず、時間通りにロックする必要があり、ユーザーは選択する権利を失います。
- 2)
withDrawPrincipal
償却は、すべてのユーザーではなく、入力バッチサイズによって制限されます。 - 3)バッチ入力の調整は、バッチ終了よりも困難です。そのため、実際の設定では、バッチサイズは100ではなく10に設定され、ガス節約量は約3〜9倍になります。
2.2オプション2-非同期フロー
ユーザーは引き続きAztecにソースアセットを持っている必要があります。ただし、プロセス全体は2つの部分に分かれています。
-
1)プリンシパルトークンを購入します。ユーザーはElementでプリンシパルトークンを購入し、これらのプリンシパルトークンはAztecL2ユーザーに返されます。
- 1.1)サポートされている資産を選択すると、ユーザーはL2レイヤーのシールドされた残高からDeFi預金トランザクションを開始します。
- 1.2)ロールアッププロバイダーは、複数のトランザクションを一緒にパッケージ化します。
- 1.3)ロールアッププロバイダーは、パッケージ化されたトランザクションをL1レイヤーのAztecロールアップコントラクトに送信します。
- 1.4)L1レイヤーのAztec Rollupコントラクトは、対応するElementブリッジコントラクトを呼び出します。
- 1.5)L1レイヤーのElementブリッジコントラクトは、AztecRollupコントラクトから集約されたトランザクションを受け取ります。Elementブリッジ契約は次のことを行います。
- 4.1)入力アセットに複数の要素プールがある場合、DBCは
auxData
それを使用して正しいプールの有効期限を選択する必要があります。 - 4.2)プリンシパルトークンは、指定された入力アセットERC20トークンを使用してElementAMMから購入されます
totalInputValue
。 outputValueA
4.3)プリンシパルトークンは、L1レイヤーのAztecRollupコントラクトに転送されます。
- 4.1)入力アセットに複数の要素プールがある場合、DBCは
-
2)プリンシパルトークンの引き換え:この時点で、L2レイヤーのAztecのユーザーはプリンシパルトークンを持っています。有効期限が切れると、クライアントは2番目のDeFiブリッジインタラクションを開始して、プリンシパルトークンを基本的な担保と交換できます。
- 2.1)L2層で、ユーザーはプリンシパルトークンのシールドされた残高を使用してDeFiデポジットトランザクションを開始します。
- 2.2)ロールアッププロバイダーは複数のトランザクションをパッケージ化します。
- 2.3)ロールアッププロバイダーは、パッケージ化されたトランザクションをL1レイヤーのAztecロールアップコントラクトに送信します。
- 2.4)L1レイヤーのAztec Rollupコントラクトは、対応するElementブリッジコントラクトを呼び出します。
- 2.5)L1レイヤーのElementブリッジコントラクトは、AztecRollupコントラクトから集約されたトランザクションを受け取ります。Elementブリッジ契約は次のことを行います。
- 2.5.1)
withDrawPrincipal()
プリンシパルトークンを基礎となる担保と交換する。 - 2.5.2)受け取った担保トークンをL1レイヤーのAztec Rollupコントラクトに転送します。数量は、です
outputValueA
。
- 2.5.1)
auxData
ユーザーが引き換えフラグまたはロールオーバーフラグを設定したかどうかを判断するために、プロセス全体でオプションのチェックがあります。ロールオーバーフラグが設定されている場合、担保は新しいトランシェで新しいプリンシパルトークンを購入することによって再投資されます。
2.2.1スキーム2のガスコスト分析
入場料は次のとおりです。
アイテム | ガス | ユーザーシェア |
---|---|---|
DeFiブリッジデポジット | 7500 | 1 |
要素AMM購入インタラクション | 180000 | 1 / n |
DeFiクレームプルーフ | 7500 | 1 |
メインネット:180000
バッチサイズ10:ガス= 33,000〜5x
バッチサイズ50:ガス= 18,600〜10x
バッチサイズ100:ガス= 16,800〜10x
終了コスト:
オプション1と比較して、満了時にすべてのユーザーによって開始される償還のバッチサイズは大きくなります。
アイテム | ガス | ユーザーシェア |
---|---|---|
要素PYトークンのオプションのデポジット | 6500 | 1? |
DeFiブリッジデポジット | 75000 | 1 |
エレメントwithDrawCollateral |
150000〜750000 | 1 / n |
DeFiクレームプルーフ | 7500 | 1 |
メインネット:150,000〜750,000
バッチサイズ10:ガス= 30,000〜90,000(5x〜8x)
バッチサイズ50:ガス= 18,000〜30,000(9x〜20x)
バッチサイズ100:ガス= 16,000〜22,500(9x〜30x)
L1デポジット付きAztecに参加しなかったユーザー向け。
バッチサイズ10:ガス= 90,000-150,000(1.5x-5x)
バッチサイズ50:ガス= 78,000-90,000(2x-10x)
バッチサイズ100:ガス= 76,500-82,500(2x-10x)
2.2.2スキーム2の長所と短所の分析
オプション2の主な利点は次のとおりです。
- 1)すべてのユーザーは、30倍のガス節約と一緒に償還できる必要があります。
- 2)L1で固定料金を購入したユーザーは、ブリッジを使用して2〜10倍のガス節約で利用できます。
- 3)ユーザーは固定レートでトレードインおよびトレードアウトできます-ロックインなし
- 4)ロールオーバーサポートが可能
オプション2の主な欠点は次のとおりです。
- 1)構築がより複雑
- 2)償還は自動ではありません
- 3)2回のAztecトランザクションが必要
- 4)要素プリンシパルトークンでどのように料金を支払うか…
- 4.1)これは問題です。これらのトークンはElementで要求された場合にのみ価値があり、これには150〜750kのガスがかかります。
- 4.2)橋は支払うことができますが、ユーザーに料金を見積もるのが難しくなります+ファラフェルは、それがいくらになるか、defitxのサイズに基づいて評価する必要があります。
2.3オプション3
スキーム1またはスキーム2に基づいて増加します。ユーザーは、L2Aztecにソースアセットを持っている必要がなくなりました。
オプション3では、ユーザーはzkETHのみを持っている必要があります。
参考文献
[1] AztecConnectブリッジを使用したプライベートDeFi
[2]2021年11月ZKHACK #5-
AztecConnectの概要[3]2021年4月Zk-zk-AztecのZacとJoeとのロールアップとzk.money
[4 ] Element FinanceAztecConnect契約
[5]ElementFinance团队2021年12月博客全員の固定料金:L2スケーリングがElementに登場