Android使用Infura、Web3j、Http等方式接入以太坊區塊鏈

Android使用Infura、Web3j、Http等方式接入以太坊區塊鏈

接入以太坊區塊鏈的方式

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的整合

最新的整合方式可以參考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();//返回當前節點持有的賬戶列表

這樣簡單的接入就完成了。

JSON-RPC API 的接入方式

因為Ethereum(以太坊)提供了JSON-RPC API 可以訪問。

JSON-RPC support

cpp-ethereumgo-ethereumpy-ethereumparity
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>() {
           @Override
           public void onSuccess(String result) {
               Log.e("wlj", "result"   result);
           }
​
           @Override
           public void onError(Throwable ex, boolean isOnCallback) {
               Log.e("wlj", ex.toString());
           }
​
           @Override
           public void onCancelled(CancelledException cex) {
​
           }
​
           @Override
           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() {
           @Override
           public void run() {
JSONRPCHttpClient client = new JSONRPCHttpClient(url);
String clientVersion = client.callString("web3_clientVersion", map);
           }
}).start();

這兩種傳參方式繁瑣複雜,沒有web3j封裝的好,但是好在靈活自由。

轉載自Android筆記系列文章

效果展示:

專案原始碼:
區塊鏈瀏覽器原始碼