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

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

这个命令将创建类文件org.web3j.example.generated.Greeter,它封装了所有智能合约的方法,以便可以从Java调用它们。

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public final class Greeter extends Contract {
private static final String BINARY =
"6060604052604051610269380380610269833981...";

private Greeter(
String contractAddress, Web3j web3j,
Credentials credentials,
BigInteger gasPrice, BigInteger gasLimit) {
super(
contractAddress, web3j, credentials,
gasPrice, gasLimit);
}

...

public Future<Utf8String> greet() {
Function function = new Function("greet",
Arrays.<Type>asList(),
Arrays.<TypeReference<?>>asList(
new TypeReference<Utf8String>() {}));

return executeCallSingleValueReturnAsync(
function);
}

public static Future<Greeter> deploy(
Web3j web3j, Credentials credentials,
BigInteger gasPrice, BigInteger gasLimit,
BigInteger initialValue,
Utf8String _greeting) {
String encodedConstructor =
FunctionEncoder.encodeConstructor(
Arrays.<Type>asList(_greeting));
return deployAsync(
Greeter.class, web3j, credentials,
gasPrice, gasLimit,
BINARY, encodedConstructor, initialValue);
}

public static Greeter load(
String contractAddress, Web3j web3j,
Credentials credentials,
BigInteger gasPrice, BigInteger gasLimit) {
return new Greeter(
contractAddress, web3j, credentials,
gasPrice, gasLimit);
}
}

现在我们可以部署和调用智能合约了:

1
2
3
4
5
6
7
8
9
10
11
Credentials credentials =
WalletUtils.loadCredentials(
"my password", "/path/to/walletfile");

Greeter contract = Greeter.deploy(
web3, credentials, BigInteger.ZERO,
new Utf8String("Hello blockchain world!"))
.get();

Utf8String greeting = contract.greet().get();
System.out.println(greeting.getTypeAsString());

运行此代码应产生以下输出:

1
Hello blockchain world!

现在让我们来看一个更复杂的智能合约:

Solidity类型的快速注释

solidity有几种不同的原生类型。虽然他们与Java中的一些类似,web3j要求你将本机Java类型转换为solidity类型。这是为了保证读写区块链数据的一致性。

同样值得注意的是,EVM在默认情况下使用无符号的256位整数,这就是为什么你会发现自己使用web3j使用BigInteger类型。

发布自己的虚拟货币

智能合同可以用来发出和管理token通证也叫代币,它代表了与一些真实资产或其自身虚拟货币挂钩的所有权比例。

例如,你可以拥有一个表示共享财产所有权的智能合约。在该财产中的投资者可以提供代表其财产所有权比例的令牌数量。

一个用于token的标准合约API已经被以太坊定义好了,它定义了与智能合约交互的下列方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// total supply of tokens
function totalSupply() constant
returns (uint256 totalSupply)
// tokens associated with address
function balanceOf(address _owner) constant
returns (uint256 balance)
// transfer tokens from sender account to address
function transfer(address _to, uint256 _value)
returns (bool success)
// approve spending for _spender of up to _value of
// your tokens
function approve(address _spender, uint256 _value)
returns (bool success)
// delegated transfer of tokens by approved spender
function transferFrom(address _from, address _to,
uint256 _value) returns (bool success)
// get the number of tokens the spender is still
// allowed to make
function allowance(address _owner, address _spender)
constant returns (uint256 remaining)

该智能合约还引入交易,在以太坊中使用交易来记录区块链上的智能合约执行过程中的特定细节。因为智能合约中的以太坊交易不能返回值,所以这些事件使你能够从发生的交易中查询信息。

1
2
3
4
5
6
7
// notification of a transfer of tokens
event Transfer(address indexed _from,
address indexed _to, uint256 _value)
// notification of an approval of delegated transfer
// of tokens
event Approval(address indexed _owner,
address indexed _spender, uint256 _value)

Consensys已经完全实现这个智能合约,可以下载并使用solidity编译器进行编译:

1
2
$ solc HumanStandardToken.sol --bin --abi \
--optimize -o build/

然后,你可以封装该智能合约如下所示(再次,为简洁起见,修改了完整路径):

1
2
3
4
$ ./web3j-1.0.7/bin/web3j solidity generate \
build/HumanStandardToken.bin \
build/HumanStandardToken.abi \
-p org.web3j.example.generated -o src/main/java/

现在你准备好使用一些你自己的token,并开始发布它们。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// deploy your smart contract
HumanStandardToken contract = HumanStandardToken
.deploy(
web3, credentials, BigInteger.ZERO,
new Uint256(BigInteger.valueOf(1000000)),
new Utf8String("web3j tokens"),
new Uint8(BigInteger.TEN),
new Utf8String("w3j$"))
.get();
// print the total supply issued
Uint256 totalSupply = contract.totalSupply().get();
System.out.println("Token supply issued: " +
totalSupply.getValue());
// check your token balance
Uint256 balance = contract.balanceOf(
new Address(credentials.getAddress()))
.get();
System.out.println("Your current balance is: w3j$" +
balance.getValue());
// transfer tokens to another address
TransactionReceipt transferReceipt =
contract.transfer(
new Address("0x<destination address"),
new Uint256(BigInteger.valueOf(100))).get();

你可以参考这篇文章附带的代码作为完整的例子。

结论

在这篇文章中,我已经刻划了与区块链工作的界面。还有些细节需要我去舍弃或忽略掉,但我希望这能让你对这个迷人的技术更加欣赏。

有关进一步的信息,你可以参考web3j源代码文档,它提供了更多关于以太坊和web3j的背景信息,而这可不是我可以放入一篇文章中的内容。

注:

Conor Svensson (@conors10),本文的作者是web3j作者,web3j是用于开发集成应用程序与以太坊区块链的Java库。

他之前是初创公司coHome和Huffle的联合创始人。他目前正在帮助Othera建立其区块链借贷交易平台。他在技术和金融方面发表了博客。当不在电脑屏幕前,Conor Svensson喜欢充分利用在澳大利亚悉尼马鲁布拉当地的海滩冲浪。

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

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

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

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

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

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