之前使用NodeJs与智能合约交互,都是访问的自己部署的合约。最近要对线上第三方合约进行转账操作,人数比较多,一笔笔操作起来手指都点断了还容易出错。既然代币Token都遵守ERC20协议,肯定有统一的Transfer(转账)方法供客户端调用,那么编写程序实现自动转账应该可以实现,去查了相关资料发现web3j是不错的选择。
1、web3j简介
轻量级客户端与以太坊交互的Java库。
2、交互方式
既然是调用第三方合约那么肯定需要知道合约地址,合约地址定义了到哪里去访问合约;
ABI(Application Binary Interface): 应用程序二进制接口,定义了智能合约提供的方法功能
3、步骤
- 智能合约的地址和ABI的获取可以直接在 https://etherscan.io/ 查询获得。
若是无法获取到ABI接口,也可以使用solc编译生产bin和abi文件。
solcjs lookCoin.sol --bin --abi --optimize -o ./lookCoin
- 通过abi接口文件使用web3j命令行工具生成Java代理类(下载地址 https://github.com/web3j/web3j/releases/tag/v3.2.0)
web3j solidity generate --javaTypes key.bin key.abi -o KeySmartCode.java -p com.joshua.eth
(生产代理类时可以指定包路径和类名)
- 生产代理类后可以直接使用Java代码调用API来调用智能合约。
// 创建Web3J
Web3j web3 = Web3j.build(new HttpService("http://127.0.0.1:8545"));
// 加载钱包
Credentials credentials = WalletUtils.loadCredentials("钱包密码", "钱包路径");
// 加载合约
Key keySCode = Key.load(SMART_CONTRACT_ADDRESS, web3, credentials, BigInteger.valueOf(27000000000L), BigInteger.valueOf(250000));
// 调用转账方法
TransactionReceipt receipt = keySCode.transfer("目的账户", BigInteger.valueOf(1)).send();
// 打印交易Hash
System.out.println(receipt.getTransactionHash());
这样一来,便可以使用程序完成批量转账操作。
后来研究发现,使用NodeJs直接调用Web3也可以实现对应功能,不过还是对Java更熟悉一些,就采用了Java的方式。