Android使用Infura、Web3j、Http等方式接入以太坊區塊鏈
阿新 • • 發佈:2019-01-07
接入以太坊區塊鏈的方式
1、自己搭建節點,終端去訪問搭建好的節點獲取資料
2、使用免費的Infura,省去建立節點的煩惱
Infura
Infura 提供免費公開的Ethereum(以太坊)主網和測試網路節點;申請只要輸入一點基本資料和Email就可以在你輸入的Email郵箱裡收到Infura發給你的郵件,郵件內容主要是你可以使用的主網節點及測試網路節點的地址。
ps:Infura 需要FQ才能註冊過去,有個驗證碼需要你FQ才能顯示出來,可以用免費的藍燈。
郵件內容截圖如下
web3j 接入方式
1、 web3j介紹
web3j是一個輕量級,Reactive(響應式),型別安全的Java庫,用於與Ethereum網路上的客戶端(節點)集 成,這允許您使用Ethereum塊鏈,而不需要為平臺編寫自己的整合程式碼的額外開銷。
2、 web3j的提供的功能
- 通過HTTP和IPC 完成Ethereum的JSON-RPC客戶端API的實現
- Ethereum錢包支援
- 使用過濾器的函數語言程式設計功能的API
- 自動生成Java智慧合約包裝器,以建立、部署、處理和呼叫來自本地Java程式碼的智慧合約
- 支援Parity的 個人和Geth的 個人客戶端API
- 支援Infura,所以您不必自己執行一個Ethereum客戶端
- 一套綜合化、一體的測試示範和可執行的腳步
- 支援命令列工具
- 相容Android
- 支援JP Morgan’s Quorum via web3j-quorum
3、 web3j的整合
implementation 'org.web3j:core:3.3.1'//切記需要java8 implementation 'org.web3j:core:3.3.1-android'
4、web3j的使用
web3j的api說明文件挺簡陋的,看著頭暈,建議配合web3的文件對照著看,應該會提高效率;
另外我還找到了他人翻譯的web3的中文文件,當做參考。
//獲取節點執行geth客戶端的版本號 String url = "https://mainnet.infura.io/your api-key"; Web3j web3 = Web3j.build(new HttpService(url)); Web3ClientVersion web3ClientVersion = web3.web3ClientVersion().sendAsync().get(); String clientVersion = web3ClientVersion.getWeb3ClientVersion(); //只讀屬性,返回當前節點持有的帳戶列表 這個方法說明就是我從web3的中文文件裡找到的 String url = "https://mainnet.infura.io/your api-key"; Web3j web3 = Web3j.build(new HttpService(url)); //點進ethAccounts()方法的原始碼就可以知道返回的是什麼物件了 EthAccounts ethAccounts = web3.ethAccounts().sendAsync().get(); List<String> accountList = ethAccounts.getAccounts();//返回當前節點持有的賬戶列表
這樣簡單的接入就完成了。
因為Ethereum(以太坊)提供了 可以訪問。
JSON-RPC support
cpp-ethereum | go-ethereum | py-ethereum | parity | |
---|---|---|---|---|
JSON-RPC 1.0 | ✓ | |||
JSON-RPC 2.0 | ✓ | ✓ | ✓ | ✓ |
Batch requests | ✓ | ✓ | ✓ | ✓ |
HTTP | ✓ | ✓ | ✓ | ✓ |
IPC | ✓ | ✓ | ✓ | |
WS |
1、Http
Http是以太坊各種客戶端都支援的方式之一,也是終端開發最熟悉的。
//查閱API 發現需要POST的形式 引數以json的形式 請求 //這裡我測試使用的是xutils3 以請求版本號為例 String json = "{\"jsonrpc\":\"2.0\",\"method\":\"web3_clientVersion\",\"params\":[],\"id\":67}"; RequestParams params = new RequestParams("https://mainnet.infura.io/your api-key"); params.setAsJsonContent(true); params.setBodyContent(json); x.http().post(params, new Callback.CommonCallback<String>() { public void onSuccess(String result) { Log.e("wlj", "result" + result); } public void onError(Throwable ex, boolean isOnCallback) { Log.e("wlj", ex.toString()); } public void onCancelled(CancelledException cex) { } public void onFinished() { } });
2、JSONRPC 2.0的方式
下載 jar包 ,匯入AndroidStudio的libs下,引入依賴。
// 獲取節點執行geth客戶端的版本號 final String url = "https://mainnet.infura.io/your api-key"; //對著 JSON-RPC API 的引數說明拼接引數 final Map<String, Object> map = new HashMap(); List paramsList = new ArrayList(); map.put("json-rpc", "2.0"); map.put("method", "web3_clientVersion"); map.put("params", paramsList); map.put("id", "67"); //需要非同步處理 當然你可以配合handler來更新頁面 new Thread(new Runnable() { public void run() { JSONRPCHttpClient client = new JSONRPCHttpClient(url); String clientVersion = client.callString("web3_clientVersion", map); } }).start();
這兩種傳參方式繁瑣複雜,沒有web3j封裝的好,但是好在靈活自由。