以太坊开发 4-geth console 命令

警告
本文最后更新于 2020-11-11,文中内容可能已过时。

Geth Console 是一个交互式的 JavaScript 执行环境,其中 > 是命令提示符。在这个环境里也内置了一些用来操作以太坊的 JavaScript 对象,可以直接使用这些对象。这些对象主要包括:

  • eth:包含一些跟操作区块链相关的方法;
  • net:包含一些查看 p2p 网络状态的方法;
  • admin:包含一些与管理节点相关的方法;
  • miner:包含启动 & 停止挖矿的一些方法;
  • personal:主要包含一些管理账户的方法;
  • txpool:包含一些查看交易内存池的方法;
  • web3:包含了以上对象,还包含一些单位换算的方法。

最简单的启动方式如下

1
geth console

控制台启动成功后,可以看到 > 提示符,等待输入控制台命令

1
> 

输入 exit 退出

1
> exit

使用 geth console 启动会在交互界面不时出现日志提示,可以将日志输出到文件

1
~/Desktop$ geth console 2>>geth.log

此时 geth.log 日志文件位于命令执行时的目录下,比如我执行命令在 ~/Desktop 目录,geth.log 文件也在这里。可以自己手动打开文件查看日志,当然也可以新开一个终端用 tail 命令查看日志

1
tail -f geth.log

实际上还可以将日志输出到另一个终端,也就是重定向日志。先在 2 号终端输入:

1
2
$ tty
dev/pts/1

获取得到终端编号,然后在 1 号终端输入如下命令,就可以将日志输出到 2 号终端

1
geth console 2>> /dev/pts/1

不想看到日志的话也可以选择将日志输出到空的终端

1
geth console 2>> /dev/null

正常的不输出日志的方式实际上并不是使用如上命令,而是使用 --verbosity 来控制日志级别,此时不输出日志的命令如下

1
geth --verbosity 0 console

另一个启动 geth 交互式 JavaScript 环境的方法是连接到一个 geth 节点

1
2
3
geth attach ipc:{ipc_file_path} # geth.ipc 文件路径
geth attach http://191.168.1.1:8545 # JSONRPC 的地址
geth attach ws://191.168.1.1:8546

注意,要连接到的节点在启动时必须开启 ipc 服务,不然不会产生 geth.ipc 文件。产生的 geth.ipc 文件位于存放链数据的 data 文件下,即 datadir 命令后面跟的文件目录,和 keystort 文件以及 geth 文件位于同一级目录。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ tree ~/Desktop -L 2
/home/shuzang/Desktop
├── data
│   ├── geth
│   ├── geth.ipc
│   ├── history
│   └── keystore
├── genesis.json
└── geth.log

3 directories, 4 files

该部分翻译自:management API

除官方 DApp APIs 接口外,go-ethereum 还支持额外的一些 Management API。与 DApp API 类似,这些也是使用 JSON-RPC 提供的,并遵循完全相同的规范。这些 API 正是应用在 Geth 提供的控制台中。

除了官方公布的 DApp API(如 eth,shh,web3)之外,额外的 Management API 列表如下:

  • admin: Geth node management
  • debug: Geth node debugging
  • miner: Miner and DAG management
  • personal: Account management
  • txpool: Transaction pool inspection

adminAPI 给了我们几种非标准的 RPC 方法,允许我们对 Geth 实例进行细粒度的控制,包括但不限于网络节点和 RPC 的端点管理。

该方法请求添加一个新的远程节点到跟踪的静态节点列表中,节点将始终尝试保持与这些节点的连接,如果远程节点断开,则每隔一段时间尝试重连一次。

1
2
> admin.addPeer("enode://a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@52.16.188.185:30303")
true

用于查找正在运行的 Geth 节点当前用于存储的数据库的绝对路径

1
2
> admin.datadir
"/home/Karalabe/.ethereum"

