Web3j API详解

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

猜你喜欢

转载自blog.csdn.net/qq_33764491/article/details/80239495