Android Web3j连接Geth私有链

作者: 唠嗑008 | 来源:发表于2018-10-08 19:11 被阅读18次

    研究区块链技术和通证经济有大半年了,但是直到最近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私有链

        本文链接:https://www.haomeiwen.com/subject/syujaftx.html