0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[ERC4521] ERC20コントラクトが安全にERC721形式のNFTを送付する仕組みを理解しよう!

Posted at

はじめに

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

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

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

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

概要

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

動機

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

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

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

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

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

仕様

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

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

補足

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

参考実装

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などからお気軽に質問してください!

Twitter @cardene777

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?