持久交易nonce是一种绕过交易的典型短生命周期的机制recent_blockhash。它们作为Solana程序实现,其机制可在提案中阅读。随机数权威可以选择性地将nonce账户的权限分配给另一个账户。这样,新权限将从前一个权限(包括账户创建者)那里继承对nonce账户的完全
<!--StartFragment-->
持久交易 nonce 是一种绕过交易的典型短生命周期的机制 recent_blockhash
。它们作为 Solana 程序实现,其机制可在提案中阅读。
可以选择性地将 nonce 账户的权限分配给另一个账户。这样,新权限将从前一个权限(包括账户创建者)那里继承对 nonce 账户的完全控制权。此功能允许创建更复杂的账户所有权安排和与密钥对无关的派生账户地址。 --nonce-authority <AUTHORITY_KEYPAIR>
参数用于指定此账户,并由以下命令支持
create-nonce-account
new-nonce
withdraw-from-nonce-account
authorize-nonce-account
持久交易 nonce 功能使用一个账户来存储下一个 nonce 值。持久 nonce 账户必须是 免租的,因此需要持有最低余额才能实现这一点。
创建 nonce 账户的方法是先生成一个新的密钥对,然后在链上创建账户
solana-keygen new -o nonce-keypair.json
solana create-nonce-account nonce-keypair.json 1
2SymGjGV4ksPdpbaqWFiDoBz8okvtiik4KE9cnMQgRHrRLySSdZ6jrEcpPifW4xUpp4z66XM9d9wM48sA7peG2XL
要使密钥对完全离线,请使用 纸钱包说明
创建持久 nonce 交易需要--blockhash
在签名和提交时将存储的 nonce 值作为参数的值传递。使用以下方法获取当前存储的 nonce 值
solana nonce nonce-keypair.json
8GRipryfxcsxN8mAGjy8zbFo9ezaUsh47TsPzmZbuytU
虽然在更有用的交易之外通常不需要,但存储的 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 账户中提取资金
solana withdraw-from-nonce-account nonce-keypair.json ~/.config/solana/id.json 0.5
3foNy1SBqwXSsfSfTdmYKDuhnVheRnKXpoPySiUDBVeDEs6iMVokgqm7AqfTjbk7QBE8mqomvMUMNQhtdMvFLide
通过提取全部余额来关闭 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 需要一些资金来创建一个 nonce 账户并发送给 Bob。空投一些 SOL
$ solana airdrop -k alice.json 1
1 SOL
现在 Alice 需要一个 nonce 账户。创建一个
这里没有使用 单独的nonce 权限
alice.json
,因此对 nonce 账户拥有完全的权限
$ solana create-nonce-account -k alice.json nonce.json 0.1
3KPZr96BTsL3hqera9up82KAU462Gz31xjqJ6eHUAjF935Yf8i1kmfEbo6SVbNaACKE5z6gySrNjVRvmS8DcPuwV
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" })
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-->
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!