Web3j是什么
Web3j是什么,我们可以把它理解成是轻量级的Java库,实现了与以太坊节点通信。
对于Web3j的最大特性,我的理解是,将Solidity语言的智能合约翻译成Java版本的智能合约。
它的核心特性有:
- 以Java类型的JSON-RPC实现以太坊客户端的交互
- 支持所有JSON-RPC类型的方法
- 支持所有Geth和Parity方法来管理账户、签名、交易
- 发送客户端同步请求和异步请求
- 自动Solidity ABI文件生成Java智能合约包装
API常用命令
由于以太坊客户端Geth已经集成了Web3j API和Admin API,所以本文结合Geth命令详解,食用更佳。
- 进入Geth控制台
geth --datadir testNet --dev console 2>> test.log
- 输入eth,回车。
我们可以看到Web3j的一些函数方法。
accounts: ["0x4d373f26dddfe07f98460fffca508eaf3194abf4", "0xba0f181533b2f99258650a036d66718a7f3bde29"],
blockNumber: 3,
coinbase: "0x4d373f26dddfe07f98460fffca508eaf3194abf4",
compile: {
lll: function(),
serpent: function(),
solidity: function()
},
defaultAccount: undefined,
defaultBlock: "latest",
gasPrice: 1,
hashrate: 0,
mining: true,
pendingTransactions: [],
protocolVersion: "0x3f",
syncing: false,
call: function(),
contract: function(abi),
estimateGas: function(),
filter: function(options, callback, filterCreationErrorCallback),
getAccounts: function(callback),
getBalance: function(),
getBlock: function(),
getBlockNumber: function(callback),
getBlockTransactionCount: function(),
getBlockUncleCount: function(),
getCode: function(),
getCoinbase: function(callback),
getCompilers: function(),
getGasPrice: function(callback),
getHashrate: function(callback),
getMining: function(callback),
getPendingTransactions: function(callback),
getProtocolVersion: function(callback),
getRawTransaction: function(),
getRawTransactionFromBlock: function(),
getStorageAt: function(),
getSyncing: function(callback),
getTransaction: function(),
getTransactionCount: function(),
getTransactionFromBlock: function(),
getTransactionReceipt: function(),
getUncle: function(),
getWork: function(),
iban: function(iban),
icapNamereg: function(),
isSyncing: function(callback),
namereg: function(),
resend: function(),
sendIBANTransaction: function(),
sendRawTransaction: function(),
sendTransaction: function(),
sign: function(),
signTransaction: function(),
submitTransaction: function(),
submitWork: function()
}
如果想要了解更详细的函数参数,请参考官方API文档。
创建账号
> personal.newAccount("新建的账户密码")
> "0xba0f181533b2f99258650a036d66718a7f3bde29"
这时在对应的datadir的keystore文件夹下也会生成一个对应的keyfile文件,它的名称格式为UTC–时间–公钥地址如:
UTC--2018-05-08T03-40-45.305449600Z--4d373f26dddfe07f98460fffca508eaf3194abf4
一定记住输入的密码并且保存备份好keyfile文件,在发起交易时,必须同时拥有keyfile和密码。如果丢失了keyfile或者忘记了对应的密码,那么就意味着丢失了账户中所有的以太币。
注意,不像中心化的服务,忘记密码后可以通过联系客户等方式找回,我们需要自己对安全负责。
转账-发送以太币
> var sender = eth.accounts[0];
> var receiver = eth.accounts[1];
> var amount = web3.toWei(1, "ether")
> eth.sendTransaction({from:sender, to:receiver, value: amount})
也可以这样写:
eth.sendTransaction({from:"0x4d373f26dddfe07f98460fffca508eaf3194abf4",to: "0xba0f181533b2f99258650a036d66718a7f3bde29",value: web3.toWei(1,"ether")})
注意在花费以太币时,需要对账户进行解锁,解锁使用
personal.unlockAccount(account)
miner模块:开始和停止挖矿
> miner.start()
true
> miner.stop()
true
miner.start()可以带参数指明并行的挖矿线程数
挖矿的奖励会发送到收钱(coinbase)地址,默认是第一个账号,可以使用
> eth.coinbase
"0x81c9fdc9910740cdc0debf90ce52a087e3ce014e"
获取收钱(coinbase)地址。
用miner.setEtherbase(eth.accounts[1])
来设置收钱地址。
admin模块
admin主要提供节点的管理功能,这里列几个常用API, 完整文档请参考官方文档Admin API。
- 节点的信息:admin.nodeInfo
> admin.nodeInfo
{
enode: "enode://aec0b7d58c59e4f9c56ae75de43d4a80b223b78234818b16532f66902e91f0afd9c6382429baca5670d80eecfaa11eeee9931f5247896b1f952659963474946a@[::]:58383?discport=0",
id: "aec0b7d58c59e4f9c56ae75de43d4a80b223b78234818b16532f66902e91f0afd9c6382429baca5670d80eecfaa11eeee9931f5247896b1f952659963474946a",
ip: "::",
listenAddr: "[::]:58383",
name: "Geth/v1.8.7-stable-66432f38/windows-amd64/go1.10.1",
ports: {
discovery: 0,
listener: 58383
},
protocols: {
eth: {
config: {
byzantiumBlock: 0,
chainId: 1337,
clique: {...},
eip150Block: 0,
eip150Hash: "0x0000000000000000000000000000000000000000000000000000000000000000",
eip155Block: 0,
eip158Block: 0,
homesteadBlock: 0
},
difficulty: 1,
genesis: "0x270498b86be5bd46cd274e4eb2621a38e920bd32b3fe19041e1e176e4fef5e85",
head: "0x270498b86be5bd46cd274e4eb2621a38e920bd32b3fe19041e1e176e4fef5e85",
network: 1
},
shh: {
maxMessageSize: 1048576,
minimumPoW: 0.2,
version: "6.0"
}
}
}
返回的信息有:enode(节点的Url,在连接节点的时候使用), id, ip, 监听端口,使用的协议等
admin.addPeer(enodde)
连接网络上的节点admin.peers
> admin.peers
包含已连接节点信息的对象数组.admin.startRPC
> admin.startRPC("127.0.0.1", 8545)
true
启动一个基于HTTP JSON RPC API服务器, 对应的是stopRPC()
startRPC用一下方式启动控制台的效果是一样的。
geth --rpc --rpcaddr 127.0.0.1 --rpcport 8545