BLOGメニューHomeTwitterGitHub検索:ERC721を活用した、全てのロジックとデータをSolidityで管理する方法(後編)2019-02-05本記事はERC721を活用した、全てのロジックとデータをSolidityで管理する方法(前編)の後編です。全てのロジックとデータをSolidityで実装しようとすると記述量がものすごい増え、一瞬でカオスになってしまうので、前編ではマスタデータをSolidityで管理する際にコード量を減らしてシンプルする方法をまとめました。後編ではロジックをシンプルにする手法をまとめてみたいと思います。OpenZeppelinのRoleコントラクトを使い、分離したロジック側コントラクトからマスタデータ管理用コントラクトにアクセスする前編にある「マスタデータ関連ロジックとその他ロジックの分離」を単純にそのまま実行してしまうと、分離したロジック側のコントラクトから、マスタデータ管理用コントラクト内のデータを更新する系のfunctionを呼ぶことができなくなります。そこで、OpenZeppelinのRoleコントラクトを継承したManagerRoleを作成し、マスタデータ用コントラクトにManagerRoleコントラクトを継承させます。これにより、Managerとして設定されたコントラクトからもデータを更新ができるようになります。:}ただしこの手法を用いると、コントラクトオーナーであれば好きなアドレスをManagerに設定でき、コントラクトオーナーが好き勝手できてしまうイメージを持たれてしまう可能性があるので、純粋に資産として扱うERC20やERC721のようなコントラクトでは用いないほうが良いでしょう。前述のCatMasterコントラクトのCatのような簡単な構造体を管理するコントラクトであれば、1つのコントラクト内で複数のデータを管理しても問題ないと思いますが、例えばERC20のような複雑なデータを複数管理する場合は、1つのコントラクト内で実装しようとすると一瞬でカオスになります。Factoryパターンの出番です。ERC20を複数管理するとした場合に、ERC20のコントラクト自体はそのまま通常通りデプロイします。そのデプロイした際のコントラクトアドレスをFactoryコントラクト内で管理することで、Factoryコントラクトを通じて任意のコントラクトを参照できるようにします。}}上記コントラクトでは、管理対象のコントラクト(ERC20)のデプロイはコントラクト外で実施し、アドレス登録の処理だけをFactoryコントラクト内で実行することを想定しています。limitに引っかかってデプロイできないことが多いので、デプロイ自体はコントラクト外で実施したほうが無難と思われます。ロジックの共通化、切り出しコードの量を減らすために些細な処理でも共通化できる部分は共通モジュール化し、必要に応じて継承して使うようにします。これは他の言語でも当たり前のことですが、Solidityにおいては別の意味でも重要となります。Solidityでfunction内のロジックが複雑化して使用する変数が増えると、すぐに下記のエラーが発生します。variables.このエラーは処理を共通化して外出ししていると起きにくくなるので、Solidityにおいて処理の共有化や切り出しはとても重要になります。まとめ前編、後編とで様々なSolidityの実装における工夫や懸念点をまとめました。これによりSolidityで全てのロジックとデータを管理するコントラクトを開発する際に、比較的簡単に実装できるようになると思います。