资讯专栏INFORMATION COLUMN

java使用web3j和spring boot构建以太坊区块链dapp

weapon / 1781人阅读

摘要:使用和以太坊客户端的容器镜像,可以快速启动解决方案,实现区块链技术的本地开发。以太坊,主要是针对工程师使用进行区块链以太坊开发的详解。以太坊,主要讲解如何使用开发基于的以太坊应用,包括账户管理状态与交易智能合约开发与交互过滤器和事件等。

区块链最近IT世界的流行语之一。这项有关数字加密货币的技术,并与比特币一起构成了这个热门的流行趋势。它是去中心化的,不可变的分块数据结构,这是可以安全连接和使用的密码算法。在这种结构中的每一区块通常包含前一个区块的加密哈希,一个时间戳,和交易数据。区块链是点对点管理网络的,并在加入每一个新的块之前进行节点间通信的验证。这是关于区块链的部分理论。简而言之,这是一种技术,它允许我们使用一个去中心化的方式管理双方的交易。现在,问题是我们如何在我们的系统中实现它。

于是以太坊来了。这是一个Vitarik Buterin提供的去中心化的平台,可以通过脚本语言创建开发应用。它的想法是从比特币获得的,并由新的叫Ether即以太坊币的加密数字币驱动。今天,以太币是继比特币之后的第二大加密数字货币。以太坊技术的核心是EVM(以太坊虚拟机),它可以被视为类似于Java虚拟机,而且用一种完全去中心化的节点网络。基于java世界实现以太坊交易我们使用web3j库。这是一个轻量级的、响应式、类型安全的java和Android库结合了以太坊区块链节点。更多的细节可以在这里找到web3j.io中文版。

1.本地运行

虽然有许多针对区块链文章,但以太坊相关的网络内容中不容易找到一个解决方案描述如何准备在本地机器使用实例运行以太坊。值得一提的是,一般有两种最基本的客户端可以使用:Geth和Parity。原来,我们可以很容易地在本地使用Docker容器运行节点。默认情况下,连接节点的以太坊主网络(公有链)。或者,你可以将它连接到测试网络或Rinkeby网络。但开始最好的选择就是运行在设置了开发参数(--dev)的开发模式下,并在Docker容器中运行命令。

下面的命令启动Docker容器开发模式在端口8545调用以太坊RPC API。

$ docker run -d --name ethereum -p 8545:8545 -p 30303:30303 ethereum/client-go --rpc --rpcaddr "0.0.0.0" --rpcapi="db,eth,net,web3,personal" --rpccorsdomain "*" --dev

在开发模式中运行该容器时,一个非常好的消息是,在默认的测试帐户上有大量的Ether。在这种情况下,你不必挖掘任何Ether,便能够开始测试。超级棒!现在,让我们创建一些其他的测试帐号,并做一些检查。为了实现这一点,我们需要在容器内部运行Geth的交互式JavaScript控制台。

$ docker exec -it ethereum geth attach ipc:/tmp/geth.ipc
2.以太坊节点使用JavaScript控制台管理

运行JavaScript控制台可以方便显示默认帐户(Coinbase),所有可用的账户及其余额清单。这里的屏幕显示我的以太坊结果。

现在,我们必须创建一些测试帐号。我们可以通过调用personal.newAccount(password)函数来实现这一点。在创建必需的帐户之后,我们可以使用JavaScript控制台执行一些测试交易,并将一些资金从基础帐户转移到新创建的帐户。下面是用于创建帐户和执行交易的命令。

3.系统体系结构

我们的demo系统的体系结构非常简单。不用想复杂的事情,只是告诉大家如何发送交易到geth节点和接收交易收据。而transaction-service发送新交易到以太坊节点,bonus-service节点监听传入的交易。然后每10笔交易发送者的帐户收到一次奖金(bonus)。这里的图表说明了一个我们的demo的系统架构。

4.spring boot应用程序使用web3j

