😽
ERC-6909について調べてみた
ERC-6909とは
どうやらマルチトークンであるERC-1155の知見を元にし、新たに開発されたマルチトークン規格らしい。
ERC-1155からどこらへんが変わるかというと、下記の2点がメインとのこと。
- ガスコストの削減
- 複雑性の改善
何が-ERC1155と違うの?
コードをざっくり見たところ、大きな違いとしてはこれくらいっぽい。
- バッチ操作を削除
- batchTransferとかそこら辺のbatchで行うものがなくなってる
- コールバックの削除
- トークン転送時に呼び出されてたコールバックがなくなってた
- approveの機能の強化
- トークンごとの量などでApproveを持たせられるようになってる
ここまでの状態では大きく新たに作られた意味合いがわからない…
というわけでもう少し深ぼってみてみよう
拡張機能たち
ライブラリを調べたら割と面白かった
ライブラリ | 関数 | 役割 | 備考 |
---|---|---|---|
ERC-6909 | supportsInterface(interfaceId) balanceOf(owner, id) allowance(owner, spender, id) isOperator(owner, spender) approve(spender, id, amount) setOperator(spender, approved) transfer(receiver, id, amount) transferFrom(sender, receiver, id, amount) _mint(to, id, amount) _transfer(from, to, id, amount) _burn(from, id, amount) _update(from, to, id, amount) _approve(owner, spender, id, amount) _setOperator(owner, spender, approved) _spendAllowance(owner, spender, id, amount) |
ERC-6909のコア部分 | approveがid指定くらいの感想かな 特筆する点はないように思える |
ERC6909ContentURI | contractURI() tokenURI(id) _setContractURI(newContractURI) _setTokenURI(id, newTokenURI) |
一般的なURIの情報をもたせるやつ | 内部変数である_contractURIとmappingされた_tokenURIsを操作するものではあるけど、mappingされてなければ全体の変数である_contractURIを返すとかっていう実装がないから、あくまでもコントラクト全体のURIとID毎のURIで取引所とかも使い分けてねーって実装を感じた! |
ERC6909TokenSupply | totalSupply(id) _update(from, to, id, amount) |
totalSuppyをid事出すための拡張機能 | なるほど、totalSupplyも無くして安く済ませようとしてるんだなと感動した |
ガス代比較
ERC-1155 VS ERC-6909
簡単にガス代比較してみた。
コード
// =================== ERC6909 ===================
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import '@openzeppelin/contracts/token/ERC6909/draft-ERC6909.sol';
contract TestERC6909 is ERC6909 {
constructor() ERC6909() {}
function mint(address to, uint256 tokenId, uint256 amount) public {
_mint(to, tokenId, amount);
}
function mint1token() public {
_mint(msg.sender, 0, 1);
}
function mint10tokens() public {
_mint(msg.sender, 0, 10);
}
function mint100tokens() public {
_mint(msg.sender, 0, 100);
}
}
// =================== ERC1155 ===================
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
contract TestERC1155 is ERC1155 {
constructor() ERC1155("") {}
function mint() public {
_mint(msg.sender, 0, 1, '');
}
function mint10() public {
_mint(msg.sender, 0, 10, '');
}
function mint100() public {
_mint(msg.sender, 0, 100, '');
}
}
結果
·---------------------------------|---------------------------|-------------|-----------------------------·
| Solc version: 0.8.28 · Optimizer enabled: true · Runs: 200 · Block limit: 30000000 gas │
··································|···························|·············|······························
| Methods │
················|·················|·············|·············|·············|···············|··············
| Contract · Method · Min · Max · Avg · # calls · usd (avg) │
················|·················|·············|·············|·············|···············|··············
| TestERC1155 · mint · 30022 · 47122 · 31732 · 20 · - │
················|·················|·············|·············|·············|···············|··············
| TestERC1155 · mint10 · 30066 · 47166 · 31776 · 20 · - │
················|·················|·············|·············|·············|···············|··············
| TestERC1155 · mint100 · 29977 · 47077 · 31687 · 20 · - │
················|·················|·············|·············|·············|···············|··············
| TestERC6909 · mint100tokens · 29285 · 46385 · 30995 · 20 · - │
················|·················|·············|·············|·············|···············|··············
| TestERC6909 · mint10tokens · 29219 · 46319 · 30929 · 20 · - │
················|·················|·············|·············|·············|···············|··············
| TestERC6909 · mint1token · 29218 · 46318 · 30928 · 20 · - │
················|·················|·············|·············|·············|···············|··············
| Deployments · · % of limit · │
··································|·············|·············|·············|···············|··············
| TestERC1155 · - · - · 1090577 · 3.6 % · - │
··································|·············|·············|·············|···············|··············
| TestERC6909 · - · - · 658684 · 2.2 % · - │
·---------------------------------|-------------|-------------|-------------|---------------|-------------·
トークンのミント自体は数%のGas比しかないため、大きな差はないなと感じた。
しかしながら、コントラクト自体のデプロイは40%ほど削減できてるのはすごい!!
ERC-20 VS ERC-6909
次にERC20と比較してみる。
コード
ERC6909のコード自体は前回と同じ。
ERC20のコードは下記の通り
// =================== ERC20 ===================
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract TestERC20 is ERC20 {
constructor() ERC20("TestERC20", "TEST") {}
function mint() public {
_mint(msg.sender, 1);
}
}
結果
·------------------------------|---------------------------|-------------|-----------------------------·
| Solc version: 0.8.28 · Optimizer enabled: true · Runs: 200 · Block limit: 30000000 gas │
·······························|···························|·············|······························
| Methods │
················|··············|·············|·············|·············|···············|··············
| Contract · Method · Min · Max · Avg · # calls · usd (avg) │
················|··············|·············|·············|·············|···············|··············
| TestERC20 · mint · 33514 · 67714 · 36934 · 20 · - │
················|··············|·············|·············|·············|···············|··············
| TestERC6909 · mint1token · 29240 · 46340 · 30950 · 20 · - │
················|··············|·············|·············|·············|···············|··············
| Deployments · · % of limit · │
·······························|·············|·············|·············|···············|··············
| TestERC20 · - · - · 519577 · 1.7 % · - │
·······························|·············|·············|·············|···············|··············
| TestERC6909 · - · - · 561247 · 1.9 % · - │
·------------------------------|-------------|-------------|-------------|---------------|-------------·
おっと、まさかのmintが20よりも安い!
デプロイは10%ほどERC20よりERC6909が高いが、全然許容範囲に感じる。
だって20%くらいERC20より安いし…
ちなみにtokensupplyでサプライ数を出すケースのガス代比較もしてみた。
·------------------------------|---------------------------|-------------|-----------------------------·
| Solc version: 0.8.28 · Optimizer enabled: true · Runs: 200 · Block limit: 30000000 gas │
·······························|···························|·············|······························
| Methods │
················|··············|·············|·············|·············|···············|··············
| Contract · Method · Min · Max · Avg · # calls · usd (avg) │
················|··············|·············|·············|·············|···············|··············
| TestERC20 · mint · 33514 · 67714 · 36934 · 20 · - │
················|··············|·············|·············|·············|···············|··············
| TestERC6909 · mint1token · 29240 · 46340 · 30950 · 20 · - │
················|··············|·············|·············|·············|···············|··············
| Deployments · · % of limit · │
·······························|·············|·············|·············|···············|··············
| TestERC20 · - · - · 519577 · 1.7 % · - │
·······························|·············|·············|·············|···············|··············
| TestERC6909 · - · - · 561247 · 1.9 % · - │
·------------------------------|-------------|-------------|-------------|---------------|-------------·
あれ、ほぼガス代が同じ…笑
まとめ
- ERC-1155の代替というよりはFTのマルチトークンとしてスタンダードになりそう。
- しかしながらデプロイのガス比率もよいので、OpenSeaなどの共通コントラクトでミントするところには利点はないが、違うコントラクトでデプロイしたいケースは重宝しそう!
- 同一コントラクトでFTやNFT出したいみたいな変わったことしたいツールは使うかもしれないけど、その需要って果たしてあるのか?
- もう話題少なくなってきてるが、ミームコインの発行コントラクトとしてはかなり機能しそうだなと。
- あとDEXとも相性いいなーと思った。totalSupply無し無駄を削ぎ落としたことで別チェーンでのトークンブリッジなどもしやすいと思う。
- Governanceコントラクトと結びつけてDAO的な仕様も未来が広がりそう。優先株的な発想とかもやりやすくなる。
- 普通に未来考えると面白そう。ちゃんとコード見る前とは全くイメージ変わったなー。
- 現在まだdraftなので本利用には注意を!あとまだ対応してるところが少ないのでそこもご注意を!
Discussion