はじめに
Solidityとはプログラミング言語の名前で、Ethereumのブロックチェーン上で動作するプログラム(コントラクト)を記述することができるプログラミング言語です。
暗号通貨として用いられるだけではなく、非中央集権型アプリケーションの作成も可能です。「最速でSolidityを学ぶ手順」では、Solidityを用いたプログラムを作成していく上で、必要な知識の習得を目的とします。
第1回では、Ethereumの概要・処理手順について説明し、Solidityで記述されたプログラムを実行するための環境構築について解説します。
本記事は、過去にコンセンサス・ベイスが主宰していたオンラインサロンの記事です。記事は2017年~2018年にかけて執筆されたため、一部は、既に古くなっている可能性があります。あらかじめご了承ください。
前提知識
本稿では、ブロックチェーンについての知識を前提としています。ビットコインやブロックチェーンに関する知識に関しては、以下の本を参照するといいかもしれません。
・いまさら聞けないビットコインとブロックチェーン | 大塚 雄介
・Mastering Bitcoin
「Mastering Bitcoin」に関しては、日本語版PDFを無料で閲覧することができます。
Solidityの理解のためには、ブロックチェーンに関する知識が必要です。したがって、ここでブロックチェーンの基礎知識を理解することをおすすめします。
Ethereum
Ethereumとは、ブロックチェーン技術をベースにした、非中央集権型アプリケーション(DApp)のためのプラットフォームです。
Ethereumの基礎知識
Ethereumで用いられる用語や、概要については当サロンにて公開されているため、そちらをご覧ください。
・「Ethereumについて第1回 概要編」
・「Ethereumについて第3回 Ethereumの基礎用語編」
Ethereumにおける処理の流れ
Ethereumにおける開発全体の流れと、トランザクション(取引データ)の流れについて説明します。作成したコントラクト・コードがどのように処理されるかを把握することで、Ethereumにおける処理の全体像を掴むことができます。まず、開発全体の流れについて解説します。
開発全体の流れ
Solidityで記述されたコントラクトのコードはEVM(Ethereum Vitual Machine) で処理されます。VMとは仮想的なコンピュータという意味です。WindowsやMacや組み込み機器など全く違うコンピュータ上に仮想的なコンピュータを作ることで、様々な環境で同じプログラムを動かすことができるように作られたものです。つまり、EVM用に書かれたプログラムは、EVMが動くコンピュータであれば、動作できます。
コントラクト・コードは、EVMが理解できるように変換する必要があります。ここでは、Aさんがコントラクトを作成しEthereumネットワーク上に配置(デプロイ)するとします。
Aさんは、まず処理の内容(コントラクト)をSolidityを用いて記述します。記述したコントラクト・コードをEVMで実行できるようにコンパイル(翻訳)してEVMバイトコードを作成し、トランザクションに乗せてからEthereumネットワークにデプロイします。
一つのノードがトランザクションを受け取り、それを近くのノードに送ります。これを繰り返すことで、トランザクションがEthereumネットワーク全体に共有されます。
コントラクトの実行方法
次に、Ethereumネットワーク上にデプロイされたコントラクトの実行方法について解説します。以下では、コントラクトの実行を行う人をBさんとして解説します。
Bさんは、ターミナルやブラウザを用いてコントラクトの実行を行うことができます。ユーザは、自身の元帳(ブロックチェーン)にコントラクトのEVMバイトコードを保持しているため、各々のローカルブロックチェーンのEVMを用いてコントラクトを実行することが可能です。ターミナルを用いてコントラクトを実行する際にはSSH等を用います。また、ブラウザで実行する際にはJSON-RPCを用います。以下で、SSHとJSON-RPCについて説明します。
・SSH:Secure Shellの略で、通信がすべて暗号化されるため安全に通信を行うことができるプロトコル。
・JSON-RPC:JSON形式で遠隔にあるサーバ上の処理を呼び出すためのプロトコル。RPCとは、web上でクライアントからサーバ上のプログラムを実行する 処理。ここでは、サーバがブロックチェーンに置き換わっている。
キーボードからコマンドを打ち込んで操作するインターフェースはCUIと呼ばれます。CUIのための環境を「コンソール」や「ターミナル」と呼びます。それに対し、GUIとは、ウィンドウなどを用いて直感的な操作を行うことが可能なインターフェースです。
・コンソール:コンピュータと直結された、制御を行うためのハードウェア。
・ターミナル:GUI上でCUIの操作をする際に用いるソフトウェア。
次に、コントラクト作成の流れについて図を用いて解説します。上の図の、「コントラクト作成」から「ブロックチェーン上にデプロイ」までの処理を指しています。例として、AさんからBさんへ1ether送る処理について考えます。
まず、Aさんは自身のPCやスマートフォンを利用して「自分からBさんに1ether送る」といった取引内容と自身の署名からなるトランザクションを作成します。そしてネットを用いてEthereumネットワークに送信します。この時、送信されたトランザクションは「トランザクションプール」に格納されます。トランザクションは、検証された後他の機器へと送信されます。
ブロックチェーンに繋ぐブロックは、マイニングと呼ばれるくじ引きのような処理で生成されます。まず、マイナー(マイニングを行う人)はトランザクションプールからトランザクションを選択し、ブロックを生成します。ブロック生成後はマイニングを行い、当たりを引くことができた人のブロックのみが、ブロックチェーンに繋がれます。当たりを引いた後の処理について以下に示します。
当たりを発見したマイナーは、ブロックに当たりを引いたことを示す情報を付与します。このブロックを他の機器に送信します。ブロックを受け取った側は、ブロックを検証して問題がなければ自身の元帳(ブロックチェーン)の最後に繋ぎます。これで、トランザクションがブロックチェーン上にデプロイされました。
Ethereumでできないこと
Ethereumは、パブリック向けのブロックチェーン実装として設計されているため、様々な攻撃に対する対応が盛り込まれています。したがって、悪意のあるコードを書かせないためにいくつかの制約があります。制約に関する詳しい情報は以下の記事で解説されています。(Ethereumについて第1回 概要編)
Ethereumの環境構築
環境構築とは?なぜ必要なのか
環境構築とは、特定のプログラミング言語を動かす(実行する)ことができるように、必要なソフトウェアやツールなどを用意する作業のことです。
プログラミング言語や関連ツールは、この世に数限りなく存在します。そのため、自分が使いたいものにに、自身のPCがデフォルトで対応しているとは限りません。
対象のプログラミング言語を用いた開発を行えるようにするために、それぞれに対応した環境を用意してやる必要があります。
今回のケースで言えば、Ethereum開発で使うGethやSolidityなどは、そこらへんで普通に売っているPCにはまず間違いなく用意されていないでしょう。
ですから、まずは自力でこれらを入手してインストールしたりする作業(=環境構築)をして、自分のPCで使えるように準備しましょう。
以下で、必要なソフトウェアの説明と、導入するための手順を解説していきます。
Geth
Ethereumの仕様を実装したEthereumクライアントはいくつか存在しますが、現在推奨されているクライアントは、Go言語によって実装された「Geth」です。
クライアントとは、サーバに対しサービスを要求する側を指します。この場合はブロックチェーンに対し任意の要求を出すためソフトウェアを指します。
Gethは、CUIクライアントでありEthereumネットワークにフルノードで参加することが可能です。また、Gethを用いることでetherの採掘・送金、スマート・コントラクトの生成・ブロックチェーンの確認なども行うことができます。
solc
Ethereumでは、可読性と生産性に優れた「Solidity」という高水準ブログラミング言語が存在します。
しかし、Ethereumネットワーク上におけるコントラクト・コードは、EVM Codeと呼ばれるバイトコードで処理されるため、SolidityのコードをEVM Codeに翻訳するコンパイラが必要です。このコンパイラが「solc」です。
環境構築に必要な知識
macOSの場合には「ターミナル」・Linuxの場合には「端末」と呼ばれるターミナルを用いることで、コマンドを用いてインストールを行うことができます。以下のコマンドは全て、自身のターミナル上で1行ずつ行なってください。
$はプロンプトと呼ばれ、ここから入力しなさいという記号です。したがって、$は入力しないでください。
以下に、ターミナルで使用するコマンドの例を示します。今回は、以下のコマンドを理解すれば環境の構築ができます。
コマンドの例
$ls //作業しているフォルダ内の要素を列挙
$pwd //作業しているフォルダまでのpathを出力
$cd example //exampleフォルダに移動
$mkdir folder //作業しているフォルダ内にfolderフォルダを作成
Homebrew
macOSを用いる場合には、「Homebrew」を用います。Homebrewはパッケージマネージャの一つで、ソフトウェアの導入を単純化するために用いられます。Homebrewのインストールは、以下のリンクに公開されているコマンドをターミナルで実行することで容易に行うことができます。(https://brew.sh/index_ja)
Gethのインストール
以下に、Gethのインストール方法を示します。
Linuxの場合
$sudo add-apt-repository -y ppa:ethereum/ethereum
$sudo apt-get update
$sudo apt-get install ethereum
macOSの場合
$sudo apt-get install ethereum
$brew install ethereum
インストールが無事に完了したら、次はgethをプライベート・ネットで起動する方法について解説します。自身で作成したコントラクト・コードなどは、プライベート・ネット上で挙動をテストした方がいいでしょう。
プライベート・ネット用ディレクトリ作成
まず、プライベート・ネット用のディレクトリ(フォルダ)を用意した方が管理が容易になります。
$mkdir ~/eth_private_net //eth_private_netフォルダを作成
$cd ~/eth_private_net //eth_private_netフォルダに移動
Genesisブロックを作成
次に、ブロックチェーンの先頭のブロックであるGenesisブロックについての情報をJSON形式で記述します。
JSON(Javascript Object Notarion)形式とは、簡潔に構造化されたデータを記述することができるデータフォーマットです。「key: value」で記述され、人間にとって読み書きが容易な記述形式です。
ファイルの作成には、テキストエディタを用います。様々なテキストエディタが提供されています。以下で、いくつかのテキストエディタを紹介します。
・Visual Studio Code: https://www.microsoft.com/ja-jp/dev/products/code-vs.aspx
・Atom: https://atom.io/
以下はgenesisブロックの情報について記述した例です。eth_private_netフォルダ内にgenesis.jsonを作成してください。
genesis.json
{
"config": {
"chainId": 15
},
"nonce": "0x0000000000000042",
"timestamp": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "",
"gasLimit": "0x8000000",
"difficulty": "0x4000",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x3333333333333333333333333333333333333333",
"alloc": {}
}
このJSONファイルを用いて、genesisブロックの初期化を行います。
Genesisブロックの初期化
$geth --datadir ~/eth_private_net init ~/eth_private_net/genesis.json
–datadirオプションでは、指定したディレクトリ下にgenesisブロックの情報を保存するためのディレクトリが新しく生成されます。genesisブロックの初期化を終えたので、gethの起動を行います。
Gethの起動
$geth --networkid "15" --nodiscover --datadir "~/eth_private_net" console 2>> ~/eth_private_net/geth.log
genesisブロックのJSONファイルでchainIdを15に設定したため、–networkidを15に指定しています。以下でオプションについての解説を行います。
–nodiscover :
gethではデフォルトで、自動的に同じnetworkidのEthereumネットワークのノードを探索します。プライベート・ネットでは、未知のノードとの接続を避けるため、このオプションを指定しています。
–datadir :
geth動作時のブロックチェーンデータや各種ログの出力先を指定します。genesisブロックの初期化で使用したディレクトリと一致させる必要があります。
console :
トランザクション生成などを対話的に行うことができるコンソールを使用するための コマンドです。
これで、gethの起動が完了しました。上記のコマンド実行後に、gethプロンプトが立ち上がります。ここで使用できるコマンドは、EthereumのJavaScript APIであるweb3 APIで提供されているコマンドです。リファレンスのリンクを以下に示します。
web3 API) http://web3js.readthedocs.io/en/1.0/
Solidityの環境構築
Solidityのコンパイラである「solc」の導入方法について以下に示します。macOSの場合には以下のバージョンのみ対応しているため注意が必要です。
・OS X Mavericks (10.9)
・OS X Yosemite (10.10)
・OS X Capitan (10.11)
solcのインストール
//Linuxの場合
$sudo add-apt-repository -y ppa:ethereum/ethereum
$sudo apt-get update
$sudo apt-get install solc
//macOSの場合
$brew install cpp-ethereum
$brew linkapps cpp-ethereum
$brew install solidity
macOSの場合にインストールしたcpp-ethereumは、C++で実装されたEthereumフル・クライアントであり、その一部にsolcが含まれています。
Solidityのコントラクト・コードの拡張子は「.sol」です。実際にコンパイルを行う際には、以下のコマンドで行います。
コントラクト・コードのコンパイル
solc --abi --bin example.sol
–abi, –binオプションを用いることで、geth上でコントラクトを登録する際に必要なBINARYとJSON ABIを出力することができます。
まとめ
今回は、Ethereumのの概要と処理の流れを説明し、Ethereumのコントラクトを記述する際にかかる制約について解説しました。また、Ethereumネットワーク上での処理を行う際に必要な「geth」とSolidityのコンパイラである「solc」の導入方法とコンパイルする方法について説明しました。第2回では、gethを用いた送金処理などの解説・Solidityの言語仕様と簡単なプログラムを作成し実行する流れについての解説を行います。
免責事項
本記事に掲載されている記事の内容につきましては、正しい情報を提供することに務めてはおりますが、提供している記事の内容及び参考資料からいかなる損失や損害などの被害が発生したとしても、弊社では責任を負いかねます。実施される際には、法律事務所にご相談ください。
技術・サービス・実装方法等のレビュー、その他解説・分析・意見につきましてはblock-chani.jp運営者の個人的見解です。正確性・正当性を保証するものではありません。本記事掲載の記事内容のご利用は読者様個人の判断により自己責任でお願いいたします。
参考資料
- Ethereum 入門 https://book.ethereum-jp.net/
- EthereumのContractをSolidityで書いて遊んだ
https://qiita.com/IKEA_dless/items/1f7c49384fd90cde4646 - 「この1冊でまるごとわかる ブロックチェーン&ビットコイン」
会社紹介
弊社(コンセンサス・ベイス株式会社)は、2015年設立の国内で最も古いブロックチェーン専門企業です。これまでに、大手企業の顧客を中心に、日本トップクラスのブロックチェーンの開発・コンサルティング実績があります。ブロックチェーンに関わるビジネスコンサル・システム開発・教育・講演などご希望でしたら、お気軽にお問い合わせください。
会社ホームページ
https://www.consensus-base.com/
ブロックチェーン学習に最適の書籍の紹介
図解即戦力 ブロックチェーンのしくみと開発がこれ1冊でしっかりわかる教科書
本書は、ブロックチェーン技術に興味を持ったエンジニアや、その仕組みを学び、自分の仕事に活かしたいビジネスパーソンを対象にして、ブロックチェーンのコア技術とネットワーク維持の仕組みを平易な言葉で解説しています。この本を読んだうえで、実際にコードを書くような専門書、ブロックチェーンビジネスの解説書を読むことで、理解度が飛躍的に高まるでしょう。(はじめにより)