如何解决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
相关产品推荐
相关产品推荐

