geth控制台console方法 web3.js

web3.js有0.2版本和1.0版本的区别,本文列出的是web3.js 1.0版本提供的api。

首先,需要注意web3.js的如下几个注意事项:

1、使用callbacks

web3.js的API使用的是异步http请求,如果需要同步,则需要使用回调函数:

web3.eth.getBlock(48, function(error, result){
    if(!error)
        console.log(result)
    else
        console.error(error);
})

2、Batch requests

Batch允许批量请求,然后一次性执行:

new web3.BatchRequest()
new web3.eth.BatchRequest()
new web3.shh.BatchRequest()
new web3.bzz.BatchRequest()

var batch = new web3.BatchRequest();
batch.add(web3.eth.getBalance.request('0x0000000000000000000000000000000000000000', 'latest', callback));
batch.add(web3.eth.contract(abi).at(address).balance.request(address, callback2));
batch.execute();

3、Big numbers in web3.js

我们在智能合约中通常需要用到BigNumber对象来存储balance,但是 JavaScript中没有这样的数据类型。

"101010100324325345346456456456456456456"
// "101010100324325345346456456456456456456"
101010100324325345346456456456456456456
// 1.0101010032432535e+38

web3.js中自动添加了BigNumber库:

var balance = new BigNumber('131242344353464564564574574567456');
// or var balance = web3.eth.getBalance(someAddress);

balance.plus(21).toString(10); // toString(10) converts it to a number string
// "131242344353464564564574574567477"

1、web3对象

var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545", 0, BasicAuthUsername, BasicAuthPassword));
//Note: HttpProvider takes 4 arguments (host, timeout, user, password)

2、web3 API

web3.version // 返回thereum的api版本  
web3.modules // 返回client版本信息 或 web3.version.getNode(callback(err,res))
web3.setProvider(provider) // 设置provider(new Web3.providers.HttpProvider("http://localhost:8545"))
web3.providers // 返回当前有效的通信服务提供器
web3.givenProvider // 在以太坊兼容的浏览器中使用web3时,将返回浏览器设置的原生服务提供器,否则返回null
web3.currentProvider // 用来检测是否已经设定了provider
web3.BatchRequest //用来创建并执行批请求
web3.extend(methods) // 继承扩展web3的模块类

3、网络交互:web3.*.net

// web3-net包用来支持和以太坊节点旳网络属性的交互
var Net = require('web3-net');
var net = new Net(Net.givenProvider || 'ws://some.local-or-remote.node:8546');

web3.eth.net.getId([callback]) // 返回当前连接网络的ID,返回promise
web3.eth.net.isListening([callback]) // 返回当前所连接节点旳网络监听状态,返回promise
web3.eth.net.getPeerCount([callback]) // 返回当前节点上已经连接的其他节点数量,返回promise

4、Swarm交互:web3.bzz

// 使用web3-bzz包来和去中心化文件存储系统Swarm交互
var Bzz = require('web3-bzz');
var bzz = new Bzz(Bzz.givenProvider || 'http://swarm-gateways.net');

web3.bzz.upload(mixed) // 上传到Swarm
web3.bzz.download(mixed) // 从Swarm下载
web3.bzz.pick(mixed) // 打开文件选择器 

5、whisper协议交互:web3.shh

var Shh = require('web3-shh');
var shh = new Shh(Shh.givenProvider || 'ws://some.local-or-remote.node:8546');

