Android Web3j连接Geth私有链

研究区块链技术和通证经济有大半年了,但是直到最近2周才开始写代码,主要研究了ETH开发,后面打算研究一下EOS。今天主要说一下Android Web3j连接Geth私有链,然后发送一笔交易或者获取一些信息这样的功能。

Geth创建与设置

1、创建ETH初始区块文件 genesis.json

{
  "config": {
        "chainId": 100, 
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
  "alloc"      : {},
  "coinbase"   : "0x0000000000000000000000000000000000000000",
  "difficulty" : "0x200",
  "extraData"  : "",
  "gasLimit"   : "0xffffff",
  "nonce"      : "0x0000000000000042",
  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp"  : "0x00"
}

2、初始化区块节点

首先进入genesis.json文件所在的路径,然后初始化

//进入初始化文件所在目录
cd privatechain
//初始化操作
geth --datadir  blockdata  init  genesis.json

blockdata是创建的文件名,是用来存储节点数据的

3、启动geth客户端节点

geth --identity "TestNode1" --datadir "blockdata" --rpc --rpcapi "db,eth,net,web3" --rpcaddr "0.0.0.0" --rpcport "8545" --networkid "100" console

使用命令 geth -h 可以查看geth 相关的帮助文档。
--Identity : 节点身份标识,起个名字

--datadir : 指定节点存在位置,“blockdata”

--rpc : 启用http-rpc服务器

--rpcapi : 基于http-rpc提供的api接口。eth,net,web3,db...

--rpcaddr : http-rpc服务器接口地址:默认“127.0.0.1”,

--rpcport : http-rpc 端口(多节点时,不要重复),默认为8545,当然你可以设置成其他任意值

--port : 节点端口号(多节点时,不要重复)

--networkid : 网络标识符 随便指定一个id(确保多节点是统一网络,保持一致)

注意:

  • 连接geth,如果你的geth是在服务器上的话,就能通过客户端直接访问的,但是如果你的geth在本地的话,那就只能通过局域网来访问了,也就是说你电脑的IP(注意手机和电脑需要保持一致)+设置的端口号(--rpcport "8545",默认的就是8545)

  • 如果android客户端访问本地geth,需要设置成--rpcaddr "0.0.0.0"或者--rpcaddr "本地IP"

Android客户端访问

导入web3j相关依赖

implementation 'org.web3j:core:3.3.1'
implementation 'org.web3j:core:3.3.1-android'

获取geth版本号

//获得Web3j对象,URL为geth私链的地址
//你需要换成你的地址,如果是本地的话是局域网IP+设置的端口号,默认是8545
 Web3j web3j = Web3j.build(new HttpService("http://192.168.2.181:8545"));

/**
     * 获取版本等信息
     * @param web3j
     */
    public static void getInfo(Web3j web3j){
        Web3ClientVersion web3ClientVersion = null;
        try {
            web3ClientVersion = web3j.web3ClientVersion().sendAsync().get();
            String clientVersion = web3ClientVersion.getWeb3ClientVersion();
            Log.i(TAG, "sendRawTransaction: clientVersion " + clientVersion);
        } catch (InterruptedException e) {
            e.printStackTrace();
            Log.i(TAG, "sendRawTransaction: "+e.getMessage());
        } catch (ExecutionException e) {
            e.printStackTrace();
            Log.i(TAG, "sendRawTransaction: "+e.getMessage());
        }
    }

发送一笔交易

1、生成交易签名信息
2、发送交易

/**
     * 发起一笔交易
     *
     * @param web3j
     * @param signedTransactionData 交易签名信息
     */
    public static void sendRawTransaction(Web3j web3j, String signedTransactionData) {
        EthSendTransaction ethSendTransaction = null;
        try {
            ethSendTransaction = web3j.ethSendRawTransaction(signedTransactionData).send();
            String transactionHash = ethSendTransaction.getTransactionHash();
            String rawResponse = ethSendTransaction.getRawResponse();
            Log.i(TAG, "sendRawTransaction transactionHash : " + transactionHash);
            Log.i(TAG, "sendRawTransaction rawResponse : " + rawResponse);
        } catch (IOException e) {
            e.printStackTrace();
            Log.i(TAG, "sendRawTransaction: " + e.getMessage());
        }
    }

参考文章:
Android客户端连接以太坊私链时发生遇到的问题
以太坊 私有链搭建 Geth+Mist钱包

你可能感兴趣的:(Android Web3j连接Geth私有链)