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が表示されます。


eth_getBlockByHash


Ethereum Peers
今回はプライベートネットワークなので表示されませんが、パブリックのネットワークではここに接続しているピアが表示されます。


System Logs
ログをリアルタイムで確認できます。


JSON-RPC Usage
JSONRPCの使い方が確認できます。いちいちマニュアルを探す必要がなくなるので、便利です。


Terminal
web3ライクにコマンドを実行できます。ただ個人的にはJSONRPCでいいかなと思いました。


Wallet
冒頭ではJSONRPCでアカウントを作成しましたが、ここでアカウントを作成することもできます。残高も表示されて便利ですね。


Contracts

Contractsでは、contractをウォッチすることができます。truffleのMetacoinをデプロイして確かめてみます。
なおデプロイではtruffle@4.1.14、solc@0.4.24を利用しました。

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向けの実装がリリースされたら、また改めて試してみたいと思います。

次世代システム研究室では、アプリケーション開発や設計を行うアーキテクト、またはブロックチェーンのエンジニアを募集しています。次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。