1前書き

この記事では、Javaを使用してhttps://www.ethereum.org/[Ethereum]ブロックチェーンと対話できるようにするhttps://github.com/ethereum/ethereumj[EthereumJ]ライブラリーを調べます。

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


2 Ethereumについて


Ethereum

は、プログラマブルな

blockchain

という形の分散型ピアツーピアデータベースを利用した

cryptocurrency

、Ethereum Virtual Machine(EVM)です。これは、異なるが接続された

ノード

を介して同期および操作されます。

2017年の時点で、

Nodes

は合意を介して

blockchain

を同期し、マイニングを介してコインを作成し(

作業の防止

)、取引を検証し、https://solidity.readthedocs.io/en/develop/[Solidity]で書かれた

smart contract

を実行し、 EVM


blockchain

は、

account states



accounts

間のトランザクションを含む)と

proof of work

を含む

blocks

に分割されます。


3


org.ethereum.facade.Ethereum

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

ネットワーク全体と同期するためにノードに接続することは可能です、そして一度接続されると、私たちはブロックチェーンで作業することができます。

ファサードオブジェクトを作成するのは簡単です:

Ethereum ethereum = EthereumFactory.createEthereum();


4 Ethereumネットワークへの接続

ネットワークに接続するには、最初にnode

__、つまり公式クライアントを実行しているサーバーに接続する必要があります。ノードは

org.ethereum.net.rlpx.Node__クラスによって表されます。


org.ethereum.listener.EthereumListenerAdapter

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

** 4.1. Ethereumネットワークへの接続

**

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

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()

メソッドが起動し、ローカルのEthereumデータが最新の状態になります。


5ブロックチェーンを使った作業

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


5.1. トランザクションを送信する

これで、ブロックチェーンに接続したので、トランザクションを送信できます。


Transaction

を送信することは比較的簡単ですが、実際の

Transaction

を作成することはそれ自体長いトピックです。

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

** 5.2.

ブロックチェーン

オブジェクトへのアクセス

**


()

メソッドは、現在のネットワークの問題と特定の

Blocks

を取得するためのゲッターを含む

Blockchain

ファサードオブジェクトを返します。

セクション4.3で

EthereumListener

を設定したので、上記のメソッドを使ってブロックチェーンにアクセスできます。

ethereum.getBlockchain();

** 5.3. Ethereumアカウントアドレスを返す

**

Ethereum

Address.

を返すこともできます。

Ethereum

Account –

を取得するには、まずブロックチェーンで公開鍵と秘密鍵のペアを認証する必要があります。

新しいランダムな鍵ペアを使って新しい鍵を作成しましょう。

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

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

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

それから

Account

を初期化するために私たちの鍵を使うことができます。

.init()を呼び出すことで、

Account

オブジェクトに

ECKey

とそれに関連する

Address__の両方を設定します。

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


6. その他の機能

このフレームワークでは、ここでは説明しませんが、言及する価値のある2つの主要機能が提供されています。

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

次に、フレームワークはCPUを使用した限定的なマイニングをサポートしていますが、前者の収益性が不足しているため、GPUマイナーを使用することをお勧めします。

Ethereum自体に関するより高度なトピックは、公式のhttp://ethdocs.org[docs]にあります。


7. 結論

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

いつものように、この例で使われているコードはhttps://github.com/eugenp/tutorials/tree/master/ethereum[over on GitHub]にあります。