2018.12.10
Ethereum Harmonyを試す
こんにちは、次世代システム研究室のN.O.です。
11月に開催されたdevcon4のkeynote(動画)で、Ethereumファウンダーのvitalik氏からEthereumの次期バージョンであるEthereum2.0(Serenity)の発表がありました(ニュース記事)。それによれば、Ethereum2.0ではプルーフ・オブ・ステーク(PoS)への移行やシャーディングの導入、その他様々な変更が行われるとのことです。またEthereum2.0のクライアントについてはいくつかのプロジェクトが進んでいることが明らかにされました。Ethereum2.0のテストネットが開始されるのは来年のため、まだ利用することはできませんが、そのクライアントの中からEthereum Foundationによって開発されているHarmonyについて紹介いたします。
Harmonyは開発者向けの機能が充実したEthereumクライアントです。Javaで実装されており、JSONRPCやGUIの機能を提供し、コアの機能はethereum/ethereumjを利用しています。既存のメインネットやRopestenテストネット、PoWベースのプライベートネットワークであれば使うことができるので、試してみたいと思います。
前提
以下の環境で実行しました。
Windows 10
Git BASH (Git for Windows)
Java8実行環境 Amazon Corretto 8
Gradle 5.0
Node.js 10
インストール
Harmonyを設定する
ether-camp/ethereum-harmony
をcloneします。
git clone https://github.com/ether-camp/ethereum-harmony
Harmonyの起動はgradleで行います。gradleのオプションは以下があります。
gradlew runMain #メインネット
gradlew runRopsten #Ropstenテストネット
gradlew runClassic #Ethereum Classic
gradlew runPrivate #プライベート
gradlew runCustom #カスタムのネットワーク
メインネットやテストネットの同期は時間がかかるので、手っ取り早く使い始めるならプライベートです。しかしながら、gradleで立ち上がるプライベートネットワークにはアカウントのキーペアが無いため、トランザクションの実行ができません。
そのため、カスタムのプライベートネットワークを作成することにします。
まずgenesisファイル、設定ファイルを用意します。先ほどcloneしたethereum-harmonyのレポジトリに移動してから作業します。
cd ethereum-harmony cp src\main\resources\genesis\genesis-private.json src\main\resources\genesis\genesis-custom.json mkdir config cp src\main\resources\private.conf config\ethereumj.conf
ethereumj.confを編集します。初回起動時はアカウントを作るだけなので、マイニングは停止しておきます。
genesis = genesis-custom.json database.name = custom mine { start = false 以下略
Harmonyにはcontractをウォッチする機能があります。これを利用するために、solcのバージョンをデプロイのツールtruffleが使用するバージョンと合わせておきます。build.gradleを以下の通り修正します。
compile "org.ethereum:solcJ-all:0.4.24"
また、マイニングではヒープが3.5GB必要となりますので、同じくbuild.gradleのrunCustomに追記します。
task runCustom() { doLast { maxHeapSize = "-Xmx3500M" 以下略
起動する(1回目)
1回目の起動はアカウントを作るためです。
$ ./gradlew runCustom -Dethereumj.conf.file=config\ethereumj.conf _____ _ _ _ _ | ___| | | | | | | | | |__ | |_| |__ | |_| | __ _ _ __ _ __ ___ ___ _ __ _ _ | __|| __| '_ \ | _ |/ _` | '__| '_ ` _ \ / _ \| '_ \| | | | | |___| |_| | | | | | | | (_| | | | | | | | | (_) | | | | |_| | \____/ \__|_| |_| \_| |_/\__,_|_| |_| |_| |_|\___/|_| |_|\__, | __/ | By <Ether.Camp> |___/ 中略 12:12:45.574 INFO [o.a.c.h.Http11NioProtocol] Starting ProtocolHandler ["http-nio-8080"] 12:12:45.590 INFO [o.a.t.u.n.NioSelectorPool] Using a shared selector for servlet write/read 12:12:45.621 INFO [o.a.c.h.Http11NioProtocol] Starting ProtocolHandler ["http-nio-8545"] EthereumJ database dir location: C:\Users\user1/ethereumj/custom EthereumJ keystore dir location: C:\Users\user1\AppData\Roaming\Ethereum\keystore Server started at http://localhost:8080
JSONRPCでアカウントを作ります。
$ curl --data '{"jsonrpc":"2.0","method":"personal_newAccount","params":["password"],"id":0}' -H "Content-Type: application/json" -X POST localhost:8545 {"jsonrpc":"2.0","id":0,"result":"0xe0c4b5fd0509727b245d91d9034b561ac8941021"}
アカウントを作ったら、Harmonyを一旦終了します。Ctrl-Cで終了できます。
アカウントができましたので、設定ファイル, genesisファイルに反映します。
ethereumj.conf
mine { start = true coinbase = "e0c4b5fd0509727b245d91d9034b561ac8941021" 以下略
genesis-custom.json
"alloc": { "0000000000000000000000000000000000000001": { "balance": "1" }, "0000000000000000000000000000000000000002": { "balance": "1" }, "0000000000000000000000000000000000000003": { "balance": "1" }, "0000000000000000000000000000000000000004": { "balance": "1" }, "0xe0c4b5fd0509727b245d91d9034b561ac8941021": { "balance": "1606938044258990275541962092341162602522202993782792835301376" } },
もろもろの準備が整いましたので、改めて起動します。
$ ./gradlew runCustom -Dethereumj.conf.file=config\ethereumj.conf
Harmonyを使ってみる
http://localhost:8080/にアクセスすると、Harmonyを利用できます。
Home画面です。右に表示されているブロック(水色のボタン)をクリックすると、Terminalでeth_getBlockByHashが表示されます。
Ethereum Peers
今回はプライベートネットワークなので表示されませんが、パブリックのネットワークではここに接続しているピアが表示されます。
JSON-RPC Usage
JSONRPCの使い方が確認できます。いちいちマニュアルを探す必要がなくなるので、便利です。
Terminal
web3ライクにコマンドを実行できます。ただ個人的にはJSONRPCでいいかなと思いました。
Wallet
冒頭ではJSONRPCでアカウントを作成しましたが、ここでアカウントを作成することもできます。残高も表示されて便利ですね。
Contracts
Contractsでは、contractをウォッチすることができます。truffleのMetacoinをデプロイして確かめてみます。
なおデプロイでは[email protected]、[email protected]を利用しました。
truffleに同梱されているMetacoinを使います。
$ mkdir MetaCoin $ truffle unbox metacoin
truffle.jsは以下の通りです
module.exports = { networks: { development: { host: "127.0.0.1", port: 8545, network_id: "*" } } };
デプロイしていきます。
$ truffle migrate Using network 'development'. Running migration: 1_initial_migration.js Deploying Migrations... ... 0x49ee4081745fce4d6d09da16636efb7b903d6f65a0c4bd583ed5ab86780684eb Migrations: 0xdedbf8b36bf14489936db67d74cf42ff464189cf Saving successful migration to network... ... 0x03a9a2314029b1c361e882a0d52e0d20224189b3fa20a668b58b025a932b5cbf Saving artifacts... Running migration: 2_deploy_contracts.js Deploying ConvertLib... ... 0x9872da3c8a11385f8cb4dab155d9abfb5a7988ce9a4b1f9af9f9fbc2a4afd4e9 ConvertLib: 0xa3854c2635cf9202073d4267f483e46c63fe6032 Linking ConvertLib to MetaCoin Deploying MetaCoin... ... 0xdc170ab8865288f913ef5f55bfa46993894ca04fab95f25bc64aaa3a202ec1dd MetaCoin: 0x67a45776c1e2953aaa09f3f1a750ad9fa34ba72b Saving successful migration to network... ... 0x461593ef717047487d8423d0e348512697e143f920dc607a8cd3d4ad88820e4e Saving artifacts...
contractのアドレスとsolidityのコードを入力します。solidityファイルをアップロードすることもできますが、importしたファイルを認識できなかったので、truffle-flattenerを利用してsolidityファイルを結合したものを利用します。
$ truffle-flattener contracts/MetaCoin.sol #出力結果をコピーする
Contractsの「Add contact for watching」ボタンをクリックし、AddressにMetaCoinのアドレス、Solidity codeにtruffle-flattenerの出力結果を貼り付け、「Upload」ボタンを押します。
これでcontractをウォッチできるようになりました。このようにmappingの中身を見ることができます。
最後に
Harmonyではブロックの中身を見たり、contractをウォッチしたりと様々な機能が利用できました。今後、Serenity向けの実装がリリースされたら、また改めて試してみたいと思います。
次世代システム研究室では、アプリケーション開発や設計を行うアーキテクト、またはブロックチェーンのエンジニアを募集しています。次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。
グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。
Follow @GMO_RD