2021-03-18 19:08:14 +00:00
|
|
|
# NeoGo CLI interface
|
|
|
|
|
|
|
|
NeoGo CLI provides all functionality from one binary, so it's used to run
|
|
|
|
node, create/compile/deploy/invoke/debug smart contracts, run vm and operate
|
|
|
|
with the wallet. The standard setup assumes that you're running a node as a
|
|
|
|
separate process and it doesn't provide any CLI of its own, instead it just
|
|
|
|
makes RPC interface available for you. To perform any actions you invoke NeoGo
|
|
|
|
as a client that connects to this RPC node and does things you want it to do
|
|
|
|
(like transferring some NEP-17 asset).
|
|
|
|
|
|
|
|
All CLI commands have corresponding help messages, use `--help` option to get
|
|
|
|
them, for example:
|
|
|
|
```
|
|
|
|
./bin/neo-go db --help
|
|
|
|
```
|
2019-09-02 13:43:44 +00:00
|
|
|
|
|
|
|
## Running node
|
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
Use `node` command to run a NeoGo node, it will be configured using a YAML
|
|
|
|
file that contains network parameters as well as node settings.
|
2019-09-02 13:43:44 +00:00
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
### Configuration
|
|
|
|
|
|
|
|
All config files are located in `./config` and they are differentiated according to the network type:
|
|
|
|
- `protocol.mainnet.yml` belongs to `--mainnet` network mode (`-m` short option)
|
|
|
|
- `protocol.privnet.yml` belongs to `--privnet` network mode (`-p` short
|
|
|
|
option) and is used by default
|
|
|
|
- `protocol.testnet.yml` belongs to `--testnet` network mode (`-t` short option)
|
|
|
|
- `protocol.unit_testnet.yml` is used by unit tests
|
|
|
|
|
|
|
|
If you want to use some non-default configuration directory path, specify
|
|
|
|
`--config-path` flag:
|
|
|
|
|
|
|
|
`./bin/neo-go node --config-path /user/yourConfigPath`
|
|
|
|
|
|
|
|
The file loaded is chosen automatically depending on network mode flag.
|
|
|
|
|
|
|
|
### Starting a node
|
2019-09-02 13:43:44 +00:00
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
To start Neo node on private network use:
|
2019-09-02 13:43:44 +00:00
|
|
|
|
|
|
|
```
|
|
|
|
./bin/neo-go node
|
|
|
|
```
|
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
Or specify a different network with appropriate flag like this:
|
2019-09-02 13:43:44 +00:00
|
|
|
|
|
|
|
```
|
|
|
|
./bin/neo-go node --mainnet
|
|
|
|
```
|
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
By default the node will run in foreground using current standard output for
|
|
|
|
logging.
|
2019-09-02 13:43:44 +00:00
|
|
|
|
2021-05-05 07:57:31 +00:00
|
|
|
### Restarting node services
|
|
|
|
|
|
|
|
To restart some of the node services without full node restart, send the SIGHUP
|
|
|
|
signal. List of the services to be restarted on SIGHUP receiving:
|
|
|
|
|
|
|
|
| Service | Action |
|
|
|
|
| --- | --- |
|
|
|
|
| RPC server | Restarting with the old configuration and updated TLS certificates |
|
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
### DB import/exports
|
2019-09-02 13:43:44 +00:00
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
Node operates using some database as a backend to store blockchain data. NeoGo
|
|
|
|
allows to dump chain into file from the database (when node is stopped) or to
|
|
|
|
import blocks from file into the database (also when node is stopped). Use
|
|
|
|
`db` command for that.
|
2019-09-02 13:43:44 +00:00
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
## Smart contracts
|
2019-09-02 13:43:44 +00:00
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
Use `contract` command to create/compile/deploy/invoke/debug smart contracts,
|
|
|
|
see [compiler documentation](compiler.md).
|
2019-09-02 13:43:44 +00:00
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
## Wallet operations
|
2019-09-02 13:43:44 +00:00
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
`wallet` command provides interface for all operations requiring a wallet
|
|
|
|
(except contract deployment and invocations that are done via `contract
|
|
|
|
deploy` and `contract invokefunction`). Wallet management (creating wallet,
|
|
|
|
adding addresses/keys to it) is available there as well as wallet-related
|
|
|
|
functions like NEP-17 transfers, NEO votes, multi-signature signing and other
|
|
|
|
things.
|
2019-09-02 13:43:44 +00:00
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
### Wallet management
|
2019-09-02 13:43:44 +00:00
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
#### Create wallet
|
2019-09-02 13:43:44 +00:00
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
Use `wallet init` command to create new wallet:
|
|
|
|
```
|
|
|
|
./bin/neo-go wallet init -w wallet.nep6
|
|
|
|
|
|
|
|
{
|
|
|
|
"version": "3.0",
|
|
|
|
"accounts": [],
|
|
|
|
"scrypt": {
|
|
|
|
"n": 16384,
|
|
|
|
"r": 8,
|
|
|
|
"p": 8
|
|
|
|
},
|
|
|
|
"extra": {
|
|
|
|
"Tokens": null
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
wallet successfully created, file location is wallet.nep6
|
|
|
|
```
|
2019-09-02 13:43:44 +00:00
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
where "wallet.nep6" is a wallet file name. This wallet will be empty, to
|
|
|
|
generate a new key pair and add an account for it use `-a` option:
|
|
|
|
```
|
|
|
|
./bin/neo-go wallet init -w wallet.nep6 -a
|
|
|
|
Enter the name of the account > Name
|
|
|
|
Enter passphrase >
|
|
|
|
Confirm passphrase >
|
|
|
|
|
|
|
|
{
|
|
|
|
"version": "3.0",
|
|
|
|
"accounts": [
|
|
|
|
{
|
|
|
|
"address": "NMe64G6j6nkPZby26JAgpaCNrn1Ee4wW6E",
|
|
|
|
"key": "6PYL2UrC11nWFJWSLiqsPKCNm9u4zr4ttX1ZbV9f2fLDqXsePioVxEsYdg",
|
|
|
|
"label": "Name",
|
|
|
|
"contract": {
|
|
|
|
"script": "DCEDzs1j19gSDDsZTDsogN1Kr+FHXFfkDIUoctcwVhUlgUBBdHR2qg==",
|
|
|
|
"parameters": [
|
|
|
|
{
|
|
|
|
"name": "parameter0",
|
|
|
|
"type": "Signature"
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"deployed": false
|
|
|
|
},
|
|
|
|
"lock": false,
|
|
|
|
"isdefault": false
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"scrypt": {
|
|
|
|
"n": 16384,
|
|
|
|
"r": 8,
|
|
|
|
"p": 8
|
|
|
|
},
|
|
|
|
"extra": {
|
|
|
|
"Tokens": null
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
wallet successfully created, file location is wallet.nep6
|
|
|
|
```
|
2019-09-02 13:43:44 +00:00
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
or use `wallet create` command to create new account in existing wallet:
|
|
|
|
```
|
|
|
|
./bin/neo-go wallet create -w wallet.nep6
|
|
|
|
Enter the name of the account > Joe Random
|
|
|
|
Enter passphrase >
|
|
|
|
Confirm passphrase >
|
|
|
|
```
|
2019-09-02 13:43:44 +00:00
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
#### Convert Neo Legacy wallets to Neo N3
|
2019-09-02 13:43:44 +00:00
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
Use `wallet convert` to update addresses in NEP-6 wallets used with Neo
|
|
|
|
Legacy. New wallet is specified in `-o` option, it will have the same keys
|
|
|
|
with Neo N3 addresses.
|
2019-09-02 13:43:44 +00:00
|
|
|
```
|
2021-03-18 19:08:14 +00:00
|
|
|
./bin/neo-go wallet convert -w old.nep6 -o new.nep6
|
2019-09-02 13:43:44 +00:00
|
|
|
```
|
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
#### Check wallet contents
|
|
|
|
`wallet dump` can be used to see wallet contents in more user-friendly way,
|
|
|
|
its output is the same NEP-6 JSON, but better formatted. You can also decrypt
|
|
|
|
keys at the same time with `-d` option (you'll be prompted for password):
|
|
|
|
```
|
|
|
|
./bin/neo-go wallet dump -w wallet.nep6 -d
|
|
|
|
Enter wallet password >
|
|
|
|
|
|
|
|
{
|
|
|
|
"version": "3.0",
|
|
|
|
"accounts": [
|
|
|
|
{
|
|
|
|
"address": "NMe64G6j6nkPZby26JAgpaCNrn1Ee4wW6E",
|
|
|
|
"key": "6PYL2UrC11nWFJWSLiqsPKCNm9u4zr4ttX1ZbV9f2fLDqXsePioVxEsYdg",
|
|
|
|
"label": "Name",
|
|
|
|
"contract": {
|
|
|
|
"script": "DCEDzs1j19gSDDsZTDsogN1Kr+FHXFfkDIUoctcwVhUlgUBBdHR2qg==",
|
|
|
|
"parameters": [
|
|
|
|
{
|
|
|
|
"name": "parameter0",
|
|
|
|
"type": "Signature"
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"deployed": false
|
|
|
|
},
|
|
|
|
"lock": false,
|
|
|
|
"isdefault": false
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"scrypt": {
|
|
|
|
"n": 16384,
|
|
|
|
"r": 8,
|
|
|
|
"p": 8
|
|
|
|
},
|
|
|
|
"extra": {
|
|
|
|
"Tokens": null
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
2019-09-02 13:43:44 +00:00
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
You can also get public keys for addresses stored in your wallet with `wallet
|
|
|
|
dump-keys` command:
|
|
|
|
```
|
|
|
|
./bin/neo-go wallet dump-keys -w wallet.nep6
|
|
|
|
NMe64G6j6nkPZby26JAgpaCNrn1Ee4wW6E (simple signature contract):
|
|
|
|
03cecd63d7d8120c3b194c3b2880dd4aafe1475c57e40c852872d7305615258140
|
|
|
|
```
|
2019-09-02 13:43:44 +00:00
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
#### Private key export
|
|
|
|
`wallet export` allows you to export private key in NEP-2 encrypted or WIF
|
|
|
|
(unencrypted) form (`-d` flag).
|
|
|
|
```
|
|
|
|
$ ./bin/neo-go wallet export -w wallet.nep6 -d NMe64G6j6nkPZby26JAgpaCNrn1Ee4wW6E
|
|
|
|
Enter password >
|
|
|
|
KyswN8r48dhsvyQJVy97RWnZmKgYLrXv9mCL81Kb4vAagZiCsePv
|
|
|
|
```
|
2019-09-02 13:43:44 +00:00
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
#### Private key import
|
|
|
|
You can import NEP-2 or WIF private key along with verification contract (if
|
|
|
|
it's non-standard):
|
2019-09-02 13:43:44 +00:00
|
|
|
```
|
2021-03-18 19:08:14 +00:00
|
|
|
./bin/neo-go wallet import --wif KwYgW8gcxj1JWJXhPSu4Fqwzfhp5Yfi42mdYmMa4XqK7NJxXUSK7 -w wallet.nep6
|
|
|
|
Provided WIF was unencrypted. Wallet can contain only encrypted keys.
|
|
|
|
Enter the name of the account > New Account
|
|
|
|
Enter passphrase >
|
|
|
|
Confirm passphrase >
|
2019-09-02 13:43:44 +00:00
|
|
|
```
|
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
#### Special accounts
|
|
|
|
Multisignature accounts can be imported with `wallet import-multisig`, you'll
|
|
|
|
need all public keys and one private key to do that. Then you could sign
|
|
|
|
transactions for this multisignature account with imported key.
|
|
|
|
|
|
|
|
`wallet import-deployed` can be used to create wallet accounts for deployed
|
|
|
|
contracts. They also can have WIF keys associated with them (in case your
|
|
|
|
contract's `verify` method needs some signature).
|
2019-09-02 13:43:44 +00:00
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
### Neo voting
|
|
|
|
`wallet candidate` provides commands to register or unregister a committee
|
|
|
|
(and therefore validator) candidate key:
|
2019-09-02 13:43:44 +00:00
|
|
|
```
|
2021-03-18 19:08:14 +00:00
|
|
|
./bin/neo-go wallet candidate register -a NMe64G6j6nkPZby26JAgpaCNrn1Ee4wW6E -w wallet.json -r http://localhost:20332
|
2019-09-02 13:43:44 +00:00
|
|
|
```
|
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
You can also vote for candidates if you own NEO:
|
|
|
|
```
|
|
|
|
./bin/neo-go wallet candidate vote -a NMe64G6j6nkPZby26JAgpaCNrn1Ee4wW6E -w wallet.json -r http://localhost:20332 -c 03cecd63d7d8120c3b194c3b2880dd4aafe1475c57e40c852872d7305615258140
|
|
|
|
```
|
|
|
|
|
|
|
|
### NEP-17 token functions
|
2019-09-02 13:43:44 +00:00
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
`wallet nep17` contains a set of commands to use for NEP-17 tokens.
|
2019-09-02 13:43:44 +00:00
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
#### Token metadata
|
|
|
|
|
|
|
|
NEP-17 commands are designed to work with any NEP-17 tokens, but NeoGo needs
|
|
|
|
some metadata for these tokens to function properly. Native NEO or GAS are
|
|
|
|
known to NeoGo by default, but other tokens are not. NeoGo can get this
|
|
|
|
metadata from the specified RPC server, but that's an additional request to
|
|
|
|
make, so if you care about command processing delay you can import token
|
|
|
|
metadata into the wallet with `wallet nep17 import` command. It'll be stored
|
|
|
|
in the `extra` section of the wallet.
|
2019-09-02 13:43:44 +00:00
|
|
|
```
|
2021-03-18 19:08:14 +00:00
|
|
|
./bin/neo-go wallet nep17 import -w wallet.nep6 -r http://localhost:20332 -t abcdefc189f30098b0ba6a2eb90b3a925800ffff
|
2019-09-02 13:43:44 +00:00
|
|
|
```
|
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
You can later see what token data you have in your wallet with `wallet nep17
|
|
|
|
info` command and remove tokens you don't need with `wallet nep17 remove`.
|
2019-09-02 13:43:44 +00:00
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
#### Balance
|
|
|
|
Getting balance is easy:
|
2019-09-02 13:43:44 +00:00
|
|
|
```
|
2021-03-18 19:08:14 +00:00
|
|
|
./bin/neo-go wallet nep17 balance -w /etc/neo-go/wallet.json -r http://localhost:20332
|
2019-09-02 13:43:44 +00:00
|
|
|
```
|
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
By default you'll get data for all tokens for the default wallet's
|
|
|
|
address. You can select non-default address with `-a` flag and/or select token
|
|
|
|
with `--token` flag (token hash or name can be used as parameter)
|
|
|
|
|
|
|
|
#### Transfers
|
2019-09-02 13:43:44 +00:00
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
`wallet nep17 transfer` creates a token transfer transaction and pushes it to
|
|
|
|
the RPC server (or saves to file if it needs to be signed by multiple
|
|
|
|
parties). For example, transferring 100 GAS looks like this:
|
|
|
|
|
|
|
|
```
|
|
|
|
./bin/neo-go wallet nep17 transfer -w wallet.nep6 -r http://localhost:20332 --to NjEQfanGEXihz85eTnacQuhqhNnA6LxpLp --from NMe64G6j6nkPZby26JAgpaCNrn1Ee4wW6E --token GAS --amount 100
|
|
|
|
```
|
|
|
|
|
|
|
|
You can omit `--from` parameter (default wallet's address will be used in this
|
|
|
|
case), you can add `--gas` for extra network fee (raising priority of your
|
|
|
|
transaction). And you can save transaction to file with `--out` instead of
|
|
|
|
sending it to the network if it needs to be signed by multiple parties.
|
|
|
|
|
|
|
|
One `transfer` invocation creates one transaction, but in case you need to do
|
|
|
|
many transfers you can save on network fees by doing multiple token moves with
|
|
|
|
one transaction by using `wallet nep17 multitransfer` command. It can transfer
|
|
|
|
things from one account to many, its syntax differs from `transfer` in that
|
|
|
|
you don't have `--token`, `--to` and `--amount` options, but instead you can
|
|
|
|
specify multiple "token:addr:amount" sets after all other options. The same
|
|
|
|
transfer as above can be done with `multitransfer` by doing this:
|
2019-09-02 13:43:44 +00:00
|
|
|
```
|
2021-03-18 19:08:14 +00:00
|
|
|
./bin/neo-go wallet nep17 multitransfer -w wallet.nep6 -r http://localhost:20332 --from NMe64G6j6nkPZby26JAgpaCNrn1Ee4wW6E GAS:NjEQfanGEXihz85eTnacQuhqhNnA6LxpLp:100
|
2019-09-02 13:43:44 +00:00
|
|
|
```
|
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
#### GAS claims
|
|
|
|
|
|
|
|
While Neo N3 doesn't have any notion of "claim transaction" and has GAS
|
|
|
|
automatically distributed with every NEO transfer for NEO owners you still
|
|
|
|
won't get GAS if you don't do any actions. So the old `wallet claim` command
|
|
|
|
was updated to be an easier way to do NEO "flipping" when you send a
|
|
|
|
transaction that transfers all of your NEO to yourself thereby triggering GAS
|
|
|
|
distribution.
|
2019-09-02 13:43:44 +00:00
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
## Conversion utility
|
|
|
|
|
|
|
|
NeoGo provides conversion utility command to reverse data, convert script
|
|
|
|
hashes to/from address, convert data to/from hexadecimal or base64
|
|
|
|
representation. All of this is done by a single `util convert` command like
|
|
|
|
this:
|
|
|
|
```
|
|
|
|
$ ./bin/neo-go util convert deee79c189f30098b0ba6a2eb90b3a9258a6c7ff
|
|
|
|
BE ScriptHash to Address NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6
|
|
|
|
LE ScriptHash to Address NjEQfanGEXihz85eTnacQuhqhNnA6LxpLp
|
|
|
|
Hex to String "\xde\xeey\xc1\x89\xf3\x00\x98\xb0\xbaj.\xb9\v:\x92X\xa6\xc7\xff"
|
|
|
|
Hex to Integer -1256651697634605895065630637163547727407485218
|
|
|
|
Swap Endianness ffc7a658923a0bb92e6abab09800f389c179eede
|
|
|
|
Base64 to String "u\xe7\x9e\xef\xd75\xf3\xd7\xf7\xd3O|oF\xda魞o\xdd\x1bݯv\xe7ƺs\xb7\xdf"
|
|
|
|
Base64 to BigInteger -222811771454869584930239486728381018152491835874567723544539443409000587
|
|
|
|
String to Hex 64656565373963313839663330303938623062613661326562393062336139323538613663376666
|
|
|
|
String to Base64 ZGVlZTc5YzE4OWYzMDA5OGIwYmE2YTJlYjkwYjNhOTI1OGE2YzdmZg==
|
|
|
|
```
|
|
|
|
|
|
|
|
## VM CLI
|
|
|
|
There is a VM CLI that you can use to load/analyze/run/step through some code:
|
2019-09-02 13:43:44 +00:00
|
|
|
|
|
|
|
```
|
|
|
|
./bin/neo-go vm
|
|
|
|
```
|
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
Some basic commands available there:
|
2019-09-02 13:43:44 +00:00
|
|
|
|
|
|
|
- `loadgo` -- loads smart contract `NEO-GO-VM > loadgo TestContract/main.go`
|
|
|
|
- `ops` -- show the opcodes of currently loaded contract
|
|
|
|
- `run` -- executes currently loaded contract
|
|
|
|
|
2021-03-18 19:08:14 +00:00
|
|
|
Use `help` command to get more detailed information on all possibilities and
|
|
|
|
particular commands. Note that this VM is completely disconnected from the
|
|
|
|
blockchain, so you won't have all interop functionality available for smart
|
|
|
|
contracts (use test invocations via RPC for that).
|