Ethereum の新しいトークン規格
ERC-1155 の実際
2020.02.27 荒川
はじめに
2
現在、ブロックチェーンで所有権を示すためにEthereum の ERC-721 という規格が最も利用されている
収集品ゲームのアイテム
切手
参加証明
Name Service
はじめに
3
本日は、最近新しくトークン規格として確定したERC-1155 について、実際のところどうなのかを話します
概要
4
ERC-1155 とは?
NFT(Non-Fungible Token)と FT(Fungible Token)を両方とも表現できる Ethereum のトークン規格
Enjin(Dapp 開発プラットフォーム)が提案し、規格として採択
特長
コントラクト1つだけで複数のトークンを作れる
トークンを効率的に操作できる
ユースケース
5
100 ゴールド
剣
薬草
通貨
アイテム
Fungible(数量に意味がある)
Non-Fungible(1つ1つ違う)
ゲーム内で利用する 通貨 と様々な アイテム を作りたい
これまでは・・・
6
ゴールド
ユーザ1:100
剣
剣1の所有者:ユーザ1
薬草
薬草1の所有者:ユーザ1
ERC-20 トークン
ERC-721 トークン
ERC-721 トークン
ブロックチェーンの情報を
取得・変更するのが大変…
アドレス管理
トークンごとの権限設定
リクエスト増加
ユーザ1:100
剣1の所有者:ユーザ1
薬草1の所有者:ユーザ1
ERC-1155 では
7
ゴールド
剣
薬草
ERC-1155 トークン
ブロックチェーンの情報を
一括で取得・変更できる
ゴールド:100
剣 :1
薬草 :1
ユーザ1
利用メリット
8
ユーザ
Gas 代が安い(アイテムの送付・売買)
サービス提供者
Gas 代が安い(アイテムの送付・売買、管理者操作など)
ノードへのリクエストが減る
実装がシンプル
Ethereum ネットワーク
トランザクションが減る
ストレージ使用量が減る
ノードへのリクエストが減る
技術の詳細
9
仕様 (コントラクトのインターフェースとルール) https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md
実装例
Enjin https://github.com/enjin/erc-1155
Sandbox’s Asset https://etherscan.io/address/0x067a1eb5e383ed24b66d72aaf80d8d7db3d299a8#code
0x プロトコルのライブラリhttps://github.com/0xProject/0x-monorepo/tree/b3c3ec/contracts/erc1155/contracts/src
OpenZeppelin のライブラリ(2020.2.26 現在 レビュー中)https://github.com/OpenZeppelin/openzeppelin-contracts/issues/1728
仕様(EIP)は GitHub で提案・議論される
10
ERC-1155 インターフェース(1)
11
safeTransferFrom(address from, address to,
uint256 id, uint256 value, bytes data)
※便宜上、修飾子を省略、変数名を一部変更
・トークンを送付する(IDと数量を指定)
・トークンを一括送付する(IDと数量を複数指定)
safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] values, bytes data)
関数
ERC-1155 インターフェース(2)
12
・トークンの残高を取得する(所有者とIDを指定)
balanceOf(address owner, uint256 id) returns (uint256)
・トークンの残高を一括取得する(所有者とIDを複数指定)
balanceOfBatch(address[] owners, uint256[] ids) returns (uint256[])
※便宜上、修飾子を省略、変数名を一部変更
関数
ERC-1155 インターフェース(3)
13
・トークンを送付する権限を設定する(オペレータと権限を指定)
setApprovalForAll(address operator, bool approved)
・トークンを送付する権限を確認する(所有者と調べたいアドレスを指定)
isApprovedForAll(address owner, address operator) returns (bool)
※便宜上、修飾子を省略、変数名を一部変更
関数
ERC-1155 インターフェース(4)
14
・トークンのメタデータ URI 更新のログ
URI(string value, uint256 id)
・トークン送付のログ
TransferSingle(address operator, address from, address to, uint256 id, uint256 value)
・トークン一括送付のログ
TransferBatch(address operator, address from, address to, uint256[] ids, uint256[] values)
イベント
※便宜上、修飾子を省略、変数名を一部変更
ERC-1155 インターフェース(5)
15
・トークン送付の権限設定のログ
ApprovalForAll(address owner, address operator, bool approved)
※便宜上、修飾子を省略、変数名を一部変更
イベント
ERC-1155 の思想
16
オンチェーンには必要最小限の情報のみ記録する!
冗長な関数、変数は提供しない
オフチェーンでイベントを収集してインデックスすべき!
何度も参照する情報はイベントに記録する
ERC-721 との違い
17
トークンを一括送付できる トランザクション削減、Gas 削減のため
メタデータの URI がイベントに残る オフチェーンでインデックスできるようイベントに残している
トークンID から所有者がわからない(ownerOf 関数がない) Gas 節約のためマップを保持していない
冗長な関数は提供されていない
transferFrom がない(safeTransferFrom のみ)
approve がない(setApprovalForAll のみ)
ERC-1155 におけるトークンの分類
18
Fungible ……… 同じ ID のトークンが複数ある
Non-Fungible … 同じ ID のトークンは 1 つだけ
#1111 ゴールド × 100
#2222 剣 × 10
#9999 伝説の剣 × 1
メタデータは同じ
トークンID の bit 分割 ※ EIP では例が示されているのみ
19
・Fungible の場合
0x0 0000000000000000000000000000001 00000000000000000000000000000000
・Non-Fungibe の場合
連番
常にゼロ
連番
(トークンのグループを示す)
連番
(同じグループ内の連番)
NFを示す
フラグ
0x8 0000000000000000000000000000001 00000000000000000000000000000001
Gas 比較(vs ERC-721)
20
※ 0x protocol library の実装で検証
まあ、ちょっと安い
Gas 比較(vs ERC-20)
21
※ 0x protocol library の実装で検証
わずかに安い
利用者は少しずつ増えている
22
ERC-1155 トークン送付のイベント数
※ TransferSingle / TransferBatch の合計(mint 除く)
・・・が、ERC-721 と比べるとまだまだ
23
トークン送付のイベント数
ERC-721
ERC-1155
コントラクトの数は少ない(ほとんどが Enjin コントラクトを利用)
24
ERC-1155 コントラクトの数
現在確認できる ERC-1155 準拠のコントラクト
25
アドレス
イベント数*
説明(調べてわかったこと)
0xfaafdc07907ff5120a76b34b731b278c38d6043c
507958
Enjin
0x2b1870752208935fda32ab6a016c01a27877cf12
74398
不明(2019/07以降使われていない)
0xa58b5224e2fd94020cb2837231b2b0e4247301a6
1420
Cryptovoxel Wearables (WEAR)
0xc59b0e4de5f1248c1140964e0ff287b192407e0c
728
Gnosis の ConditionalTokens
0x5b306b1d0f1c1959777469a3fd42557298e9193a
585
不明(2019/09以降使われていない)
0x067a1eb5e383ed24b66d72aaf80d8d7db3d299a8
396
Sandbox's ASSETs
0xeef06c49885461f8a897f503e1bb4c3a67412d28
239
Rhovit というプロジェクト
0x559604845ffc64a05f780ead75249c377b1dae57
94
ReceiptChain というプロジェクト
0xd0e4847359ae76c2786d242e5f45c4f6f1abd752
60
不明(2019/04以降使われていない)
0xa2a295ae156bcd0023783cc2666ccbb0ca218d9f
47
BlockchainCutiesERC1155
0x238f2d6787dacb6045d72b0ec6626de0ff7c3107
14
Neon District Radiant Blade (NDRB)
* 2019/6/1-2020/2/10のmintを除く TransferSingle / TransferBatch
課題・問題点
26
トークンの法的な扱いが決まっていない Fungible も混合なので、規制対象になるかも
ERC-721 / ERC-20 と互換性がない アプリ/ウォレットごとに対応が必要なので置き換えが大変
イベントをインデックスする仕組みがないとトークン情報を取れない ERC-721に比べると、アプリへの導入ハードルが高い
課題・問題点
27
(・ トークンID の10進表記がやたら長い値なので、視認性が悪い)
16進表記:0x8000000000000000000000000000000100000000000000000000000000000001
10進表記:57896044618658097711785492504343953926975274699741220483192166611388333031425
将来性
28
ブロックチェーンのデータをインデックスするインフラ基盤が整ってくれば、普及するかも?
インフラ基盤がないと・・・単体機能は ERC-721 より劣るので、普及は難しそう(ちなみに、実装は ERC-721 よりクセが強い)
最近の Ethereum の方向性
29
オンチェーンは必要最小限、シンプルに
オフチェーンの分権化に焦点
オンチェーン
オフチェーン
参考:主なトークン規格
30
Final
ERC-20: Token Standard
ERC-721: Non-Fungible Token Standard
ERC-777: Token Standard
ERC-1155: Multi Token Standard
Draft
ERC-864: Divisible non-fungible tokens
ERC-1178: Multi-class Token Standard
ERC-1633: Re-Fungible Token
(ERC-223: Token Standard)
その他
ERC-721x