查询当前网络正在运行的 Geth 节点的所有已知信息,包括节点作为 P2P 网络参与者的本身的信息和它自己运行的应用协议(e.g. eth,les,shh,bzz)的专有信息。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
> admin.nodeInfo
{
  enode: "enode://44826a5d6a55f88a18298bca4773fca5749cdc3a5c9f308aa7d810e9b31123f3e7c5fba0b1d70aac5308426f47df2a128a6747040a3815cc7dd7167d03be320d@[::]:30303",
  id: "44826a5d6a55f88a18298bca4773fca5749cdc3a5c9f308aa7d810e9b31123f3e7c5fba0b1d70aac5308426f47df2a128a6747040a3815cc7dd7167d03be320d",
  ip: "::",
  listenAddr: "[::]:30303",
  name: "Geth/v1.5.0-unstable/linux/go1.6",
  ports: {
    discovery: 30303,
    listener: 30303
  },
  protocols: {
    eth: {
      difficulty: 17334254859343145000,
      genesis: "0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3",
      head: "0xb83f73fbe6220c111136aefd27b160bf4a34085c65ba89f24246b3162257c36a",
      network: 1
    }
  }
}

和 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
> admin.peers
[{
    caps: ["eth/61", "eth/62", "eth/63"],
    id: "08a6b39263470c78d3e4f58e3c997cd2e7af623afce64656cfc56480babcea7a9138f3d09d7b9879344c2d2e457679e3655d4b56eaff5fd4fd7f147bdb045124",
    name: "Geth/v1.5.0-unstable/linux/go1.5.1",
    network: {
      localAddress: "192.168.0.104:51068",
      remoteAddress: "71.62.31.72:30303"
    },
    protocols: {
      eth: {
        difficulty: 17334052235346465000,
        head: "5794b768dae6c6ee5366e6ca7662bdff2882576e09609bf778633e470e0e7852",
        version: 63
      }
    }
}, /* ... */ {
    caps: ["eth/61", "eth/62", "eth/63"],
    id: "fcad9f6d3faf89a0908a11ddae9d4be3a1039108263b06c96171eb3b0f3ba85a7095a03bb65198c35a04829032d198759edfca9b63a8b69dc47a205d94fce7cc",
    name: "Geth/v1.3.5-506c9277/linux/go1.4.2",
    network: {
      localAddress: "192.168.0.104:55968",
      remoteAddress: "121.196.232.205:30303"
    },
    protocols: {
      eth: {
        difficulty: 17335165914080772000,
        head: "5794b768dae6c6ee5366e6ca7662bdff2882576e09609bf778633e470e0e7852",
        version: 63
      }
    }
}]

当调用 eth_compileSolidityRPC 方法时用来设置 Solidity 编译器路径,不设置的话,默认路径是 /usr/bin/solc

1
2
3
4
5
> admin.setSolc("/usr/bin/solc")
"solc, the solidity compiler commandline interface
 Version: 0.3.2-0/Release-Linux/g++/Interpreter

 path: /usr/bin/solc"

开启一个基于 JSON RPC 的 HTTP Webserver 来处理客户端请求,参数含义如下:

  • host: network interface to open the listener socket on (默认 "localhost")
  • port: network port to open the listener socket on (默认 8545)
  • cors: cross-origin resource sharing header to use (默认 "")
  • apis: 通过此接口提供的 API 模块 (默认 "eth,net,web3")

返回一个布尔值表示 HTTP RPC 监听是否打开,任何时候只允许一个 HTTP 端点保持活动

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

和 RPC 相似,不同的是开启的是 WebSocket Websever。Example

1
2
> admin.startWS("127.0.0.1", 8546)
true

和 RPC 开启对应,关闭 HTTP Webserver

1
2
> admin.stopRPC()
true

和 WebSocket 开启对应,关闭 WebSocket Webserver

1
2
> admin.stopWS()
true

Q:HTTP 和 WebSocket 有啥区别

A:HTTP 协议和 WebSocket 协议(一), HTTP 协议和 WebSocket 协议(二)

提供一些非标准的 RPC 方法,运行我们在运行时检查、调试和设置某些调试标志

这部分的话从上面表格也看出来了,方法比较多,而且是调试用,就不细列了,用的时候查就行了。

允许我们远程控制节点的挖矿操作并进行各种挖矿相关的设置

  • miner.setExtra (string):设置一个矿工挖矿时可以包含的额外数据,最大 32 字节
  • miner.setGasPrice (number):设置挖矿时接受的最低 Gas 价格,低于此价格的交易不会被收集到区块
  • miner.start (number):以给定数量的线程启动 CPU 挖矿进程,如果需要生成新的 DAG
  • miner.stop ():停止 CPU 挖矿操作
  • miner.setEtherbase (address):设置挖矿奖励账户地址

