1. 程式人生 > >EthereumJ(java類庫)操作區塊鏈

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詳解。

其他以太坊教程如下:

  • 以太坊入門教程,主要介紹智慧合約與dapp應用開發,適合入門。
  • 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
  • python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
  • php以太坊,主要是介紹使用php進行智慧合約開發互動,進行賬號建立、交易、轉賬、代幣開發以及過濾器和事件等內容。
  • C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括賬戶管理、狀態與交易、智慧合約開發與互動、過濾器和事件等。

匯智網原創翻譯,轉載請標明出處。這裡是原文