web3j作者谈《区块链:java使用数字加密货币》(一)

我们来看看java以太坊开发类库web3j的作者Conor Svensson是怎么讲解《如何使用web3j将以太坊集成到java应用中》(本文的副标题)。在2017年的java杂志上他这么说:

几乎没有一天不会在技术或金融媒体上提及区块链。但是,到底为什么对这项技术大惊小怪,你怎么能从Java应用程序中处理它呢?首先讨论一个库web3j,这使得与以太坊交互成为可能,让我来解释一下区块链是什么以及它是如何工作的。

数字加密币的简史

区块链技术从加密货币比特币开始。比特币出现在2008,虽然不是首先提出的加密算法,但它是第一个完全去中心化的,既没有中央发行机构也没有交易验证。比特币维护一个包含所有比特币交易细节的分布式分类帐本。比特币所有权是从这些分类账条目中派生出来的,被称为比特币的区块链。使用简单脚本语言生成块链上的交易操作。

快进五年后到2013岁,当一个19岁的孩子名叫 Yitalik Buterin开始开发一个新的去中心化的平台,基于比特币的想法,提供了一个更强大的脚本语言来开发应用程序。什么平台?名为以太坊,提供了一个完整的图灵完备的语言。它最早是在2014年初提出的,在2015年7月推出。

从那时起,一些其他的区块链技术开始从不同的组织出现,然而,目前为止,以太坊是最成熟的(如果你可以称之为),这是本文(注2017)的基础。

当以太坊区块链被驱动建立时以太币是比特币之后的第二大数字加密货币,市值约为4亿美元,而比特币资本化后为10亿美元。

以太坊旨在服务于安全的后端,去中心化以太网,与点对点通信,你不再需要与单个实体或组织直接交互。web3j是一个轻量级的Java库用于以太坊,我会在本文中使用它。

什么是区块链

区块链可以被认为是一个去中心化的、不可篡改的数据结构,它通过状态转换来修改它的状态。状态在区块链上进行交易或操作不断迭代,其细节被写入区块链。这些交易被分组成块,这些块连接在一起,组成块链,非常类似于事件源中使用的事件日志。通过重放先前发生的状态转换来推导出当前状态。

区块链是分布式账本技术(DLT),是为了描述提供分散数据存储的区块链技术而出现的术语。并不是所有的DLT都在以太坊使用一个公共的区块链,有些则在进入交易的各方之间保持数据私有。

在以太坊中数据被写入,并且子状态转换在以太坊虚拟机(EVM)内发生,这类似于Java 虚拟机解释字节码格式来执行交易中的指令。但是以太坊虚拟机不同于JVM,它使用完全去中心化的节点网络。每一个节点在本地执行这些指令,验证区块链的本地版本与先前已写入区块链的那些版本相匹配。为了添加新的块(其中包含新交易),要取得成功,网络上的大多数节点关于新的状态应该是什么必须达成共识。创建这些新块的节点被称为矿工。

挖矿

当挖掘节点使用一种叫做工作量证明(POW)的共识机制时(顺便说一下,这是比特币使用的共识机制)。它依赖于原始的计算能力在区块链上创建新的块。块是通过尚未分配给区块链新的连续哈希交易来创建的。当发现交易的矿工们解决了预先定义的计算问题(称之为难度),找到解决方案的矿工通过新铸造货币获得网络奖励,然后将该块添加到区块链中。

智能合约

在EVM中执行的程序称为智能合约,智能合约是一个存在计算机中的电子化的合约。在以太坊中,智能合约是一个集合包括代码和数据。代码由函数构成,数据主要是状态它指向以太坊区块链中的相关地址。

从以太坊开始

要开始使用以太坊网络,需要访问一个以太坊客户端(也称为节点或对等体)。当以太坊客户端同步以太坊区块链时,它们提供与区块链交互的网关。

目前两个使用最广泛和最好用的以太坊客户端是gethParity

只需下载一个客户端,然后启动它:

1
2
3
$ geth --rpcapi personal,db,eth,net,web3 \
--rpc --testnet
$ parity --chain testnet

这样就会启动客户端,并且将开始同步testnet的以太坊区块链(数十亿字节大小)。以太坊网络的两个公共版本网络:主干网(公有链)和测试网(测试链)也被称为Ropsten,分别对应生产和测试环境。我们将在本文中使用TestNET。否则,将需要花费真正的钱。

你还需要web3j的最新可用版本命令行工具。这些工具为在以太坊工作提供了一些有用的实用命令。