web3.shh.getVersion // 返回whisper协议版本
web3.shh.getInfo // 返回whisper节点信息
web3.shh.setMaxMessageSize // 设置whisper消息大小上限
web3.shh.setMinPoW // 设置节点最小PoW
web3.shh.markTrustedPeer // 标记可信节点
web3.shh.newKeyPair // 创建密钥对
web3.shh.addPrivateKey // 使用私钥创建密钥对
web3.shh.deleteKeyPair // 删除指定密钥对
web3.shh.hasKeyPair // 检查节点是否有指定密钥对
web3.shh.getPublicKey // 返回公钥
web3.shh.getPrivateKey // 返回私钥
web3.shh.newSymKey // 创建对称密钥
web3.shh.addSymKey // 添加对称密钥
web3.shh.generateSymKeyFromPassword // 使用指定密码生成对称密钥
web3.shh.hasSymKey // 检查是否有指定对称密钥
web3.shh.getSymKey // 返回对称密钥
web3.shh.post // 发送whisper消息
web3.shh.subscribe // 订阅whisper消息
web3.shh.clearSubscriptions // 清理订阅
web3.shh.newMessageFilter // 创建消息过滤器
web3.shh.deleteMessageFilter // 删除消息过滤器
web3.shh.getFilterMessages // 读取新消息

6、web3.eth

/***账户和节点信息***/
web3.eth.defaultAccount // 设置或获取默认账户
web3.eth.defaultBlock // 设置默认区块,默认值是latest
web3.eth.isSyncing(callback) // 检测节点是否在同步 
web3.eth.getCoinbase // 返回coinbase
web3.eth.getGasPrice // 返回当前gas price
web3.eth.getAccounts // 返回节点所拥有的所有账户
web3.eth.getBlockNumber // 返回当前区块数目
web3.eth.getBalance(address) // 获得指定账户的balance
web3.eth.getStorageAt(address, position) // 返回一个以太坊地址的指定位置存储内容
web3.eth.getCode(address) // 返回指定以太坊地址处的代码

/***挖矿信息***/
web3.eth.isMining // 返回节点的mining状态,true or false
web3.eth.getHashrate // 返回miner每秒产生的hash数
web3.eth.getWork() // 方法返回矿工的工作内容,包括当前块的哈希值、种子哈希值和要满足的边界条件
web3.eth.submitWork() // 方法用来提交工作量证明(POW)解决方案

/***区块相关信息***/
web3.eth.getBlock(hash/number) // 返回指定块编号或块哈希对应的块
web3.eth.getBlockTransactionCount(hash/number) // 返回指定块编号或块哈希对应的块
web3.eth.getUncle(hash/number) // 返回指定索引位置的叔伯块

/***交易相关***/
web3.eth.getTransaction(hash) // 返回具有指定哈希值的交易对象
web3.eth.getTransactionFromBlock(hashOrNumber, indexNumber) // 返回指定块中特定索引号的交易对象
web3.eth.getTransactionReceipt(hash) // 返回指定交易的收据对象,如果交易处于pending状态,则返回null
web3.eth.getTransactionCount(address) // 返回指定地址发出的交易数量
web3.eth.sendTransaction(object) // 向以太坊网络提交一个交易
web3.eth.sendSignedTransaction(signedTransactionData) // 发送已经签名的交易
web3.eth.sign // 使用指定的账户对数据进行签名,该账户必须先解锁
web3.eth.signTransaction // 对交易进行签名,用来签名的账户地址需要首先解锁

/***消息调用信息***/
web3.eth.call(object) // 执行一个消息调用交易,消息调用交易直接在节点旳VM中执行而不用通过区块链的挖矿来执行
web3.eth.estimateGas(object) // 通过执行一个消息调用来估算交易的gas用量
web3.eth.getPastLogs() // 方法根据指定的选项返回历史日志

/***编译器相关***/
web3.eth.getCompilers() // 方法返回可用编译器的列表
web3.eth.compile.solidity() // 方法用来编译使用solidity语言编写的合约源代码
web3.eth.compile.lll() // 方法用来编译使用LLL语言编写的合约源代码
web3.eth.compile.serpent() // 方法用来编译使用serpent语言编写的合约源代码

/***订阅事件***/
web3.eth.subscribe() // 方法来订阅区块链上的指定事件
web3.eth.clearSubscriptions() // 方法用来复位订阅状态
web3.eth.subscribe('pendingTransactions' [, callback]) // 表示订阅处于pending状态的交易
web3.eth.subscribe('newBlockHeaders' [, callback]) // 参数订阅新的区块头生成事件。可用做检查区块链上变化的计时器文本
web3.eth.subscribe('syncing' [, callback]) // 使用syncing参数订阅同步事件
web3.eth.subscribe('logs', options [, callback]) // 使用logs参数订阅日志,并且可以指定条件进行过滤

