メインコンテンツへスキップ
Change page

ERC-721 非代替性トークン(NFT)規格

最終更新: 2026年2月25日

はじめに

非代替性トークン(NFT)とは?

非代替性トークン(NFT)は、固有の方法で、人や物を識別するために使われます。 この種類のトークンは、収集用のアイテム、アクセスキー、宝くじ、コンサートやスポーツ試合におけるシート番号付チケットなどを発行するプラットフォームに最も適しています。 この特殊なタイプのトークンはすばらしい可能性を秘めているため、専用の規格としてERC-721を策定しました。

ERC-721とは?

ERC-721は、NFTに対する標準規格です。つまり、この種類のトークンはそれぞれがユニークな存在であり、発行日、希少性、および外見などの点で、同一のスマートコントラクトで発行される他のトークンとは異なる値を持つことができます。 外見が違うとはどういう意味でしょう?

はい! すべてのNFTはtokenIdと呼ばれるuint256変数を持っています。そのため、どのERC-721コントラクトでも、ペアである contract address, uint256 tokenIdはグローバルに一意でなければなりません。 とはいえ、dappはtokenIdを入力として使用し、ゾンビ、武器、スキル、あるいは素晴らしい子猫のようなクールな画像を出力する「コンバーター」を持つことができます。

前提条件

規格の概要

ERC-721(Ethereum Request for Comments 721)は、ウィリアム・エントリケン氏、ディーター・シャーリー氏、ジェイコブ・エバンス氏、ナスタシア・サックス氏により2018年1月に提案された、スマートコントラクト内で非代替性トークン(NFT)を取り扱うためのAPIを実装するための規格です。

この規格により、複数アカウント間のトークンの転送、アカウントにおける現在のトークン残高の取得、トークン所有者の取得、およびネットワーク上で供給されているトークン総数の取得といった機能が提供されます。 さらに、特定のアカウントが所有するトークン残高のうち、サードパーティのアカウントが転送可能な上限の設定を承認するなど、その他の機能も提供されています。

以下のメソッドおよびイベントを実装したスマートコントラクトはERC-721非代替性トークン(NFT)コントラクトと呼ばれ、デプロイされると、イーサリアム上で作成されたトークンの状況を追跡する機能を提供します。

EIP-721 (opens in a new tab) から引用:

メソッド

1 function balanceOf(address _owner) external view returns (uint256);
2 function ownerOf(uint256 _tokenId) external view returns (address);
3 function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;
4 function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
5 function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
6 function approve(address _approved, uint256 _tokenId) external payable;
7 function setApprovalForAll(address _operator, bool _approved) external;
8 function getApproved(uint256 _tokenId) external view returns (address);
9 function isApprovedForAll(address _owner, address _operator) external view returns (bool);
すべて表示

イベント

1 event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
2 event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
3 event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

実例

イーサリアムネットワークにおけるERC-721トークンコントラクトを詳しく検討することで、ネットワークをシンプルにする上でこれらの規格がいかに重要であるかが理解できるでしょう。 ERC-721トークンを対象とするインターフェイスを開発するには、コントラクトのアブリケーション・バイナリ・インターフェイス(ABI)があれば十分です。 理解しやすいように、以下では簡略化したABIを用いています。

Web3.pyの例

まず、Web3.py (opens in a new tab) Pythonライブラリがインストールされていることを確認してください:

