どうも、イーサリアムnavi運営のでりおてんちょーです。
今回は、Omnichain相互運用性プロトコルを標榜する「LayerZero」について紹介・解説していきたいと思います。
執筆時点では、StargateというLayerZero上で稼働するDeFiがローンチされていたり、Gh0stly Gh0stsやLayer Zero PunksなどがOmnichainNFTとしてローンチされており、徐々に頭角を現しながら話題になってきています。
「Omnichain NFT」を完全に理解しました。
— でりおてんちょー|derio (@yutakandori) April 11, 2022
今回は以下を試してみましたが、すごく簡単で感動しました👏
💡Omnichain NFTをBSCテストネットでmint
💡Mumbaiテストネットにトークンを転送
Omnichain NFTの概要/ポイント/使い方など記事にする予定なので、お楽しみに。@LayerZero_Labs @PrimordialAA pic.twitter.com/bpgF065oj0

後の項で試してみますが、OmnichainNFT自体は実装が簡単なので、今後もOmnichainNFTを標榜するNFTプロジェクトは多数出てきて、「フルオンチェーンNFT」のようにマーケティング用語化するのではないかと予想しています。
フルオンチェーンNFTというのは、画像データがsvg形式などによって直接ブロックチェーン上に保持されているタイプのNFTのことです。
— でりおてんちょー|derio (@yutakandori) October 20, 2021
一方で、一般的なサーバー保管型NFTは、NFTの画像部分がデータベースへのリンクになっていて、要はブロックチェーンの外の世界から画像情報を引っ張ってきています。 pic.twitter.com/LXWDbrQ5ZJ
ということで今回は、執筆時点で徐々に頭角を現しつつある「LayerZero」「OmnichainNFT」を中心に取り上げていき、その概要やコンセプトなどを紐解いていくことで、実態を理解していただくことを目的とします。
でははじめに、この記事の構成について説明します。
まずは、LayerZeroの概要やコンセプトなどについて、完結かつ抽象的な表現も交えつつ可能な限り分かりやすく解説してまいります。
次に、LayerZeroのモデルが既存のクロスチェーン/マルチチェーン・L2(Layer2)とどのように違うのかについて解説してまいります。
最後に、皆様にLayerZero/OmnichainNFTについての理解を深めていただくことを目的とし、Hardhatを使って実際にコントラクトをデプロイしたり、NFTを別チェーンに転送してみるまでの一連の流れを解説いたします。
本記事が、「LayerZero」「OmnichainNFT」の概要やコンセプト・開発の一例などについて理解したいと思われている方にとって、少しでもお役に立てれば幸いです。
※本記事は一般的な情報提供を目的としたものであり、法的または投資上のアドバイスとして解釈されることを意図したものではなく、また解釈されるべきではありません。ゆえに、特定のFT/NFTの購入を推奨するものではございませんので、あくまで勉強の一環としてご活用ください。


LayerZeroとは


LayerZeroは、「Omnichain相互運用性プロトコル」であることを標榜するプロトコルであり、開発主体はカナダのバンクーバーを拠点とするチーム「LayerZero Labs」です。
多くの異なるユーザーアプリケーション(LayerZeroを使用してブロックチェーン間でメッセージを送受信するコントラクト)が、ベースレイヤー(Layer0)として使用できるようにするための基盤プロトコルであることを提唱しています。


少しイメージが湧きづらい方は、まずは既存の暗号資産における中央集権取引所(CEX)の挙動をイメージしてみてください。
例えば、BTCを売却してETHを購入するというシーン。
本来であれば、この行為を直接的におこなうことはブロックチェーンの違いにより難しいのですが、CEXを使うことで即座にエクスチェンジすることができますよね。
これは、CEXが裏側でBTCとETHを保有して、さらに交換業務を担っているからこそ為せるのですが、このシーンはイメージしやすいでしょう。
LayerZeroは、このCEXが裏側でおこなっているような仕組みを、それぞれ独立したオラクル/リレイヤー・ULN (Ultra Light Node)を用いることにより、トラストレスかつシームレスに実現するというコンセプトです。
異なるチェーン上のユーザーアプリケーション間で、オンチェーンかつマルチチェーンにメッセージ検証をおこないます。


仕組みとしては、異なるチェーン(ここではA, B)のブロックヘッダーを伝達するオラクル(Oracle)と、 トランザクションの証明を取得するリレイヤー(Relayer)という2つの独立したエンティティを組み合わせることで実現しています。
ここで、以下のように疑問に思われる方もいらっしゃるかもしれません。



