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笔记系列文章

效果展示:


项目源代码:



版权声明:本文为jack00809原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。