1pip install web3
1from web3 import Web3
2from web3._utils.events import get_event_data
3
4
5w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))
6
7ck_token_addr = "0x06012c8cf97BEaD5deAe237070F9587f8E7A266d" # CryptoKittiesコントラクト
8
9acc_address = "0xb1690C08E213a35Ed9bAb7B318DE14420FB57d8C" # CryptoKittiesセールスオークション
10
11# これはERC-721 NFTコントラクトの簡易版コントラクト・アプリケーション・バイナリ・インターフェース(ABI)です。
12# balanceOf(address)、name()、ownerOf(tokenId)、symbol()、totalSupply()メソッドのみを公開します。
13simplified_abi = [
14 {
15 'inputs': [{'internalType': 'address', 'name': 'owner', 'type': 'address'}],
16 'name': 'balanceOf',
17 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
18 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True
19 },
20 {
21 'inputs': [],
22 'name': 'name',
23 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],
24 'stateMutability': 'view', 'type': 'function', 'constant': True
25 },
26 {
27 'inputs': [{'internalType': 'uint256', 'name': 'tokenId', 'type': 'uint256'}],
28 'name': 'ownerOf',
29 'outputs': [{'internalType': 'address', 'name': '', 'type': 'address'}],
30 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True
31 },
32 {
33 'inputs': [],
34 'name': 'symbol',
35 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],
36 'stateMutability': 'view', 'type': 'function', 'constant': True
37 },
38 {
39 'inputs': [],
40 'name': 'totalSupply',
41 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
42 'stateMutability': 'view', 'type': 'function', 'constant': True
43 },
44]
45
46ck_extra_abi = [
47 {
48 'inputs': [],
49 'name': 'pregnantKitties',
50 'outputs': [{'name': '', 'type': 'uint256'}],
51 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True
52 },
53 {
54 'inputs': [{'name': '_kittyId', 'type': 'uint256'}],
55 'name': 'isPregnant',
56 'outputs': [{'name': '', 'type': 'bool'}],
57 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True
58 }
59]
60
61ck_contract = w3.eth.contract(address=w3.to_checksum_address(ck_token_addr), abi=simplified_abi+ck_extra_abi)
62name = ck_contract.functions.name().call()
63symbol = ck_contract.functions.symbol().call()
64kitties_auctions = ck_contract.functions.balanceOf(acc_address).call()
65print(f"{name} [{symbol}] NFTs in Auctions: {kitties_auctions}")
66
67pregnant_kitties = ck_contract.functions.pregnantKitties().call()
68print(f"{name} [{symbol}] NFTs Pregnants: {pregnant_kitties}")
69
70# TransferイベントABIを使用して、送金されたKittiesに関する情報を取得します。
71tx_event_abi = {
72 'anonymous': False,
73 'inputs': [
74 {'indexed': False, 'name': 'from', 'type': 'address'},
75 {'indexed': False, 'name': 'to', 'type': 'address'},
76 {'indexed': False, 'name': 'tokenId', 'type': 'uint256'}],
77 'name': 'Transfer',
78 'type': 'event'
79}
80
81# ログをフィルタリングするためにイベントの署名が必要です。
82event_signature = w3.keccak(text="Transfer(address,address,uint256)").hex()
83
84logs = w3.eth.get_logs({
85 "fromBlock": w3.eth.block_number - 120,
86 "address": w3.to_checksum_address(ck_token_addr),
87 "topics": [event_signature]
88})
89
90# 注:
91# - Transferイベントが返されない場合は、ブロック数を120から増やしてください。
92# - Transferイベントが見つからなかった場合は、次の場所でtokenIdを取得することもできます:
93# https://etherscan.io/address/0x06012c8cf97BEaD5deAe237070F9587f8E7A266d#events
94# イベントのログを展開して、その「tokenId」引数をコピーしてください
95recent_tx = [get_event_data(w3.codec, tx_event_abi, log)["args"] for log in logs]
96
97if recent_tx:
98 kitty_id = recent_tx[0]['tokenId'] # 上記のリンクから「tokenId」をここに貼り付けます
99 is_pregnant = ck_contract.functions.isPregnant(kitty_id).call()
100 print(f"{name} [{symbol}] NFTs {kitty_id} is pregnant: {is_pregnant}")
すべて表示

CryptoKittiesのコントラクトには、標準的なイベント以外にもいくつか興味深いイベントが含まれています。

そのうちの2つ、PregnantBirthをチェックしてみましょう。

