在本文中,我们将看一下EthereumJ库,它允许我们使用Java与以太坊区块链进行交互。
以太坊作为一种加密货币,利用去中心化、点对点、可编程区块链形式的数据库,以太坊虚拟机(EVM),通过连接不同的节点进行同步和操作。节点通过共识同步区块链,通过挖掘(工作量证明)创建硬币,验证交易,执行以Solidity编写的智能合约,并运行EVM,而区块链的区块,主要包含帐户状态(包括帐户之间的交易)和工作量证明。
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详解。
其他以太坊教程如下:
汇智网原创翻译,转载请标明出处。这里是 原文