スマートコントラクトの実装で悩ましい点は、
業務ロジックを変更したいときにどうするかという点です。
コントラクトの業務ロジックを変更してデプロイし直すと、当然新しいコントラクトのアドレスが採番され、
新しいコントラクトからは、今まであった昔のデータにアクセスできなくなります。
既存の色々なコントラクトのソースコードを読んでみても、
再デプロイした際、新しいコントラクトから昔のデータにアクセスできなくなる実装をしている案件が散見しています。
現実問題として業務ロジックを変更したいということは、多々あるので、
業務ロジックコントラクトとデータコントラクトを別々に実装し、業務ロジックコントラクトから、
データロジックコントラクトにアクセスするという手が割とコストパフォーマンスがいい実装だと思います。
<スポンサードリンク>
業務ロジックとデータロジックを分断するコントラクトのサンプル
pragma solidity ^0.4.24; contract Business { function set(address dcAddress, uint num, address account) public { Data data = Data(dcAddress); data.set(num, account); } function get(address dcAddress, address account) public view returns(uint256) { Data data = Data(dcAddress); return data.get(account); } } contract Data { mapping (address => uint256) public balances; function set(uint num, address account) public { balances[account] += num; } function get(address account) public view returns(uint256) { return balances[account]; } }
解説
改善点は多々あるかもしれませんが、BusinessとDataを別コントラクトとして実装したサンプルです。
コントラクトのデプロイはコントラクト単位で可能です。
なので、仮にイベント出力を増やしたいといった場合に、Businessクラスを変更してもBusinessクラスからアクセスするDataコントラクトのアドレスは変わらりません。
つまり、新しいBusinessクラスから、常に同じデータコントラクトにアクセスできるので、業務ロジックを好き勝手に変更することができるのです。
参考
Ethereum Solidityの最強の開発環境を構築 これだけ!
【初心者向け】solidity基礎 modifierの使い方を徹底解説
【初心者向け】Solidity 外部コントラクトの呼び出し方法を徹底解説
Solidity(Remix)とgitを連携させ、Ethereumの開発をする
Ethereum プライベートネットワークでgeth起動時にnodeを自動接続する方法