😽

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なので本利用には注意を!あとまだ対応してるところが少ないのでそこもご注意を!
NonEntropy Tech Blog

Discussion