Day 2:solcの多くのバージョン、Solidityコンパイラ
2017/05/12
私たちは、現在のsolcバージョンで古いSolidityスマートコントラクト(The DAOなど)をコンパイルしようとした際に、いくつかの問題に直面しました。この記事では、Solidityコンパイラのバージョンと、異なるバージョンを構築する方法について見ていきます。
Solidityコンパイラ:solcとsolcjs
実際、2つのSolidityコンパイラがあります:solc(C++で書かれている)と、solc-js(Emscriptenを使用して、solcのC++ソースコードからJavaScriptにクロスコンパイルします)。技術的には同じソースコードから構築されていますが、実際にはわずかに異なる結果を生成するようです。また、異なるコマンドラインインターフェースがあり、solcjsは(予想通り)solcよりもかなり遅いです。
SolidityコンパイラのJavaScriptビルドには、ウェブベースのRemix Solidity IDEのような素晴らしいアプリケーションがあります。
Solidityスマートコントラクト言語とそのバージョン
Solidityは、Ethereumブロックチェーンのスマートコントラクト言語です。これは高水準のCファミリー言語で、Ethereumバイトコードにコンパイルされ、Ethereum仮想マシン(EVM)で実行されます。EVMは、Ethereumブロックチェーンに参加するすべてのノードで動作する分散仮想マシンで、Ethereumクライアントに統合されています。最も人気のあるEthereumクライアントは、cpp-ethereum、go-ethereum、および[Rustで書かれた][evm-parity](Parity)です。バイトコードとEVMの操作は、Gavin WoodによるいわゆるEthereumイエローペーパーに詳しく説明されています。
Ethereumブロックチェーンは不変であるため、ブロックチェーンに展開されたスマートコントラクト(バイトコード)が常に有効であると合理的に期待できます。つまり、Solidityバイトコードの仕様に破壊的な変更が加えられた場合、EVMは常に既に展開されたバイトコードをサポートする必要があります。しかし、高水準のSolidity言語への変更は、古いバージョンのsolcコンパイラと後方互換性がない可能性があり、その逆も同様です。
これは、私たちがevmdisを使って実験する際に直面した問題であり、最新のsolcバージョン(2017年5月頃)でThe DAOのソースコード(2016年3月頃)をコンパイルすることができませんでした。
バージョンプラグマ
Solidityの0.4.0リリース以降、すべてのSolidityファイルの先頭にpragma solidity ^x.y.zのようなバージョンプラグマステートメントを持つことが求められています。ドキュメントによれば、より複雑なルールが可能であり、これによりコンパイラは(おそらく)未定義または望ましくない結果でコンパイルするのではなく、互換性のないソースファイルを優雅に拒絶できます。
Solidityのバージョン:Ethereum改善提案
Solidity言語の変更の包括的なリストがあるかどうかは不明であり、それと同様、同じSolidity入力に対するsolc出力の変更のミラーも不明です。ブログやredditの投稿を除いて、私たちが特定できた最も注目すべき情報源は、基準変更が議論、正式化、合意されるプロセスであるEthereum改善提案(EIPs)のリストです。
solcのインストール
Solidityとsolcは非常に積極的な開発の下にあり、時間とともに大きく変化しました。私たちは一般的にsolcのビルドとインストールに関するSolidityのドキュメントに従いましたが、0.4.11バージョン(2017年5月)についてはいくつかの quirks を noted しました:
現在、ビルドパイプラインの問題により、Mac OS用のダウンロード可能なバイナリパッケージはありません。LinuxおよびWindowsユーザーはバイナリからインストールできます。
Homebrewを介してインストールすると、Boostを再コンパイルするのに10分以上CPUを占有します。私たちは中止しました。
最終的にGithubからソースをクローンしてビルドしました。約30分かかり、Boostに関しては問題がありませんでした。
古いバージョンのsolcのインストール
Solidityの積極的な開発プロセスの一環として、ドキュメントやソースコード、依存関係が移動しました。私たちの前回の投稿の一部としてThe DAOを再コンパイルするために、私たちは2016年5月頃のsolcのバージョンを取得する必要がありました。実際、私たちはThe DAOの展開バージョンをコンパイルするために使用された正確なsolcバージョンを使いたいと思っていました。 [solcバージョンv0.3.1-2016-04-12-3ad5e82][the-dao-contract]。Githubでの多くの検索の後、特定のリビジョン(3ad5e82)を見つけることができず、諦めてsolc 0.3.2(28b30ec13)を使用しました。
ビルドプロセスも変更されました。ドキュメントは移動したり非推奨になったリポジトリを指しており、私たちは基本的に新しいリポジトリ(cpp-ethereum)を古いコマンドで使用し、動作するまでハックしました。
結論
任意のバージョンのsolcをビルドし、Solidityソースコードをそれでコンパイルできるsolcメタビルダーを作るというのは面白いプロジェクトになるでしょう。