7、智能合约:web3.eth.Contract

// web3.eth.Contract类简化了与以太坊区块链上智能合约的交互
// 创建合约对象时,只需指定相应智能合约的json接口,web3就可以自动地将所有的调用转换为底层基于RPC的ABI调用
web3.eth.Contract - 合约构造函数
var myContract = new web3.eth.Contract(jsonInterface[, address][, options])
/*
options - 合约配置对象
    address - 合约的部署地址
    jsonInterface - 合约的json接口
    data - 合约的字节码,合约部署时会用到
    from - 合约发送方账户地址
    gasPrice - 用于交易的gas价格,单位:wei
    gas - 交易的gas用量上限,即gas limit
    
    myContract.options.address - 合约地址
    myContract.options.jsonInterface - 合约JSON接口
*/
myContract.clone() - 克隆合约
myContract.deploy - 部署合约

myContract.methods.myMethod([param]) //为指定的合约方法创建一个交易对象,以便使用该交易对象进行调用、发送或估算gas
myContract.methods.myMethod([param]).call // 调用合约的只读方法,并在EVM中直接执行方法,不需要发送任何交易,不改变合约状态
myContract.methods.myMethod([param]).send // 向合约发送交易来执行指定方法,将改变合约的状态。
myContract.methods.myMethod([param]).estimateGas() // 通过在EVM中执行方法来估算链上执行是需要的gas用量。
myContract.methods.myMethod([param]).encodeABI // 为指定的合约方法进行ABI编码,可用于发送交易、调用方法或向另一个合约方法传递参数

myContract.once(event, callback)// 单次订阅合约事件
myContract.events() // 订阅合约事件
myContract.events.allEvents() // 订阅全部事件
myContract.getPastEvents(event) // 读取历史事件

8、账户管理:web3.eth.accounts

var Accounts = require('web3-eth-accounts')

web3.eth.accounts.create() // 创建账户
web3.eth.accounts.privateKeyToAccount(privateKey) // 使用指定私钥创建账户
web3.eth.accounts.recoverTransaction(rawTransaction) // 从给定的RLP编码的交易中提取签名地址
web3.eth.accounts.hashMessage(message) // 计算消息的哈希
web3.eth.accounts.sign(data, privateKey) // 为数据生成签名
web3.eth.accounts.recover(signatureObject) // 从给定的已签名数据中回复用来进行签名的以太坊地址
web3.eth.accounts.encrypt(privateKey) // 将私钥加密变换为keystore v3标准格式
web3.eth.accounts.decrypt(keystoreJsonV3, password) // 解密keystore对象

web3.eth.accounts.wallet // 一个内存钱包对象,其中包含多个账户
web3.eth.accounts.wallet.create(numberOfAccounts) // 在钱包中创建一个或多个账户,不会覆盖已经存在的钱包
web3.eth.accounts.wallet.add(account) // 使用私钥或账户对象向钱包中添加一个账户
web3.eth.accounts.wallet.remove(account) // 从钱包中移除指定账户
web3.eth.accounts.wallet.clear() // 清空钱包
web3.eth.accounts.wallet.encrypt(password) // 加密所有的钱包账户为keystore v3对象
web3.eth.accounts.wallet.decrypt(keystoreArray, password) // 解密keystore v3对象
web3.eth.accounts.wallet.save() // 保存钱包
web3.eth.accounts.wallet.load() // 从本地存储器载入钱包并解密

9、账户交互:web3.eth.personal

var Personal = require('web3-eth-personal');
var personal = new Personal(Personal.givenProvider || 'ws://some.local-or-remote.node:8546');

web3.eth.personal.newAccount(password) // 创建新账户
web3.eth.personal.sign(dataToSign, address, password) // 为数据生成签名
web3.eth.personal.ecRecover(dataThatWasSigned, signature) // 提取数据的签名账户
web3.eth.personal.signTransaction // 为交易生成签名

