当我们搭建了一条以太坊的私有链后, 使用 geth console
命令可启动节点, 并进入一个交互式的控制台.
1 | $ geth --datadir "./chain" --networkid 15 console |
运行上面命令后, 将会得到像以下的输出:
1 | INFO [06-07|13:29:04] Maximum peer count ETH=25 LES=0 total=25 |
这是一个交互式的 Javascript 执行环境, 可以直接在 >
提示符后输入 Javascript 代码, 它会将执行后的结果在当前窗口中输出.
不过很可能一些 console
的日志或辅助信息也会在当前窗口中输出, 影响 Javascript 代码结果的查看. 所以一个更好的启动 geth console
方式, 是使用以下的命令, 将 console
的输出重定向到一个文件中:
1 | $ geth --datadir "./chain" --networkid 15 console 2> console.log |
运行上面的命令后, 我们将进入一个更清爽的交互式环境:
1 | Welcome to the Geth JavaScript console! |
然后我们可以另起一个终端窗口, 使用命令 tail -f console.log
来查看 console
的日志或辅助信息输出.
在这个交互式的 Javascript 执行环境中, 内置了一些用来操作 Ethereum 节点网络的 Javascript 对象. 它们提供的功能很丰富, 比如: 查看区块与交易信息、创建账户、挖矿、发送交易、部署智能合约、管理节点、查看内存池状态等等. 在进入 Javascript 的执行环境后, 我们可以直接使用这些对象.
内置对象列表:
对象 | 用处 |
---|---|
personal | 包含与账户管理相关的方法 |
admin | 包含与节点节点相关的方法 |
miner | 包含启动或停止挖矿的方法 |
eth | 包含与操作区块链相关的方法 |
net | 包含一些查看P2P网络状态的方法 |
txpool | 包含一些查看交易内存池的方法 |
web3 | 包含了以上的对象, 还包含一些有关单位换算的工具类方法 |
下面将介绍这些内置对象常用方法的使用. 前面带 >
字符的表示输入的 Javascript 命令代码, 其它的表示输出.
1. 账户管理
1.1 查看账户
先查看一下当前节点的账户信息:
1 | > personal.listAccounts |
或者使用以下命令查看:
1 | > eth.accounts |
1.2 创建账户
此时节点网络中没有任何的账户, 我们可以使用 personal
对象来创建账户:
1 | > personal.newAccount() |
也可以在创建账户时, 指定密码:
1 | > personal.newAccount("123456") |
我们再次查看账户:
1 | > personal.listAccounts |
查看指定账户:
1 | > personal.listAccounts[0] |
1.3 解锁账户
1 | > personal.unlockAccount(eth.accounts[0]) |
当进行发送交易时, 需要先对转出的账户进行解锁操作.
可以指定过期时间, 单位为秒(以下为设置5分钟后解锁过期):
1 | > personal.unlockAccount(eth.accounts[1], "123456", 60*5) |
假如我们想在指定过期时间时, 依然在密码提示符后输入密码, 而不是直接在代码命令中输入密码明文, 可以在密码参数一项传入 null
:
1 | > personal.unlockAccount(eth.accounts[1], null, 60*5) |
1.4 查看钱包的所有账户信息
1 | > personal.listWallets |
2. admin 管理
2.1 查看数据目录
1 | > admin.datadir |
2.2 显示当前节点信息
1 | > admin.nodeInfo |
2.3 查看当前节点地址
1 | > admin.nodeInfo.enode |
其中的 192.168.1.18 表示 ipv4 地址, 也可能为 “[::]”, 表示 ipv6 地址.
2.4 查看 networkid
1 | > admin.nodeInfo.protocols.eth.network |
2.5 添加其它节点
可以通过 admin.addPeer("节点地址")
方法连接到其它节点. 两个节点要想联通, 必须保证网络是相通的, 并且要指定相同的 networkid. 而且启动节点时, 注意去掉 –nodiscover 参数.
先确保网络可用:
1 | > net.listening |
添加其它节点:
1 | > admin.addPeer("enode://87c10977acb3f48718e3a980a27f39e9c7a0bf00143f2b9143a22fa96e33e6b519d7e8407a32f5a61f9c6eb139d6bd46ad7f7288f169d0d0689e881d76e997c1@192.168.1.18:30301") |
其中的节点地址, 是使用以下命令另外启动的一个节点:
geth --datadir "./chain2" --networkid 15 --port 30301 console 2> console2.log
2.6 查看其它Peer节点信息
1 | > admin.peers |
列表其它节点的 IP 地址:
1 | > admin.peers.forEach(function(p) {console.log(p.network.remoteAddress)}) |
3. miner 挖矿管理
3.1 开始挖矿
1 | > miner.start(2) |
其中的参数表示挖矿时使用的线程数, 会根据计算机的硬件情况进行设置.
第一次启动挖矿时, 会先生成挖矿所需的 DAG 文件, 这个过程可能会比较慢, 等进度达到 100% 后, 就会开始挖矿.
3.2 停止挖矿
1 | > miner.stop() |
3.3 设置矿工账户
当挖到一个区块得到以太币奖励时, 所得的奖励会进入到矿工的账户中.
这个账户叫做 coinbase
, 默认下矿工的账户为系统的第一个账户.
我们也可以设置其它的账户为 coinbase
账户 :
1 | > miner.setEtherbase(eth.accounts[1]) |
4. eth 管理
4.1 查看矿工账户
1 | > eth.coinbase |
默认下 coinbase 为系统的第一个账户.
4.2 查看账号列表
1 | > eth.accounts |
查看指定的账户:
1 | > eth.accounts[0] |
4.3 查看账户余额
1 | > eth.getBalance(eth.accounts[0]) |
getBalance
方法返回值的单位是 wei, wei是以太币的最小单位.
其中: 1以太币=10^18个wei.
可以使用 web3.fromWei()
方法将返回值换算成以太币:
1 | > u0 = eth.accounts[0] |
4.4 一次查看所有的账户余额
1 | > function checkAllBalances() { |
4.5 发送交易
发送交易时, 需要先对发起交易的账户进行 解锁:
1 | > personal.unlockAccount(eth.accounts[0]) |
这里从 账户0 转10个以太币到 账户1 中:
1 | > amount = web3.toWei(10, 'ether') |
我们去查看所有账户中的余额:
1 | > checkAllBalances() |
发现还没转过来, 因为此时交易虽然已经提交到网络中, 但还未被处理.
我们需要启动挖矿, 然后等一会挖到区块后, 才能够查看到交易完成后的信息:
1 | > miner.start(2) |
注意: 这里的账户0中的余额变多了, 因为挖矿一段时间后, 会有新的以太币产生.
4.6 查看挂起的交易
1 | > eth.pendingTransactions |
如果返回值为空, 表示交易已全部完成:
1 | > eth.pendingTransactions |
4.7 查看区块信息
查看当前区块总数:
1 | > eth.blockNumber |
查看某个区块信息:
1 | > eth.getBlock(0) |
getBlock
方法传入的是区块的序号数, 从0开始计数. 当区块不存在时, 将返回null
.
4.8 查看交易信息
1 | > eth.getTransaction("0xdc6e22cf55db26a14486375e278712af8a19667f4541a8cca3d7ad67fcb5fad7") |
getTransaction
方法传入的是交易的Hash值. 当交易不存在时, 将返回null
.
4.9 查看支持的智能合约编译器
1 | > eth.compile |
5. net 管理
5.1 查看网络监听状态
1 | > net.listening |
5.2 查看网络的Peer节点数
1 | > net.peerCount |
5.3 查看网络的id
1 | > net.version |
这里有个疑问:
version
字面上返回的是networkid
的值, 而不是什么版本值?
很可能节点网络的版本用的就是networkid
的值
6. txpool 管理
6.1 查看交易内存池状态
1 | > txpool.status |
6.2 查看交易内存池的内容
1 | > txpool.content |
7. web3 工具方法
在介绍 web3 对象中的工具方法前, 先要对 Ether 币的单位进行说明.
Ether 币的最小单位为 wei, 也是命令行中默认的单位. 然后每1000个 wei 进一个单位, 依次为:
- kwei (1000 wei)
- mwei (1000 kwei)
- gwei (1000 mwei)
- szabo (1000 gwei)
- finney (1000 szabo)
- ether (1000 finney)
也即: 1 ether = 10^18 wei
7.1 其它单位转换为 wei
1 | > web3.toWei(1, 'ether') |
当
toWei
方法的第二个参数不传或者为null
时, 默认将按ether
单位进行转换为 wei.
7.2 wei 转换为其它单位
1 | > web3.fromWei(1000000000000000000, 'ether') |
当
fromWei
方法的第二个参数不传或者为null
时, 默认将转换为单位ether
.
7.3 判断是否为地址
1 | > eth.accounts[0] |
当传入的是一个160位长的字符串数字时, 才返回
true
. 否则返回false
.