EthereumJの紹介
1. 序章
この記事では、Javaを使用してEthereumブロックチェーンと対話できるEthereumJライブラリについて説明します。
まず、このテクノロジーの概要を簡単に説明します。
2. イーサリアムについて
Ethereum は、プログラム可能なブロックチェーン、Ethereum仮想マシン(EVM)の形式で、分散型のピアツーピアデータベースを活用する暗号通貨です。 同期され、異なるが接続されたノードを介して動作します。
2017年現在、ノードはコンセンサスを通じてブロックチェーンを同期し、マイニング(プルーフオブワーク)を通じてコインを作成し、トランザクションを検証し、スマートコントラクトを実行します] Solidity で記述し、EVMを実行します。
ブロックチェーンは、アカウント状態(アカウント間のトランザクションを含む)とプルーフオブワークを含むブロックに分割されます。 。
3. イーサリアムファサード
org.ethereum.facade.Ethereum クラスは、EthereumJの多くのパッケージを抽象化し、1つの使いやすいインターフェースに統合します。
ノードに接続してネットワーク全体と同期することが可能であり、接続すると、ブロックチェーンを操作できます。
ファサードオブジェクトの作成は次のように簡単です。
Ethereum ethereum = EthereumFactory.createEthereum();
4. イーサリアムネットワークへの接続
ネットワークに接続するには、最初にノードに接続する必要があります
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をアプリケーション構成に挿入できます。 次に、自動的にイーサリアムネットワークに接続し、ブロックチェーンのダウンロードを開始します。
実際、ほとんどの接続処理は、作成したorg.ethereum.facade.Ethereumインスタンスにorg.ethereum.listener.EthereumListenerAdapterインスタンスを追加するだけで、便利にラップおよび抽象化されます。上記のstart()メソッドで行いました:
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オブジェクトにアクセスする
getBlockchain()メソッドは、現在のネットワークの問題と特定のブロックをフェッチするためのゲッターを備えたBlockchainファサードオブジェクトを返します。
セクション4.3でEthereumListenerを設定したので、上記の方法を使用してブロックチェーンにアクセスできます。
ethereum.getBlockchain();
5.3. イーサリアムアカウントアドレスを返す
イーサリアムアドレスを返すこともできます。
イーサリアムアカウント– を取得するには、最初にブロックチェーン上の公開鍵と秘密鍵のペアを認証する必要があります。
新しいランダムキーペアを使用して新しいキーを作成しましょう。
org.ethereum.crypto.ECKey key = new ECKey();
そして、与えられた秘密鍵から鍵を作成しましょう:
org.ethereum.crypto.ECKey key = ECKey.fromPivate(privKey);
次に、キーを使用してアカウントを初期化できます。 .init()を呼び出すことにより、ECKeyと関連するAddressの両方をAccountオブジェクトに設定します。
org.ethereum.core.Account account = new Account();
account.init(key);
6. その他の機能
フレームワークによって提供される他の2つの主要な機能がありますが、ここでは取り上げませんが、言及する価値があります。
まず、Solidityスマートコントラクトをコンパイルして実行する機能があります。 ただし、Solidityでコントラクトを作成し、その後それらをコンパイルして実行することは、それ自体が広範なトピックです。
第2に、フレームワークはCPUを使用した限定的なマイニングをサポートしますが、前者の収益性がないことを考えると、GPUマイナーを使用することをお勧めします。
イーサリアム自体に関するより高度なトピックは、公式のドキュメントにあります。
7. 結論
このクイックチュートリアルでは、イーサリアムネットワークに接続する方法と、ブロックチェーンを操作するためのいくつかの重要な方法を示しました。
いつものように、この例で使用されているコードは、GitHubのにあります。