読了時間:8分
はじめに
ERC-721に対応したデジタルコレクティブルは、『Cryptokitties』のリリース以来大きな人気を博し、ここ数ヶ月で広く普及しています。このガイドでは、スマートコントラクトライブラリ「0xcert/ethereum-erc721」を使用して、独自のERC-721(NFT)を作成・リリースする方法について解説します。
「非代替性トークン(NFT)」とは何ですか?
「代替可能(fungible)」とは、それらが同一である、あるいは互いに置き換え可能であることを意味します。例えば、イーサリアムのトークンでは、同じクラスのトークンはすべて同じ価値を持っています。カルダノのトークンについても同様です。代替可能なトークンは1対1で交換可能です。
このことを踏まえると、NFTは唯一無二のものであり、それぞれが異なり、独自の特性を持っています。 NFTになり得るものには、トレーディングカード、芸術作品、航空券などがあります。これらはすべて互いに明確に区別でき、互いに交換することはできません。非代替性トークン(NFT)を、非常に希少なコレクターズアイテムだと考えてみてください。それぞれが独自の特徴や珍しい属性を持っており、ほとんどの場合、独自のメタデータも備えています。
ERC-721とは何ですか?
ERCは「Ethereum Request for Comment」の略称であり、721は提案の識別番号です。ERCはイーサリアム・エコシステムにおけるアプリケーションレベルの標準であり、ERC-20のようにスマートコントラクト向けの標準となる場合もあります。
ERCの提案者は、イーサリアムコミュニティとの合意形成を図る責任を負っており、コミュニティによる審査と承認を経た後、その提案は標準となります。最近のERC提案はすべて、こちらから確認できます。
ERC-721は、スマートコントラクト上でNFTの追跡や転送を行う機能を提供するために策定されました。
ERC-721は、EVM(イーサリアム仮想マシン)対応のブロックチェーン上で非代替性トークン(NFT)を作成する方法を規定したオープンスタンダードです。NFTを容易に扱えるよう、一連のルールが定められています。NFTにはERC-721だけでなく、ERC-1155トークンもあります。
ERC-721規格で定義されている機能およびイベントは以下の通りです:
ERC-721は、ERC-20に準拠したいくつかの機能を定義しています。これにより、既存のウォレットの一部でトークンの情報を表示することが、はるかに容易になります。
ERC-20の機能
- name:他の契約やアプリケーションがこれを識別するための名前を指定するために使用されます。
- シンボル:シンボルまたは短縮名を指定するために使用します。
- totalSupply:この関数は、ブロックチェーン上に存在するトークンの総量を定義するために使用されます。必ずしも一定である必要はありません。
- balanceOf:あるアドレスが保有するNFTの数を返します。
トークンの所有権に関連する機能
- ownerOf:この関数は、トークンの所有者のアドレスを返します。ERC-721トークンはそれぞれ一意であり、代替不可能であるため、ブロックチェーン上ではIDによって表されます。他のユーザー、スマートコントラクト、またはアプリは、このIDを使用してトークンの所有者を特定することができます。
- 承認:この機能は、トークンの転送を承認するために使用されます。
- takeOwnership:これは、このアドレスによるトークンの引き出しが事前に承認されている場合に、ユーザーからトークンを引き出すためのオプション機能です。
- 転送:トークンの所有者が、他のトークンや通貨と同様に、自分のトークンを別のアドレスに転送できるようにする機能。
- tokenOfOwnerByIndex:これはオプションの関数ですが、実装することを強くお勧めします。各トークンの所有者は、同じNFTを同時に複数所有することができます。各NFTの一意のIDによって識別は可能ですが、やがてこれらのIDを追跡することが非常に困難になります。そこで、スマートコントラクトは所有者に関連付けられたIDの記録を保持しており、この関数を使用することで、追跡に必要な情報を取得することができます。
メタデータ機能
- tokenMetadata:このオプション機能は、トークンの情報を取得するためのインターフェースです。
イベント
- 転送:このイベントは、トークンの所有者が変更された際に発生します。どのアドレスからトークンが転送されたか、どのアドレスが受け取ったか、およびどのトークンIDが転送されたかに関する情報を発信します。
- 承認:このイベントは、あるユーザーが別のユーザーに対してトークンの利用権を承認した際、たとえば「approve」関数が実行された際に発生します。このイベントでは、現在どのアドレスがトークンを保有しているか、将来的にトークンを利用できるよう承認されたアドレスはどれか、そしてどのトークンIDの所有権が承認されたかに関する情報が送信されます。
非代替性トークン(NFT)のユースケース:
- デジタルアート(または実物アート):これはNFTの最も一般的な活用例です。デジタルアートのオークションは、NFTの初期の活用例の一つであり、現在も成長を続けています。
- ゲーム:ゲーム内課金や収集アイテムの提供。
- 不動産:不動産をトークン化し、売買のためのスマートコントラクトを生成できる。
- 財務:ローン、先物取引、その他の債務などの金融商品。
- ソフトウェア:ソフトウェアのライセンスにより、海賊版対策とプライバシー保護を確保します。
- コンサートやスポーツイベントのチケット:チケット販売における不正行為を防止し、ファンが過去の体験を1か所で確認できるようにするため。
ETHテストの取得
ERC-721トークンとは何か、その仕組みがわかったところで、次は独自のトークンをどのように作成・発行できるかを見ていきましょう。
当社のコントラクトをRopstenテストネットワークにデプロイします。まず、Metamaskのブラウザ拡張機能をインストールし、ETHウォレットを作成して、Ropstenのファウセットから少量のテスト用ETHを受け取る必要があります。Metamaskのウォレットで「Ropsten Test Network」を選択し、ウォレットのアドレスをファウセットのテキスト入力欄にコピーしてから、「Send me test Ether」をクリックしてください。