トラストレスとはいえ、オラクル/リレイヤーに依存したモデルでは?
これは非常に的を得た批判かと思いますし、筆者も最初に本プロトコルを見たときにそのように思いました。
実際にその指摘は的を得ている側面もありますが、LayerZeroではオラクル/リレイヤーをそれぞれ「独立」させることにより、以下のような効果を生み出しています。
- オラクルとリレイヤーが結託して悪事をはたらくことを防ぐ
- 被害を受けた際の被害を最小限に止める
つまり、オラクルとリレイヤーが共謀することを防ぎつつ、かつそれが起きた際でも被害が最小限に止まるように設計されています。


クロスチェーンブリッジ(ミドルチェーン設計)では、単一の脆弱性が全ペアネットワーク・全流動性を危険にさらす可能性があるのに対し、LayerZeroでは悪用されるリスクを、悪用される特定のオラクル/リレイヤーペアに制限します。
この設計によって、高いセキュリティを保ちつつも、各チェーンを跨いだトークンの転送が可能になり利便性向上が見込めるという利点が挙げられます。
またその他のメリットとして、統一した標準規格/ルールを設けることによって、開発者が異なるチェーン間(※EVM互換性を問わない)で通信するための実装における「車輪の再発明」をなくすことが期待されるでしょう。
初期のフェーズではEVM互換性のあるチェーン(Ethereum/Arbitrum/Avalanche/BSC/Fantom/Optimism/Polygon)のみをサポートしていますが、将来的にCosmos Hub/Terraなどの非EVMチェーンのサポートも追加する予定となっています。
既存モデルとの違いを比較
本章では、Omnichain相互運用性プロトコルを標榜するLayerZeroと、以下の既存モデルとの違いを比較していくことで、LayerZeroについての理解をより深めていくことを目的とします。
- クロスチェーン/マルチチェーン
- L2(Layer2)
クロスチェーン/マルチチェーンとの違い




昨今ではDeFi領域を中心に、シングルチェーンからマルチチェーンへとトレンドが変わりつつある状況ですが、その中で以下のような課題が挙げられています。
- 流動性がサイロ化され分散してしまうことで生じる資本効率・UXの悪さ
- 独立するそれぞれのチェーン間での非効率的な通信
- ブリッジ機能を一元的に備えたコントラクトのハッキングリスク
これらの課題に対するソリューションとして登場したのがLayerZeroであり、現在大きな注目を集めているといった背景があります。
まず前提として、既存のNFTにおける主なクロスチェーンブリッジと今回取り上げているLayerZero(Omnichain NFT)では、どちらもMint/Burn方式が採用されています。


既存のNFTにおける主なクロスチェーンブリッジの仕組みでは、ブリッジ機能を備えたスマートコントラクトを介して対象のNFT「X」をロックし、それを担保に転送先のチェーンで新たにNFT「X’」をMintします。


これに対して、LayerZeroプロトコルならではの特筆すべきポイントは、「2つ以上のチェーンが同時にメッセージング・ステートを共有できる点」です。
LayerZeroプロトコルを活用したOmnichain NFTの場合は、複数のチェーンを跨いでNFTをmintすることが可能になりますが、NFTが存在しユーザーが保有できる(owner権限が与えられる)のは単一のチェーンのみとなり、転送元チェーンにあったNFTはburnされる仕様です。
つまり、既存のNFTクロスチェーンブリッジとは異なり、特定のコントラクトに対してロックする必要がありません。
これは先述の通り、それぞれ独立したオラクル/リレイヤー・ULN (Ultra Light Node)を用いることで可能になっていますが、それにより以下のような新たなユースケースを生まれるのではないかと期待されています。
- 統一流動性ブリッジ
- 効率的なクロスチェーンスワップ
- マルチチェーンイールドアグリゲーター
ちなみに、既にデプロイされたNFTコレクションであっても、Parakeet DAOの投票によって可決されwhitelist入りすれば、LayerZeroのサポートするOmnichain NFTに仲間入りできるそうです。
こちらは先日「Pudgy Penguins」というNFTプロジェクトが対象となり、LayerZeroのサポートするOmnichain NFTになることが決定されました。
We’re proud to announce that @pudgypenguins will be the very omnichain #NFT collection supported by @ParakeetDAO ! https://t.co/sH3dhzXCmU
— parakeet.dao 🦜 Omnichain NFT Bridge (@ParakeetDAO) April 5, 2022
L2(Layer2)との違い


