【发布时间】:2021-10-06 14:15:02
【问题描述】:
我的托盘中运行了一个链下工作实例,它在时代选举结束后调用一个未签名的外部实例。这个未签名的外部数据的目的是将一些数据存储在链下索引存储中,以供下一个时代的所有验证者使用。如果有超过 1 个验证器在同一个块中调用此无符号外部,我会收到以下错误:
2021-10-06 14:06:19.406 WARN ThreadId(26) txpool: (offchain call) Error submitting a transaction to the pool: Pool(TooLowPriority { old: 10100, new: 10100 })
2021-10-06 14:06:19.406 ERROR ThreadId(26) pallet_participant: Failed in submit_participant
2021-10-06 14:06:19.406 ERROR ThreadId(26) pallet_participant: offchain_worker error: OffchainUnsignedTxSignedPayloadError
经过一番挖掘 (here),我发现错误来自同一块中的两个无符号外在数具有相同的随机数。 就我而言,由于我的托盘正在开发中,因此我的外部重量设置如下:
#[weight = 10000]
pub fn submit_participant(_signature: T::Signature) -> DispatchResult {
和我的验证无符号函数交易优先级设置如下:
fn validate_unsigned(_source: TransactionSource, call: &Self::Call) -> TransactionValidity {
let valid_tx = |provide| {
ValidTransaction::with_tag_prefix("pallet-participant")
.priority(100)
.and_provides([&provide])
.longevity(3)
.propagate(true)
.build()
};
所以问题是如何管理 nonce 以便它不会给我关于事务优先级的错误? 如果有这种实现的示例,那将非常有帮助。
【问题讨论】:
-
似乎 2 个外部参数完全相同,您想通过随机数来区分它们。你有没有想过设计是否合理?许多验证者发送相同的 tx 是什么意思。
-
许多验证者发送相同的交易意味着例如他们使用自己的相关数据调用相同的未签名交易,这些数据将存储在链下索引存储中。
-
因此,如果我们有 2 个验证者被选为时代选举后的下一个验证者,他们每个人都会从链下工作人员那里调用
Call::submit_participant(validator_A_data)和Call::submit_participant(validator_B_data)。当然,在存储数据时,存储密钥是从每个验证者的签名密钥中单独派生的。这对我来说产生了相同的随机数,可以从错误“10100”中看出。
标签: blockchain substrate polkadot