我想现在我们清楚了我们到底想做什么。所以,让我们来进行实施。首先,我们应该包括所有必需的依赖项,以便能够在Spring boot应用程序中使用web3j库。幸运的是,有一个starter可以使用。


    org.web3j
    web3j-spring-boot-starter
    1.6.0

因为我们在Docker容器运行以太坊客户端需要改变客户端的自动默认配置的web3j的调用地址。

spring:
  application:
    name: transaction-service
server:
  port: ${PORT:8090}
web3j:
  client-address: http://192.168.99.100:8545
5.构建应用

如果我们将web3j starter包含到项目依赖项中,需要的是自动装载web3j bean。web3j负责向Geth客户端节点发送交易。它用交易哈希接收响应,不管是节点接受或由于错误被拒绝。在创建交易对象时,重要的是将gas限制最小值设置为21000。如果发送较低的值,则可能会收到错误信息:intrinsic gas too low。

@Service
public class BlockchainService {
 
    private static final Logger LOGGER = LoggerFactory.getLogger(BlockchainService.class);
 
    @Autowired
    Web3j web3j;
 
    public BlockchainTransaction process(BlockchainTransaction trx) throws IOException {
        EthAccounts accounts = web3j.ethAccounts().send();
        EthGetTransactionCount transactionCount = web3j.ethGetTransactionCount(accounts.getAccounts().get(trx.getFromId()), DefaultBlockParameterName.LATEST).send();
        Transaction transaction = Transaction.createEtherTransaction(accounts.getAccounts().get(trx.getFromId()), transactionCount.getTransactionCount(), BigInteger.valueOf(trx.getValue()), BigInteger.valueOf(21_000), accounts.getAccounts().get(trx.getToId()),BigInteger.valueOf(trx.getValue()));
        EthSendTransaction response = web3j.ethSendTransaction(transaction).send();
        if (response.getError() != null) {
            trx.setAccepted(false);
            return trx;
        }
        trx.setAccepted(true);
        String txHash = response.getTransactionHash();
        LOGGER.info("Tx hash: {}", txHash);
        trx.setId(txHash);
        EthGetTransactionReceipt receipt = web3j.ethGetTransactionReceipt(txHash).send();
        if (receipt.getTransactionReceipt().isPresent()) {
            LOGGER.info("Tx receipt: {}", receipt.getTransactionReceipt().get().getCumulativeGasUsed().intValue());
        }
        return trx;
    }
 
}

@Service从上面的代码看由控制器调用。POST方法的需要BlockchainTransaction对象作为参数。你可以发送发件人ID,接收人ID和交易金额。发送者和接收者ID是通过eth.account[index]可查询的。

@RestController
public class BlockchainController {
 
    @Autowired
    BlockchainService service;
 
    @PostMapping("/transaction")
    public BlockchainTransaction execute(@RequestBody BlockchainTransaction transaction) throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException, CipherException, IOException {
        return service.process(transaction);
    }
 
}

你可以用下面的命令调用POST方法发送测试交易。

在发送任何交易之前,你应该解锁发送人帐户。

$ curl --header "Content-Type: application/json" --request POST --data "{"fromId":2,"toId":1,"value":3}" http://localhost:8090/transaction

应用程序bonus-service监听由以太坊节点处理的交易。它通过调用web3j.transactionObservable().subscribe(...)方法从web3j库订阅通知消息。它将从该地址每10个交易返回后,发送一次到发送者的帐户。下面是bonus-service中可监听方法的实现。

@Autowired
Web3j web3j;
 
