交易如何工作

介绍

交易是 Stacks 中的基本执行单元。每笔交易都由一个 Stacks 账户发起,并永久保留在 Stacks 网络历史中。本指南帮助你理解 Stacks 交易。

生命周期

交易在最终确认之前会经历多个阶段。

1

生成

交易根据编码规范进行组装。

2

验证和签名

交易会被验证以确认其格式正确。所需的签名会被填入。

3

广播

交易被发送到节点。

4

注册

矿工接收交易、验证并将其添加到内存池(mempool),这是所有待处理交易的暂存区域。

5

处理

矿工审查内存池并为下一个要挖出的区块选择交易。根据交易类型,在此步骤期间可能发生不同的操作。例如,在代币转移时可以验证后置条件、可以铸造智能合约定义的代币,或者尝试调用现有智能合约的方法。

6

确认

矿工成功提议包含一组交易的区块。当堆叠者(stackers)批准时,区块内的交易会成功在网络中传播。

circle-info

一旦交易被注册,它可以处于三种状态之一: 待处理, 成功,或 失败.

类型

Stacks 支持一组不同的交易类型:

类型

描述

任期变更

TenureChange

任期变更是现有 Stacks 区块链中的一个事件,当一个矿工从另一个矿工接管创建新 Stacks 区块的责任时发生。任期变更发生于通过加密抽签发现 Stacks 区块时。由堆叠者(stackers)执行。

发现任期变更区块

TenureChange-BlockFound

一笔 TenureChange-BlockFound 交易由获胜的抽签引发。这会导致新矿工开始产生区块,并阻止当前矿工继续产生更多区块。

延长任期变更

TenureChange-Extend

一笔 TenureChange-Extend,由堆叠者引发,重置当前任期的正在进行的执行预算,从而允许矿工继续产生区块。

代币转移

token_transfer

资产从发送方转移到接收方

合约部署

smart_contract

合约实例化

合约调用

contract_call

对公共的、非只读函数的合约调用

费用

费用用于激励矿工在 Stacks 区块链上确认交易。费用根据估算费率和原始交易大小(字节数)计算。费率是由市场决定的变量。对于测试网,费率设为 1 微 STX。

随机数(Nonce)

每个账户都带有一个 nonce 属性arrow-up-right ,该属性指示给定账户已处理的交易数量。随机数是一次性代码,新账户从 0 开始,并在每笔交易后递增 1。

随机数会被添加到所有交易中并帮助识别它们,以确保交易按顺序处理并避免重复处理。

circle-info

共识机制还通过两种方式确保交易不会被“重放”。首先,节点查询其未花费交易输出(UTXO)以满足新交易中的支出条件。其次,节点之间发送的消息会检查序列号。

当构建新的代币转移交易时,需要获取并设置该账户的最新随机数。

如何检测并解决随机数间隙

Stacks 交易必须 严格按随机数顺序执行。当提交的交易具有高于预期的随机数时,网络并不会 立即 拒绝它——相反,网络会跟踪该间隙并等待缺失的随机数到达。

下面是一个概念性演练,包含来自 API 的可视化响应,说明当随机数按错序提交时系统的行为。

1

初始状态(没有待处理交易)

解释

  • 所有直到随机数 241 的交易都已执行

  • 网络期望的下一个随机数是 242 下一个

  • 当前内存池中没有等待的交易

  • 不存在随机数间隙

2

提交将来的随机数(245)

解释

  • 一笔随机数为 245 的交易现在在内存池中

  • 随机数(Nonce) 242, 243,并且 244 丢失

  • 在这些随机数被提交之前执行无法继续

  • possible_next_nonce 反映观察到的最高随机数 + 1

3

提交部分间隙(243)

解释

  • 随机数 243 现在存在于内存池中

  • 随机数(Nonce) 242 并且 244 仍然缺失

  • 执行仍然被阻塞

  • API 区分为:

    • detected_mempool_nonces → 已存在但未执行

    • detected_missing_nonces → 所需但尚未见到

4

填补更多间隙(244)

解释

  • 随机数(Nonce) 243 并且 244 都在内存池中等待

  • 随机数 242 仍然缺失

  • 执行仍停在 241

5

所有所需随机数均已存在(242)

解释

  • 所有所需随机数(242–245)现在可用

  • 没有间隙了

  • 网络可以按顺序执行交易

6

执行完成后

解释

  • 所有待处理交易都已执行

  • 该账户的随机数已递增到 245

  • 下一个有效的随机数现在是 246

  • 内存池状态再次清理完成

最后更新于

这有帮助吗?