Web3j讓Java開發者可以輕松地訪問以太坊區塊鏈並調用區塊鏈上的智能合約的方法,本教程中,將介紹如何創建一個簡單的命令行應用來訪問區塊鏈上的合約。
1、什么是web3j
現在的Web3j是一個開發包,你可以利用這個開發包快速實現對以太坊/Quorum節點的訪問,同時也可以用它為某個智能合約文件生成對應的java封裝類,以便在Java應用中調用。
2、節點安裝與智能合約部署
首先我們需要搭建一個以太坊網絡並部署智能合約,你可以參考這個repo,按照README說明搭建並部署智能合約。
要調用以太坊鏈上的合約,我們需要兩個東西:
- 錢包私鑰
- 合約地址
在區塊鏈領域,賬號通常稱為錢包,不過這是一個比較混亂的詞語,有時錢包指的是單一地址,有時又指的是包含多個地址的容器。在本文中,一個錢包指的是單一的以太坊地址,
ganache在啟動時會列出10個錢包地址以及其對應的私鑰。例如:
(0) 11af9e9f87c53beedfe7eb3f1e9b6e2592b382ab3ecd83a92a6c20cb0c885f63 (1) 7cb8f9f70eac9aca70b514a9a8ebd36a3c2c4a9d28dc9534d6042914ed814161 (…)
在這個教程中,我們將使用0#地址,即:
11af9e9f87c53beedfe7eb3f1e9b6e2592b382ab3ecd83a92a6c20cb0c885f63
部署好的合約也類似:
2_deploy_contracts.js ===================== Deploying ‘SimpleStorage’ ————————- > transaction hash: 0x18f4dffba426a2cd63bddf5b8741f0708729515d178d59df0b2a43c5aa85e646 > Blocks: 0 Seconds: 0 > contract address: 0x3C4c39bd5a928bc19A981c85A00543EEB9f7C795 > account: 0x169C8C361e1CC394C3FFefa52FcaB91704cde2b2 > balance: 99.99147618 (…)
在上面的輸出中,注意contract address
部分,表示合約的部署地址,即:
contract-address: 0x3C4c39bd5a928bc19A981c85A00543EEB9f7C795
3、智能合約相關工具安裝
我們首先需要安裝solidity智能合約編譯器:
$ npm install -g solc
然后從這里下載web3j命令行工具,解壓並設置PATH環境變量,以便可以在任何目錄調用。
4、合約的java封裝類
首先編譯合約並生成java封裝類:
$ solc <smart-contract>.sol –bin –abi –optimize -o <output-dir>/ $ web3j solidity generate -b /path/to/<smart-contract>.bin \ -a /path/to/<smart-contract>.abi \ -o /path/to/src/main/java \ -p com.your.organisation.name
5、在Java代碼中調用合約
現在我們可以調用合約了:
public class App { // change contract-address private static String contractAddress = contract-address; // main method public static void main(String[] args) { // instantiate web3j Web3j web3 = Web3j.build(new HttpService("http://localhost:9545/")); Credentials credentials = Credentials.create(wallet-address); // instantiate the contract SimpleStorage contract = SimpleStorage.load( contractAddress, web3, credentials, new DefaultGasProvider() ); // say hello System.out.println("Welcome " + credentials.getAddress()); // interact with the contract try { BigInteger currentValue; // get value currentValue = contract.get().send(); System.out.println(currentValue.toString()); // change value contract.set(new BigInteger("1")).send(); // get value currentValue = contract.get().send(); System.out.println(currentValue.toString()); } catch (Exception e) { e.printStackTrace(); } } }
上面的代碼首先用節點URL來初始化Web3j實例,然后使用錢包地址私鑰創建一個賬戶身份憑證對象,並使用合約地址初始化合約,最后調用合約的方法。