20
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-08-25

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);

#最後に

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

20
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?