LayerZeroが異なるチェーン間でネイティブな直接通信を実現するのに対して、Layer2は単一のL1チェーンと繋がるものであるという明確な違いがあります。
例えば、Arbitrum/Optimism/StarkNetなどはL1(Ethereum)と繋がるL2ですが、それぞれに異なるプールが存在していてサイロ化された構造となっており、資金効率やUXの面で課題となっています。


この課題を解決するために、ミドルチェーンによるブリッジングソリューションが試みられてはいるものの、セキュリティリスクの高さなどがネックとなっています。


この問題を根本から(Layer0ベースで)解決しようと試みるのがLayerZeroのアプローチであり、完結かつ抽象的に表現すると、L2が建物であればLayerZeroは土地である程の明確な構造的違いがあると言えます。
LayerZeroのOmnichainコントラクトをデプロイ/転送してみる
本章では、LayerZeroの大まかな概念を理解した次のステップとして、実際にLayerZeroのOmnichainコントラクトをデプロイしてみることで理解を深めることを目的とします。
今回、筆者の作業実行環境は以下です。
- macOS Big Sur v11.6.2
- Node.js v16.14.2
- コード エディター:Visual Studio Code
- Solidity開発環境:Hardhat


まずは、LayerZero-Labsが提供しているsolidity-examplesを、git clone
で複製してみます。
git clone https://github.com/LayerZero-Labs/solidity-examples.git
solidity-examplesディレクトリが作成されたので、移動してnpm install
を実行します。
//solidity-examples
npm install
インストールが成功したら、以下コマンドでtestしてみましょう。
npx hardhat test


ここで実行されたtest構文は、以下4つです。
- OmnichainFungibleToken.test.js
burn local tokens on source chain and mint on destination chain
転送元チェーンでローカルトークンをburnし、転送先チェーンでmintする - OmnichainNonFungibleToken.test.js
mint on the source chain and send ONFT to the destination chain
転送元チェーンでmintし、転送先チェーンにONFTを送る - OmniCounter.test.js
increment the counter of the destination OmniCounter
転送先のOmniCounterカウンターをインクリメント(+1)する - PingPong.test.js
increment the counter of the destination PingPong
転送先のPingPongカウンターをインクリメント(+1)する
次節からは、「② OmnichainNonFungibleToken」について実際に触っていきながら、理解を深めていきたいと思います。
前提
OmnichainNonFungibleTokenでは、開始トークンIDと最大ミント数を引数として、コントラクトをチェーン上にデプロイします。
このとき重要なのは『トークンIDを分けること』なのですが、それは異なるチェーンで同じトークンIDがmintされることがないようにするためです。
今回は例として、bsc-testnet
とmumbai
という2つのチェーンにLayerZero-Labsが提供しているsolidity-examples内のコントラクトをデプロイし、OmnichainNFTを発行してみたいと思います。
チェーン名 | 開始トークンID | 最大ミント数 |
---|---|---|
bsc-testnet | 0 | 50 |
mumbai | 50 | 100 |


ちなみにこれらの設定は、solidity-examples/constants/onftArgs.jsonファイルに記載されています。
チェーン間で転送がおこなわれた場合、OmnichainNFTは転送元のチェーン(今回はbsc-testnet)でburnされ、転送先のチェーン(今回はmumbai)でmintされることになります。
.envファイルを作成


Note: Remember to add a .env file with your MNEMONIC=”
出典:README.md
注意:MNEMONIC=”.envファイルを追加することを忘れないでください。
まずはREADME.mdの指示に従って、.envファイルを作成します。
上写真のように、サンプルとして.env.exampleファイルが用意されているので、以下のコマンドで.envファイルとして複製し、MNEMONICの部分をご自身の開発用walletアドレスの12wordsに書き換えて保存します。
cp .env.example .env


ちなみに、誤って.envファイルをGitHubなどにアップロードしてしまうとWallet内の資産を全部抜かれたりOwner権を失ってしまうので、扱いには十分気をつけましょう!!
.gitignoreで指定しておくことが大切ですが、筆者はよく分かっていないのでそもそもGitHubなどにアップロードしないようにしています。
MetaMaskにネットワークを追加


hardhat.config.jsファイルに書かれた情報を元に、bsc-testnetとmumbaiそれぞれのネットワークをMetaMaskに追加しておいてください。


