はじめに

『DApps開発入門』という本や色々記事を書いているかるでねです。

今回は、ERC20コントラクトが安全にERC721トークンを送付する仕組みを提案しているERC4521についてまとめていきます!

以下にまとめられているものを翻訳・要約・補足しながらまとめていきます。

他にも様々なEIPについてまとめています。

概要

ERC721はEthereumブロックチェーン上でユニークなデジタル資産(NFT)を扱う標準規格です。 NFTを別のアドレスに送付するためのtransferFrom()や、移動先がコントラクトの場合に安全性を検証するsafeTransferFrom()といった関数が用意されています。 しかし、ERC20という同じ価値を持つトークンを扱う規格で使用されているtransfer()関数は定義されていません。 ERC20のtransfer()は多くのコントラクトやウォレットがトークン送信の基本機能として期待しているため、このままだとNFTをERC20向けのシステムで扱う時に互換性の問題が生じます。 ERC4521では、既存の仕組みと後方互換性を保ちつつ、NFTにも同名のtransfer()関数を追加する方法を示しています。

動機

ERC4521の背景には二つの課題があります。

  • 誤送信によるロックリスクへの対処

ERC20用コントラクトやウォレットがtransfer()のみをサポートしている場合、NFTを誤って送信すると取り出せなくなる可能性があります。 NFTにも同じtransfer()を用意することで、こうした誤送信時のロックリスクを軽減できます。

  • コントラクト実装の簡素化

開発者がERC20トークンとNFTで異なる関数を実装・管理する必要があると、コントラクトが複雑になります。 どちらにも対応する共通のtransfer()を使えるようにすることで、実装の手間を減らし、開発効率を向上させることができます。

仕様

ERC4521のtransferインターフェースは、ERC20に準拠する必要があります。 また、transfer関数の実行時にはTransferイベントを発行させる必要があります。

js
function transfer(address to, uint256 tokenId) external returns (bool success);

補足

ERC20のtransfer関数をそのまま実装することでNFT用に別途複雑な処理を追加せずに済みます。 具体的には、ERC20では「送信する量(amount)」を受け取る引数を、NFT用には「送信する識別子(tokenId)」に置き換えるだけです。 このように関数名やシグネチャをほぼ共通化することで、開発者は新たに別関数を実装せず、既存のtransfer呼び出しのままNFTを扱えるようになります。結果としてコードの行数が減り、可読性や保守性が向上します。

参考実装

js
function transfer(address to, uint256 tokenId) public virtual returns (bool success) {
        require(msg.sender == ownerOf[tokenId], "NOT_OWNER");

        unchecked {
            balanceOf[msg.sender]--; 
        
            balanceOf[to]++;
        }
        
        delete getApproved[tokenId];
        
        ownerOf[tokenId] = to;
        
        emit Transfer(msg.sender, to, tokenId); 
        
        success = true;
}

セキュリティ

ERC20と同じインターフェイスを実装する場合、transfer関数は成功時に必ずbool型の戻り値を返す必要があります。 これを省略すると、既存のERC20互換コントラクトが失敗と判断し、NFTが送金先でロックされたまま取り出せなくなる恐れがあります。

safeTransferとの併用

safeTransfer()系の関数は受け取り側コントラクトが正しく実装されていることを確認できる仕組みを持つため、ロックのリスクを軽減できます。 しかし、全てのシステムがsafeTransfer()を利用するわけではないため、transfer()にも必須の戻り値を含めておくことで安全性が向上します。

引用

Ross Campbell (@z0r0z), "ERC-4521: 721/20-compatible transfer [DRAFT]," Ethereum Improvement Proposals, no. 4521, December 2021. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-4521.

最後に

今回は「ERC20コントラクトが安全にERC721トークンを送付する仕組みを提案しているERC4521」についてまとめてきました! いかがだったでしょうか?

質問などがある方は以下のTwitterのDMなどからお気軽に質問してください!

他の媒体でも情報発信しているのでぜひ他も見ていってください!