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

我们接着上一篇 web3j作者谈《区块链:java使用数字加密货币》(一)继续:

以太坊区块链上的交易

若要在以太坊区块链上创建新交易,通常需要执行三个操作之一:

  • 1.转账:从一个帐户转移ether到另一个帐户
  • 2.发布部署一个新的智能合约
  • 3.向修改状态的现有智能合约发出一个方法调用。

还有一个单独的只读方法调用来检查一个现有的智能合约,它不在区块链上创建一个交易。

这些交易交互需要通过JSON RPC到以太坊客户端进行多个底层调用。Web3J负责这种较低级别的功能。然而,所有的JSON-RPC调用都可供用户使用,以便实现他们自己的想法。

以太坊转账

首先,我将演示最基本的交易类型:将0.2个ether从一个帐户转账到另一个帐户。确保你知道先前创建的Eython钱包文件的地址,因为如果没有它,你将无法发送任何资金。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Web3j web3 = Web3j.build(new HttpService());
Credentials credentials =
WalletUtils.loadCredentials(
"my password", "/path/to/walletfile");
TransactionReceipt transactionReceipt =
Transfer.sendFundsAsync(
web3, credentials,
"0x...", BigDecimal.valueOf(0.2),
Convert.Unit.ETHER).get();
System.out.println(
"Funds transfer completed, transaction hash: " +
transactionReceipt.getTransactionHash() +
", block number: " +
transactionReceipt.getBlockNumber());

此代码产生以下输出(交易hash已被整理,以方便阅读)

1
2
3
Funds transfer completed, transaction hash:
0x16e41aa9d97d1c3374a...34,
block number: 1840479

交易和块hash是在以太坊区块链上的交易的标识。后台,实际交易的处理如下图所示:

  • 1.发送ether请求,并提交给web3j。
  • 2.交易消息被提交给以太坊客户端。
  • 3.客户端验证交易,然后:
    • a.将交易传播到其他以太网节点
    • b.得到提交的交易的哈希,将其发送给客户端并在HTTP响应中同步。
  • 4.该交易与其他新的交易相结合,以在以太坊网络上由矿工形成块。一旦形成一个有效的块,块及其相关交易的细节就在区块链上永久存在了。

你可以返回到Etherscan来查看交易的详细信息,如图所示:

显示了交易所在的区块链中块的内容:

gas

我早些时候在文章中提到了Ether,它用来支付EVM中代码的执行。准备支付的交易费用有两个参数需要在你指定,gas价格和gas上限额。gas价格是你准备支付ether的价格的一个单位。每个EVM操作码包含与之相关联的gas成本。gas限量是你愿意为交易执行支付的gas使用总量。这确保了所有的交易都有执行成本。与交易有关的气体的细节在交易收据和Ethscan中可查到。

以太坊HelloWorld

现在,我演示一个简单的交易,当我创建第一个智能合约时,事情开始变得有趣起来。以太坊智能合约通常是用一种名为solidity的语言编写的,它是一种静态类型的高级语言。描述如何使用solidity的文章很多,所以我要尽量保持这个例子简单。这样你可以在网上阅读更多关于solidity的文章。

现在让我们使用Greeter合约示例。Greeter合约是智能合约的“Hello World”示例。当我们部署合约时,将UTF-8编码的字符串传递给它的构造函数。当调用部署的合约时,该字符串的值由处理请求的以太坊网络节点返回。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
contract mortal {
/* Define variable owner of the type address*/
address owner;

/* this function is executed at initialization
and sets the owner of the contract */

function mortal() { owner = msg.sender; }
/* Function to recover the funds on the contract */

function kill() {
if (msg.sender == owner) suicide(owner);
}
}

contract greeter is mortal {
/* define variable greeting of the type string */
string greeting;

/* this runs when the contract is executed */
function greeter(string _greeting) public {
greeting = _greeting;
}

/* main function */
function greet() constant returns (string) {
return greeting;

}
}

虽然语言是陌生的,但是上面的例子是相当直观。mortal合约是基类, greeter合约是子类。

合约的创建者是实例变量的owneraddress类型;msg.sender是与该合约相关的任何交易的发送者;并且实例变量greeting是另一个实例变量。

有两种方法值得关注:

  • greeter(string _greeting)是构造函数。
  • greet()是一个返回greeter值的greeter方法。

合约的编译有两种选择:

一旦安装了编译器,现在就可以编译greeter合约:

1
$ solc Greeter.sol --bin --abi --optimize -o build/

此操作创建两个files;二进制文件(.bin),这是EVM可以解释智能合约的代码格式,以及应用程序二进制接口文件(.abi),它定义了智能合约中可用的公共方法。

web3j需要这两个文件来生成用于在Java中使用智能合约的智能合约封装包。

我使用web3J命令行工具生成greeter封装包,这次是使用Solidity命令(完整路径为了简洁而缩短了):

1
2
3
$ ./web3j-1.0.9/bin/web3j solidity generate \
build/greeter.bin build/greeter.abi \
-p org.web3j.javamag.generated -o src/main/java/

下一篇已经完成:

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

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

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

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

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

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

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