@PostConstruct
public void listen() {
    Subscription subscription = web3j.transactionObservable().subscribe(tx -> {
        LOGGER.info("New tx: id={}, block={}, from={}, to={}, value={}", tx.getHash(), tx.getBlockHash(), tx.getFrom(), tx.getTo(), tx.getValue().intValue());
        try {
            EthCoinbase coinbase = web3j.ethCoinbase().send();
            EthGetTransactionCount transactionCount = web3j.ethGetTransactionCount(tx.getFrom(), DefaultBlockParameterName.LATEST).send();
            LOGGER.info("Tx count: {}", transactionCount.getTransactionCount().intValue());
            if (transactionCount.getTransactionCount().intValue() % 10 == 0) {
                EthGetTransactionCount tc = web3j.ethGetTransactionCount(coinbase.getAddress(), DefaultBlockParameterName.LATEST).send();
                Transaction transaction = Transaction.createEtherTransaction(coinbase.getAddress(), tc.getTransactionCount(), tx.getValue(), BigInteger.valueOf(21_000), tx.getFrom(), tx.getValue());
                web3j.ethSendTransaction(transaction).send();
            }
        } catch (IOException e) {
            LOGGER.error("Error getting transactions", e);
        }
    });
    LOGGER.info("Subscribed");
总结

区块链和数字货币不是容易开始的话题。通过提供完整的脚本语言,以太坊简化了使用区块链进行应用程序开发的难度。使用web3j、spring boot和以太坊geth客户端的docker容器镜像,可以快速启动解决方案,实现区块链技术的本地开发。

如果你想进行本地开发时clone我的库,可以在github上下载源代码。

如果希望快速进行web3j、java、以太坊开发,那请看我们精心打造的教程:
web3j教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。

其他以太坊教程如下:

以太坊教程,主要介绍智能合约与dapp应用开发,适合入门。

以太坊开发,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。

python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。

php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和事件等内容。

C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和事件等。

这里是原文

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/24201.html

相关文章

  • java使用web3jspring boot构建以太区块dapp

    摘要:使用和以太坊客户端的容器镜像,可以快速启动解决方案,实现区块链技术的本地开发。以太坊,主要是针对工程师使用进行区块链以太坊开发的详解。以太坊,主要讲解如何使用开发基于的以太坊应用,包括账户管理状态与交易智能合约开发与交互过滤器和事件等。 区块链最近IT世界的流行语之一。这项有关数字加密货币的技术,并与比特币一起构成了这个热门的流行趋势。它是去中心化的,不可变的分块数据结构,这是可以安全...

    hidogs 评论0 收藏0
  • Java开发区块的三大sdk库

    摘要:是企业与区块链相遇的地方。的框架旨在成为开发区块链解决方案的支柱。以太坊,主要是针对工程师使用进行区块链以太坊开发的详解。 如果你想将区块链合并到一个Java项目中,现在我们来看看就是这个细分领域中三个最大的OSS玩家。 好的伙计们,我们都听说过比特币,以太坊或其他加密货币,其中有一些时髦的名字围绕着我们常见的新闻,但我们作为Java开发人员知道如何轻松地与这些区块链技术进行交互吗?以...

    iKcamp 评论0 收藏0
  • 2018以太智能合约编程语言solidity的最佳IDEs

    摘要:使用基于以太坊的智能合约的集成开发环境。以太坊教程,主要介绍智能合约与应用开发,适合入门。以太坊,主要是介绍使用进行智能合约开发交互,进行账号创建交易转账代币开发以及过滤器和事件等内容。 Solidity是一种以智能合约为导向的编程语言。这是一种只有四年的年轻语言,旨在帮助开发基于以太坊数字货币的智能合约。 理解它官方文档应该是学习Solidity的最佳来源:solidity.read...

    darkerXi 评论0 收藏0
  • 区块开发中使用的最流行的编程语言

    摘要:我们目前正处于一个新兴的区块链开发行业中。,一种在以太坊开发人员中流行的新的简单编程语言,因为它是用于开发以太坊智能合约的语言。它是全球至少万开发人员使用的世界上最流行的编程语言之一。以太坊,主要是针对工程师使用进行区块链以太坊开发的详解。 我们目前正处于一个新兴的区块链开发行业中。区块链技术处于初期阶段,然而这种颠覆性技术已经成功地风靡全球,并且最近经历了一场与众不同的繁荣。由于许多...

    2shou 评论0 收藏0

发表评论

0条评论

weapon

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<