たのしい工学

プログラミングを学んで、モノをつくりたいひと、効率的に仕事をしたい人のための硬派なブログになりました

【Ethereum開発】ローカルでsolidityで書かれたコントラクトをコンパイルする

   

inboxフォルダ(Inbox Project Directory)をつくる
そのなかにcontranctsフォルダとtestフォルダをつくります。
contrantsフォルダには、ビルドを終了する各コントラクトの生のソースコードがふくまれます。
testフォルダには、その名のとおり各種テスト系のファイルがふくまれます。
https://gyazo.com/fd984dceb09ca0ffb3383099c6a283e0

ルートディレクトリには、package.json、compile.json、deploy.jsを配置します。

  • package.json
    プロジェクトにインストールするさまざまな依存関係も記録しま す

    • compile.js
      contractディレクトリを調べて、そのなかにあるコントラクトを コンパイルします
  • deploy.js
    コンパイルされたコードをメインネットワークやRobsternネットワーク、Rinkbeyネットワーク等のネットワーク内に展開します

https://gyazo.com/8ec27d1859a34d73105832ef0fe418e4

コントラクトソースを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としてコンパイルしてみましょう。

これをコンパイルした結果えられるのが、
https://gyazo.com/8ec27d1859a34d73105832ef0fe418e4
この図のABIとContractBytecodeです。

https://gyazo.com/2b957ad204dc7479488b6aea2cc337a0

このbytecodeというデータが実際にethereumネットワークに展開しようとしているbytecodeです 。

この一連の数字と文字がブロックチェーンに格納されて実行されるコントラクトの実際のコードを表しています。

もっとしたにいくと

https://gyazo.com/257128c9b6a91a1cb1afbc81b9db74b6

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」を探してみてください。

続きは随時アップしていく予定です。

ではでは!

 - BlockChain, テクノロジー