最近有点背...

Web3j API详解

Web3j是什么

Web3j是什么,我们可以把它理解成是轻量级的Java库,用于连接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的一些函数方法。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
      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文档

创建账号

1
2
> personal.newAccount("新建的账户密码")
> "0xba0f181533b2f99258650a036d66718a7f3bde29"

这时在对应的datadir的keystore文件夹下也会生成一个对应的keyfile文件,它的名称格式为UTC–时间–公钥地址如:
UTC--2018-05-08T03-40-45.305449600Z--4d373f26dddfe07f98460fffca508eaf3194abf4
一定记住输入的密码并且保存备份好keyfile文件,在发起交易时,必须同时拥有keyfile和密码。如果丢失了keyfile或者忘记了对应的密码,那么就意味着丢失了账户中所有的以太币。

注意,不像中心化的服务,忘记密码后可以通过联系客户等方式找回,我们需要自己对安全负责。

转账-发送以太币

1
2
3
4
> 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模块:开始和停止挖矿

1
2
3
4
> miner.start()
true
> miner.stop()
true

miner.start()可以带参数指明并行的挖矿线程数
挖矿的奖励会发送到收钱(coinbase)地址,默认是第一个账号,可以使用

1
2
> eth.coinbase
"0x81c9fdc9910740cdc0debf90ce52a087e3ce014e"

获取收钱(coinbase)地址。
miner.setEtherbase(eth.accounts[1])来设置收钱地址。

admin模块

admin主要提供节点的管理功能,这里列几个常用API, 完整文档请参考官方文档Admin API

  • 节点的信息:admin.nodeInfo
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    > 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

    1
    2
    > admin.startRPC("127.0.0.1", 8545)
    true

启动一个基于HTTP JSON RPC API服务器, 对应的是stopRPC()
startRPC用一下方式启动控制台的效果是一样的。

geth --rpc --rpcaddr 127.0.0.1 --rpcport 8545