著者:ハビエル・カルデロン編集: Cointime.com 237
序章
ブロックチェーン空間で波を起こしているユニークなデジタル資産である非代替トークン (NFT) の世界へようこそ。 NFT の台頭により、ブロックチェーン ネットワークで実現できる可能性が大幅に拡大していることがわかります。エキサイティングな開発の 1 つは、ウォレットまたはアカウントとしての NFT の概念であり、これは多くの新しいユースケースやアプリケーションを開く強力なアイデアです。
ERC-721 はイーサリアムの NFT 標準であり、コミュニティに十分に貢献してきましたが、その制限により新しい拡張機能や概念が生まれました。その 1 つは、「バインドされたトークン アカウント」の概念を提案する ERC-6551 です。このドラフトペーパーでは、ERC-721 トークンごとに独自のスマート コントラクト アカウントを作成し、既存の ERC-721 スマート コントラクトや基盤となる機能を変更することなく、NFT が資産を所有し、アプリケーションと対話できるようにするという提案が示されています。
動作原理
このガイドでは、ERC-6551提案を使用してNFTをウォレットまたはアカウントに変換するプロセスについて説明します。まず、ERC-6551 の背後にある基本原理の概要を説明します。ERC-6551 は、結合されたトークン アカウントを作成するための標準インターフェイスと権限のないレジストリを提供します。次に、レジストリの createAccount とアカウント、IERC6551Account インターフェイスなど、特定の関数の実装について詳しく説明しました。
次に、Solidity に IERC6551Account を実装し、NFT をウォレットとして使用するスマート コントラクトを作成する方法を検討しました。このコントラクトには、ERC-20 トークンを受信、保持、送信する機能があり、基本的に各 NFT の個別のウォレットとして機能します。この機能を実装する単純化されたスマート コントラクトの例も共有しました。これは良い出発点となるはずです。
共有しているコードは説明のみを目的としており、この機能を運用環境に実装する予定がある場合は、コードを監査して徹底的にテストすることが重要であることに留意してください。
NFT をウォレットやアカウントに変える機能は、ブロックチェーンの世界に新たな可能性をもたらします。これにより、NFT 用の独自のデジタル ID が作成され、チェーン上の資産を所有および管理できます。ゲーム資産を蓄積するためにアバターをデジタル化する場合でも、ロイヤルティを保持するためにアートワークをデジタル化する場合でも、インタラクションを記録するためにロイヤルティ カードをデジタル化する場合でも、潜在的なアプリケーション シナリオは非常に興味深いものです。
埋め込む
ブロックチェーン技術は、資産の所有権と取引を理解する方法に革命をもたらしました。その 1 つは、ブロックチェーン上で表現され、多くの注目を集めている独自の資産である非代替トークン (NFT) です。ただし、これらの資産の個性にもかかわらず、従来の NFT には重要な制限があります。つまり、独立して資産を所有したり、アプリケーションと対話したりすることができません。したがって、ERC-6551は、NFTに固有のアカウントを与えることでNFTをウォレットまたはアカウントに変える新しい方法です。この記事では、ERC-6551 の実装方法について詳しく説明し、ERC-6551 がどのように NFT をより柔軟にするかを示し、コード スニペットとベスト プラクティスを提供します。
ERC-6551 を理解する
ERC-6551 を理解する
イーサリアム改善提案 (EIP) ERC-6551 は、ERC-721 非代替トークン (NFT) の機能を拡張するために最近導入された標準です。各 NFT に一意の決定論的なスマート コントラクト アカウントを割り当て、既存の ERC-721 スマート コントラクトやインフラストラクチャに変更を加えることなく、NFT が資産を所有し、アプリケーションと対話できるようにします。
ERC-6551 システムは、トークン バインド アカウントを展開するための権限のないレジストリと、トークン バインド アカウントを実装するための標準インターフェイスという 2 つの主要コンポーネントで構成されます。レジストリは、結合された各トークン アカウントを ERC-1167 最小限のプロキシ コントラクトとして展開し、不変の定数データをバイトコードに追加することによって実現されます。各アカウントのアドレスは決定的であり、実装アドレス、トークン コントラクト アドレス、トークン ID、EIP-155 チェーン ID、およびオプションのソルト値の一意の組み合わせから導出されます。
ERC-6551の実装方法
ERC-6551 は、パーミッションレス、不変、所有者のないレジストリ契約を通じて実装されます。レジストリは、アカウント バインド トークンの使用を希望するプロジェクトの単一のエントリ ポイントとして機能します。レジストリ コントラクトには 2 つの機能があります。
1. createAccount : 実装アドレスに従って、ERC-721 トークンのトークン アカウントを展開してバインドします。
2. account : 実装アドレスに基づいて ERC-721 トークン バインド トークンのアカウント アドレスを計算する読み取り専用関数。
以下はレジストリ コントラクトのインターフェイスです。
アカウント作成機能を使用して、新しい結合トークン アカウントを展開できます。アカウントがすでに作成されている場合は、create2 関数を呼び出さずにアカウント アドレスを返します。 initData が null でなく、アカウントが作成されていない場合は、作成後に指定された initData が呼び出されます。 account 関数は、計算されたバインドされたトークンのアカウント アドレスを返します。
保証されたトークンアカウントを作成する
スマート コントラクトをさらに開発するには、IERC6551Account によって実装された機能を拡張することから始めます。
まず、NFT によって受信される可能性のある ERC-20 トークンを処理する機能を追加しましょう。 NFT が別のアドレスに特定の ERC-20 トークンの一定量の使用を承認できるようにする関数を追加します。
インターフェイス IERC20 {
関数承認(アドレス消費者、uint256 金額) 外部戻り値 (ブール値);
}
契約 MyERC6551Account は IERC6551Account {
// 他の契約コード...
function acceptERC20(アドレストークンアドレス、アドレス消費者、uint256金額) 外部のみOwner {
IERC20 トークン = IERC20(トークンアドレス);
token.approve(支出者, 金額);
}
IERC20 トークン = IERC20(トークンアドレス);
token.approve(支出者, 金額);
}
}
ここで、onlyOwner は、NFT の所有者のみが関数を呼び出せるようにする修飾子です。 IERC20 は、ERC-20 トークンと対話するための簡素化されたインターフェイスです。
次に、NFT が融資プラットフォームなどの仮想の DeFi プロトコルと対話する機能を追加しましょう。わかりやすくするために、NFT が一定量の ERC-20 トークンをプラットフォームに入金できるようにする関数を追加します。
インターフェイス ILendingPlatform {
関数デポジット(アドレストークンアドレス、uint256 金額)外部;
}
契約 MyERC6551Account は IERC6551Account {
// 他の契約コード...
function destroyToLendingPlatform(address platformAddress, address tokenAddress, uint256 amount) externalonlyOwner {
// 指定された量のトークンをこのコントラクトに転送します
IERC20 トークン = IERC20(トークンアドレス);
require(token.transferFrom(msg.sender, address(this), amount), "トークン転送に失敗しました");
// 融資プラットフォームがトークンを使用することを承認する
token.approve(プラットフォームアドレス, 金額);
// トークンを融資プラットフォームに預けます
ILendingPlatform プラットフォーム = ILendingPlatform(プラットフォームアドレス);
platform.deposit(tokenAddress, amount);
}
}
このコード スニペットでは、ILendingPlatform は、仮想の融資プラットフォームと対話するための簡素化されたインターフェイスです。まず指定された量のトークンを NFT 所有者から契約に転送し、次に融資プラットフォームがそれらのトークンを使用することを承認し、最後にトークンを融資プラットフォームに預けます。
これらは、ERC-6551 を使用して実現できることのほんの一部の例です。プロジェクトの特定のニーズに応じて、可能性は事実上無限です。新しい機能をメインネットにデプロイする前に、必ず徹底的にテストして、期待どおりに機能し、セキュリティ ホールがないことを確認してください。
NFTをウォレットに変換
NFT がウォレットまたはアカウントとして機能するスマート コントラクトを作成するには、まず ERC-721 コントラクトをデプロイする必要があります。この契約は、NFT の鋳造と転送を処理します。
次に、ERC-721 コントラクトと対話する IERC6551Account コントラクトを実装します。このコントラクトには、ERC-20 トークンを受信、保持、送信する機能があり、基本的に各 NFT の個別のウォレットとして機能します。
次に、ERC-721 コントラクトと対話する IERC6551Account コントラクトを実装します。このコントラクトには、ERC-20 トークンを受信、保持、送信する機能があり、基本的に各 NFT の個別のウォレットとして機能します。
以下は IERC6551Account コントラクトの簡略化された例です。
プラグマ ソリッドティ ^0.8.0;
インポート "@openzeppelin/contracts/token/ERC721/ERC721.sol";
インポート "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
インポート "@openzeppelin/contracts/access/Ownable.sol";
契約 NFTWallet は ERC721、ReentrancyGuard、所有可能 {
マッピング(uint256 => アドレス) private _wallets;
コンストラクタ(文字列メモリ名, 文字列メモリシンボル) ERC721(名前, シンボル) {}
function WalletOfToken(uint256 tokenId) public view returns (address) {
return _wallets[トークンID];
}
function mint(アドレス) publiconlyOwner {
uint256 newTokenId = totalSupply() + 1;
_mint(to, newTokenId);
_wallets[newTokenId] = に;
}
function transferERC20(uint256 tokenId, address token, address to, uint256 amount) public nonReentrant {
require(_wallets[tokenId] == msg.sender, "ウォレット所有者のみが転送できます");
IERC20(トークン).transferFrom(アドレス(この), 宛先, 金額);
}
function depositERC20(uint256 tokenId, address token, uint256 amount) public nonReentrant {
require(_wallets[tokenId] == msg.sender, "ウォレット所有者のみが入金できます");
IERC20(トークン).transferFrom(msg.sender, address(this), amount);
IERC20(トークン).transferFrom(msg.sender, address(this), amount);
}
function BalanceOfERC20(uint256 tokenId, address token) public view returns (uint256) {
require(_wallets[tokenId] == msg.sender || ownerOf(tokenId) == msg.sender, "ウォレットの所有者ではありません");
return IERC20(トークン).balanceOf(アドレス(この));
}
}
このコントラクトでは、各 NFT (tokenId によって識別される) はウォレット アドレス (_wallets[tokenId]) に関連付けられます。 mint 関数は、新しい NFT を生成し、そのウォレット アドレスを指定されたアドレスに設定します。 transferERC20 関数を使用すると、NFT 所有者は、NFT に関連付けられたウォレットから別のアドレスに ERC-20 トークンを転送できます。デポジットERC20機能を使用すると、NFT所有者は個人アドレスからNFTに関連付けられたウォレットにERC-20トークンを入金できます。 BalanceOfERC20 関数を使用すると、NFT 所有者は、NFT に関連付けられたウォレット内の ERC-20 トークンの残高を確認できます。
この契約はわかりやすくするために簡略化されており、ERC-6551 標準の完全な機能は含まれていないことに注意してください。このコードは完全に安全ではない、または最適化されていない可能性があるため、本番環境に導入する前に徹底的にテストおよび監査する必要があります。
最後に、これらのスマート コントラクトを実際に展開するには、ETH がガスの料金を支払う必要があることに注意してください。必要なガスの量は、契約の複雑さとイーサリアム ネットワーク上の現在のガス価格によって異なります。
ベストプラクティス
ERC-6551 を実装する場合は、セキュリティと効率を確保するためのベスト プラクティスに従うことが重要です。
1. 互換性の確保: ERC-6551 標準は、既存の ERC-721 トークンと下位互換性があるように設計されています。互換性は、既存の ERC-721 契約でテストすることによって常に確保されます。
2. セキュリティ: 他のスマート コントラクトと同様、セキュリティは最も重要です。実装が安全であり、一般的な攻撃ベクトルに対して耐性があることを確認してください。導入前にセキュリティ監査を実施することを検討してください。常に、ERC-721 トークンとそれに関連するアカウントに対する所有者の制御を優先してください。
3. ガス効率: 実装でガスが効率的に使用されていることを確認してください。イーサリアム ブロックチェーン上のすべての操作はガスを消費し、非効率な契約は不必要に高いコストにつながる可能性があることに注意してください。
4. 正しいアドレスを使用する: 結合トークン アカウントを作成するときは、必ず正しい実装アドレス、チェーン ID、トークン コントラクト アドレス、およびトークン ID を使用してください。間違ったアドレスまたは無効なアドレスを使用すると、予期しない動作が発生したり、アカウントの制御が失われたりする可能性があります。
5. ソルトを利用する: アカウント作成機能のオプションのソルトを使用すると、他のパラメーターが同じであっても、結合されたトークン アカウントごとに一意のアドレスを作成できます。この機能を使用すると、各アカウントの一意性とセキュリティが向上します。
結論は
ERC-6551 はイーサリアム エコシステムにとってエキサイティングな開発であり、ERC-721 トークンに固有のアカウントを提供することで機能を拡張します。この開発により、NFT が資産を所有し、アプリケーションと独立して対話するなど、新たな可能性が開かれます。このガイドでは、ERC-6551 とその実装の概要を説明します。ただし、他の新しいテクノロジーと同様に、契約の安全性と効率性を確保するために、ベスト プラクティスに従って慎重に使用する必要があります。
全てのコメント