3DアートデータをNFT化してOpenSeaで閲覧する

CTO室の井上です。

NFT(Non-Fungible Token:非代替性トークン)が話題です。このブログでは、3Dゲーム開発エンジンPlayCanvasで作成された3Dアートデータを、P2P分散型ファイルシステムIPFSにアップロードした後にNFT化してマーケットプレイスのOpenSeaで閲覧・取引ができる状態にしてみたいと思います。

NFT

NFT(Non-Fungible Token:非代替性トークン)とは、ブロックチェーン上で発行される代替可能性のないデジタルトークン(証票)です。画像等のデジタルアイテムと紐づけることで、ブロックチェーン上でのデジタルアイテムの取引が可能となります。

NFTとは何かを基礎から徹底解説、なぜデジタルデータに数億円の価値が付くのか?(FinTech Journal)
ブロックチェーン×「NFT」〜NFTの基礎と活用事例〜(Trade Log)

Twitter創業者ジャック・ドーシーの最初のTweetが約3億円で落札されたり、デジタルアートが約75億円で落札されたりと市場が賑わっており、新しいデジタルデータの流通プラットフォームとして注目を集めています。

OpenSea等のNFTマーケットプレイスを利用すれば、Webブラウザ上の操作のみでデジタルデータのNFT化が可能ですが、今回のブログでは自作のNFTスマートコントラクトの作成、実装、デプロイ及びNFT発行の方法を紹介します。

PlayCanvas

PlayCanvasとは、デスクトップ・モバイルブラウザ向けに作られたHTML/WebGLゲームエンジンです。インタラクティブな2D/3D Webコンテンツを開発するための豊富な機能を備えています。今回は弊社PlayCanvas推進室に用意してもらった3Dアート(glTF形式)をNFT化したいと思います。



ERC-721

ERC-721はEthereumブロックチェーン上でNFTを実装するための規格であり、多くのNFTで使用されています。発行するトークンに一意となるトークンIDを付与することで非代替性を実現しています。画像や動画等のデジタルコンテンツを扱うためのメタデータという情報の実装方法も定義されています。このブログでもERC-721を使用してNFTを実装していきます。

最近のEthereumの価格上昇で、メインネットでの操作に高額の費用が必要になっています。今回はテストネットを使用して実装を行います。

ERC-721公式ドキュメント

tokenURIとメタデータ

NFT化したいデジタルデータをブロックチェーン上に直接保存をするのは、コストやスケーラビリティの面で現実的ではありません。特に画像等のサイズの大きいデータを保存する場合はEthereumのGas代が増大する問題が発生します。
ERC-721では各NFTのtokenURIという領域にメタデータをJSON形式で設定できます。メタデータの中にNFTの名前や詳細データ等と共にデジタルデータの保存先(外部サーバー等)を指定することができます。実際のデジタルデータは外部に保存して、それを指し示す情報をメタデータとしてブロックチェーン上に記録した情報をNFTとして取り扱います。

ERC-721 tokenURI公式ドキュメント

Remix

Remixはスマートコントラクト開発用言語Solidityの統合開発環境で、スマートコントラクトの作成とコンパイルとEthereumブロックチェーンへのデプロイ及び実行をWebブラウザ上で全て実行でき、大変便利です。

Contract開発環境(IDE)の活用

Remixからスマートコントラクトをデプロイする際にEthereumウォレットMetamaskのインストールが必要になります。

MetaMaskのインストール

OpenZeppelin

OpenZeppelinは、スマートコントラクト開発のための堅牢なオープンソースライブラリであり、様々なタイプのライブラリが用意されています。今回はOpenZeppelinのERC721ライブラリを使用します。

OpenZeppelin ERC-721公式ドキュメント
OpenZeppelin ERC-721ソースコード

以下の通り、OpenZeppelinのライブラリを使用すると、NFT作成のスマートコントラクトを簡潔に実装することができます。

pragma solidity 0.6.6;

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/solc-0.6/contracts/token/ERC721/ERC721.sol";

contract SimpleCollectible is ERC721 {
    uint256 public tokenCounter;
    constructor () public ERC721 ("Space", "SPC"){
        tokenCounter = 0;
    }

    function createCollectible(string memory tokenURI) public returns (uint256) {
        uint256 newItemId = tokenCounter;
        _safeMint(msg.sender, newItemId);
        _setTokenURI(newItemId, tokenURI);
        tokenCounter = tokenCounter + 1;
        return newItemId;
    }
}


IPFS

IPFS(InterPlanetary File System)は、P2P分散型ファイルシステムでブロックチェーンのストレージやスケーラビリティの問題を解決する技術として注目されています。ERC-721のメタデータに指定するデジタルデータの保管先をIPFSにすることで、分散型ストレージの非中央集権なNFTを作成することができます。

IPFS入門
IPFS ~ハイパーメディアプロトコル~(三井情報株式会社)

Pinata

Pinataは、IPFSピンニングサービスの一つでWebブラウザ上からIPFSへのファイルのアップロードが可能です。このサービスを使用して3DデータのIPFSへのアップロードを行います。

PinataのIPFSアップロード画面

OpenSea

OpenSeaは世界最大手のNFTマーケットプレイスでERC-721の規格で実装されたNFTの閲覧、売買が可能です。ERC-721の規格に準拠したNFTは自動的にOpenSeaにて閲覧・売買が可能となります。

OpenSeaにはテストネットであるRinkebyのマーケットプレイスも用意されています。Gas代をかけずにメインネットと同一の操作やテストが可能です。



ここでOpenSea上で3Dアートモデルを表示する方法を考えたいと思います。OepeSeaメタデータ公式ドキュメントを確認します。

animation_urlに3Dアートモデルの保存先を指定してあげれば良いことが分かります。animation_urlに3Dアートモデルを保存したIPFSのURIを指定します。

{
  "name": "Green man",
  "image": "https://ipfs.io/ipfs/QmVRhTsedPSDFAG5fub9pQdXxuroCqU4c1Ff2LgqCAwmyh",
  "animation_url": "https://ipfs.io/ipfs/QmVjARX3ZXTGTdUn1US4osSXtBieYZMNZDN83vNoXFpqro"
}
要素名 詳細
name NFTの名前
image 画像のパス
animation_url 3Dデータのパス


Remixでの操作(コンパイル、デプロイ、NFT発行)

Remixでのコンパイル実行


Remixでのスマートコントラクトのデプロイ


RemixでのNFT発行




OpenSeaでのNFT表示確認

OpenSeaのNFT画面で3Dアートモデルを表示することができました。


最後に

このブログでは、主に以下の技術やサービスを利用して3DアートデータのNFT化の方法を紹介しました。皆さんの理解の一助になれば幸いです。

  • ERC-721: Ethereum上でNFTを実装するための規格
  • Remix: Solidity言語統合開発環境
  • OpenZeppelin: スマートコントラクト開発用ライブラリ
  • IPFS: P2P分散型ファイルシステム
  • Pinata: IPFSピンニングサービス
  • OpenSea: NFTマーケットプレイス
  • PlayCanvas: 3Dゲーム開発エンジン



最後になりますが、GMOインターネットグループのNFTマーケットプレイスAdam byGMOのβ版が提供開始しています。こちらのご利用も是非検討をお願いします。