要在公有链或测试链上进行交易处理,需要具备一些安全性保障。

交易处理依赖公钥加密,其中用户具有公钥私钥对。每个人使用私钥(只有他们自己知道)签署一个交易,它是与相关的公钥一起发布的。当其他的网络参与者使用公钥来验证交易是真实的时,需要进行交易签名。

幸运的是,对于以太坊和web3j的用户来说,公钥密码被抽象掉了,所以你只需要使用一个以太坊钱包,一个包含帐户凭据的数字文件,用于与以太坊进行交易。用户可以拥有任意数量的钱包文件,包含密码加密的私钥和从公钥导出的地址(注意,公钥和地址都可以从私钥中导出)。网络上的所有交易都与这样的地址相关联。

我们可以创建一个新的安全钱包文件,使用web3j命令行工具,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ ./web3j-1.0.7/bin/web3j wallet create
_ _____ _ _
| | |____ (_) (_)
__ _____| |__ / /_ _ ___
\ \ /\ / / _ \ '_ \ \ \ | | | / _ \
\ V V / __/ |_) |.___/ / | _ | || (_) |
\_/\_/ \___|_.__/ \____/| |(_)|_| \___/
_/ |
|__/
Please enter a wallet file password:
Please re-enter the password:
Please enter a destination directory location
[~/.ethereum/testnet-keystore]:
Wallet file <timestamp>--<UUID>.json created in:
~/.ethereum/testnet-keystore

确保你选择一个安全的密码,而且你不会忘记它。如果你忘记了密码,或者有人偷了你的钱包文件并计算出你的密码,你就没有办法再收回你的资金。

一旦你拥有一个钱包的地址,你可以前往etherscan查看当前余额细节,以及与此地址关联的所有交易。

在etherscan上显示钱包地址账户。

testnet已经被配置为允许更容易地挖掘以太币,因此你可以在挖掘模式中启动客户端,并且在几分钟内有足够的以太币开始在网络上创建自己的交易。

详情可去学习下运行挖矿用geth和Parity。

开始使用web3j

在运行以太坊客户端时,现在可以编写一些Java代码来使用web3j连接到它。注意,所有完整的代码可以在github上获得。

以太坊客户端在JSON-RPC上公开了几种方法,JSON-RPC是使用JSON的无状态远程过程调用(RPC)协议。web3j支持所有的JSON-RPC API

然而,后台有更多的管道。web3j负责提供JSON-RPC协议封装包。JSON-RPC API在HTTP和进程间通信(IPC)上可用,并且在Geth中有WebSocket实现。当然,最常见的实现采用了HTTP,在下面的例子中也用到它。

web3j版本发布给Maven Central和JFrog’s JCenter。写这篇文章的时候,当前的版本是4.3。不过,我建议你学习时仔细检查一下。

web3j 项目页面去下载使用最新版本。

将相关的依赖项添加到生成文件中:

1
2
3
4
5
6
7
8
9
Maven:
dependency>
<groupId>org.web3j</groupId>
<artifactId>core</artifactId>
<version>1.0.9</version>
</dependency>

Jradle:
compile ('org.web3j:core:1.0.9')

将下列代码放置在可运行类中,它将显示以太坊客户端的版本:

1
2
3
4
5
6
7
8
// defaults to http://localhost:8545/
Web3j web3 = Web3j.build(new HttpService());
Web3ClientVersion clientVersion =
web3.web3ClientVersion().sendAsync().get();
if (!clientVersion.hasError()) {
System.out.println("Client is running version: " +
clientVersion.getWeb3ClientVersion());
}

当你运行这个代码的时候,一切正常的情况下,你就可以看到你的以太坊客户端的版本信息了:

1
2
Client is running version: 
Geth/v1.5.4-stable-b70acf3c/darwin/go1.7.3

web3j中的所有JSON-RPC方法实现使用以下结构,其中web3是管理请求的实例化web3j实现:

1
2
web3.<method name>([param1, ..., paramN])
.[send()|sendAsync()]

当方法名称和参数根据JSON-RPC规范时,请求的传输可以同步地或异步地通过send()sendAsync()方法完成。

现在已经验证了区块链客户端的连接,我们已经准备好开始使用以太坊区块链了。

文章篇幅太长,我们下一篇接着来……

=====================================================

web3j的内容我们已经做好了一个教程:

web3j教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。

如果需要加快进入java开发以太坊进程,可以选择学习。另外一些以太坊课程:

  • 以太坊教程,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊开发,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
  • php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和事件等内容。

汇智网原创翻译,转载请标明出处。这里是原文