首页 > 解决方案 > Substrate 链下签名交易问题

问题描述

我按照substrate offchain recipe 实现了一个需要进行签名交易的offchain worker。由于它不起作用,我添加了一些调试语句,它似乎正在检测 AppCrypto 中的帐户,创建有效负载,但未能生成签名。

pub type SignedPayload = generic::SignedPayload<Call, SignedExtra>;

impl<LocalCall> frame_system::offchain::CreateSignedTransaction<LocalCall> for Runtime
where
    Call: From<LocalCall>,
{
    fn create_transaction<C: frame_system::offchain::AppCrypto<Self::Public, Self::Signature>>(
        call: Call,
        public: <Signature as sp_runtime::traits::Verify>::Signer,
        account: AccountId,
        index: Index,
    ) -> Option<(
        Call,
        <UncheckedExtrinsic as sp_runtime::traits::Extrinsic>::SignaturePayload,
    )> {
        debug::debug!(target: "OWNERS", "create_transaction");
        debug::debug!(target: "OWNERS", "create_transaction account: {:?}", &account);

        let period = BlockHashCount::get() as u64;
        let current_block = System::block_number()
            .saturated_into::<u64>()
            .saturating_sub(1);
        let tip = 0;
        let extra: SignedExtra = (
            frame_system::CheckSpecVersion::<Runtime>::new(),
            frame_system::CheckTxVersion::<Runtime>::new(),
            frame_system::CheckGenesis::<Runtime>::new(),
            frame_system::CheckEra::<Runtime>::from(generic::Era::mortal(period, current_block)),
            frame_system::CheckNonce::<Runtime>::from(index),
            frame_system::CheckWeight::<Runtime>::new(),
            pallet_transaction_payment::ChargeTransactionPayment::<Runtime>::from(tip),
        );

        let raw_payload = SignedPayload::new(call, extra)
            .map_err(|e| {
                debug::native::warn!("SignedPayload error: {:?}", e);
            })
            .ok()?;
        debug::debug!(target: "OWNERS", "create_transaction raw payload ok");

        raw_payload.using_encoded(|payload| {
            debug::debug!(target: "OWNERS", "create_transaction payload: {:?}", &payload);
        });

        let signature = raw_payload.using_encoded(|payload| C::sign(payload, public));
        debug::debug!(target: "OWNERS", "create_transaction signature: {:?}", &signature);


        //let address = account;
        //let (call, extra, _) = raw_payload.deconstruct();
        //Some((call, (address.into(), signature, extra)))
        None
    }
}

这是上面的代码在我的日志中打印的内容:

2021-06-14 08:53:54.127 DEBUG ThreadId(34) OWNERS: create_transaction    
2021-06-14 08:53:54.127 DEBUG ThreadId(34) OWNERS: create_transaction account: 089e6f3129e3ab81bac78cef021d80debc3acb4c34152fa93b15b5174adfac69 (5CG1JeWG...)    
2021-06-14 08:53:54.128 DEBUG ThreadId(34) OWNERS: create_transaction raw payload ok    
2021-06-14 08:53:54.128 DEBUG ThreadId(34) OWNERS: create_transaction payload: [8, 0, 123, 0, 0, 0, 0, 0, 0, 0, 171, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 176, 170, 14, 20, 103, 190, 47, 243, 111, 165, 88, 217, 111, 60, 15, 40, 2, 215, 117, 222, 88, 154, 130, 62, 96, 141, 156, 91, 189, 180, 19, 0, 251, 232, 81, 216, 61, 240, 146, 99, 239, 45, 37, 48, 219, 73, 81, 38, 150, 3, 177, 214, 165, 143, 217, 107, 205, 218, 200, 232, 16, 55, 71, 176]    
2021-06-14 08:53:54.238 DEBUG ThreadId(34) OWNERS: create_transaction signature: None 

我正在使用基于基板标签 v3.0.0 的简单模板节点和托盘。

标签: substrate

解决方案


推荐阅读