java類庫EthereumJ使用區塊鏈
在本文中,我們將看一下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挖掘器是推薦的方法。
有關以太坊本身的更多高階主題可以在官方文件中找到。
在本文中,我們展示瞭如何連線到以太坊網路以及使用區塊鏈的幾種重要方法。
與往常一樣,此示例中使用的程式碼可以在ofollow,noindex">GitHub 上找到。
如果希望快速進行java以太坊開發,那請看我們精心打造的教程:java以太坊開發教程,主要是針對java和android程式設計師進行區塊鏈以太坊開發的web3j詳解。
其他以太坊教程如下:
- 以太坊入門教程,主要介紹智慧合約與dapp應用開發,適合入門。
- 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
- python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
- php以太坊,主要是介紹使用php進行智慧合約開發互動,進行賬號建立、交易、轉賬、代幣開發以及過濾器和事件等內容。
- C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括賬戶管理、狀態與交易、智慧合約開發與互動、過濾器和事件等。
匯智網原創翻譯,轉載請標明出處。這裡是原文