之前使用NodeJs與智能合約交互,都是訪(fǎng)問(wèn)的自己部署的合約乒融。最近要對(duì)線(xiàn)上第三方合約進(jìn)行轉(zhuǎn)賬操作掰盘,人數(shù)比較多,一筆筆操作起來(lái)手指都點(diǎn)斷了還容易出錯(cuò)赞季。既然代幣Token都遵守ERC20協(xié)議愧捕,肯定有統(tǒng)一的Transfer(轉(zhuǎn)賬)方法供客戶(hù)端調(diào)用,那么編寫(xiě)程序?qū)崿F(xiàn)自動(dòng)轉(zhuǎn)賬應(yīng)該可以實(shí)現(xiàn)申钩,去查了相關(guān)資料發(fā)現(xiàn)web3j是不錯(cuò)的選擇次绘。
1、web3j簡(jiǎn)介
輕量級(jí)客戶(hù)端與以太坊交互的Java庫(kù)撒遣。
2邮偎、交互方式
既然是調(diào)用第三方合約那么肯定需要知道合約地址,合約地址定義了到哪里去訪(fǎng)問(wèn)合約愉舔;
ABI(Application Binary Interface): 應(yīng)用程序二進(jìn)制接口钢猛,定義了智能合約提供的方法功能
3、步驟
- 智能合約的地址和ABI的獲取可以直接在 https://etherscan.io/ 查詢(xún)獲得轩缤。
image.png
image.png
image.png
若是無(wú)法獲取到ABI接口,也可以使用solc編譯生產(chǎn)bin和abi文件贩绕。
solcjs lookCoin.sol --bin --abi --optimize -o ./lookCoin
- 通過(guò)abi接口文件使用web3j命令行工具生成Java代理類(lèi)(下載地址 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
(生產(chǎn)代理類(lèi)時(shí)可以指定包路徑和類(lèi)名)
- 生產(chǎn)代理類(lèi)后可以直接使用Java代碼調(diào)用API來(lái)調(diào)用智能合約火的。
// 創(chuàng)建Web3J
Web3j web3 = Web3j.build(new HttpService("http://127.0.0.1:8545"));
// 加載錢(qián)包
Credentials credentials = WalletUtils.loadCredentials("錢(qián)包密碼", "錢(qián)包路徑");
// 加載合約
Key keySCode = Key.load(SMART_CONTRACT_ADDRESS, web3, credentials, BigInteger.valueOf(27000000000L), BigInteger.valueOf(250000));
// 調(diào)用轉(zhuǎn)賬方法
TransactionReceipt receipt = keySCode.transfer("目的賬戶(hù)", BigInteger.valueOf(1)).send();
// 打印交易Hash
System.out.println(receipt.getTransactionHash());
這樣一來(lái),便可以使用程序完成批量轉(zhuǎn)賬操作淑倾。
后來(lái)研究發(fā)現(xiàn)馏鹤,使用NodeJs直接調(diào)用Web3也可以實(shí)現(xiàn)對(duì)應(yīng)功能,不過(guò)還是對(duì)Java更熟悉一些娇哆,就采用了Java的方式湃累。