IPFSにファイルを追加する
NFTの契約を作成する前に、NFTに関連するアートを保存し、メタデータファイルを作成する必要があります。このため、分散型ファイル共有システムであるIPFSを使用します。以下のIPFSインストールガイドに従って、お使いのOS用にIPFS CLIをダウンロードしてインストールしてください。
以下に、画像とメタデータファイルを保存するための手順を記載します。
ステップ 1:IPFS リポジトリの作成 ターミナルで以下のコマンドを入力して、IPFS リポジトリを起動します。
ipfs init
ステップ 2:IPFS モニターを起動する
新しいターミナルを開き、次のコマンドを入力してください
IPFS デーモン
ステップ3:IPFSに画像を追加する
最初のターミナルで画像(ここではart.png)を追加してください
ipfs 追加 art.png

Qm で始まるハッシュをコピーし、その先頭にhttps://ipfs.io/ipfs/ を追加してください。次のような形式になるはずです:https://ipfs.io/ipfs/QmQEVVLJUR1WLN15S49rzDJsSP7za9DxeqpUzWuG4aondg
ステップ4:IPFSにJSONファイルを追加する
「nft.json」という名前のJSONファイルを作成し、画像と同じディレクトリに保存してください。
JSONファイル:
{
"name": "NFT Art",
"description": "This image shows the true nature of NFT.",
"image": "https://ipfs.io/ipfs/QmZzBdKF7sQX1Q49CQGmreuZHxt9sVB3hTc3TTXYcVZ7jC",
}
それでは、JSONファイルをIPFSに追加してください
ipfs 追加 nft.json
Qm で始まるハッシュをコピーし、その先頭にhttps://ipfs.io/ipfs/ を追加してください。次のような形式になるはずです:https://ipfs.io/ipfs/QmUFbUjAifv9GwJo7ufTB5sccnrNqELhDMafoEmZdPPng7
このURLを確認してください。NFTをリリースするには、これが必要になります。
トークンの作成
手軽さと安全性を考慮し、NFTコントラクトの作成には0xcert/ethereum-erc721を使用します。0xcert/ethereum-erc721を使えば、ERC-721インターフェースをすべて自作する必要はなく、代わりにそれをインポートしてその関数を利用することができます。
Ethereum RemixIDE にアクセスし、新しい Solidity ファイル(例:nft.sol)を作成してください。
新しいSolidityファイルに、次のコードを貼り付けてください:
// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;
import "https://github.com/0xcert/ethereum-erc721/src/contracts/tokens/nf-token-metadata.sol";
import "https://github.com/0xcert/ethereum-erc721/src/contracts/ownership/ownable.sol";
contract newNFT is NFTokenMetadata, Ownable {
constructor() {
nftName = "Synth NFT";
nftSymbol = "SYN";
}
function mint(address _to, uint256 _tokenId, string calldata _uri) external onlyOwner {
super._mint(_to, _tokenId);
super._setTokenUri(_tokenId, _uri);
}
}
上記のコードの説明:
行1:SPDXライセンス種の指定。これはSolidity ^0.6.8以降で必須となった追加項目です。 スマートコントラクトのコードを一般に公開する場合、これらのライセンスを指定することで、著作権に関する問題を解決・回避するのに役立ちます。ライセンスを指定したくない場合は、「Unlicensed」という値を使用するか、コメントを省略してください(エラーにはなりませんが、警告が表示されます)。
2行目:スマートコントラクトのSolidityバージョンを指定します。
4~5行目:0xcert/ethereum-erc721 契約をインポートします
ライン7:このスマートコントラクトは「newNFT」という名前で開始され、このスマートコントラクトは「NFTokenMetadata」および「Ownable」という名前の他のスマートコントラクトを継承しています。
9~12行目:コンストラクタを初期化し、トークンの名前とシンボルを設定します。
14行目:3つの引数を持つmint関数を宣言しています。address型の変数_toはNFTトークンを受け取るアドレスを格納し、uint256型の変数_tokenIdはトークンのIDを格納し、変数_uriはJSONファイルのURIを格納します。 この mint 関数を external として宣言することは、他のスマートコントラクトや、当該コントラクト自身のスコープ外からもアクセス可能であることを意味します。
15行目:トークンを受け取るアドレスとトークンIDを使用して、トークンを削除します。
16行目:トークンIDとJSONファイルのURIを使用してURIを設定します。
スマートコントラクトをコンパイルし、注入されたWeb3を使用してデプロイを行います(コントラクトをコンパイルする前に、MetamaskでRopstenテストネットが選択されていることを確認してください)。
Metamaskで取引を承認してください。

