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的翻译,基于 ...