管理私钥

返回密钥库中所有密钥对应的以太坊账户地址

1
2
> personal.listAccounts
["0x5e97870f263700f46aa00d967821199b9bc5a120", "0x3d80b31a78c30fc628f20b2c89d7ddbf6e53cedc"]

生成新的私钥并将其存储在密钥库目录中。密钥文件使用给定的密码加密。返回新帐户的地址。未提供参数时,会在控制台提示输入密码。

1
2
3
4
> personal.newAccount()
Passphrase: 
Repeat passphrase: 
"0x5e97870f263700f46aa00d967821199b9bc5a120"

也可以直接提供参数作为密码

1
2
> personal.newAccount("h4ck3r")
"0x3d80b31a78c30fc628f20b2c89d7ddbf6e53cedc"

使用密码解密密钥库中某个地址对应的账户。使用 JavaScript 控制台时,密码短语和解锁持续时间都是可选的。如果密码短语未作为参数提供,控制台将以交互方式提示输入密码短语。

解锁持续时间默认为 300 秒,geth 退出持续时间也会结束。帐户解锁时可以与 eth_sign 和 eth_sendTransaction 一起使用。

1
2
3
4
> personal.unlockAccount("0x5e97870f263700f46aa00d967821199b9bc5a120")
Unlock account 0x5e97870f263700f46aa00d967821199b9bc5a120
Passphrase: 
true

提供密码字段和持续时间作为参数

1
2
> personal.unlockAccount("0x5e97870f263700f46aa00d967821199b9bc5a120", "foo", 30)
true

如果不想将密码字段作为参数显式输入,但又想设置持续时间,如下

1
2
3
4
> personal.unlockAccount("0x5e97870f263700f46aa00d967821199b9bc5a120", null, 30)
Unlock account 0x5e97870f263700f46aa00d967821199b9bc5a120
Passphrase: 
true

验证给定的密码短语并提交交易。该交易与 eth_sendTransaction 的参数相同,并包含 from 地址。如果验证了密码短语可以用来解锁 tx.from 的账户,签名并发送到网络上。该帐户未在节点中全局解锁,不能在其他 RPC 调用中使用。

1
2
3
4
> var tx = {from: "0x391694e7e0b0cce554cb130d723a9d27458f9298", to: "0xafa3f8684e54059998bc3a7b0d2b0da075154d66", value: web3.toWei(1.23, "ether")}
undefined
> personal.sendTransaction(tx, "passphrase")
0x8474441674cdd47b35b875fd1a530b800b51a5264b9975fb21129eeb8c18582f
1
2
> personal.sign("0xdeadbeaf", "0x9b2055d370f73ec7d8a03e965129118dc8f5bf83", "")
"0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a12d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee1b"

返回与某个私钥相关联的地址,该私钥用于 personal.sign 中计算签名

1
2
3
4
> personal.sign("0xdeadbeaf", "0x9b2055d370f73ec7d8a03e965129118dc8f5bf83", "")
"0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a12d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee1b"
> personal.ecRecover("0xdeadbeaf", "0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a12d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee1b")
"0x9b2055d370f73ec7d8a03e965129118dc8f5bf83"

从内存中删除具有给定地址的私钥。该帐户不能再用于发送交易。

将给定的未加密私钥(十六进制字符串)导入密钥存储区,并使用密码短语对其进行加密。返回新帐户的地址

给我们访问交易池和排队队列中待处理交易的权限,交易池中是所有挂起的交易

返回交易池和待处理交易队列中的内容

 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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
