【Ethereum開発】ローカルでsolidityで書かれたコントラクトをコンパイルする
inboxフォルダ(Inbox Project Directory)をつくる
そのなかにcontranctsフォルダとtestフォルダをつくります。
contrantsフォルダには、ビルドを終了する各コントラクトの生のソースコードがふくまれます。
testフォルダには、その名のとおり各種テスト系のファイルがふくまれます。
ルートディレクトリには、package.json、compile.json、deploy.jsを配置します。
- package.json
プロジェクトにインストールするさまざまな依存関係も記録しま す- compile.js
contractディレクトリを調べて、そのなかにあるコントラクトを コンパイルします
- compile.js
- deploy.js
コンパイルされたコードをメインネットワークやRobsternネットワーク、Rinkbeyネットワーク等のネットワーク内に展開します
コントラクトソースをSolidityCompilerに渡して、コントラクトの内容のjavascript解釈レイヤであるABIと、実際にイーサリアムに展開しているコントラクトバイトコードを吐き出します。
コントラクトバイトコードによって、私たちの端末に小さなノードモジュールをインストールします。
ターミナルにもどって、
npm install --save solc
を実行すると、コンパイラがインストールされます。
nodeプロジェクトにファイルをrequireするときはいつでも、nodeエンジンはJavascriptコードであるかのようにファイルの内容を実行しようとします。ですので、このファイルを直接requiresするのではなく、ハードドライブからファイルの内容を読み取って内容を読みだす必要があります。
complie.js
const path = require('path');
const fs = require('fs');
pathモジュールを使用する理由は、これを利用することで、クロスプラットフォーム互換性が保証されるからです。
つまり、上記のコンパイルスクリプトをwindowsシステム、またはUnixベースのシステムで実行しようとすると、パスモジュールは常にただしいパスを生成するようになります。
まず、Inboxディレクトリへのパスをsolファイルとして生成しましょう。
complie.jsの実行
ターミナルからnode compile.jsとしてコンパイルしてみましょう。
これをコンパイルした結果えられるのが、
この図のABIとContractBytecodeです。
このbytecodeというデータが実際にethereumネットワークに展開しようとしているbytecodeです 。
この一連の数字と文字がブロックチェーンに格納されて実行されるコントラクトの実際のコードを表しています。
もっとしたにいくと
interfaceというデータがあります。
これがABIです。このABIがsolidityの世界とJavascriptの世界とのやり取りを実現する層です。
compile.jsをコンパイルするときには、プロジェクト内の他のファイルをなんらかの形で利用できるようにする必要があります。
コンパイルされたファイルをrequireし、コンパイルされたソースコードにすぐにアクセスできるようにします。
module.exports = solc.compile(source,1);
こうすることで、コントラクトプロパティをもつ巨大オブジェクトとコンパイルされたすべてのコントラクトのリストをエクスポートするようになります。
さきほど得られたデータ構造から、Inboxのデータを取り出すには、
module.exports = solc.compile(source,1).contracts[':inbox'];
とすればよいことがわかります。
コンパイルされたファイルにアクセスするときには、bytecodeプロパティとABIインターフェースだけを含むオブジェクトに直接アクセスすることで、デプロイやテストを簡潔に行えるようになります。
今回はここまでです。
いかがでしたでしょうか?
ちなみに、ここからじぶんで開発を学んでいきたいひとは、
世界最大級のオンライン学習サイトUdemyから「Ethereum and Solidity: The Complete Developer's Guide」を探してみてください。
続きは随時アップしていく予定です。
ではでは!