Blockchain
Ethereum
solidity
web3.js

Ethereum1.6.x以降のSolidityコンパイル

More than 1 year has passed since last update.

Ethereumを学習しているときに躓いたところと解決策について備忘録的に書き残していきます。

  1. Solidityソースのコンパイル
  2. web3.jsでSolidityソースのコンパイル

環境

  • Geth 1.6.7
  • Go 1.8.3
  • Solidity 0.4.15
  • mac OS X 10.12.6

Solidityソースコンパイル

1.5以前はGethから次のコマンドで実行ができました。

> eth.compile.solidity(source)

しかし、1.6以降はGethからcompileメソッドが削除されたため、ターミナルからsolcコマンドを使ってコンパイルする必要が生じました。
ターミナルから次のコマンドで実行することでsolidityソースをコンパイルすることができます。

$ solc -bin -abi hoge.solc

web3.jsでSolidityソースコンパイルをコンパイル

1.5以前にあったGethでのコンパイルができなくなったため、プログラム上でコンパイル及びデプロイを行う場合はexecを使う必要が生じました。
ソースは次のようになります。

compile.js
var fs = require('fs');
var exec = require('child_process').execSync;

exec(`solc --bin --abi --optimize -o bin contract.sol`);

var abi = fs.readFileSync('bin/contract.sol:Contract.abi');
var compiled = '0x' + fs.readFileSync("bin/Contract.bin");

この時、依存関係を解決するためにnpmでfsとchild_processをインストールしてください。

もう一つはbrowser-solcを使用してコンパイルする方法です

browser-solc
このソースのbrowser-solc.min.jsを加え、次のソースでコンパイルができます。

compiler.js
//Get a list of all possibile solc versions
BrowserSolc.getVersions(function(soljsonSources, soljsonReleases) {
  console.log(soljsonSources);
  console.log(soljsonReleases);
});

//Load a specific compiler version
BrowserSolc.loadVersion("バージョン", function(compiler) {
  source = 'ソースコード';
  optimize = 1;
  result = compiler.compile(source, optimize);
  console.log(result);
});

このあとresultから値を取り出せばコピペせずにスマートコントラクトをデプロイできると思います。

[追記]
他にも、npmパッケージのsolcをインストールするとコンパイルできます。

compile.js
#!/usr/bin/env node

// 必要なパッケージをインポート
const fs = require("fs");
const solc = require('solc');
const Web3 = require('web3');

// web3の初期化
web3 = new Web3();
// プライベートネットワークと接続
if (!web3.currentProvider) {
    web3.setProvider(new web3.providers.HttpProvider("http://localhost:8545"));
}else{
    console.log("error");
    exit;
}
web3.setProvider(new web3.providers.HttpProvider('http://localhost:8545'));
web3.eth.defaultAccount=web3.eth.accounts[0];
let source = "contract TestContract {uint data;function set(uint x) {data = x;} function get() constant returns (uint){return data;}}";
let compiledContract = solc.compile(source, 1);
console.log(compiledContract);

最後に

初めて自分で解決させた点を共有する事となるのですが、今後自分と同じ箇所で躓いた人の助けになればと思います。