今回は、「zkSync1.xのNFT」について解説します。
zkSync1.xのNFTとは
zkSync1.xとは、zkSyncのNFTのことです。
※zkSyncとは→【 zkSyncとは 】必要知識まとめ
zkSync1.xのNFTアドレスは、NFTコンテンツとメタデータを次のようにエンコードします。
address = truncate_to_20_bytes(rescue_hash(creator_account_id || serial_id || content_hash));
これにより、2つの普遍条件が暗号的に保証されます。
①NFTアドレスは、作成者・NFTのシリアル番号・そのコンテンツハッシュに対する一意のコミットメントとして機能すること
②NFTアドレスは、誰も制御したりメインnネットにスマートコントラクトコードを設定したりすることはできないということ
※zkSync 1.xでは、同じコンテンツハッシュで複数のNFTを作成できます。
zkSyncの公式ホームページはこちらです。
設定方法
①zkSyncライブラリをインストールする
②zkSyncネットワークに接続する
yarn add zksync
→このチュートリアルでは、Rinkebyテストネットに接続する(mainnetとRopstenの手順は同様)
onst syncProvider = await zksync.getDefaultProvider('rinkeby');
ミント
NFTを作成するために、「MINT_NFT」引数月の新しいオペコードを導入します。
- creator_account_id
- content_hash
- receive_account_id
「recipient_account_id」をパスすることにより、クリエイターは自分自身ミントするか、他の人に直接ミントするかを選択します。
独自性の強化
NFTトークンIDの一意性を強制するために、zkSyncバランスツリーの最後のアカウントを使用してトークンIDを追跡します。
このアカウント(ここではSpecial NFT Accountと呼ぶ)は、最新のミントの「token_id」を表す「SPECIAL_NFT_TOKEN」の残高を持つこととなります。
NFTトークンアドレスの一意性を強化させるために、「serial_id」をアドレスミントのハッシュの入力としてリコールします。
クリエイターアカウントは、「serial_id」を表す「SPECIAL_NFT _TOKEN」の残高・クリエイターによってミントされたNFTの数を持つことになります。
zkSyncサーバーは、NFTトークンアドレスからトークンIDへのマッピングを維持します。
取引手数料を計算する
NFTをミントする際の取引手数料を計算するには、「Provider」クラスの「getTransactionFee」メソッドを使用することができます。
NFTをミントする
Walletクラスから「mintNFT」関数を呼び出すことで、NFTをミントすることができます。
名前 | 説明 |
recipent | 16進文字列として表される受信者アドレス |
contentHash | 32バイトの16進文字列として表されるNFTの識別子 (例:IPFSコンテンツ識別子) |
feeToken | 料金が支払われるトークンの名前 (通常はETH) |
fee | 取引手数料 |
領収書の取得
ミントされたNFTの領収書を取得することができます。
const receipt = await nft.awaitReceipt();
NFTを表示する
NFTが作成された後、コミットと検証の2つの状態になります。
NFTは、ロールアップブロックに含まれている場合にコミットされ、そのブロックに対してゼロ知識証明がミントされ、ロールアップブロックのルートハッシュがEthreumメインネットのスマートコントラクトに含まれている場合に検証されます。
トランスファー(Transfer)
ユーザーは、NFTを既存のアカウントに転送し、zkSyncアカウントをまだ登録していないアドレスに転送できます。
オペコードも同じように機能します。
NFTは、ミントトランザクションのあるブロックが検証された後のみ転送できます。
これは、新しく生成されたNFTが転送されるまでに数時間待たなければならない可能性があることを意味しています。
そして最初の転送にのみ適用されます。
以下の全ての転送は、制限なしで完了することができます。
「zkSync Transfer NFT」で関数を呼び出すことにより、NFTを転送できます。
名前 | 説明 |
to | 16進文字列として表される受信者アドレス |
feeToken | 料金が支払われるトークンの名前 (通常はETH) |
token | NFTオブジェクト |
fee | 取引手数料 |
この「zkSync Transfer NFT」関数は内部でバッチトランザクションとして機能するため、最初のハンドルがNFT転送で、2番目のハンドルが手数料である一連のトランザクションを返します。
領収書の取得
転送の領収書を取得できます。
const receipt = await handles[0].awaitReceipt();
緊急撤退(Emergency Withdraw)
検閲の場合、ユーザーは緊急の撤退を要求することができます。
※レイヤー1の操作であり、fullExitメカニズムに類似しています。
名前 | 説明 |
token | NFTのID |
accountID | fullExitのアカウントID |
ファクトリーとzkSyncスマートコントラクトの相互作用
独自のミント系なくを実装したくないプロジェクトのL1でのミントNFTを処理するデフォルトのファクトリーコントラクトがあります。
独自のミンティングアドレスを持つプロジェクトは、1つのミンティング機能を実装するだけで済みます。
zkSync Governanceコントラクトは、ファクトリーコントラクトのL2で信頼できるみんたーとして作成者を登録する機能を実装します。
撤回するには、ユーザーはtoken_idを指定して「withdrawNFT」呼び出します。
zkSyncスマートコントラクトは所有権を確認し、トークンをL2でバーンし、作成者に対応するファクトリーで「mint NFT From zkSync」を呼び出します。
ファクトリー登録
①ファクトリーに登録するために、クリエイターズは「faactory_address」と「creator_address」メッセージのフォローにサインします。
②zkSyncスマートコントラクトは署名を検証し、「factory_address 」と 「creator_address 」を含むイベントを発行します。
スワップ・指値注文
アトミックスワップ
アトミックスワップを使用すると、既存のzkSyncアカウントと安全かつ安価に資金をスワップできます。
スワップを正常に行うためには、次の3つの手順が必要です。
①特定のスワップを実行することを確認する注文に署名する
②スワップしたいアカウントから同じフォーマットの署名付き注文を取得する
③両方の注文を有料でzkSyncサーバーに送信する
注文に署名する
注文に署名するには、次の情報が必要です。
①スワップしたいトークン
②スワップしたいトークン先
③スワップするトークンの量
④相互に関連する、スワップされたトークンの比率
比率は、トークンがスワップされる比率を表す15バイトの整数です。
注文に署名するにはウォレットの「getodrer」を使用します。
注文は次のものも含まれます。
recipient | ・スワップとトランスファーを実行する場合に、スワップの結果を転送する必要がある既存のアカウントのアドレス ・デフォルトはself |
vaildFrom vaildUntil | ・スワップのあるブロックを処理できる期間を制限するUnixタイムスタンプ |
nonce | ・スワップに使用される |
スワップの提出
次の制限を満たしている場合、誰でもスワップの2つの注文を送信できます。
オーダーとトークンが一致する場合 | oderAがtokenA->tokenBを指定する場合、 orderBはtokenB->tokenAを指定する必要がある |
オーダー内の比率が互換性がある場合 | 1/orderB.rario<=orderA.amaunt/orderB.amaunt<=orderA.ratio |
オーダーに受信者がいる場合 | その受信者のアカウントは既にzkSyncに存在する |
料金は、提出者が支払います。
支払われるトークンを指定する必要があります。
スワップが実行された後、nonceはスワップアカウントのサブみったーの両方でインクリメントされます。
スワップがスワッピングアカウントの1つから送信された場合、nonceは1回だけインクリメントされます。
ユーザーがまだ送信されていないスワップをキャンセルしたい場合は、nonceをインクリメントするだけです。
(例えばゼロ転送を送信します。)
スワップを送信するには、ウォレットの、次の「snycSwap」を使用します。
指値注文
指値注文は、特定のトークンを特定の価格で別のトークンとスワップする方法を提供します。
これらは、信頼できないスケーラブルなスワップサービスを提供したい他のプラットフォームで主に使用されるように設計されています。
アトミックスワップと指値注文の違いは次のとおりです。
・指値注文は、残高から直接スワップできる金額を推測する
・指値注文は部分的に約定することができる
・指値注文は、部分的に約定された時にアカウントのnonceを増分しない
特定のトークンの指値注文が署名されると、残高全体が潜在的に別のトークンとスワップされます。(指定された比率で)
特別な取引口座を使用する以外に、スワップsルウ金額を制限する方法はありません。
取引口座
取引口座は、指値注文に署名するために使用できる通常の口座です。
その機能は、ユーザーが交換したい特定のトークンの量を制限することです。
これを行うには、ユーザーは次のことを行う必要があります。
①希望するトークンの金額を新しいアカウントに転送する
②アカウント署名キーを設定する
③指値注文に署名する
このようにして、指値注文は最大で取引口座に送金した金額をスワップします。
メインアカウントの残りの残高は変更されません。
指値注文に署名する
指値注文に署名するには、ウォレットの「getLimitorder」方法を使用します。
const order = await wallet.getLimitOrder({
tokenSell: 'ETH',
tokenBuy: 'USDT',
ratio: utils.tokenRatio({
ETH: 1,
USDT: 3900
})
});
指値注文の約定
指し値注文自体は、スワップ操作の半分に過ぎません。
満たされるには、次の基準が満たされている必要があります。
・元の注文のトークンと売買比率に適合するカウンターパート注文(通常注文または指値注文)が存在する
・両方の注文を組み合わせてスワップ操作をし、それを送信することを厭わない人がいる
満たされる量は、すわぷ操作で指定する必要があります。
指値注文は部分的に約定される可能性があるため、注文で指定された比率と互換性がなければなりませんが、金額は実際の残高とは異なる場合があります。
指値注文マッチングに関する注意
アトミックすスワップの実行は、スワップしたいパーティと署名された注文メッセージを共有するのと同様に簡単です。
一方、指値注文の収集と称号は、ある種の称号エンジンに夜既存のユーザーベースを持つプラットフォームによって実行される必要があります。
zkSyncは可能な限り一般的なものにしようとしているため、一致するエンジンの作成は考慮されていません。
他のプラットフォームと統合できるL2フレームワークのみを提供します。
提案
取引口座はCREATE2口座として作成できます。
このアプローチには、次のメリットがあります。
・CREATE2アカウントに署名キーを設定する方が安価
・CREATE2のsalt引数を使用して、特定のメインアカウントの取引アカウントアドレスを決定論的に生成できる
・必要に応じて、全ての取引アカウントとメインアカウントに同じL2(詳細→仮想通貨における【 レイヤー2とは 】レイヤー1とレイヤー2の違い・メリット・デメリットも含めて解説)秘密鍵を使用できる(単一のアカウントをリスクに晒すと全てのアカウントをリスクに晒すことを意味するため、状況によってはキー管理が不便になる可能性がある)
プラットフォームが取引口座にCREATE2を使用することを決定した場合、アドレス計算に使用するアドレスバイトコードを選択する必要があります。
稀な検閲の場合、ユーザーは資金を救済するためにコントラクトを展開する必要があるため、コントラクトオープンソースであり、完全な終了及び撤回機能を備えている必要があります。
また、注文が処理またはキャンセルされたトレーディングアカウントを再利用することをお勧めします。
これにより、署名キーをサイド設定する必要がなくなります。
例
このセクションでは、注文で指定された比率が口座残高にどのように影響するかの例を示します。
スワップを2つの指値注文で構成します。
指定された比率は、次のことを意味します。
walletA | wBTCごとに2.5ETH(またはそれ以上)を取得する予定 |
walletB | ETHごとに0.25w BTC(またはそれ以上)を取得する予定 |
どちらの比率(またはその中間)でも、両方の当事者が満足するため、比率には互換性があります。
・orderBの比率では、walletAは1wBTCあたり4ETHを得ることになり、これは予想以上である
・orderAの比率でwalletBはETHあたり0.4w BTCを得ることになり、予想以上に多い
それでは、実際にスワップを送信して、wBTCごとに3ETHの間の比率を選択しましょう。
これにより、ウォレットAから100w BTCをウォレットBから300ETHにスワップします。
詳細は以下の表を参照してください。
walletA | walletB | |
スワップ前のwBTC | 100 | 0 |
スワップ前のETH | 0 | 300 |
スワップ後に予想されるw BTC | 0 | 75 |
スワップ後に予想されるETH | 250 | 0 |
スワップ後の実際のwBTC | 0 | 100 |
スワップ後の実際のETH | 300 | 0 |
Urils
,比率を作成するには、次の2つの効用関数のいずれかを使用します。
・tokenRatioは、トークン自体に関連する比率を構築するため、{ ETH: 4, wBTC: 1 }は各w BTCに対して4ETHが必要であることを意味している
・weiRatioは、トークンの最低額に関連する比率を構築するため、{ ETH: 4, wBTC: 1 }は、各 satoshi (10-8 wBTC) に対して 4 wei (10-18 ETH) が必要であることを意味している
トークンシンボルまたはIDが変数に含まれている場合は、次の構文を使用してそれらを位hりつオブジェクトに渡します。
イベントを見る
zkSyncイベントAPIの使用方法に関する簡単なチュートリアルです。
この機能は現在、メインネット・Ropsten・RInkebyテストネットでのみ使用できます。
APIはまだ完全には安定しておらず、将来変更される可能性があります。
ネットワークに正しいWebSocketURLを選択していることを確認してください。
yarnプロジェクトの設定
以下を使用して、最小限の動作をするJavascriptプロジェクトをセットアップし、「yarn」を使用します。
接続の確立
イベントサーバーは「wss://events.zksync.io/」にあります。
このチュートリアルでは、wsを使用します。
パッケージですが、プロジェクトに適した任意のWebSocketクライアントライブラリを使用できます。
接続が有効であることを確認するには、定期的にpingフレームを送信することをお勧めします。
また、タイムアウト切断を回避することにも役立ちます。
イベントのフィルタリング
接続が確立されると、クライアントはイベントの関心を含むテキストメッセージを送信する必要があります。
フィルタを変更する場合は、新しい接続を作成する必要があるため、一度しか実行できないことに注意してください。
空のJSONオブジェクトは、フィルターがない場合と同様です。
全てのイベントを受信することをサーバーに通知します。
無効なオブジェクトを送信すると、次のエラーメッセージが表示されたクローズフレームが表示されます。
このチュートリアルでは、全てのイベントを受け入れ、それらを自分でフィルタリングします。
メッセージの受信
接続を確立してフィルターを正常に送信した後のこの時点で、サーバーは新しいイベントについて通知を開始します。
また、制御フレーム(close, ping, pong)以外のメッセージは無視されます。
とはいえ、再接続せずにフィルターを変更することはできません。
「data」フィールド定義については、ドキュメントを参照してください。
zkSyncプロバイダーは、トークン記号と金額を人間が読める形式で表示するために使用できます。
最近のコメント