ChargeTransactionPayment:验证和 pre_dispatch

ChargeTransactionPayment: validate and pre_dispatch

pallet-transaction-paymentChargeTransactionPayment 实现了 SignedExtension。在其代码中,validate()pre_dispatch() 都在内部调用 withdraw_fee()

为什么这不会导致多次提款?

另外,validate()可以调用多次。

https://github.com/paritytech/substrate/blob/v2.0.0/frame/transaction-payment/src/lib.rs#L511-L534

Why doesn't this cause multiple withdrawals?

在验证阶段,所有状态更改都将被丢弃。当交易存在于池中时使用验证阶段。在创作和导入时,它只经过 pre_dispatch.

Also, validate() could be called many times.

事实上,池(或者通常是运行时之外的任何组件)可能想要多次 re-validate 事务。关键是要记住状态更改在验证中被丢弃。

在此处查看更多信息:https://github.com/paritytech/substrate/blob/a200cdb93c6af5763b9c7bf313fa708764ac88ca/primitives/runtime/src/traits.rs#L711-L728