1# PregnantおよびBirthイベントABIを使用して、新しいKittiesに関する情報を取得します。
2ck_extra_events_abi = [
3 {
4 'anonymous': False,
5 'inputs': [
6 {'indexed': False, 'name': 'owner', 'type': 'address'},
7 {'indexed': False, 'name': 'matronId', 'type': 'uint256'},
8 {'indexed': False, 'name': 'sireId', 'type': 'uint256'},
9 {'indexed': False, 'name': 'cooldownEndBlock', 'type': 'uint256'}],
10 'name': 'Pregnant',
11 'type': 'event'
12 },
13 {
14 'anonymous': False,
15 'inputs': [
16 {'indexed': False, 'name': 'owner', 'type': 'address'},
17 {'indexed': False, 'name': 'kittyId', 'type': 'uint256'},
18 {'indexed': False, 'name': 'matronId', 'type': 'uint256'},
19 {'indexed': False, 'name': 'sireId', 'type': 'uint256'},
20 {'indexed': False, 'name': 'genes', 'type': 'uint256'}],
21 'name': 'Birth',
22 'type': 'event'
23 }]
24
25# ログをフィルタリングするためにイベントの署名が必要です。
26ck_event_signatures = [
27 w3.keccak(text="Pregnant(address,uint256,uint256,uint256)").hex(),
28 w3.keccak(text="Birth(address,uint256,uint256,uint256,uint256)").hex(),
29]
30
31# これはPregnantイベントです:
32# - https://etherscan.io/tx/0xc97eb514a41004acc447ac9d0d6a27ea6da305ac8b877dff37e49db42e1f8cef#eventlog
33pregnant_logs = w3.eth.get_logs({
34 "fromBlock": w3.eth.block_number - 120,
35 "address": w3.to_checksum_address(ck_token_addr),
36 "topics": [ck_event_signatures[0]]
37})
38
39recent_pregnants = [get_event_data(w3.codec, ck_extra_events_abi[0], log)["args"] for log in pregnant_logs]
40
41# これはBirthイベントです:
42# - https://etherscan.io/tx/0x3978028e08a25bb4c44f7877eb3573b9644309c044bf087e335397f16356340a
43birth_logs = w3.eth.get_logs({
44 "fromBlock": w3.eth.block_number - 120,
45 "address": w3.to_checksum_address(ck_token_addr),
46 "topics": [ck_event_signatures[1]]
47})
48
49recent_births = [get_event_data(w3.codec, ck_extra_events_abi[1], log)["args"] for log in birth_logs]
すべて表示
  • Etherscan NFTトラッカー (opens in a new tab)は、送金量別にイーサリアムのトップNFTをリストアップします。
  • CryptoKitties (opens in a new tab)は、繁殖可能で、収集可能で、そしてとても愛らしい、私たちがCryptoKittiesと呼ぶ生き物を中心としたゲームです。
  • Sorare (opens in a new tab)は、限定版のコレクティブルを収集し、チームを管理し、賞品を獲得するために競い合うグローバルなファンタジーフットボールゲームです。
  • イーサリアム・ネーム・サービス(ENS) (opens in a new tab)は、安全かつ分散型の方法により、ブロックチェーン内外のリソースにシンプルかつ人間が読み取り可能な名前を使用してアドレスを付与します。
  • POAP (opens in a new tab)は、イベントに参加したり、特定のアクションを完了した人々に無料のNFTを配布します。 POAPは自由に作成し、配布できます。
  • Unstoppable Domains (opens in a new tab)は、サンフランシスコを拠点とし、ブロックチェーン上にドメインを構築している会社です。 ブロックチェーンドメインは、暗号通貨アドレスを人間が読める名前に置き換え、検閲耐性のあるウェブサイトを可能にするために使用できます。
  • Gods Unchained Cards (opens in a new tab)はイーサリアムブロックチェーン上のトレーディングカードゲーム(TCG)で、NFTを使用してゲーム内アセットに真の所有権をもたらします。
  • Bored Ape Yacht Club (opens in a new tab)は10,000個のユニークなNFTのコレクションで、証明可能な希少なアート作品であると同時に、クラブへの会員トークンとしても機能し、コミュニティの取り組みの結果として時間とともに増える会員特典や利益を提供します。

参考リンク

この記事は役に立ちましたか?