0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Web3Advent Calendar 2024

Day 24

アップグレード可能なNFTマーケットプレイスのスマートコントラクト

Posted at

はじめに

このプロジェクトは、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ファイルは、各ファセットが共有するストレージ構造を定義します。これにより、リストやオークションの情報が全ファセットで一貫して保持され、効率的にデータにアクセスできるようになります。

使用方法

インストール

  1. 依存関係のインストール: 必要なOpenZeppelinとSolidStateライブラリをインストールします。

    npm install @openzeppelin/contracts @solidstate/contracts
    
  2. コントラクトのデプロイ: HardhatやTruffleといった開発フレームワークを用いて各ファセットをデプロイし、NFTMarketplaceDiamondコントラクトにファセットのアドレスを初期化します。

ワークフローの例

  1. NFTのリスト:

    • ListFacetを使用してNFTをマーケットプレイスにリストし、価格を設定し、NFTの転送承認を確認します。
  2. NFTの購入:

    • 購入者がBuyFacetbuyNFT関数を呼び出し、NFTを購入します。
  3. オークションの作成と入札:

    • AuctionFacetを使用してオークションを作成し、ユーザーが入札し、終了時に最高入札者にNFTが転送されます。

SolidStateの利用によるメリット

  • アップグレード性: 各ファセットを個別にアップグレードでき、他のモジュールに影響を与えずに機能を追加・修正できます。
  • モジュール性: リスト、購入、オークションといった機能が分割されており、拡張や変更が簡単です。
  • 効率的なストレージ管理: ダイヤモンドストレージパターンにより、全ファセットでのデータの一貫性と最適なストレージ使用が実現します。

注意点

  • アクセス制御: onlyOwnerなどのアクセス制御を追加し、重要な関数の呼び出しを制限することを検討してください。
  • マーケットプレイスの互換性: 他のNFT標準にも対応することで、幅広いNFTマーケットプレイスと互換性を持たせることが可能です。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?