Web3j实际上就是一个简单的封装好的JsonRpc的HttpClient。这是java版的,它的同族兄弟最著名的还是web3.js,是js版本的,都是用来访问以太坊节点的。
使用web3j第一步当然是引入依赖:
<dependency>
<groupId>org.web3j</groupId>
<artifactId>core</artifactId>
<version>4.5.5</version>
</dependency>
一个简单例子如下:
package com.alisita.eth;
import java.io.IOException;
import java.math.BigInteger;
import java.security.InvalidAlgorithmParameterException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.util.List;
import org.web3j.crypto.CipherException;
import org.web3j.crypto.ECKeyPair;
import org.web3j.crypto.Keys;
import org.web3j.crypto.Wallet;
import org.web3j.crypto.WalletFile;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.admin.Admin;
import org.web3j.protocol.admin.methods.response.NewAccountIdentifier;
import org.web3j.protocol.admin.methods.response.PersonalListAccounts;
import org.web3j.protocol.http.HttpService;
public class EthService {
public static Web3j initWeb3j() {
return Web3j.build(new HttpService());
}
public static Admin initAdmin() {
return Admin.build(new HttpService());
}
/**
* 查询所有的地址
* @return
* @throws IOException
*/
public static List<String> listAccounts() throws IOException {
PersonalListAccounts listAccounts = initAdmin().personalListAccounts().send();
return listAccounts.getResult();
}
/**
* 创建新地址
* @param ps
* @return 公钥地址
* @throws IOException
*/
public static String newAccount(String ps) throws IOException {
NewAccountIdentifier identifier = initAdmin().personalNewAccount(ps).send();
return identifier.getResult();
}
/**
* 创建新地址
* @param ps
* @return
* @throws IOException
* @throws CipherException
* @throws NoSuchProviderException
* @throws NoSuchAlgorithmException
* @throws InvalidAlgorithmParameterException
*/
public static void newAcc() throws IOException, CipherException, InvalidAlgorithmParameterException, NoSuchAlgorithmException, NoSuchProviderException {
ECKeyPair ecKeyPair = Keys.createEcKeyPair();
BigInteger privateKeyInDec = ecKeyPair.getPrivateKey();
String sPrivatekeyInHex = privateKeyInDec.toString(16);
WalletFile aWallet = Wallet.createLight("", ecKeyPair);
String sAddress = aWallet.getAddress();
System.out.println(sPrivatekeyInHex);
System.out.println(sAddress);
}
}
只是个别使用的示例,这个里面需要注意的地方不少,容我一一道来:
1.Web3j是基本工具对象,Admin继承自web3j,并且多了一些权限较大的方法。
2、Web3j的构造方法里的HttpService拥有一个url的构造,是区块节点的url,如果不填写就代表这localhost:8545,代表着本地区块节点,如果将来你要连接其他节点比如以太坊api什么的,就要换成它们的url
3.newAccount创建新用户方法和在geth命令行里创建的方式是一样的,该方法返回公钥,如果创建好,你会发现在节点keystore文件夹里出现了一个以公钥为结尾的keystore文件。
4.如果你要访问外网的节点api地方,它们可能就根本不给你创建keystore,这时候你就只能使用newAcc方法,只生成秘钥和公钥,不生成文件,这是最简单的,有的时候你可能需要修改下本方法,比如生成助记词什么的。