はじめに

初めまして。 CryptoGamesというブロックチェーンゲーム企業でエンジニアをしている cardene(かるでね) です! スマートコントラクトを書いたり、フロントエンド・バックエンド・インフラと幅広く触れています。

代表的なゲームはクリプトスペルズというブロックチェーンゲームです。

今回は、ERC20と互換性を持たせつつERC223の仕組みを活用して、トークンを受け取ったことを通知する仕組みを提案している幻のERC677についてまとめていきます!

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

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

この規格はGithubでの議論にとどまっていて、正式なERC標準としてまとめられていません。 以下のGithubで色々議論されていますが、数年前にClosedとなっているため正式なERCとして採用されるのは難しそうです。 ただ、仕組みとしては使えると思うので今回記事にまとめました。 あくまでERC(仮)と認識した上で記事を読んでください。

概要

この規格では、ERC20トークンにtransferAndCallという関数を追加する提案をしています。 この関数は、ERC20トークンをコントラクトにtransferし、追加のデータを渡すことができます。 これにより、トークンがtransferされた後にコントラクトが特定の処理を実行することが可能になります。

ERC20については以下の記事を参考にしてください。

動機

現在(当時)、ERC20トークンをContractにtransferするには以下の複数の手順が必要です。

  1. ERC20コントラクトでapprove関数を実行して、コントラクトがトークンのtransferをできるようにします。
  2. コントラクトに通知をして、ERC20トークンをtransferできるようになったことを知らせます。
  3. コントラクトが実際にERC20トークンをtransferし、ERC20トークンの受け取りに関連する処理を実行します。

上記の手順は2~3ステップ必要なため、非効率でUXが悪いです。

ERC223はこの問題を解決するために設計されましたが、既存のERC20トークンを互換性がありません。 ERC223では、ERC20コントラクトのtransfer関数を拡張して、onTokenTransferを実装していないコントラクトにtransferする場合エラーを返すようにしています。 これにより、マルチシグウォレットのような既存のコントラクトがトークンを受け取る時、トークンのtransfer元のコントラクトにロックされる可能性があります。

ERC223では、ERC20トークンをtransferする時、送り先のアドレスがコントラクトの場合にそのトークンを受け取ることができるかをチェックします。 チェック方法としては、tokenReceivedという関数を実行してtransfer処理を実行し、もしなければエラーを返すというような仕組みです。 ERC223については以下の記事を参考にしてください。

この規格では、ERC223の機能を提供しながら、ERC223の問題を回避する提案をしています。 この提案では、transferAndCall(address receiver, uint amount, bytes data)という新しい関数を導入します。 この関数は、トークンを受け取りアドレスにtransferし、追加のデータと共に受け取りコントラクトのonTokenTransfer関数を呼び出します。 この規格で提案されているtransferAndCall関数は、ERC223のtransfer(address,uint256,bytes)関数と似ていますが、名前が異なるため明確に区別できます。 これにより、既存のERC20コントラクトとの互換性を維持しながら、トークンtransfer時の新しい機能を提供できます。 将来的には、より多くのコントラクトがtokenReceivedを実装し、ERC223トークンを取り扱えるようになります。

仕様

トークンコントラクト

js
function transferAndCall(address receiver, uint amount, bytes data) returns (bool success)

ERC20のtransfer関数を使ってトークンをreceiverに指定されたアドレスにtransferします。 その後、以下の処理を行います。

まず、Transfer(address, address, uint256, bytes)というイベントをログに記録します。 次に、トークンコントラクトはトークン受け取りコントラクトのonTokenTransfer関数を呼び出します。 この関数には以下のパラメータが渡されます。

  • sender
    • トークンを送ったアドレス
  • amount
    • transferされたトークンの量
  • data
    • 追加のデータ(例えば、トークンのtransfer理由を示すためのもの)

トークン受け取りコントラクト

js
function onTokenTransfer(address from, uint256 amount, bytes data) returns (bool success)

この関数は、トークンを受け取るコントラクトに追加され、単一のトランザクション内でトークンを受け取ったことを通知できるようにします。

互換性

この規格は全てのERC20トークンとコントラクトに対して互換性があります。 新しく作成されたトークンとコントラクトはtransferAndCall機能を実装でき、既存のコントラクトではapprove + transferFromワークフローを使用することができ、特に何か変更をしたり追加の手順は不要です。

実装

以下のGithubに実装コードが格納されています。

最後に

今回は「ERC20と互換性を持たせつつERC223の仕組みを活用して、トークンを受け取ったことを通知する仕組みを提案している幻のERC677」についてまとめてきました! いかがだったでしょうか?

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

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