見出し画像

第2回 CryptoGames ブロックチェーン研修会(3/25(金) 19:00~)

こんにちは、CryptoGamesの高橋です。

今回は内部の非エンジニアの方向けの研修を公開させていただきたいと思います。動画も公開予定です。

日時 3/25(金) 19:00~

場所 meet.google.com/xjh-puit-ydd

ご興味のある方、是非お気軽にどうぞ

注意事項

状況や内容は日々変化していきます。

例えば、Documentの中では、EIP721は3つで構成と書かれていますが、Githubを見ると4つがあります。

また、extentionsの中身も変化しています。

ここではDocumentに書かれている情報をもとに進めていきます。

Githubにはどのように書かれているのか、何が増えたのかなどを確認することでより理解が深まるのではと思います。


0 概要

本日はERC721とは、具体的になんなのか、こちらのOpenzeppelinを中心に見ていきたいと思います。

少し細かいところもありますが、これらを知ることで、お客様との会話などでも説明に深みが出るのではと思っています。

ではまずはじめにEIP721について見ていきましょう。(スペルミスではありません。)

1 EIP721の構成

EIPはEthereum Improvement Proposalsの略で、イーサリアムの改善提案です。

EIP721は、次の3つから構成されています。

① IERC721
② IERC721Metadata
③ IERC721Enumerable

2 IERCの実装

それぞれのIERCを実装したものがERC~です。

これらは「継承」(inheritance)を用いて利用します。

3 IERC721Full

IERC721Fullは上の3つをパッケージしたものです。

4 IERC721の構成

大きく、次の4つからなっています。

① balanceOf()
② ownerOf()

③ approve()など(Approve関連)
④ safeTransferFrom()など(transfer関連)

5 IERC721Metadataの構成

① name()
② symbol()
③ tokenURI()

これがあるからこそ、それぞれのメタデータを確認することができます。

6 IERC721Enumerableの構成

① totalSupply()
② tokenOfOwnerByIndex()
③ tokenByIndex()

全供給量を取り出したり、数えることができるのはIERC721Enumerableのおかげなのですね。

7 拡張機能について

機能を拡張するコントラクトとして4つあります。

① ERC721Mintable
② 
ERC721MetadataMintable
③ 
ERC721Burnable
④ 
ERC721Pausable

7ー1 ERC721Mintable

下のように3つの関数が入っているようです。

ちなみに、mint()safeMint()の違いはなんでしょう?

下はERC721についてですが、このように記載されています。

safeMint()は宛先がコントラクトアドレスであった場合に、「onERC721Received」を実装してなければ送ることができません。

これは誤送信を防ぐためです。

「onERC721Received」を実装していないということは、受け取る準備をしていない、誤ったコントラクトアドレスの可能性が高いとの判断です。

そのため、そのようなコントラクトアドレスには送れないようになっています。

7ー2 その他の機能について

ERC721Burnableは関数としてはburn()のみのようです。

ERC721Pausableは基本的な機能は「Pausable」「PauserRole」というコントラクトに書かれており、それを継承しています。

8 IERC165って何?

最後に、ずっと出てきていたIERC165についても見ていきましょう。

8ー1 背景

今まで見てきた、インターフェース(IERC~のことです。)コントラクトに必須ではありません。

実はそれによって問題も起こり得ます。

例えば、あるERC20のトークンをAコントラクト30送ったとします。

しかし、そのAコントラクト自体にTransferする機能がなかったらどうでしょう?

Aコントラクトには30のトークンがありますが、これをどこかに送るすべがありません。そのため、このトークンは結局、永遠に使うことができません。

そのため、どのインターフェースを使っているのを確認できることにより、この事態を防ごうとしています。

8ー2 実際に見て見ましょう。

それぞれのインターフェースにはインターフェースIDがあります。

例えばIERC721「0x80ac58cd」です。

IERC165supportsInterface()が実装してあるコントラクトに対して、「0x80ac58cd」はありますか?と聞くことができます。

これにより、そのインターフェースがあるかを確認できます。

今回はLootのコントラクトで確認してみましょう。

https://etherscan.io/address/0xff9c1b15b16263c61d017ee9f65c50e4ae0113d7#readContract

このように、true(○)が返ってきたため、IERC721が実装されていることが確認できました。


いかがでしたでしょうか?

今回は以上です。

サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