如何为未签名的交易实现递增随机数?

Jda*_*287 0 blockchain substrate polkadot

我的托盘中运行着一个链下工作实例,它在时代选举结束后调用一个未签名的外部实例。这个未签名的外部数据的目的是在链下索引存储中存储一些数据,供下一个时代的所有验证者使用。如果有超过 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 
Run Code Online (Sandbox Code Playgroud)

经过一番挖掘(此处),我发现错误是由于同一块中的两个无符号外部变量具有相同的随机数而导致的。就我而言,由于我的托盘正在开发中,因此我的外部重量设置如下:

#[weight = 10000]
pub fn submit_participant(_signature: T::Signature) -> DispatchResult {
Run Code Online (Sandbox Code Playgroud)

我的验证未签名函数的事务优先级设置如下:

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()
    };
Run Code Online (Sandbox Code Playgroud)

所以问题是如何管理随机数,以便它不会给我带来有关事务优先级的错误?如果有一个此类实现的示例,那将非常有帮助。

小智 6

未签名的交易不与任何帐户关联,因此它们也没有任何随机数。