faucetでテストネット用のトークンを取得
今回使用するbsc-testnetとmumbaiそれぞれのテストネット用トークンを、それぞれ以下のサイトなどを利用して獲得してください。
OmnichainNFTをデプロイ/転送してみる
では下準備が完了したので、ここからは実際にOmnichainNFTをデプロイ/転送していきます。
① 2つのコントラクトを、それぞれのチェーンにデプロイする
「クロスチェーン/マルチチェーンとの違い」節で述べた通り、チェーンを跨いだ先のNFT「X’」の発行主体について、クロスチェーンの場合がブリッジコントラクトであるのに対して、OmnichainはNFT「X」のコントラクトデプロイ主であるという違いがあります。
ということで、まずは2つのコントラクトを各チェーンにデプロイしていきます。
npx hardhat --network bsc-testnet deploy --tags OmnichainNonFungibleToken


npx hardhat --network mumbai deploy --tags OmnichainNonFungibleToken


② 信頼できるソースを設定し、各コントラクトが互いに、そして互いに”のみ”メッセージを受信できるようにする
OmnichainNFTは、クロスチェーンブリッジのように直接FT/NFTなどアセットを移動するわけではなく、メッセージを送受信してステート管理するという仕組みです。
ということで、各チェーン(今回はbsc-testnet/mumbai)のコントラクトがメッセージを送受信できるように設定します。
npx hardhat --network bsc-testnet omnichainNonFungibleTokenSetTrustedSource --target-network mumbai


npx hardhat --network mumbai omnichainNonFungibleTokenSetTrustedSource --target-network bsc-testnet


③ 各チェーンにOmnichainNFTをmintする
bsc-testnet/mumbaiそれぞれのチェーンで、OmnichainNFTをmintします。
npx hardhat --network bsc-testnet omnichainNonFungibleTokenMint


npx hardhat --network mumbai omnichainNonFungibleTokenMint


④ 自身が、そのチェーン上の、そのトークンの保有者であることを確認する
先ほどmintしたOmnichainNFTのowner(保有者)が、あなたのwalletアドレスであることを確認します。
npx hardhat --network bsc-testnet omnichainNonFungibleTokenOwnerOf --token-id 1
npx hardhat --network mumbai omnichainNonFungibleTokenOwnerOf --token-id 51


⑤ OmnichainNFTをチェーンを跨いで転送する(bsc-testnet => mumbai)
先ほどbsc-testnetチェーンでmintしたOmnichainNFTを、mumbaiチェーンに転送してみます。
npx hardhat --network bsc-testnet omnichainNonFungibleTokenTransfer --target-network mumbai --token-id 1


⑥ 転送元チェーン上にトークンが存在しないことを確認する
『④ 自身が、そのチェーン上の、そのトークンの保有者であることを確認する』で実行したコマンドと同じものを試してみます。
npx hardhat --network bsc-testnet omnichainNonFungibleTokenOwnerOf --token-id 1


⑦ 最後に転送先チェーン上にトークンが存在することを確認する
npx hardhat --network mumbai omnichainNonFungibleTokenOwnerOf --token-id 1


以上で、bsc-testnetチェーンでmintしたOmnichainNFT(tokenID = 1)を、mumbaiチェーンに転送(bsc-testnetチェーンでburn / mumbaiチェーンでmint)することができました。
他にも、OmnichainFT(Omnichain ERC20)やOmniCounterのセットアップ手順も掲載されているので、より理解を深めたいという方はぜひこちらを参考に遊んでみてください!
まとめ


Nouns DAO JAPANは世界で一番Nounsを広げるコミュニティを目指します。Discord参加はこちら
本記事では、執筆時点で徐々に頭角を現しつつある「LayerZero」「OmnichainNFT」を中心に取り上げていき、その概要やコンセプトなどについて私見を交えながら解説しました。
本記事が、「LayerZero」「OmnichainNFT」の概要やコンセプト・開発の一例などについて理解したいと思われている方にとって、少しでもお役に立ったのであれば幸いです。
また励みになりますので、参考になったという方はぜひTwitterでのシェア・コメントなどしていただけると嬉しいです。
🆕記事をアップしました🆕
— イーサリアムnavi (@ethereumnavi) April 15, 2022
今回は、Omnichain相互運用性プロトコルを標榜する「LayerZero」および「Omnichain NFT」について解説しました⛓
✅クロスチェーン/マルチチェーンとの違い
✅L2との違い
✅Omnichain NFTのデプロイ/転送方法
などについて、ぜひご参考ください✍️https://t.co/3hFsU1T3E1


イーサリアムnaviを運営するSTILL合同会社では、以下などに関するお問い合わせを受け付けております。
- 広告掲載
- リサーチ代行業務
- アドバイザー業務
- その他(ご依頼・ご提案・ご相談など)
まずはお気軽に、ご連絡ください。
- Webサイト:still-llc.co.jp
- Twitter:@STILL_Corp
- メールアドレス:info@still-llc.com