NFTはデジタルアートの高額取引やBCG人気によって一気に認知度を向上させました。企業がマーケティングに活用する事例も多くみられるようになっています。
NFTをビジネスに活用する上でカギになってくるのがカスタマイズ性です。NFTはスマートコントラクトから作成することによって様々な機能を搭載できます。
本記事ではNFTをスマートコントラクトから作成する方法、拡張できる機能、注意点について解説します。Web3.0ビジネスを進める方、NFTをビジネスに取り入れようと計画している方々に向けて有益な情報となれば幸いです。
この記事の構成
NFTの概要
NFT(Non-Fungible Token)はブロックチェーン技術を利用したデジタル資産です。ビットコインのようなFT(Fungible Token)が交換機能に特化しているのに対し、NFTはデジタルデータの所有権を担保する機能に特化しています。
NFTはデジタルアートや音楽、ゲーム内アイテムなどの所有権を証明します。動画、ツイート、メタバース内不動産、仮想ペットなど、デジタルで表現可能なあらゆるものがNFTとして作成可能です。
スマートコントラクトへの理解
スマートコントラクトは特定の条件で自動的に実行されるプログラムコードです。ブロックチェーン技術を利用して信頼性と透明性を持った取引(契約)を実現します。
スマートコントラクトの仕組みを解説する際に「自動販売機の例」がよく使用されます。自動販売機は特定の入力(お金)が与えられたときに特定の出力(商品)を提供するシステム(プログラム)に基づいて動作します。この仕組みはスマートコントラクトの動作原理と似ています。
スマートコントラクトはNFTの作成と管理に使用されています。デジタルアセットの所有権を確立する上で基軸となる技術です。
NFTの規格
規格はNFTの作成や管理に関するルールです。ブロックチェーンの種類や仕様によって異なる規格が使用されます。最も認知度が高く、一般的な規格はEthereumネットワークのERC-721とERC-1155です。
ERC-721は最初にできたNFT規格です。NFT黎明期から多くのプロジェクトで採用されており、NFTの標準規格として広く認識されています。L2※1でも使用できることから、さらなるユーザビリティの向上が期待できます。
ERC-1155は一つのスマートコントラクトで複数のNFTとFTを管理できる規格です。マルチトークン規格とも呼ばれ、異なる種類のデジタルアセットを効率的に管理することが可能です。ERC-1155はBCG※2の流行と共に広く認知されるようになりました。ERC-1155によって、ゲーム内のアイテムやキャラクターなどを一つのスマートコントラクトで管理します。
一方で、FLOW※3やNEP※4などの新たな規格も注目されています。利便性やコストパフォーマンスといった魅力が広く認知されれば、NFT市場でシェアを拡大する可能性もあります。新規格のNFTプロジェクトにも注目していきましょう。
※1 L2(Layer2)はEthereumを拡張するための技術やプロトコルの総称です。
詳細情報:「L2スケーリングへの移行とは?Ethereumのネットワーク負荷対策を解説」
※2 BCG(Block Chain Game)はブロックチェーンを利用したゲームです。NFTを使用することからNFTゲームとも呼ばれます。
※3 Dapper Labsによって開発されたNFT規格です。
※4 NEP(NFT Ecosystem Proposal)はNEARプロトコルに基づくNFT規格です。
NFTの作成方法
NFTの作成方法は大きく2つあります。OpenSea(オープンシー)などのプラットフォームを利用する方法と自分でスマートコントラクトを作成する方法です。
プラットフォームを使用する方法はユーザーフレンドリーで、技術的な知識が少なくてもNFTを作成できます。ただし、プラットフォームの規則に従う必要があります。NFTに実装できる機能は事前に確認しておきましょう。
自分でスマートコントラクトを作成するにはブロックチェーンとスマートコントラクトの知識が必要ですが、より柔軟なNFTカスタマイズが可能です。スマートコントラクトをコーディングし、ブロックチェーンにデプロイします。
NFTを自分でミントするメリット
- カスタマイズ性の追求
- プラットフォーム依存の回避
- コスト削減
カスタマイズ性の追求
NFTを完全にカスタマイズできます。特定のビジネスモデルやクリエイティブなアイデアを実現するために重要なアプローチです。自分でスマートコントラクトを書くことで、ブロックチェーンとスマートコントラクトに対する理解を深めることにもなります。
プラットフォーム依存の回避
プラットフォームを使用しないことで、規則や制限を回避することができます。また、プラットフォームがサービスを停止した場合でも、自分で作成したNFTは影響を受けません。
コスト削減
プラットフォームを使用する場合、リスティング料や売買手数料などが発生します。自分でスマートコントラクトを作成/管理すれば様々な手数料を回避/削減することができます。
NFTをプラットフォームでミントする方法
- アカウント作成
- フォルダ(コレクション)の作成
- アイテムの追加
- 販売設定
- ミント
ここでは世界最大のNFT販売プラットフォームであるOpenSeaを例に、ミント方法を解説します。プラットフォームそれぞれで細部のミントプロセスが異なる場合があります。詳細は各プラットフォーム公式サイトを確認しましょう。
アカウント作成
参照画像:https://opensea.io/
最初にOpenSea公式サイトにアクセスし、アカウントを作成します。MetaMask(メタマスク)などのWeb3.0対応ウォレットをOpenSeaに接続する必要があります。
NFTミントで使用するガス代も準備しておきましょう。ガス代はネットワークの混雑具合で変化します。日本円換算で、数百円から数千円程度のETHがかかる場合があります。
OpenSea公式サイト:https://opensea.io/
フォルダ(コレクション)の作成
参照画像:https://opensea.io/learn/how-to-create-an-nft
ダッシュボードの「My collections」から「Create a collection」をクリックし、新しいコレクションを作成します。
コレクションのURLは短く、覚えやすく、ブランドに関連するものを設定しましょう。カテゴリはNFTがどのような種類のコンテンツに関連するかを示すためのものです。最も適切なものを選択してください。
また、OpenSeaでは最大10%のロイヤルティ収入が設定できます。NFT売買の際にトレード額に応じて報酬がクリエイターに支払われるシステムです。2次販売でも収益が上がるのでクリエイターにとっては大きな魅力です。
アイテムの追加
参照画像:https://opensea.io/blog/announcements/introducing-the-collection-manager/
コレクション作成後に「Add Items」をクリックして新しいデジタルアセットを追加します。画像/音声/3Dモデルなどをアップロードし、アイテム名/説明/プロパティ/レベルなどの詳細を入力します。最後に「作成(Create)」ボタンを押して作成完了です。
この段階でNFTが作成されますが、Ethereumネットワークにガス代は支払われません。これは、OpenSeaがレイジーミンティング※5というシステムを採用しているからです。
※5 レイジーミンティングはミントをNFT販売後に実施するシステムです。NFTはオフチェーンで作成され、販売された時点でオンチェーンにミントされます。
販売設定
参照画像:https://support.opensea.io/hc/ja/articles/360063498333
「Sell」をクリックして販売設定を行います。価格、通貨(ETHまたはERC-20トークン)、販売形式、販売期間などを設定します。
このプロセスは必須ではありません。NFTを販売する予定がない方、もしくはNFTを転送する計画がある方は省略できます。
ミント(レイジーミンティング)
OpenSeaではNFT のミンティングを 販売後に行います。このシステムをレイジーミンティングといいます。販売後にNFTはオンチェーンとなり、ガス代が発生します。販売ではなく他ウォレットへの転送時にもオンチェーンになるのでガス代は発生します。
スマートコントラクトを作成してNFTをミントする方法
- Ethereumウォレット準備
- スマートコントラクトの作成
- スマートコントラクトのコンパイル
- スマートコントラクトのデプロイ
- NFTのミント
OpenSeaなどのプラットフォームを使用せずにNFTをミントする方法を解説します。このプロセスではSolidityなどのプログラミング言語やブロックチェーンシステムへの理解が不可欠です。一方で、視覚的/感覚的にスマートコントラクトを作成できるソリューションツールも登場しています。作業の効率化も期待できるので、必要に応じて活用しましょう。
Ethereumウォレット準備
参考画像URL:https://metamask.io/
最初にEthereumウォレット(Metamaskなど)とETHを準備します。ETHは作成したデジタルアセットをNFTとしてEthereumネットワークに乗せる際のトランザクション手数料(ガス代)として使用します。
本記事では主にEthereumネットワーク(ERC-721とERC-1155)を使用したNFTミントについて解説しています。他のブロックチェーンネットワークでNFTをミントする場合はそれぞれ対応するウォレット※6を準備する必要があります。
※6 NEAR Protocolの公式ウォレットは「NEAR Wallet」、FLOWブロックチェーンに対応するウォレットは「Blocto」です。
スマートコントラクトの作成
NFTを作成するためのスマートコントラクトを作成します。Ethereumネットワークでスマートコントラクトを作成するプログラミング言語としてSolidity、Vyperが有力です。
スマートコントラクトの開発環境のセットアップ
まずはSolidityなどのスマートコントラクト言語のコンパイラ※7をインストールします。次に開発フレームワーク(TruffleやHardhatなど)をセットアップします。フレームワークはスマートコントラクトのコンパイル、デプロイ、テストをする上で作業の効率化が期待できます。
ローカルのブロックチェーン環境(Ganacheなど)のセットアップもしておきましょう。開発中のスマートコントラクトをローカルでテストできます。
※7 コンパイラの選択は任意ですが、Solidityのコンパイルで最も有力なものはsolcです。ダウンロードURL:https://github.com/ethereum/solidity/releases
スマートコントラクトの設計
スマートコントラクトの設計はNFTの機能とセキュリティを決定していく重要なステップです。スマートコントラクトが何を達成するべきか、どのような機能を持つべきかを明確にします。必要な関数※8、トークン規格、セキュリティ対策などを具体的に決めていきましょう。
特にスマートコントラクトのセキュリティ対策は重要事項です。誤った設計やコードはユーザーの資産損失や様々な機能不全を引き起こす可能性があります。スマートコントラクトは一度デプロイすると変更が困難なため、設計段階での詳細な検討とテストが必要です。
※8 スマートコントラクトがタスクを実行するために必要なプログラムです。ミント、転送、所有権を決定する関数などがあります。
スマートコントラクトのコーディング
スマートコントラクトの設計で決めた目的や機能を実現させるために、コーディングを進めていきます。
上記図はOpenZeppelin※9のライブラリを使用したスマートコントラクトの一例です。ERC721規格でミント、転送、所有権確認の機能がコーディングされています。
例として出した上記コードは最も基本的なものです。実際にはWeb3.0プロジェクトに応じた機能追加やセキュリティ対策が必要となります。またライブラリを使用する際は、OpenZeppelinが事前にプロジェクト(特定のコードベースやリポジトリ)にインストールされている必要があります。
※9 OpenZeppelinはEthereum上で安全なスマートコントラクトを実装するためのオープンフレームワークです。OpenZeppelin公式サイトURL:https://www.openzeppelin.com/
スマートコントラクトのコンパイル
スマートコントラクトのコンパイルはSolidityのコードをEVM※10が解釈できるバイトコードに変換するプロセスです。
※10 EVM(Ethereum Virtual Machine)はEthereumのスマートコントラクト実行環境です。
コンパイラの選択
SolidityのコードをコンパイルするためにはSolidityコンパイラ(solc)が必要です。solcはコマンドラインツールです。JavaScriptで書かれたsolcのバージョン「solc-js」もあります。solc-jsはブラウザ環境で動作します。
コンパイラのバージョン確認
「スマートコントラクトの作成」で解説したスマートコントラクトのコードバージョンはコンパイラのバージョンと一致させましょう。
Solidityの仕様はバージョンによって変わるため、バージョンの不一致はエラーや予期しない動作を引き起こす可能性があります。コード冒頭にある「pragma solidity ^0.8.0;」で指定し、不具合を回避します。
コンパイルの実行
コンパイルはコマンドラインから直接実行するか、開発フレームワーク(TruffleやHardhat)を用いて行います。作業効率の面からもフレームワークを使った方が効率的です。コンパイル時にエラーが発生した場合、メッセージで注意喚起してくれます。
スマートコントラクトのデプロイ
コンパイルされたスマートコントラクトをブロックチェーンネットワークに「デプロイ」(アップロード)します。このプロセスはスマートコントラクトをブロックチェーン上で実行可能な状態にするものです。デプロイは通常のトランザクションと同様にガス料金が発生します。
デプロイにはTruffleやHardhatのようなフレームワークが使用されるのが一般的です。デプロイのプロセスを自動化し、エラーハンドリングやネットワーク管理などを容易にしてくれます。
デプロイ前にはテストネットワーク(Goerli、Sepoliaなど)※11でスマートコントラクトをデプロイし、テストしましょう。本番環境でのデプロイ前に問題を発見・修正できます。
※11 Ropsten/Rinkeby/Kilinなどのテストネットは廃止が発表されています。
デプロイトランザクションの作成
フレームワークを使用する場合、デプロイトランザクションは自動的に作成されます。フレームワークはコンパイルされたスマートコントラクトのバイトコードと、スマートコントラクトの初期化に必要なパラメータ※12を取得してデプロイトランザクションを作成します。
フレームワークを使用しない場合でも手動でデプロイトランザクションの作成は可能です。一方で、作業コストやエラーリスクが課題となります。
※12 パラメータはスマートコントラクトの初期設定値(トークンの名前やシンボル、初期供給量)を指定するためのものです。
トランザクションの署名
作成したトランザクションを所有するウォレットのプライベートキーで署名します。署名によってトランザクションの発行者が自分であることを証明します。
フレームワークを使用している場合、ウォレットとの接続とトランザクションの署名は自動的に行われます。
フレームワークを使用しない場合でもウォレットのプライベートキーを使用して署名することは可能です。しかし、このプロセスは手動で行う必要があり、セキュリティ上のリスクも伴います。プライベートキーの管理と使用には最大限の注意を払いましょう。
トランザクションの送信
署名されたデプロイトランザクションの送信はスマートコントラクトをブロックチェーンに公開するための最終ステップです。このプロセスはEthereumウォレット(MetaMaskなど)とEthereumネットワークへの接続を提供するサービス(Infuraなど)を使用して行います。
Infuraは開発者が直接フルノードを運用せずにEthereumネットワークとの通信を可能にします。トランザクションの送信やスマートコントラクトの呼び出しなど、Ethereumネットワークとのインタラクションが容易になります。
技術的には自分でEthereumノードを運用し、直接トランザクションを送信することも可能です。この方法では高度な技術/知識と大きなリソース(ストレージ、ネットワーク帯域など)が必要になります。
トランザクションの確認
参照画像URL:https://etherscan.io/
トランザクションがブロックに含まれ、マイニングされたことが確認できればスマートコントラクトは正常にデプロイされたと言えます。この時点でスマートコントラクトはブロックチェーン上で実行可能な状態となります。一般的にはブロックチェーンエクスプローラーを使用してトランザクションを確認します。
Ethereumネットワークの場合、Etherscan(https://etherscan.io/)やBlockchair(https://blockchair.com/ethereum)などのブロックチェーンエクスプローラーを使用します。エクスプローラーにトランザクションハッシュやアドレスを入力することで、特定のトランザクションやアドレスの状態を確認できます。
NFTのミント
NFTのミントは新しいNFTを生成し、ブロックチェーン上に登録するプロセスを指します。デプロイされたスマートコントラクトの関数(通常はmint)を用いて呼び出します。
最初にミントしたいNFTの情報(アートワークのURLやメタデータなど)を指定します。これらの情報を引数としてmint関数を呼び出します。この関数呼び出しはトランザクションとしてブロックチェーンに送信され、マイニングされることで実行されます。
トランザクションが成功すると、新しいNFTが生成され、指定した所有者(通常はトランザクションを署名/送信したアドレス)に割り当てられます。
スマートコントラクトに実装させる基本機能
NFTの最も基本的な機能はミント(Mint)、所有者の確認(Owner Check)、転送(Transfer)です。それぞれの基本機能を解説していきます。
ミント(Mint)
ERC-721規格の一例
ミント(Mint)は新しいNFTを生成し、特定のアドレスに割り当てる機能です。スマートコントラクトのmint関数によって実現されます。
この関数は新しいトークンIDを生成し(_tokenIdCounter.increment())、新しいトークンを指定されたアドレス(to)に割り当てる(_safeMint(to, _tokenIdCounter.current()))ことで、新しいNFTをミントします。
所有者の確認(Owner Check)
ERC-721規格の一例
所有者の確認(Owner Check)は特定のNFTの所有者を確認するための機能です。
引数としてトークンID(tokenId)を受け取り、そのトークンの所有者のアドレスを返します。所有者のアドレスはマッピング(_owners)で管理されます。
上記例の関数はpublic viewと宣言されており、誰でも呼び出すことができることを意味します。
転送(Transfer)
ERC-721規格の一例
転送(Transfer)はNFTを一つのアドレスから別のアドレスに移動する機能です。
送信者のアドレス(from)、受信者のアドレス(to)、トークンID(tokenId)を引数として受け取り、指定されたトークンを送信者から受信者へ転送します。
スマートコントラクトに実装させる拡張機能
スマートコントラクトに実装させる拡張機能の一例を解説します。実装はNFTの用途や設計、セキュリティに応じて検討される必要があります。Web3.0ビジネスの目的に合わせてNFTを最適化していきましょう。
メタデータの管理(Metadata Management)
ERC-721規格の一例
NFTに関連するメタデータ(名前、説明、画像URLなど)を管理する機能です。NFTの属性を設定していきます。
トークンID(tokenId)を引数として受け取り、トークンのメタデータURI※13を返します。メタデータURIはトークンに関連するメタデータが格納されている場所です。
※13 URI(Uniform Resource Identifier)はURL(Uniform Resource Locator)やURN(Uniform Resource Name)を含む情報源(リソース)の場所を識別する記述方式です。
ロイヤルティ
ERC-721規格の一例
ロイヤルティ機能はNFTの再販時に元の作成者が利益を受け取る機能です。NFTの転送が行われる際に、転送価格の一部が元の作成者に自動的に送られるように設定されます。
NFTの転送が行われる際に、転送価格(salePrice)の一部(royaltyRate%)が元の作成者(originalCreator[tokenId])に送られます。作成者はNFTが再販されるたびにロイヤルティを受け取ることができます。
アクセス制御
ERC-721規格の一例
スマートコントラクトで特定のサービスやコンテンツへのアクセスを制御します。
「if (isOwner) {…} else {…}」でユーザーがNFTを所有している場合と所有していない場合で異なる処理を行います。所有している場合は特定のサービスやコンテンツへのアクセスを許可し、所有していない場合はアクセスを拒否します。
上記以外でもOpenZeppelinのOwnableライブラリ(onlyOwner修飾子)でもNFT所有者だけが実行できる関数を作成/実行できます。
オラクルとの統合
ERC-721規格の一例
オラクルはブロックチェーン外のデータをブロックチェーン内に取り込むためのシステムです。Chainlink(チェーンリンク)はオラクルソリューションの代表例です。リアルタイムのデータフィードや各種APIへのアクセスを提供します。
スポーツイベントの結果に基づいてNFTの属性を変更する場合、Chainlinkのデータフィードを使用してスポーツイベントの結果を取得します。その結果に基づいてスマートコントラクト内の関数を実行してNFTの属性を更新します。
fetchData関数を呼び出すとChainlinkのデータフィードからデータが取得されます。データはfulfill関数によってdata変数に格納されます。取得したデータを基に、NFTの属性を更新することが可能になります。
DeFiとの統合
ERC-721規格の一例
NFTを担保として使用し、借入やレンディングなどの分散型金融サービスにアクセスする機能です。NFTをERC-20トークンとして扱い、DeFiプロトコルに対応することができます。
上記コード例ではNFTをデポジットするとERC-20トークンが発行され、そのトークンを返すとNFTを引き出すことが可能になります。
プロバイダンス(由来)の追跡
ERC-721規格の一例
プロバイダンス(由来)の追跡はNFTの所有権の移転履歴を追跡し、結果を表示する機能です。NFTの由来と正当性の証明に活用されます。
この機能はスマートコントラクトのtransfer関数内で実装されます。上記コード例ではトークンが転送されるたびにTransferEventが発行されます。NFTの所有権の移転履歴を追跡し、表示させます。
NFTデータの保存先
一般的にNFTのデータは外部のデータストレージサービスに保存されています。ブロックチェーン上にはデータへの参照(通常はURL)を設定し、データストレージにアクセスできるようにしておきます。データをブロックチェーン上に直接保存することも可能ですが、データサイズによっては高額なガス料金が発生する可能性があります。
データストレージサービスの中でもIPFS(InterPlanetary File System)は有力な選択肢です。IPFSは分散型のファイルストレージシステムとして機能し、データの永続性とアクセスを保証します。
他にもAmazon S3やGoogle Cloud Storageなどの従来型のクラウドストレージサービスを使用することも可能です。
詳細情報:IPFSとは?P2Pが構築する次世代のデータストレージを解説
NFTを自分でミントする際の注意点
- スマートコントラクトの設計と実装
- データの永続性とアクセシビリティ
- 法的な規制
スマートコントラクトの設計と実装
スマートコントラクトの設計と実装はNFTのミントにおける最も重要なステップです。スマートコントラクトの設計ミスや実装ミスはユーザーの資産損失やセキュリティ問題を引き起こす可能性があるためです。
2016年に発生したThe DAO事件はスマートコントラクトの設計ミスを狙ったものでした。攻撃者はスマートコントラクト内の関数を再帰的に呼び出し(Reentrancy攻撃)、約360万ETH(当時の価格で約52億円)もの資金を不正に流出させました。
スマートコントラクトは一度デプロイされると変更が困難であるため、設計や実装の段階での厳密なチェックとテストが不可欠です。
データの永続性とアクセシビリティ
NFTはブロックチェーン上のスマートコントラクトによって生成され、その所有権情報はブロックチェーン上に永続的に記録されます。しかし、一般的にNFTが参照するメタデータやコンテンツ(画像、音声、映像など)はブロックチェーン外のストレージに保存されます。これらのデータにアクセスできなくなるとNFTの価値は大幅に低下し、機能不全になる可能性があります。
NFTに関連するメタデータやコンテンツの保存には、IPFS(InterPlanetary File System)のような分散型ストレージを使用することが推奨されます。IPFSはデータの永続性とアクセシビリティを確保するための技術です。データはネットワーク全体に分散して保存され、特定のノードがダウンしてもデータが失われることはありません。
法的な規制
NFTのミントや取引に関して、税制面で不確定な部分があります。NFTのミントや取引に関連する税務ルールは国や地域によって異なります。具体的な税務処理については専門家への相談が必要になる場合があります。
NFTミント/トレードに関する法的規制は進行中の課題です。世界各国で取り組みが進んでいます。米国のIRS(Internal Revenue Service)はNFTの売買に関する税金のガイダンスを発表しています。日本においては一般社団法人日本ブロックチェーン協会(JBA)が「暗号資産に関する税制改正要望」を政府に提出し、FT/NFTの税制改革の道筋を示しています。
まとめ
OpenSeaなどのプラットフォームを利用したNFTミントは非常に簡単ですが、機能に制限があります。一方、スマートコントラクトから自分でNFTを作成する場合は様々な機能を実装できます。企業がNFTをマーケティングなどで活用する際に、戦略に合わせたNFTのカスタマイズが可能です。
NFTをビジネスに最適化するプロセスはWeb3.0時代において非常に重要といえます。本記事ではNFTをスマートコントラクトから作成する方法、拡張できる機能、注意点について解説しました。Web3.0ビジネスを進める方、NFTをビジネスに取り入れようと計画している方々に向けて有益な情報となれば幸いです。