区块链最近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可以使用。
<dependency>
<groupId>org.web3j</groupId>
<artifactId>web3j-spring-boot-starter</artifactId>
<version>1.6.0</version>
</dependency>
因为我们在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以太坊教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
其他以太坊教程如下:
汇智网原创翻译,转载请标明出处。这里是原文
相关推荐
Spring Boot 是一个基于 Spring Framework 的快速开发工具,旨在简化 Spring 应用程序的初始设置和配置过程,...因此,Spring Boot 已成为现代 Java 应用开发的首选工具之一,尤其在微服务架构中,它的优势更加明显。
java 使用 Swagger 创建一个Spring Boot 的 Web 服务java 使用 Swagger 创建一个Spring Boot 的 Web 服务java 使用 Swagger 创建一个Spring Boot 的 Web 服务java 使用 Swagger 创建一个Spring Boot 的 Web 服务java...
Spring Boot是Java领域的一款热门应用开发框架,它简化了基于Spring的应用程序的初始设置和配置。这个名为"Spring Boot应用开发框架 v2.7.17.zip"的压缩包包含了该版本的源码和相关文档,是学习和开发基于Spring ...
《Spring Boot 2+Thymeleaf企业应用实战》是杨恩雄编著的一本面向Java Web开发的技术书籍,这本书籍主要介绍了Spring Boot框架及其与Thymeleaf模板引擎的结合使用。内容覆盖了从Spring Boot和Spring MVC基础,到...
5. **Web开发**:学习使用Spring Boot和Spring MVC进行Web应用开发,包括RESTful API设计、模板引擎(Thymeleaf、Freemarker)和WebSocket支持。 6. **数据访问**:掌握如何与各种数据库(如MySQL、PostgreSQL、...
Spring Boot 是一个由 Pivotal Team 开发的 Java 框架,旨在简化新 Spring 应用的初始搭建以及开发过程。它集成了大量常用的第三方库配置,如 JDBC、MongoDB、JPA、RabbitMQ、Quartz 等,大大减少了开发时的配置工作...
【标题】中的“基于 Spring Boot 构建的 Java ...综上所述,基于Spring Boot的Java Web平台为企业级应用开发提供了强大的工具集,能够帮助开发者快速构建稳定、安全、高效的应用程序,同时保持良好的可维护性和扩展性。
Spring Boot 是一款基于Spring框架的快速应用开发工具包,旨在简化新Spring应用程序的初始搭建以及开发过程。该框架利用一种初始约定优于配置的理念,简化了配置文件,插件依赖,项目布局等繁琐的流程。Spring Boot...
通过Spring的依赖注入将web3j集成到您的Spring Boot应用程序中。 入门 提供示例应用程序 要使用,请创建一个新的 ,并包括以下依赖项: Maven: < groupId>org.web3j < artifactId>web3j-spring-boot-starter ...
Spring Boot是Java EE开发领域的一股强大力量,它简化了传统的Java企业级应用的配置和启动过程,被誉为“颠覆者”。Spring Boot的核心理念在于“约定优于配置”,它旨在通过提供预配置的“起步依赖”(Starters)来...
在现代Web应用开发中,Vue.js和Spring Boot的结合已经成为了一种常见的前后端分离架构模式。这本《Vue Spring Boot前后端分离开发实战》的源码提供了深入学习和实践这一技术栈的机会。以下是对其中涉及知识点的详细...
Spring Boot是Spring生态系统中的一个核心组件,它通过自动化配置、起步依赖和内嵌式Web服务器等功能,极大地简化了Java应用的开发。 在Spring Boot 3.0版本中,我们可以期待一系列更新和改进,包括性能提升、新...
总结来说,"Spring Boot web 访问"涵盖了创建一个基础的Spring Boot Web应用,配置访问静态资源,使用Spring Boot DevTools进行快速开发,以及处理中文乱码问题。这些都是Spring Boot入门开发者需要掌握的基本技能,...
Spring Boot是Java领域的一款热门应用开发框架,它简化了基于Spring的应用程序开发流程,通过预配置的设置使得开发者能够快速构建可运行的应用程序。在"Spring Boot应用开发框架 v3.0.12.zip"中,包含了一份详细的...
以上就是使用Spring Boot 3构建Java Web应用程序的基础知识和主要步骤,开发者可以根据具体需求和场景选择合适的技术栈和最佳实践,构建高效、可扩展的应用程序。随着Spring Boot 3的发布,我们可以期待更多优化和新...
Spring Boot 2.5.0 简单学习pdf 资料 Spring Boot 是一个基于Java的开源框架,旨在简化Spring应用程序的搭建和...Spring Boot 2.5.0 提供了许多有用的特性和工具,能够帮助开发者快速搭建和开发 Java Web 应用程序。
Spring Boot是Java领域的一款热门应用开发框架,它简化了基于Spring的应用程序的初始设置和配置。版本v2.6.14是该框架的一个稳定版本,提供了诸多改进和新特性,旨在提高开发效率和应用程序的稳定性。在这个压缩包中...
4. Java语言作为Spring Boot应用开发的核心技术。 5. Spring框架的深入应用,如何在Spring Boot中集成和使用Spring的各个模块。 6. 根据书中明确指出的版权信息,书中内容在复制、存储和传输时需要遵守相关规定。 7....
使用微服务进行Web服务开发并与Spring Boot应用程序集成 无缝添加持久性和数据层,使您的Spring Boot Web应用程序做得更多 使用Spring Boot集成企业服务以创建更复杂的Java应用程序 本书适用于经验丰富的Java和...