EthereumJの紹介
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]にあります。