はじめに
このプロジェクトは、SolidStateライブラリのダイヤモンドストレージパターンを使用して構築された、アップグレード可能なNFTマーケットプレイスのスマートコントラクトです。このマーケットプレイスでは、NFTのリスト、購入、オークションといった各機能を分割してモジュール化(ファセット化)し、柔軟にアップグレードやスケーリングが可能な設計になっています。
リポジトリ
主な特徴
- ダイヤモンドストレージパターン: SolidStateのダイヤモンドプロキシとファセットを活用し、モジュールごとに分割されたアップグレード可能なスマートコントラクトを実現しています。
- NFTリスト機能: ユーザーがNFTを価格設定してマーケットプレイスにリストできます。
- NFT購入機能: 購入者がリストされたNFTを支払って購入することが可能です。
- NFTオークション機能: オークション機能をサポートし、指定した期間内でユーザーがNFTの入札を行えます。
- 共通ストレージ: 全てのファセットが共通のストレージを使用して、データの整合性を保ちつつ効率的にアクセスできるようにしています。
ファイル構成
contracts/
├── NFTMarketplaceDiamond.sol // ダイヤモンドプロキシコントラクト(各ファセットを管理)
├── ListFacet.sol // NFTリスト機能を提供するファセット
├── BuyFacet.sol // NFT購入機能を提供するファセット
├── AuctionFacet.sol // NFTオークション機能を提供するファセット
└── MarketplaceStorage.sol // 共有ストレージ定義
コントラクトの概要
1. ダイヤモンドプロキシコントラクト (NFTMarketplaceDiamond.sol)
NFTMarketplaceDiamond
コントラクトは、中央のプロキシとして機能し、異なるファセットに呼び出しを委譲します。このコントラクトには、ファセットアドレスのリストを初期化する機能があり、特定の機能を正しいファセットにルーティングする役割を担っています。
2. リストファセット (ListFacet.sol)
ListFacet
コントラクトは、NFTのリスト機能を管理します。ユーザーがNFTをマーケットプレイスにリストする際に価格を設定し、NFTの転送承認を確認することで、所有権が適切に移転されるようにします。
3. 購入ファセット (BuyFacet.sol)
BuyFacet
コントラクトは、リストされたNFTを購入する機能を提供します。購入者が適切な支払いを行うと、NFTが購入者に転送され、支払いが売り手に送られます。
4. オークションファセット (AuctionFacet.sol)
AuctionFacet
コントラクトは、オークション機能を提供します。売り手がオークションを作成し、ユーザーが指定された期間内で入札を行います。オークションが終了すると、最高入札者にNFTが転送され、売り手に支払いが行われます。
5. マーケットプレイスストレージ (MarketplaceStorage.sol)
MarketplaceStorage
ファイルは、各ファセットが共有するストレージ構造を定義します。これにより、リストやオークションの情報が全ファセットで一貫して保持され、効率的にデータにアクセスできるようになります。
使用方法
インストール
-
依存関係のインストール: 必要なOpenZeppelinとSolidStateライブラリをインストールします。
npm install @openzeppelin/contracts @solidstate/contracts
-
コントラクトのデプロイ: HardhatやTruffleといった開発フレームワークを用いて各ファセットをデプロイし、
NFTMarketplaceDiamond
コントラクトにファセットのアドレスを初期化します。
ワークフローの例
-
NFTのリスト:
-
ListFacet
を使用してNFTをマーケットプレイスにリストし、価格を設定し、NFTの転送承認を確認します。
-
-
NFTの購入:
- 購入者が
BuyFacet
のbuyNFT
関数を呼び出し、NFTを購入します。
- 購入者が
-
オークションの作成と入札:
-
AuctionFacet
を使用してオークションを作成し、ユーザーが入札し、終了時に最高入札者にNFTが転送されます。
-
SolidStateの利用によるメリット
- アップグレード性: 各ファセットを個別にアップグレードでき、他のモジュールに影響を与えずに機能を追加・修正できます。
- モジュール性: リスト、購入、オークションといった機能が分割されており、拡張や変更が簡単です。
- 効率的なストレージ管理: ダイヤモンドストレージパターンにより、全ファセットでのデータの一貫性と最適なストレージ使用が実現します。
注意点
-
アクセス制御:
onlyOwner
などのアクセス制御を追加し、重要な関数の呼び出しを制限することを検討してください。 - マーケットプレイスの互換性: 他のNFT標準にも対応することで、幅広いNFTマーケットプレイスと互換性を持たせることが可能です。