デプロイ前に「This contract may be abstract」というエラーメッセージが表示された場合は、「Contracts」オプションで正しい契約が選択されていることを確認してください。

次に、Remixの「Deployed Contracts」セクションに移動し、先ほどデプロイしたコントラクトを展開してください。そこには多数の関数やメソッドが表示されています。「mint」関数を展開し、以下の詳細を追加してください:
- _to_ フィールドに Ropsten のアドレスを追加してください
- _tokenid フィールドに数字を入力してください(最初の値なので、1 を入力することをお勧めします)。
- 前のセクションで取得したJSONファイルのURIを、_uriフィールドに追加してください。
「Transact」をクリックし、Metamaskで取引を確認してください。これで、Ropstenネットワーク上にトークンが取得されました。
前述のtokenidを入力することで、名前、シンボル、所有者、tokenuriなどのその他の詳細を確認できます。

結論
独自のNFTを作成されたこと、おめでとうございます。アーティストの友人の作品をイーサリアムネットワーク上に公開したり、ご自身もアーティストとして活動したりして、友人をサポートしましょう。その他の例については、0xcert/ethereum-erc721のGitHubをご覧ください。
イーサリアムに関する記事やガイドをもっと読みたい方は、ぜひニュースレターにご登録ください。ご意見やご感想がございましたら、ぜひTwitterでコメントをお寄せください。また、Discordサーバーでもいつでも私たちと交流できます。そこでは、素晴らしい開発者たちにも出会えるかもしれません :)