はじめに
初めまして。
CryptoGamesというブロックチェーンゲーム企業でエンジニアをしている cardene(かるでね) です!
スマートコントラクトを書いたり、フロントエンド・バックエンド・インフラと幅広く触れています。
代表的なゲームはクリプトスペルズというブロックチェーンゲームです。
今回は、ERC20と互換性を持たせつつERC223の仕組みを活用して、トークンを受け取ったことを通知する仕組みを提案している幻のERC677についてまとめていきます!
以下にまとめられているものを翻訳・要約・補足しながらまとめていきます。
他にも様々なEIPについてまとめています。
この規格はGithubでの議論にとどまっていて、正式なERC標準としてまとめられていません。
以下のGithubで色々議論されていますが、数年前にClosedとなっているため正式なERCとして採用されるのは難しそうです。
ただ、仕組みとしては使えると思うので今回記事にまとめました。
あくまでERC(仮)と認識した上で記事を読んでください。
概要
この規格では、ERC20トークンにtransferAndCall
という関数を追加する提案をしています。
この関数は、ERC20トークンをコントラクトにtransfer
し、追加のデータを渡すことができます。
これにより、トークンがtransfer
された後にコントラクトが特定の処理を実行することが可能になります。
ERC20については以下の記事を参考にしてください。
動機
現在(当時)、ERC20トークンをContractにtransfer
するには以下の複数の手順が必要です。
-
ERC20コントラクトで
approve
関数を実行して、コントラクトがトークンのtransfer
をできるようにします。 - コントラクトに通知をして、ERC20トークンを
transfer
できるようになったことを知らせます。 - コントラクトが実際に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トークンを取り扱えるようになります。
仕様
トークンコントラクト
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
理由を示すためのもの)
- 追加のデータ(例えば、トークンの
トークン受け取りコントラクト
function onTokenTransfer(address from, uint256 amount, bytes data) returns (bool success)
この関数は、トークンを受け取るコントラクトに追加され、単一のトランザクション内でトークンを受け取ったことを通知できるようにします。
互換性
この規格は全てのERC20トークンとコントラクトに対して互換性があります。
新しく作成されたトークンとコントラクトはtransferAndCall
機能を実装でき、既存のコントラクトではapprove
+ transferFrom
ワークフローを使用することができ、特に何か変更をしたり追加の手順は不要です。
実装
以下のGithubに実装コードが格納されています。
最後に
今回は「ERC20と互換性を持たせつつERC223の仕組みを活用して、トークンを受け取ったことを通知する仕組みを提案している幻のERC677」についてまとめてきました!
いかがだったでしょうか?
質問などがある方は以下のTwitterのDMなどからお気軽に質問してください!
他の媒体でも情報発信しているのでぜひ他も見ていってください!