Solana CLI 中的持久事务 Nonces

持久交易nonce是一种绕过交易的典型短生命周期的机制recent_blockhash。它们作为Solana程序实现,其机制可在提案中阅读。随机数权威可以选择性地将nonce账户的权限分配给另一个账户。这样,新权限将从前一个权限(包括账户创建者)那里继承对nonce账户的完全

<!--StartFragment-->

持久交易 nonce 是一种绕过交易的典型短生命周期的机制 recent_blockhash。它们作为 Solana 程序实现,其机制可在提案中阅读。

随机数权威

可以选择性地将 nonce 账户的权限分配给另一个账户。这样,新权限将从前一个权限(包括账户创建者)那里继承对 nonce 账户的完全控制权。此功能允许创建更复杂的账户所有权安排和与密钥对无关的派生账户地址。 --nonce-authority &lt;AUTHORITY_KEYPAIR>参数用于指定此账户,并由以下命令支持

  • create-nonce-account
  • new-nonce
  • withdraw-from-nonce-account
  • authorize-nonce-account

Nonce 账户创建

持久交易 nonce 功能使用一个账户来存储下一个 nonce 值。持久 nonce 账户必须是 免租的,因此需要持有最低余额才能实现这一点。

创建 nonce 账户的方法是先生成一个新的密钥对,然后在链上创建账户

  • 命令
solana-keygen new -o nonce-keypair.json
solana create-nonce-account nonce-keypair.json 1
  • 输出
2SymGjGV4ksPdpbaqWFiDoBz8okvtiik4KE9cnMQgRHrRLySSdZ6jrEcpPifW4xUpp4z66XM9d9wM48sA7peG2XL

要使密钥对完全离线,请使用 纸钱包说明

查询存储的 Nonce值

创建持久 nonce 交易需要--blockhash在签名和提交时将存储的 nonce 值作为参数的值传递。使用以下方法获取当前存储的 nonce 值

  • 命令
solana nonce nonce-keypair.json
  • 输出
8GRipryfxcsxN8mAGjy8zbFo9ezaUsh47TsPzmZbuytU

提高存储的 Nonce值

虽然在更有用的交易之外通常不需要,但存储的 nonce 值可以通过以下方式提升:

  • 命令
solana new-nonce nonce-keypair.json
  • 输出
44jYe1yPKrjuYDmoFTdgPjg8LFpYyh1PFKJqm5SC1PiSyAL8iw1bhadcAX1SL7KDmREEkmHpYvreKoNv6fZgfvUK

显示随机数帐户

使用更人性化的格式检查 nonce 账户

  • 命令
solana nonce-account nonce-keypair.json
  • 输出
balance: 0.5 SOL
minimum balance required: 0.00136416 SOL
nonce: DZar6t2EaCFQTbUP4DHKwZ1wT8gCPW2aRfkVWhydkBvS

从 Nonce账户

使用以下方式从 nonce 账户中提取资金

  • 命令
solana withdraw-from-nonce-account nonce-keypair.json ~/.config/solana/id.json 0.5
  • 输出
3foNy1SBqwXSsfSfTdmYKDuhnVheRnKXpoPySiUDBVeDEs6iMVokgqm7AqfTjbk7QBE8mqomvMUMNQhtdMvFLide

通过提取全部余额来关闭 nonce 账户

为 Nonce账户

创建 nonce 账户后重新分配权限

  • 命令
solana authorize-nonce-account nonce-keypair.json nonce-authority.json
  • 输出
3F9cg4zN9wHxLGx4c3cUKmqpej4oa67QbALmChsJbfxTgTffRiL3iUehVhR9wQmWgPua66jPuAYeL1K2pYYjbNoT

其他支持持久随机数

要与其他 CLI 子命令一起使用持久随机数,必须支持两个参数。

  • --nonce,指定存储 nonce 值的账户
  • --nonce-authority,指定可选的随机数授权

到目前为止,以下子命令已接受此处理

  • pay
  • delegate-stake
  • deactivate-stake

使用持久随机数

这里我们演示了 Alice 使用持久随机数向 Bob 支付 1 个 SOL。对于所有支持持久随机数的子命令,该过程都是相同的

- 创建帐户

首先,我们需要一些 Alice、Alice 的随机数和 Bob 的账户

$ solana-keygen new -o alice.json
$ solana-keygen new -o nonce.json
$ solana-keygen new -o bob.json

- 为 Alice 的账户

Alice 需要一些资金来创建一个 nonce 账户并发送给 Bob。空投一些 SOL

$ solana airdrop -k alice.json 1
1 SOL

- 创建 Alice 的 nonce账户

现在 Alice 需要一个 nonce 账户。创建一个

这里没有使用 单独的nonce 权限alice.json,因此对 nonce 账户拥有完全的权限

$ solana create-nonce-account -k alice.json nonce.json 0.1
3KPZr96BTsL3hqera9up82KAU462Gz31xjqJ6eHUAjF935Yf8i1kmfEbo6SVbNaACKE5z6gySrNjVRvmS8DcPuwV

- 第一次向Bob

Alice 尝试向 Bob 付款,但签名时间过长。指定的区块哈希过期,交易失败

$ solana transfer -k alice.json --blockhash expiredDTaxfagttWjQweib42b6ZHADSx94Tw8gHx11 bob.json 0.01
[2020-01-02T18:48:28.462911000Z ERROR solana_cli::cli] Io(Custom { kind: Other, error: "Transaction \"33gQQaoPc9jWePMvDAeyJpcnSPiGUAdtVg8zREWv4GiKjkcGNufgpcbFyRKRrA25NkgjZySEeKue5rawyeH5TzsV\" failed: None" })
Error: Io(Custom { kind: Other, error: "Transaction \"33gQQaoPc9jWePMvDAeyJpcnSPiGUAdtVg8zREWv4GiKjkcGNufgpcbFyRKRrA25NkgjZySEeKue5rawyeH5TzsV\" failed: None" })

- Nonce 来救援

Alice 重试交易,这次指定她的 nonce 账户和存储在那里的区块哈希

记住,在这个例子中,alice.json是nonce 权限

$ solana nonce-account nonce.json
balance: 0.1 SOL
minimum balance required: 0.00136416 SOL
nonce: F7vmkY3DTaxfagttWjQweib42b6ZHADSx94Tw8gHx3W7
$ solana transfer -k alice.json --blockhash F7vmkY3DTaxfagttWjQweib42b6ZHADSx94Tw8gHx3W7 --nonce nonce.json bob.json 0.01
HR1368UKHVZyenmH7yVz5sBAijV6XAPeWbEiXEGVYQorRMcoijeNAbzZqEZiH8cDB8tk65ckqeegFjK8dHwNFgQ

- 成功

交易成功!Bob 从 Alice 处收到 0.01 SOL,Alice 存储的 nonce 值增加到新值

$ solana balance -k bob.json
0.01 SOL
$ solana nonce-account nonce.json
balance: 0.1 SOL
minimum balance required: 0.00136416 SOL
nonce: 6bjroqDcZgTv6Vavhqf81oBHTv3aMnX19UTB51YhAZnN

<!--EndFragment-->

  • 原创
  • 学分: 0
  • 分类: Solana
  • 标签:
点赞 0
收藏 0
分享

0 条评论

请先 登录 后评论
加密女士
加密女士
无代码发币平台