> txpool.content
{
  pending: {
    0x0216d5032f356960cd3749c31ab34eeff21b3395: {
      806: [{
        blockHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
        blockNumber: null,
        from: "0x0216d5032f356960cd3749c31ab34eeff21b3395",
        gas: "0x5208",
        gasPrice: "0xba43b7400",
        hash: "0xaf953a2d01f55cfe080c0c94150a60105e8ac3d51153058a1f03dd239dd08586",
        input: "0x",
        nonce: "0x326",
        to: "0x7f69a91a3cf4be60020fb58b893b7cbb65376db8",
        transactionIndex: null,
        value: "0x19a99f0cf456000"
      }]
    },
    0x24d407e5a0b506e1cb2fae163100b5de01f5193c: {
      34: [{
        blockHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
        blockNumber: null,
        from: "0x24d407e5a0b506e1cb2fae163100b5de01f5193c",
        gas: "0x44c72",
        gasPrice: "0x4a817c800",
        hash: "0xb5b8b853af32226755a65ba0602f7ed0e8be2211516153b75e9ed640a7d359fe",
        input: "0xb61d27f600000000000000000000000024d407e5a0b506e1cb2fae163100b5de01f5193c00000000000000000000000000000000000000000000000053444835ec580000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
        nonce: "0x22",
        to: "0x7320785200f74861b69c49e4ab32399a71b34f1a",
        transactionIndex: null,
        value: "0x0"
      }]
    }
  },
  queued: {
    0x976a3fc5d6f7d259ebfb4cc2ae75115475e9867c: {
      3: [{
        blockHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
        blockNumber: null,
        from: "0x976a3fc5d6f7d259ebfb4cc2ae75115475e9867c",
        gas: "0x15f90",
        gasPrice: "0x4a817c800",
        hash: "0x57b30c59fc39a50e1cba90e3099286dfa5aaf60294a629240b5bbec6e2e66576",
        input: "0x",
        nonce: "0x3",
        to: "0x346fb27de7e7370008f5da379f74dd49f5f2f80f",
        transactionIndex: null,
        value: "0x1f161421c8e0000"
      }]
    },
    0x9b11bf0459b0c4b2f87f8cebca4cfc26f294b63a: {
      2: [{
        blockHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
        blockNumber: null,
        from: "0x9b11bf0459b0c4b2f87f8cebca4cfc26f294b63a",
        gas: "0x15f90",
        gasPrice: "0xba43b7400",
        hash: "0x3a3c0698552eec2455ed3190eac3996feccc806970a4a056106deaf6ceb1e5e3",
        input: "0x",
        nonce: "0x2",
        to: "0x24a461f25ee6a318bdef7f33de634a67bb67ac9d",
        transactionIndex: null,
        value: "0xebec21ee1da40000"
      }],
      6: [{
        blockHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
        blockNumber: null,
        from: "0x9b11bf0459b0c4b2f87f8cebca4cfc26f294b63a",
        gas: "0x15f90",
        gasPrice: "0x4a817c800",
        hash: "0xbbcd1e45eae3b859203a04be7d6e1d7b03b222ec1d66dfcc8011dd39794b147e",
        input: "0x",
        nonce: "0x6",
        to: "0x6368f3f8c2b42435d6c136757382e4a59436a681",
        transactionIndex: null,
        value: "0xf9a951af55470000"
      }, {
        blockHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
        blockNumber: null,
        from: "0x9b11bf0459b0c4b2f87f8cebca4cfc26f294b63a",
        gas: "0x15f90",
        gasPrice: "0x4a817c800",
        hash: "0x60803251d43f072904dc3a2d6a084701cd35b4985790baaf8a8f76696041b272",
        input: "0x",
        nonce: "0x6",
        to: "0x8db7b4e0ecb095fbd01dffa62010801296a9ac78",
        transactionIndex: null,
        value: "0xebe866f5f0a06000"
      }],
    }
  }
}

txpool.content 相似,不同的是只列出所有交易摘要,而 txpool.content 是列出前几个交易的详细内容

 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
