はじめに
この世には通称、オレオレと呼ばれるものがあります。
世間的には詐欺が有名ですね、IT界隈で言えば証明書でしょうか。
何にせよ、早いタイミングでは何も決まっていことも多く、数多のエンジニアが「えいや」と言う掛け声と共に独自の仕様を実装していくことはよくあります。
いつまでもそれでは問題があるので、ある日ある時あの場所で君(ERC)に出会うことがあります。
今回のERC7802もその1つです。
ERC7802とは
目的
トークンがクロスチェーンで通信するための最小限のインターフェースの規格。
ブリッジがERC20のmintとburnをできるようにする。
要は「いろんなチェーンで独自関数使ってブリッジしてるけど、統一しようぜ」。
詳細
各々のブリッジはトークンを勝手にmint、burnする権限を保持していないため、ブリッジ機能を実現するために、ある程度のトークンをロックしている。
そのためハッキング対象にするメリットが多く、今までも多くの被害が実際に出ている。
一方、burn/mint機能を保持するブリッジも存在はする。
たとえばOptimismやArbitrumの公式ブリッジがそれに当たる。
しかしながらそれぞれの規格が乱立しており、また異なるL1をまたぐWormholeのNTTやLayerZeroのOFTも仕様がバラバラである。
それらを標準化したい。
例) Optimismの場合
ERC20のインターフェースに加え、下記のような関数を追加する。そうすることにより、Optimismの公式ブリッジをburn/mint形式で実行できるようになる。
solidity/// @notice Allows the StandardBridge on this network to mint tokens. /// @param _to Address to mint tokens to. /// @param _amount Amount of tokens to mint. function mint(address _to, uint256 _amount) external virtual onlyBridge { _mint(_to, _amount); emit Mint(_to, _amount); } /// @notice Allows the StandardBridge on this network to burn tokens. /// @param _from Address to burn tokens from. /// @param _amount Amount of tokens to burn. function burn(address _from, uint256 _amount) external virtual onlyBridge { _burn(_from, _amount); emit Burn(_from, _amount); }
例) Arbitrumの場合
Optimismと同様、ERC20のインターフェースに加え、下記のような関数を追加する。そうすることにより、Arbitrumの公式ブリッジをburn/mint形式で実行できるようになる。
solidity/** * @notice should increase token supply by amount, and should (probably) only be callable by the L1 bridge. */ function bridgeMint(address account, uint256 amount) external; /** * @notice should decrease token supply by amount, and should (probably) only be callable by the L1 bridge. */ function bridgeBurn(address account, uint256 amount) external;
メリット
様々なチェーンに合わせて、独自関数を実装する必要がなくなる。
プログラムを書かなくて済む、と言うことは品質が良くなる、と言うこと。
新たなチェーンができても、この仕様に乗っかっておけば、自動でブリッジ対応ができる。
Upgradeableが煙たがられるERC20において、このメリットは大きい。
burn/mint方式なので、トークンをロックせずにすみ、ハッキング対象に選ばれにくくなる。
じゃあどうするの?
新しい規格はこれ、以降これに合わせてねと言う雰囲気。
crosschainMintとcrosschainBurnを使ってburn/mintの動作を行う。
これらの関数はブリッジ側のウォレットやコントラクトからしか実行できないようにしておく。
それぞれでイベントも発生させる。イベントの検知はL1同士のブリッジに使われるのだろうか。
ERC165(プログラム上からインターフェースをチェックすることができる仕組み)に対応することによって、業者側が実装の有無判断可能。
solidity/// @notice A modifier that only allows the TOKEN_BRIDGE to call modifier onlyTokenBridge() { if (msg.sender != TOKEN_BRIDGE) revert Unauthorized(); _; } /// @notice Allows the TOKEN_BRIDGE to mint tokens. /// @param _to Address to mint tokens to. /// @param _amount Amount of tokens to mint. function crosschainMint(address _to, uint256 _amount) external onlyTokenBridge { _mint(_to, _amount); emit CrosschainMint(_to, _amount, msg.sender); } /// @notice Allows the TOKEN_BRIDGE to burn tokens. /// @param _from Address to burn tokens from. /// @param _amount Amount of tokens to burn. function crosschainBurn(address _from, uint256 _amount) external onlyTokenBridge { _burn(_from, _amount); emit CrosschainBurn(_from, _amount, msg.sender); } function supportsInterface(bytes4 interfaceId) external pure override returns (bool) { return interfaceId == type(IERC7802).interfaceId || interfaceId == type(IERC165).interfaceId; }
所感
ワームホールなど、他のL1へのブリッジも考慮するなら、LayerZeroみたいにto引数はaddress型じゃなくてbytes型なのではって思ってしまう。
あと、SoneiumのAstarがこの規格に準拠するらしい。そうですか。
参考リンク
ERC-7802: Crosschain Token Interface
This ERC introduces a minimal interface for tokens to communicate cross-chain. It allows bridges with mint and burn rights to send and relay token transfers with a standardized API. The interface is bridge agnostic and fully extensible. PR:
https://ethereum-magicians.org/t/erc-7802-crosschain-token-interface/21508
OP Labs on Twitter / X
Want to help unify Ethereum?Meet the freshly proposed ERC-7802, a bridge-agnostic cross-chain token interface proposed by OP Stack Core Devs, including @OPLabsPBC, @DeFi_Wonderland & @Uniswap.This ERC is waiting for vital feedback from the community. More below: pic.twitter.com/H63wuFEiwZ— OP Labs (@OPLabsPBC) November 7, 2024
https://x.com/OPLabsPBC/status/1854628616287797473