You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决FRAME v2实现Offchain-worker时CreateSignedTransaction编译报错

错误1:E0308 类型不匹配(MultiAddress预期()实际得到u32)

原因

你当前使用的最新版node-template默认没有集成Indices pallet,runtime配置的MultiAddress索引泛型参数为(),但Indices::unlookup()返回的是携带u32索引的MultiAddress变体,导致类型不兼容。

解决方案

直接使用账户ID构造MultiAddress即可,替换地址构造代码:

// 删掉原来的 let address = Indices::unlookup(account);
let address = MultiAddress::Id(account);

如果确实需要使用索引功能,可将Indices pallet完整集成到runtime中,调整对应类型配置即可。


错误2:E0277 不能从Option<MultiSignature>转换为MultiSignature

原因

C::sign()方法返回值是Option<MultiSignature>类型,你注释掉了原有代码中的?解包操作,直接对Option类型调用.into()转换,没有对应实现所以报错。

解决方案

恢复原来的签名构造代码,用?处理签名失败的None分支,签名成功时直接取出MultiSignature实例:

// 删掉你现在写的signature那行,恢复原来的代码
let signature = raw_payload.using_encoded(|payload| C::sign(payload, public))?;

修改后完整的代码片段

let raw_payload = SignedPayload::new(call, extra)
    .map_err(|e| {
        log::warn!("Unable to create signed payload: {:?}", e);
    })
    .ok()?;
let signature = raw_payload.using_encoded(|payload| C::sign(payload, public))?;
let address = MultiAddress::Id(account);
let (call, extra, _) = raw_payload.deconstruct();
Some((call, (address, signature, extra)))

修改完成后重新编译即可解决这两个报错。


内容的提问来源于stack exchange,提问作者s.Takahashi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 13:39:01