6 R+ I1 @# t) @( i4 k
打开命令行,定位到 NEO-CLI 所在目录,输入下面代码即可启动 NEO 的命令行钱包。! F" Y0 O0 {3 C2 x
dotnet neo-cli.dll
本篇教程将介绍命令行钱包的所有命令,你可以通过输入命令的形式操作钱包,如创建打开钱包、导入导出私钥、转账、启动共识等。在命令行中输入 help 可以查看所有命令。
Note命令中尖括号 表示参数,方括号 [] 表示可选参数,或符号 | 表示所填的参数可以是其中任意一种,等号 = 表示可选参数在不输入情况下的默认值。. `4 k" l( l, s- H5 w+ O U: i) C
5 u4 f) Q- B$ ^) A7 ~& Y
控制台指令
命令 | 功能说明 |
version | 显示当前软件的版本 |
help | 帮助菜单 |
clear | 清除屏幕 |
exit | 退出程序 |
钱包操作- G7 ]" L' |9 f# r. Y% g+ z
命令 | 功能说明 | 备注 |
create wallet | 创建钱包文件 | |
open wallet | 打开钱包文件 | |
upgrade wallet | 升级旧版钱包文件 | |
rebuild index | 重建钱包索引 | 需要打开钱包 |
list address | 列出钱包中的所有账户 | 需要打开钱包 |
list asset | 列出钱包中的所有资产 | 需要打开钱包 |
list key | 列出钱包中的所有公钥 | 需要打开钱包 |
show utxo [id|alias] | 列出钱包中指定资产的 UTXO | 需要打开钱包 |
show gas | 列出钱包中的所有可提取及不可提取的 GAS | 需要打开钱包 |
claim gas [all] | 提取钱包中可提取状态的 GAS(前50个地址或所有地址) | 需要打开钱包 |
create address [n=1] | 创建地址 / 批量创建地址 | 需要打开钱包 |
import key | 导入私钥 / 批量导入私钥 | 需要打开钱包 |
export key [address] [path] | 导出私钥 | 需要打开钱包 |
send |all [fee=0] | 向指定地址转账 参数分别为:资产 ID,对方地址,转账金额,手续费 | 需要打开钱包 |
import multisigaddress m pubkeys... | 创建多方签名合约 | 需要打开钱包 |
sign | 签名 参数为:记录交易内容的 json 字符串 | 需要打开钱包 |
relay | 广播 参数为:记录交易内容的 json 字符串 | 需要打开钱包 |
命令说明/ a" R K2 Z+ c: ]7 V4 p
👉 upgrade wallet
升级旧版钱包文件4 S, u) l7 d: h, R& D: H
neo>upgrade wallet cli.db3$ S) o4 k- x) G/ C* @
Wallet file upgrade complete. Old file has been auto-saved at: cli.old.db3
👉 rebuild index 3 f3 N/ f. U) D
重建钱包索引。为什么要重建钱包索引,重建钱包索引有什么用?% y' U5 [2 e- f2 t+ N2 {
钱包中有一个字段,记录了当前钱包同步的区块高度,每新增加一个区块,钱包客户端就会同步区块,将钱包中的资产和交易更新。假设当前记录的区块高度为 100,然后你执行了 import key 命令导入了私钥,这时钱包仍然是从区块高度为 100开始计算你的资产。如果导入的地址在区块高度小于 100的时候有一些交易,这些交易和对应的资产将不会体现在钱包中,所以要重建钱包索引,强制让钱包从区块高度为0开始计算你的资产。* w0 o# M/ t# P- i8 I' ]
假如由于种种原因,钱包中的某笔交易未确认,这时资产已经从钱包中扣除,但并未经过整个区块链网络的确认。如果想删掉这笔未确认的交易使钱包中的资产正常显示也需要重建钱包索引。
新创建的钱包不用重建钱包索引,只有要导入私钥或者钱包中资产显示异常时才需要重建钱包索引。
👉 show utxo [id|alias]: @3 ~4 N& G5 w8 p; s9 k9 `
列出钱包中指定资产的 UTXO,示例输出如下所示: i' [: ~$ t- n) G$ x4 G
neo>show utxo neo R" B1 ~9 v4 i( w+ v
8674c38082e59455cf35cee94a5a1f39f73b617b3093859aa199c756f7900f1f:2$ ]4 r8 H8 D7 O8 z2 M) N
total: 1 UTXOs- K5 Y1 ]; U8 u- E! `/ c( `. H
neo>show utxo gas
8674c38082e59455cf35cee94a5a1f39f73b617b3093859aa199c756f7900f1f:10 Y* w8 V9 ~( \
total: 1 UTXOs
neo>show utxo 025d82f7b00a9ff1cfe709abe3c4741a105d067178e645bc3ebad9bc79af47d4
8674c38082e59455cf35cee94a5a1f39f73b617b3093859aa199c756f7900f1f:0
total: 1 UTXOs
👉 show gas
列出钱包中的所有可提取及不可提取的 GAS,输出结果如下:& O' h& \& U+ ]) O" c, P6 E0 n3 U
unavailable: 133.024
available: 10.123
其中 unavailable 表示不可提取的 GAS,available 表示可提取(待提取)的 GAS。0 l0 Q! G d. Z9 w
什么是可提取的 GAS,什么是不可提取的 GAS?
每一个 NEO 都有两种状态:unspent 和 spent。每一个未提取的 GAS 也有两种状态,available 和 unavailable。一个 NEO 的生命周期以转入地址起始,转出地址截止,转入时状态变为 unspent,转出时状态变为 spent。当 NEO 处于 unspent 状态时,所产生的 Gas 为 unavailable 状态,即不可提取。当 NEO 处于 spent 状态时,期间所产生的 GAS 变为 available,用户可以提取。: ]$ \4 \+ |- ]; n
如何将钱包中的所有 unavailable GAS 转为 available GAS 呢,很简单,将钱包中的所有 NEO 转到钱包中的任意一个地址即可。) M) F1 l) ?3 V8 r& F
👉 claim gas
提取钱包中可提取状态下的 GAS,该过程是通过一个特殊的交易 Claim Transaction 完成的,输入命令后,客户端会输出 Claim Transaction 的 ID(提取 GAS 这笔交易的 ID)。用户可以有两种选择,如末尾不带参数,则默认提取钱包前50个地址中的可提取状态的 GAS。如果指定参数 [all],则会提取钱包中所有地址的可提取状态的 GAS。
执行完 claim gas 命令后,再执行 list asset 会显示 GAS 有增加。; ~4 `8 m! S+ s9 w9 c- }
👉 create address [n=1] 2 j$ t5 ]' ^, r* p X) L H4 e
可以输入 create address 来创建一个地址,也可以输入 create address 100 来批量创建 100个地址,批量创建的地址会自动导出到 address.txt 文件中。
👉 export key [address] [path]
你可以指定导出哪个地址对应的私钥,也可以指定导出至指定的文件中,例如下面的命令都是合法的。该命令需要验证钱包密码。2 U) t9 L0 O1 c. ?, O- j7 \
export key/ n f, Z1 f3 Q( G* ]4 R! O
export key AeSHyuirtXbfZbFik6SiBW2BEj7GK3N62b& J6 j) ]: _# e6 K0 {- j8 R
export key key.txt# g: n2 \$ G3 W3 \6 ]
export key AeSHyuirtXbfZbFik6SiBW2BEj7GK3N62b key.txt) G. E6 ^7 F% u q9 Z8 Y# z
👉 import key 1 }7 Y% n# H8 E# A
导入私钥,你可以指定导入一个私钥,或者是导入一个文件中的多个私钥,例如下面的命令都是合法的。6 ~8 r% e# w6 C7 R g2 f6 b7 M- q
import key L4zRFphDJpLzXZzYrYKvUoz1LkhZprS5pTYywFqTJT2EcmWPPpPH/ q1 t6 z* m, U# L, q' M- e6 v
import key key.txt
如果是指定文件的话,文件里的私钥格式请参考 export key key.txt 的输出。4 ~) @: S7 E' y) ?
👉 send |all [fee=0]
转账,一共有 4 个参数,第一个参数是资产 ID,第二个参数是收款地址,第三个参数是转账金额(当输入 all 即为钱包中该资产的全部数量),第四个参数是手续费(这个参数可不填,默认为0)。该命令需要验证钱包密码。假如我想转 100 NEO 转到这个地址“AeSHyuirtXbfZbFik6SiBW2BEj7GK3N62b”,我需要输入以下命令。
send c56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b AeSHyuirtXbfZbFik6SiBW2BEj7GK3N62b 100/ F: u8 G$ P% V0 x9 E. h
因为第二个参数除了资产 ID,还可以填写资产缩写,如 neo,gas,所以以上命令可以写成: g7 B& P1 |! m- U( O* C
send neo AeSHyuirtXbfZbFik6SiBW2BEj7GK3N62b 100
不知道资产 ID 怎么办?请输入 list asset 命令查看钱包中的所有资产。
👉 import multisigaddress m pubkeys...! I5 u' G# m! W, C9 l2 c
以 m 个最小签名数量来创建多方签名的合约地址,例如两个公钥创建的多方签名地址, m 可以为 1 或 2, 后面的参数就是两方的公钥。. |' o1 h1 k% @
例如:import multisigaddress 1 037ebe29fff57d8c177870e9d9eecb046b27fc290ccbac88a0e3da8bac5daa630d 03b34a4be80db4a38f62bb41d63f9b1cb664e5e0416c1ac39db605a8e30ef270cc7 A5 f( w6 ^/ w2 J! ]- A6 B$ P
👉 sign - g$ x; F" `5 \
从签名数量为 1 以上的多方签名合约中提取资产时,需要多方进行签名,参数为记录这段交易的 json 字符串。 签名完整后才能广播出去。5 U3 V1 A2 Y, h) J( C# n' \
👉 relay % k2 ^4 C1 ^, C" u9 s; L* p
签名完整后,可以将这段交易信息进行广播。参数同样为记录这段交易的 json 字符串。
插件安装
命令 | 功能说明 | 备注 |
install [Plugin name] | 安装指定插件 | |
uninstall [Plugin name] | 卸载指定插件 |
命令说明
👉 install [Plugin name] . G/ n6 A' ~0 M# N, s8 {: a7 Y# |
安装指定插件,如下所示。卸载插件与此类似。- v! t6 M' t7 d
neo>install ImportBlocks" z3 W5 J6 J$ G, D+ d: L7 ^
Downloading from https://github.com/neo-project/neo-plugins/releases/download/v2.9.4/ImportBlocks.zip
Install successful, please restart neo-cli.
neo>install ApplicationLogs
Downloading from https://github.com/neo-project/neo-plugins/releases/download/v2.9.4/ApplicationLogs.zip
Install successful, please restart neo-cli.
以上只是示例插件,更多插件请访问 NEO 客户端插件。6 h" z% q9 Q# j) k
查看节点信息
命令 | 功能说明 |
show state | 显示当前区块链同步状态 |
show node | 显示当前已连接的节点地址和端口 |
show pool | 显示内存池中的交易(这些交易处于零确认的状态) |
export blocks [path=chain.acc] | 导出全部区块数据,导出的结果可以用作离线同步 |
export blocks [count] | 从指定区块高度导出指定数量的区块数据,导出的结果可以用作离线同步 |
高级指令
命令 | 功能说明 |
start consensus | 启动共识 |
启动共识的前提是该钱包有共识的权限,在 NEO 主网上可以通过投票选举获得共识的权限,如果自己部署的私有链可以在 protocol.json 中设置共识节点的公钥,详情可参考 私链搭建。