> txpool.inspect
{
  pending: {
    0x26588a9301b0428d95e6fc3a5024fce8bec12d51: {
      31813: ["0x3375ee30428b2a71c428afa5e89e427905f95f7e: 0 wei + 500000 × 20000000000 gas"]
    },
    0x2a65aca4d5fc5b5c859090a6c34d164135398226: {
      563662: ["0x958c1fa64b34db746925c6f8a3dd81128e40355e: 1051546810000000000 wei + 90000 × 20000000000 gas"],
      563663: ["0x77517b1491a0299a44d668473411676f94e97e34: 1051190740000000000 wei + 90000 × 20000000000 gas"],
      563664: ["0x3e2a7fe169c8f8eee251bb00d9fb6d304ce07d3a: 1050828950000000000 wei + 90000 × 20000000000 gas"],
      563665: ["0xaf6c4695da477f8c663ea2d8b768ad82cb6a8522: 1050544770000000000 wei + 90000 × 20000000000 gas"],
      563666: ["0x139b148094c50f4d20b01caf21b85edb711574db: 1048598530000000000 wei + 90000 × 20000000000 gas"],
      563667: ["0x48b3bd66770b0d1eecefce090dafee36257538ae: 1048367260000000000 wei + 90000 × 20000000000 gas"],
      563668: ["0x468569500925d53e06dd0993014ad166fd7dd381: 1048126690000000000 wei + 90000 × 20000000000 gas"],
      563669: ["0x3dcb4c90477a4b8ff7190b79b524773cbe3be661: 1047965690000000000 wei + 90000 × 20000000000 gas"],
      563670: ["0x6dfef5bc94b031407ffe71ae8076ca0fbf190963: 1047859050000000000 wei + 90000 × 20000000000 gas"]
    },
    0x9174e688d7de157c5c0583df424eaab2676ac162: {
      3: ["0xbb9bc244d798123fde783fcc1c72d3bb8c189413: 30000000000000000000 wei + 85000 × 21000000000 gas"]
    },
    0xb18f9d01323e150096650ab989cfecd39d757aec: {
      777: ["0xcd79c72690750f079ae6ab6ccd7e7aedc03c7720: 0 wei + 1000000 × 20000000000 gas"]
    },
    0xb2916c870cf66967b6510b76c07e9d13a5d23514: {
      2: ["0x576f25199d60982a8f31a8dff4da8acb982e6aba: 26000000000000000000 wei + 90000 × 20000000000 gas"]
    },
    0xbc0ca4f217e052753614d6b019948824d0d8688b: {
      0: ["0x2910543af39aba0cd09dbb2d50200b3e800a63d2: 1000000000000000000 wei + 50000 × 1171602790622 gas"]
    },
    0xea674fdde714fd979de3edf0f56aa9716b898ec8: {
      70148: ["0xe39c55ead9f997f7fa20ebe40fb4649943d7db66: 1000767667434026200 wei + 90000 × 20000000000 gas"]
    }
  },
  queued: {
    0x0f6000de1578619320aba5e392706b131fb1de6f: {
      6: ["0x8383534d0bcd0186d326c993031311c0ac0d9b2d: 9000000000000000000 wei + 21000 × 20000000000 gas"]
    },
    0x5b30608c678e1ac464a8994c3b33e5cdf3497112: {
      6: ["0x9773547e27f8303c87089dc42d9288aa2b9d8f06: 50000000000000000000 wei + 90000 × 50000000000 gas"]
    },
    0x976a3fc5d6f7d259ebfb4cc2ae75115475e9867c: {
      3: ["0x346fb27de7e7370008f5da379f74dd49f5f2f80f: 140000000000000000 wei + 90000 × 20000000000 gas"]
    },
    0x9b11bf0459b0c4b2f87f8cebca4cfc26f294b63a: {
      2: ["0x24a461f25ee6a318bdef7f33de634a67bb67ac9d: 17000000000000000000 wei + 90000 × 50000000000 gas"],
      6: ["0x6368f3f8c2b42435d6c136757382e4a59436a681: 17990000000000000000 wei + 90000 × 20000000000 gas", "0x8db7b4e0ecb095fbd01dffa62010801296a9ac78: 16998950000000000000 wei + 90000 × 20000000000 gas"],
      7: ["0x6368f3f8c2b42435d6c136757382e4a59436a681: 17900000000000000000 wei + 90000 × 20000000000 gas"]
    }
  }
}

和前两个相比更简单,只返回交易数目

1
2
3
4
5
> txpool.status
{
  pending: 10,
  queued: 7
}

这两个也有使用,但是没找到 Javascript 控制台下命令格式的具体说明

  • personal.newAccount ():创建账户;
  • personal.unlockAccount ():解锁账户;
  • eth.accounts:枚举系统中的账户;
  • eth.getBalance ():查看账户余额,返回值的单位是 Wei(Wei 是以太坊中最小货币面额单位,类似比特币中的聪,1 ether = 10^18 Wei);
  • eth.blockNumber:列出区块总数;
  • eth.getTransaction ():获取交易;
  • eth.getBlock ():获取区块;
  • miner.start ():开始挖矿;
  • miner.stop ():停止挖矿;
  • web3.fromWei ():Wei 换算成以太币;
  • web3.toWei ():以太币换算成 Wei;
  • txpool.status:交易池中的状态;
  • admin.addPeer ():连接到其他节点;
支付宝
微信
0%