EthereumJの紹介

EthereumJの概要

1. 前書き

この記事では、Javaを使用してEthereumブロックチェーンと対話できるようにするEthereumJライブラリーについて説明します。

まず、このテクノロジーの概要を簡単に説明しましょう。

2. イーサリアムについて

Ethereumは、プログラム可能なblockchainの形式の分散型ピアツーピアデータベースであるEthereum Virtual Machine(EVM)を活用するcryptocurrencyです。 同期され、異なるが接続されたnodesを介して動作します。

2017年の時点で、Nodesはコンセンサスを通じてblockchainを同期し、マイニング(proof of work)を通じてコインを作成し、トランザクションを検証し、Solidityで記述されたsmart contractsを実行し、実行しますEVM。

blockchainは、account statesaccounts間のトランザクションを含む)とproof of workを含むblocksに分割されます。

3. Ethereum Facade

org.ethereum.facade.Ethereumクラスは、EthereumJの多くのパッケージを抽象化し、1つの使いやすいインターフェイスに統合します。

ノードに接続してネットワーク全体と同期することができます。接続すると、ブロックチェーンを操作できます。

ファサードオブジェクトの作成は次のように簡単です。

Ethereum ethereum = EthereumFactory.createEthereum();

4. イーサリアムネットワークへの接続

ネットワークに接続するには、最初に公式クライアントを実行しているサーバーのノード, i.e.に接続する必要があります。 ノードはorg.ethereum.net.rlpx.Nodeクラスで表されます。

org.ethereum.listener.EthereumListenerAdapterは、ノードへの接続が正常に確立された後にクライアントによって検出されたブロックチェーンイベントを処理します。

4.1. イーサリアムネットワークへの接続

ネットワーク上のノードに接続しましょう。 これは手動で行うことができます:

String ip = "http://localhost";
int port = 8345;
String nodeId = "a4de274d3a159e10c2c9a68c326511236381b84c9ec...";

ethereum.connect(ip, port, nodeId);

ネットワークへの接続は、Beanを使用して自動的に行うこともできます。

public class EthBean {
    private Ethereum ethereum;

    public void start() {
        ethereum = EthereumFactory.createEthereum();
        ethereum.addListener(new EthListener(ethereum));
    }

    public Block getBestBlock() {
        return ethereum.getBlockchain().getBestBlock();
    }

    public BigInteger getTotalDifficulty() {
        return ethereum.getBlockchain().getTotalDifficulty();
    }
}

次に、EthBeanをアプリケーション構成に挿入できます。 次に、Ethereumネットワークに自動的に接続し、ブロックチェーンのダウンロードを開始します。

実際、上記のstart()メソッドで行ったように、作成したorg.ethereum.facade.Ethereumインスタンスにorg.ethereum.listener.EthereumListenerAdapterインスタンスを追加するだけで、ほとんどの接続処理が便利にラップおよび抽象化されます。

EthBean eBean = new EthBean();
Executors.newSingleThreadExecutor().submit(eBean::start);

4.2. リスナーを使用したブロックチェーンの処理

EthereumListenerAdapterをサブクラス化して、クライアントによって検出されたブロックチェーンイベントを処理することもできます。

この手順を実行するには、サブクラス化されたリスナーを作成する必要があります。

public class EthListener extends EthereumListenerAdapter {

    private void out(String t) {
        l.info(t);
    }

    //...

    @Override
    public void onBlock(Block block, List receipts) {
        if (syncDone) {
            out("Net hash rate: " + calcNetHashRate(block));
            out("Block difficulty: " + block.getDifficultyBI().toString());
            out("Block transactions: " + block.getTransactionsList().toString());
            out("Best block (last block): " + ethereum
              .getBlockchain()
              .getBestBlock().toString());
            out("Total difficulty: " + ethereum
              .getBlockchain()
              .getTotalDifficulty().toString());
        }
    }

    @Override
    public void onSyncDone(SyncState state) {
        out("onSyncDone " + state);
        if (!syncDone) {
            out(" ** SYNC DONE ** ");
            syncDone = true;
        }
    }
}

onBlock()メソッドは、(古いか現在かを問わず)受信した新しいブロックでトリガーされます。 EthereumJは、org.ethereum.core.Blockクラスを使用してブロックを表し、処理します。

同期が完了するとonSyncDone()メソッドが起動し、ローカルのイーサリアムデータが最新の状態になります。

5. ブロックチェーンでの作業

イーサリアムネットワークに接続してブロックチェーンを直接操作できるようになったので、いくつかの基本的な操作について詳しく説明しますが、それでも、頻繁に使用する非常に重要な操作について説明します。

5.1. トランザクションの送信

これで、ブロックチェーンに接続したので、トランザクションを送信できます。 Transactionの送信は比較的簡単ですが、実際のTransactionを作成すること自体は長いトピックです。

ethereum.submitTransaction(new Transaction(new byte[]));

5.2. Blockchainオブジェクトにアクセスする

The[.pl-en]# getBlockchain#()メソッドは、現在のネットワークの問題と特定のBlocksをフェッチするためのゲッターを含むBlockchainファサードオブジェクトを返します。

セクション4.3でEthereumListenerを設定したので、上記の方法を使用してブロックチェーンにアクセスできます。

ethereum.getBlockchain();

5.3. イーサリアムアカウントアドレスを返す

イーサリアムAddress.を返すこともできます

イーサリアムAccount –を取得するには、最初にブロックチェーン上の公開鍵と秘密鍵のペアを認証する必要があります。

新しいランダムキーペアを使用して新しいキーを作成しましょう。

org.ethereum.crypto.ECKey key = new ECKey();

そして、与えられた秘密鍵から鍵を作成しましょう:

org.ethereum.crypto.ECKey key = ECKey.fromPivate(privKey);

次に、キーを使用してAccountを初期化できます。 .init()を呼び出すことにより、ECKeyと関連するAddressの両方をAccountオブジェクトに設定します。

org.ethereum.core.Account account = new Account();
account.init(key);

6. その他の機能

フレームワークによって提供される他の2つの主要な機能がありますが、ここでは取り上げませんが、言及する価値があります。

まず、Solidityスマートコントラクトをコンパイルして実行する機能があります。 ただし、Solidityで契約を作成し、その後それらをコンパイルして実行することは、それ自体が広範なトピックです。

第二に、フレームワークはCPUを使用した限定的なマイニングをサポートしますが、GPUマイナーの使用は前者の収益性の欠如を考慮すると推奨されるアプローチです。

イーサリアム自体に関するより高度なトピックは、公式のdocsにあります。

7. 結論

このクイックチュートリアルでは、イーサリアムネットワークに接続する方法と、ブロックチェーンを操作するためのいくつかの重要な方法を示しました。

いつものように、この例で使用されているコードはover on GitHubにあります。