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