交易池包含本地节点已接收并验证的所有广播到网络的交易(已签名和未签名的)。 有效性 交易池检查交易有效性。请注意,交易的有效性不是硬连接到交易池中,而是由 runtime 定义的。有效性检查的示例是: 检查交易索引(nonce)是否正确。检查帐户是否有足够的资金来支付相关费用。检查签名是否有效。交易池还定期检查池中现有交易的有效性。如果发现无效或过期的非永久交易,则将从池中删除该交易。 排序 如果交易有效,则交易队列将交易分为两类: Ready Queue(就绪队列)—— 包括可以包含在新的未决区块中的交易。对于使用 FRAME 构建的 runtime,交易必须遵循就绪队列中的确切顺序。Future Queue(将来队列)—— 包含将来可能变得有效的交易。例如,某笔交易的随机数可能对于其帐户而言过高。该交易将在将来队列中等待,直到之前的交易包含在链中为止。注意:可以设计自定义 runtime 来删除严格的交易排序要求。这将允许整个节点在交易传播和区块包含方面实施不同的策略。 交易依赖 ValidTransaction结构定义了require并提供了用于构建交易依赖关系图的参数。该依赖关系图与 priority(下面会讨论到)一起,能让交易池产生有效的交易线性排列。 对于使用 FRAME 构建的 runtime,节点使用基于帐户的系统对交易进行排序。每个已签名的交易都需要包含一个随机数,每进行一次新交易,该随机数将增加 1。例如,来自新帐户的第一笔交易的nonce = 0,第二笔交易的nonce = 1。 至少,如果nonce> 1,则FRAME交易具有提供标签的encode(发送者++随机数)和需要require编码的标签(发送者++(nonce -1)),如果nonce = 0,则交易不需要任何内容。 至少,FRAME 交易具有一个encode(sender ++ nonce)的provides标签,和一个encode(sender ++ (nonce -1)) if nonce > 1的requires标签。如果 nonce=0则交易不需要任何内容。结果是,来自单个发件人的所有交易将形成其被包括的顺序。 Substrate 支持多个provides和requires标签,因此自定义 runtime 可以创建备用依赖项(排序)方案。 交易优先级 ValidTransaction结构中的交易priority(优先级)确定就绪队列中交易的顺序。如果节点是下一个区块生成者,则它将在下一个区块中按从高到低的优先级对交易进行排序,直到达到该区块的重量(weight)或长度限制为止。 priority定义在一个交易解锁多个相关交易的情况下关系图的线性顺序。例如,如果我们有两个(或多个)满足其依赖关系的交易,那么我们将使用优先级为它们选择顺序。 对于使用 FRAME 构建的 runtime,priority定义为交易要支付的费用。例如: 如果我们收到来自不同发件人的 2 笔交易 (withnonce=0),我们将使用priority来确定哪个交易更重要,并首先将其包含在该区块中。如果我们从同一发件人处收到具有相同随机数的 2 笔交易,则链上只能包含一项交易。我们使用priority选择较高fee(手续费)的交易来存储在交易池中。请注意,交易池不知道费用、帐户或签名 —— 它仅处理交易的priority、requires、和provides参数的抽象概念,要求并提供参数。所有其他详细信息由 runtime 通过validate_transaction函数定义。 交易的生命周期 交易可以遵循两种路径: 由我们的节点生产的区块 我们的节点侦听网络上的交易。 每笔交易都会经过验证,并将有效交易放置在交易池中。 交易池负责对交易进行排序,并返回准备好包含在该区块中的交易。准备队列中的交易用于构造区块。 执行交易并将状态更改存储在本地内存中。来自就绪队列的交易也将通过网络传播(即八卦)给对等方。由于队列前面的交易具有较高的优先级,并且更有可能在下一个区块中成功执行,因此我们将精确的排序用作未决区块。 构造好的区块将发布到网络。网络上的所有其他节点都接收并执行该区块。 请注意,在编写块时,不会从就绪队列中删除交易,而仅在导入区块时才将其删除。这是由于可能新近编写的区块可能无法进入规范链。 从网络中接收到的区块 区块被执行后,整个区块要么成功要么失败。 交易有效性 validate_transaction是从 runtime 中调用的 ,它检查有效签名和随机数(或 UTXO 链的输出)并返回Result。validate_transaction孤立地检查交易,因此它不会捕获错误,例如同一输出被使用了两次。 尽管有可能,但validate_transaction不会检查对 pallet 的调用是否会成功。它是潜在的 DoS 向量,因为网络中的所有交易都将传递到validate_transaction中。 validate_transaction函数应专注于为池提供必要的信息,以对交易进行排序和排优先级,并迅速拒绝所有无效或过时的交易。该函数将被频繁调用,对于同一交易可能多次调用。validate_transaction也有可能使依赖交易失败,如果该交易以正确的顺序执行时将通过execute_block的话。 了解更多 Extrinsics 外部信息:https://substrate.dev/docs/en/knowledgebase/learn-substrate/extrinsicsTransaction Fees 交易费:https://substrate.dev/docs/en/knowledgebase/runtime/fees欢迎学习 Substrate: https://substrate.dev/ 关注 Substrate 进展: https://github.com/paritytech/substrate 关注 Polkadot 进展: https://github.com/paritytech/polkadot 更多内容:如何从 Polkadot 财政部申请 DOT ?如何参与波卡生态项目并获得收益 ?为什么说波卡是从 0 到 1 的创新? 扫码关注公众号,回复 “1” 加入波卡群 关注 PolkaWorld 发现Web 3.0 时代新机遇 —- 编译者/作者:PolkaWorld 玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。 |
交易池|Substrate 文档
2020-08-06 PolkaWorld 来源:区块链网络
LOADING...
相关阅读:
- 帕维尔·杜洛夫(Pavel Durov)否认:“我们不出售电报”2020-08-06
- 研究:11家区块链公司被列入独角兽全球排名2020-08-06
- 东京大学招募XRP验证程序管理技术人员2020-08-06
- Republic通过安全令牌销售削减SEC繁文via节筹集1600万美元2020-08-06
- EOS随大势有所表现,大丰收,大宝功不可没,Organix又来了,EOS生态或将2020-08-05