Book: Document CLI durable nonce account management (#7595)
* Book: Document CLI durable nonce account management * Fix rent link * review
This commit is contained in:
parent
87b2525e03
commit
ce1d36cacb
|
@ -39,6 +39,7 @@
|
||||||
* [Installation](paper-wallet/installation.md)
|
* [Installation](paper-wallet/installation.md)
|
||||||
* [Paper Wallet Usage](paper-wallet/usage.md)
|
* [Paper Wallet Usage](paper-wallet/usage.md)
|
||||||
* [Offline Signing](offline-signing/README.md)
|
* [Offline Signing](offline-signing/README.md)
|
||||||
|
* [Durable Transaction Nonces](offline-signing/durable-nonce.md)
|
||||||
* [API Reference](api-reference/README.md)
|
* [API Reference](api-reference/README.md)
|
||||||
* [Transaction](api-reference/transaction-api.md)
|
* [Transaction](api-reference/transaction-api.md)
|
||||||
* [Instruction](api-reference/instruction-api.md)
|
* [Instruction](api-reference/instruction-api.md)
|
||||||
|
|
|
@ -201,6 +201,7 @@ OPTIONS:
|
||||||
SUBCOMMANDS:
|
SUBCOMMANDS:
|
||||||
address Get your public key
|
address Get your public key
|
||||||
airdrop Request lamports
|
airdrop Request lamports
|
||||||
|
authorize-nonce-account Assign account authority to a new entity
|
||||||
balance Get your balance
|
balance Get your balance
|
||||||
cancel Cancel a transfer
|
cancel Cancel a transfer
|
||||||
catchup Wait for a validator to catch up to the cluster
|
catchup Wait for a validator to catch up to the cluster
|
||||||
|
@ -305,6 +306,35 @@ ARGS:
|
||||||
<UNIT> Specify unit to use for request and balance display [possible values: SOL, lamports]
|
<UNIT> Specify unit to use for request and balance display [possible values: SOL, lamports]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### solana-authorize-nonce-account
|
||||||
|
```text
|
||||||
|
solana-authorize-nonce-account
|
||||||
|
Assign account authority to a new entity
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
solana authorize-nonce-account [FLAGS] [OPTIONS] <NONCE_ACCOUNT> <NEW_AUTHORITY_PUBKEY>
|
||||||
|
|
||||||
|
FLAGS:
|
||||||
|
-h, --help Prints help information
|
||||||
|
--skip-seed-phrase-validation Skip validation of seed phrases. Use this if your phrase does not use the BIP39
|
||||||
|
official English word list
|
||||||
|
-V, --version Prints version information
|
||||||
|
-v, --verbose Show extra information header
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
--ask-seed-phrase <KEYPAIR NAME> Securely recover a keypair using a seed phrase and optional passphrase
|
||||||
|
[possible values: keypair]
|
||||||
|
-C, --config <PATH> Configuration file to use [default:
|
||||||
|
~/.config/solana/cli/config.yml]
|
||||||
|
-u, --url <URL> JSON RPC URL for the solana cluster
|
||||||
|
-k, --keypair <PATH> /path/to/id.json
|
||||||
|
--nonce-authority <KEYPAIR> Specify nonce authority if different from account
|
||||||
|
|
||||||
|
ARGS:
|
||||||
|
<NONCE_ACCOUNT> Address of the nonce account
|
||||||
|
<NEW_AUTHORITY_PUBKEY> Account to be granted authority of the nonce account
|
||||||
|
```
|
||||||
|
|
||||||
#### solana-balance
|
#### solana-balance
|
||||||
```text
|
```text
|
||||||
solana-balance
|
solana-balance
|
||||||
|
|
|
@ -75,3 +75,11 @@ Output
|
||||||
```text
|
```text
|
||||||
4vC38p4bz7XyiXrk6HtaooUqwxTWKocf45cstASGtmrD398biNJnmTcUCVEojE7wVQvgdYbjHJqRFZPpzfCQpmUN
|
4vC38p4bz7XyiXrk6HtaooUqwxTWKocf45cstASGtmrD398biNJnmTcUCVEojE7wVQvgdYbjHJqRFZPpzfCQpmUN
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Buying More Time to Sign
|
||||||
|
|
||||||
|
Typically a Solana transaction must be signed and accepted by the network within
|
||||||
|
a number of slots from the blockhash in its `recent_blockhash` field (~2min at
|
||||||
|
the time of this writing). If your signing procedure takes longer than this, a
|
||||||
|
[Durable Transaction Nonce](durable-nonce.md) can give you the extra time you
|
||||||
|
need.
|
||||||
|
|
|
@ -0,0 +1,188 @@
|
||||||
|
# Durable Transaction Nonces
|
||||||
|
|
||||||
|
Durable transaction nonces are a mechanism for getting around the typical
|
||||||
|
short lifetime of a transaction's [`recent_blockhash`](../transaction.md#recent-blockhash).
|
||||||
|
They are implemented as a Solana Program, the mechanics of which can be read
|
||||||
|
about in the [proposal](../implemented-proposals/durable-tx-nonces.md).
|
||||||
|
|
||||||
|
## Known Issues
|
||||||
|
|
||||||
|
### Fee Theft Opportunity
|
||||||
|
|
||||||
|
The durable nonce implementation contains a vulernability which allows for fees
|
||||||
|
to be stolen by a transaction using the feature under certain conditions. If the
|
||||||
|
transaction fails with an instruction errror, the runtime rolls back the step
|
||||||
|
that advanced the stored nonce, allowing it to be replayed and fees charged.
|
||||||
|
This can be repeated until the stored nonce is successfully advanced.
|
||||||
|
|
||||||
|
- Mitigation
|
||||||
|
|
||||||
|
To minimize loss of funds, use a low-balance account to pay fees on a durable
|
||||||
|
nonce transaction.
|
||||||
|
|
||||||
|
If a transaction using the durable nonce feature fails with an instruction error,
|
||||||
|
immediately submit a new transaction that advances the nonce and will certainly
|
||||||
|
succeed. The simplest way to do this is with a single-instruction
|
||||||
|
`NonceInstruction::Nonce` transaction, which can be sent using the CLI
|
||||||
|
[`new-nonce`](#advancing-the-stored-nonce-value) command.
|
||||||
|
|
||||||
|
- Issue Tracking
|
||||||
|
|
||||||
|
This issue is being actively addressed, progress can be followed on
|
||||||
|
[Github](https://github.com/solana-labs/solana/issues/7443).
|
||||||
|
|
||||||
|
## Usage Examples
|
||||||
|
|
||||||
|
Full usage details for durable nonce CLI commands can be found in the
|
||||||
|
[CLI reference](../api-reference/cli.md).
|
||||||
|
|
||||||
|
Additionally, authority over a nonce account can be assigned to another entity.
|
||||||
|
This enables the creation of more complex account ownership arrangements and
|
||||||
|
derived account addresses not associated with a keypair. The
|
||||||
|
`--nonce-authority <AUTHORITY_KEYPAIR>` argument is used to specify this
|
||||||
|
authority and is supported by the following commands
|
||||||
|
* `create-nonce-account`
|
||||||
|
* `new-nonce`
|
||||||
|
* `withdraw-from-nonce-account`
|
||||||
|
* `authorize-nonce-account`
|
||||||
|
|
||||||
|
### Nonce Account Creation
|
||||||
|
|
||||||
|
The durable transaction nonce feature uses an account to store the next nonce
|
||||||
|
value. Durable nonce accounts must be [rent-exempt](../implemented-proposals/rent.md#two-tiered-rent-regime),
|
||||||
|
so need to carry the minimum balance to acheive this.
|
||||||
|
|
||||||
|
A nonce account is created by first generating a new keypair, then create the account on chain
|
||||||
|
|
||||||
|
- Command
|
||||||
|
|
||||||
|
```bash
|
||||||
|
solana-keygen new -o nonce-keypair.json
|
||||||
|
solana create-nonce-account nonce-keypair.json 1 SOL
|
||||||
|
```
|
||||||
|
|
||||||
|
- Output
|
||||||
|
|
||||||
|
```text
|
||||||
|
2SymGjGV4ksPdpbaqWFiDoBz8okvtiik4KE9cnMQgRHrRLySSdZ6jrEcpPifW4xUpp4z66XM9d9wM48sA7peG2XL
|
||||||
|
```
|
||||||
|
|
||||||
|
{% hint style="info" %}
|
||||||
|
To keep the keypair entirely offline, use the [Paper Wallet](../paper-wallet/README.md)
|
||||||
|
keypair generation [instructions](../paper-wallet/usage.md#seed-phrase-generation.md)
|
||||||
|
instead
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
|
{% hint style="info" %}
|
||||||
|
[Full usage documentation](../api-reference/cli.md#solana-create-nonce-account)
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
|
### Querying the Stored Nonce Value
|
||||||
|
|
||||||
|
Creating a durable nonce transaction requires passing the stored nonce value as
|
||||||
|
the value to the `--blockhash` argument upon signing and submission. Obtain the
|
||||||
|
presently stored nonce value with
|
||||||
|
|
||||||
|
- Command
|
||||||
|
|
||||||
|
```bash
|
||||||
|
solana get-nonce nonce-keypair.json
|
||||||
|
```
|
||||||
|
|
||||||
|
- Output
|
||||||
|
|
||||||
|
```text
|
||||||
|
8GRipryfxcsxN8mAGjy8zbFo9ezaUsh47TsPzmZbuytU
|
||||||
|
```
|
||||||
|
|
||||||
|
{% hint style="info" %}
|
||||||
|
[Full usage documentation](../api-reference/cli.md#solana-get-nonce)
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
|
### Advancing the Stored Nonce Value
|
||||||
|
|
||||||
|
While not typically needed outside a more useful transaction, the stored nonce
|
||||||
|
value can be advanced by
|
||||||
|
|
||||||
|
- Command
|
||||||
|
|
||||||
|
```bash
|
||||||
|
solana new-nonce nonce-keypair.json
|
||||||
|
```
|
||||||
|
|
||||||
|
- Output
|
||||||
|
|
||||||
|
```text
|
||||||
|
44jYe1yPKrjuYDmoFTdgPjg8LFpYyh1PFKJqm5SC1PiSyAL8iw1bhadcAX1SL7KDmREEkmHpYvreKoNv6fZgfvUK
|
||||||
|
```
|
||||||
|
|
||||||
|
{% hint style="info" %}
|
||||||
|
[Full usage documentation](../api-reference/cli.md#solana-new-nonce)
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
|
### Display Nonce Account
|
||||||
|
|
||||||
|
Inspect a nonce account in a more human friendly format with
|
||||||
|
|
||||||
|
- Command
|
||||||
|
|
||||||
|
```bash
|
||||||
|
solana show-nonce-account nonce-keypair.json
|
||||||
|
```
|
||||||
|
|
||||||
|
- Output
|
||||||
|
|
||||||
|
```text
|
||||||
|
balance: 0.5 SOL
|
||||||
|
minimum balance required: 0.00136416 SOL
|
||||||
|
nonce: DZar6t2EaCFQTbUP4DHKwZ1wT8gCPW2aRfkVWhydkBvS
|
||||||
|
```
|
||||||
|
|
||||||
|
{% hint style="info" %}
|
||||||
|
[Full usage documentation](../api-reference/cli.md#solana-show-nonce-account)
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
|
### Withdraw Funds from a Nonce Account
|
||||||
|
|
||||||
|
Withdraw funds from a nonce account with
|
||||||
|
|
||||||
|
- Command
|
||||||
|
|
||||||
|
```bash
|
||||||
|
solana withdraw-from-nonce-account nonce-keypair.json ~/.config/solana/id.json 0.5 SOL
|
||||||
|
```
|
||||||
|
|
||||||
|
- Output
|
||||||
|
|
||||||
|
```text
|
||||||
|
3foNy1SBqwXSsfSfTdmYKDuhnVheRnKXpoPySiUDBVeDEs6iMVokgqm7AqfTjbk7QBE8mqomvMUMNQhtdMvFLide
|
||||||
|
```
|
||||||
|
|
||||||
|
{% hint style="info" %}
|
||||||
|
Close a nonce account by withdrawing the full balance
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
|
{% hint style="info" %}
|
||||||
|
[Full usage documentation](../api-reference/cli.md#solana-withdraw-from-nonce-account)
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
|
### Assign a New Authority to a Nonce Account
|
||||||
|
|
||||||
|
Reassign the authority of a nonce account after creation with
|
||||||
|
|
||||||
|
- Command
|
||||||
|
|
||||||
|
```bash
|
||||||
|
solana authorize-nonce-account nonce-keypair.json nonce-authority.json
|
||||||
|
```
|
||||||
|
|
||||||
|
- Output
|
||||||
|
|
||||||
|
```text
|
||||||
|
3F9cg4zN9wHxLGx4c3cUKmqpej4oa67QbALmChsJbfxTgTffRiL3iUehVhR9wQmWgPua66jPuAYeL1K2pYYjbNoT
|
||||||
|
```
|
||||||
|
|
||||||
|
{% hint style="info" %}
|
||||||
|
[Full usage documentation](../api-reference/cli.md#solana-authorize-nonce-account)
|
||||||
|
{% endhint %}
|
||||||
|
|
Loading…
Reference in New Issue