10、应用二进制接口ABI

web3.eth.abi系列函数用来将参数编码为ABI (Application Binary Interface),或者从ABI解码回来。 以便在以太坊虚拟机EVM上执行函数函数调用。

web3.eth.abi.encodeFunctionSignature(functionName) // 将函数名编码为ABI签名,方法是取函数名及参数类型的sha3哈希值的头4个字节
web3.eth.abi.encodeEventSignature(eventName) // 将事件名编码为ABI签名,方法是取事件名及其参数类型的sha3哈希值
web3.eth.abi.encodeParameter(type, parameter) // 将参数按照其type编码成ABI
web3.eth.abi.encodeParameters(typesArray, parameters) // 编码函数参数组
web3.eth.abi.encodeFunctionCall(jsonInterface, parameters) // 将函数调用根据其JSON接口对象和给定的参数进行ABI编码
web3.eth.abi.decodeParameter(type, hexString) // 将ABI编码过的参数解码为其JavaScript形式
web3.eth.abi.decodeParameters(typesArray, hexString) // 将ABI编码的参数解码为其JavaScript形式
web3.eth.abi.decodeLog(inputs, hexString, topics) // 对ABI编码后的日志数据和索引的主题数据进行解码

11、辅助工具:web3.utils

调用方法:Web3.utils

web3.utils.randomHex(size) // 生成伪随机16进制字符串
web3.utils._ // 提供了underscore库的接口,underscore是非常流行的javascript工具库,提供了很多方便的js函数
web3.utils.BN(mixed) // 提供了BN.js库的访问接口,用来处理大数的计算
web3.utils.isBN(bn) // 检查给定参数是否BN对象
web3.utils.isBigNumber(bignumber) // 检查给定参数是否为BigNumber对象
web3.utils.sha3(string) // 计算给定字符串的sha3哈希值
web3.utils.keccak256(string) 
web3.utils.soliditySha3 // 采用和solidity同样的方式计算给定参数的sha3哈希值,也就是说,在计算哈希之前,需要首先对参数进行ABI编码,并进行字节紧凑化处理
web3.utils.isHex(hex) // 检查指定的参数字符串是否是16进制字符串
web3.utils.isHexStrict(hex) // 严格模式16进制检查,必须以0x开头
web3.utils.isAddress(address) // 检查指定的字符串是否是有效的以太坊地址
web3.utils.toChecksumAddress(address) // 将给定的大写或小写以太坊地址转换为校验和地址
web3.utils.checkAddressChecksum(address) // 检查指定地址的校验和,对于非检验和地址将返回false
web3.utils.toHex(mixed) // 转换为16进制字符串
web3.utils.toBN // 转换为BN对象
web3.utils.hexToNumberString(hex) // 将给定的16进制字符串转化为数值字符串
web3.utils.hexToNumber(hex) // 返回给定16进制字符串的数值表示
web3.utils.numberToHex(number) // 数值转换为16进制表示
web3.utils.hexToUtf8(hex) // 16进制字符串转换为utf-8
web3.utils.hexToAscii(hex) // 16进制字符串转换为ascii
web3.utils.utf8ToHex(string) // utf-8字符串转换为16进制
web3.utils.asciiToHex(string) // ascii字符串转换为16进制
web3.utils.hexToBytes(hex) // 16进制字符串转换为字节数组
web3.utils.toWei(number, type) // 转换到wei, type为ether, Gwei
web3.utils.fromWei // 从wei转换到其他以太单位
web3.utils.unitMap // 以太单位换算表
web3.utils.padLeft // 左侧零补齐
web3.utils.padRight // 右侧零补齐

 

 

Geth在以太坊智能合约开发中最常用的工具(必备开发工具),一个多用途的命令行工具。 熟悉Geth可以让我们有更好的效率,大家可收藏起来作为Geth命令用法手册。 本文主要是对geth help的翻译,基于 ...