EthereumJ(java類庫)操作區塊鏈
在本文中,我們將看一下EthereumJ庫,它允許我們使用Java與以太坊區塊鏈進行互動。
以太坊作為一種加密貨幣,利用去中心化、點對點、可程式設計區塊鍊形式的資料庫,以太坊虛擬機器(EVM),通過連線不同的節點進行同步和操作。節點通過共識同步區塊鏈,通過挖掘(工作量證明)建立硬幣,驗證交易,執行以Solidity編寫的智慧合約,並執行EVM,而區塊鏈的區塊,主要包含帳戶狀態(包括帳戶之間的交易)和工作量證明。
以太坊 Facade
org.ethereum.facade.Ethereum
類將許多EthereumJ軟體包抽象並整合到一個易於使用的介面中。
可以連線到節點以與整個網路同步,並且一旦連線,我們就可以使用區塊鏈。
建立Facade物件非常簡單:
Ethereum ethereum = EthereumFactory.createEthereum();
連線到以太坊網路
要連線到網路,我們必須首先連線到一個節點,即執行官方客戶端的伺服器。節點由org.ethereum.net.rlpx.Node
類表示。
在成功建立與節點的連線後,org.ethereum.listener.EthereumListenerAdapter
處理客戶端檢測到的區塊鏈事件。
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);
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()
方法將觸發,使我們的本地以太坊資料保持最新狀態。
使用區塊鏈
現在我們可以連線到以太坊網路並直接使用區塊鏈,我們將探討我們經常使用的幾個基本但非常重要的操作。
1.提交交易
現在,我們已經連線到區塊鏈,我們可以提交交易。提交一個Transaction
相對容易,但建立實際Transaction
本身就是一個冗長的主題:
ethereum.submitTransaction(new Transaction(new byte[]));
2.訪問區塊鏈物件
getBlockchain()
方法返回一個Blockchain facade
物件,其中包含用於獲取當前網路差異和特定塊的getter。
由於我們在前面設定了EthereumListener
,因此我們可以使用上述方法訪問區塊鏈:
ethereum.getBlockchain();
3.返回以太坊帳戶地址
我們也可以返回以太坊地址Address
。
要獲得以太坊Account
——我們首先需要驗證區塊鏈上的公鑰和私鑰對。
讓我們用新的隨機金鑰對建立一個新金鑰:
org.ethereum.crypto.ECKey key = new ECKey();
讓我們從給定的私鑰建立一個金鑰:
org.ethereum.crypto.ECKey key = ECKey.fromPivate(privKey);
然後我們可以使用我們的金鑰來初始化帳戶。通過呼叫.init()
,在Account
物件上設定了ECKey
和相關的Address
:
org.ethereum.core.Account account = new Account();
account.init(key);
其他功能
框架提供了另外兩個主要功能,我們在此不會介紹,但值得一提。
首先,我們有能力編譯和執行Solidity智慧合約。但是,在Solidity中建立合約,然後編譯和執行它們本身就是一個廣泛的主題。
其次,儘管該框架支援使用CPU進行有限的挖掘,但鑑於前者缺乏盈利能力,使用GPU挖掘器是推薦的方法。
有關以太坊本身的更多高階主題可以在官方文件中找到。
在本文中,我們展示瞭如何連線到以太坊網路以及使用區塊鏈的幾種重要方法。
與往常一樣,此示例中使用的程式碼可以在GitHub上找到。
如果希望快速進行java以太坊開發,那請看我們精心打造的教程: java以太坊開發教程,主要是針對java和android程式設計師進行區塊鏈以太坊開發的web3j詳解。
其他以太坊教程如下:
匯智網原創翻譯,轉載請標明出處。這裡是原文