微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

托盘中的类型不匹配

如何解决托盘中的类型不匹配

当我按照步骤暴露合同托盘api时显示错误

https://substrate.dev/docs/en/tutorials/add-a-pallet-to-your-runtime/#install-the-node-template

我一直按照步骤进行操作,并修复了另一个与ContractExecResult :: Success相关的错误。现在我遇到了这两个错误

我认为它与语法或本教程尚未更新的更新的库api有关。

$ cargo check -p node-template-runtime
   Compiling node-template-runtime v2.0.0-rc5 (C:\substrate-node-template2\runtime)
error: Failed to run custom build command for `node-template-runtime v2.0.0-rc5 (C:\substrate-node-template2\runtime)`

Caused by:
  process didn't exit successfully: `C:\substrate-node-template2\target\debug\build\node-template-runtime-8af1699a702fd7e8\build-script-build` (exit code: 1)
--- stdout
Executing build command: "rustup" "run" "nightly" "cargo" "rustc" "--target=wasm32-unkNown-unkNown" "--manifest-path=C:\\substrate-node-template2\\target\\debug\\wbuild\\node-template-runtime\\Cargo.toml" "--color=always" "--release"

--- stderr
   Compiling wasm-build-runner-impl v1.0.0 (C:\substrate-node-template2\target\debug\wbuild-runner\node-template-runtime6610820868370414452)
    Finished dev [unoptimized + debuginfo] target(s) in 0.75s
     Running `C:\substrate-node-template2\target\debug\wbuild-runner\node-template-runtime6610820868370414452\target\x86_64-pc-windows-msvc\debug\wasm-build-runner-impl.exe`
   Compiling node-template-runtime v2.0.0-rc5 (C:\substrate-node-template2\runtime)
error[E0308]: mismatched types
   --> C:\substrate-node-template2\runtime\src\lib.rs:477:17
    |
476 |             match exec_result {
    |                   ----------- this expression has type `(core::result::Result<pallet_contracts::ExecReturnValue,sp_runtime::dispatchError>,u64)`
477 |                 Ok(v) => ContractExecResult::Success{
    |                 ^^^^^ expected tuple,found enum `core::result::Result`
    |
    = note: expected tuple `(core::result::Result<pallet_contracts::ExecReturnValue,u64)`
                found enum `core::result::Result<_,_>`

error[E0308]: mismatched types
   --> C:\substrate-node-template2\runtime\src\lib.rs:482:17
    |
476 |             match exec_result {
    |                   ----------- this expression has type `(core::result::Result<pallet_contracts::ExecReturnValue,u64)`
...
482 |                 Err(_) => ContractExecResult::Error,|                 ^^^^^^ expected tuple,_>`

error: aborting due to 2 prevIoUs errors

For more information about this error,try `rustc --explain E0308`.
error: Could not compile `node-template-runtime`.

To learn more,run the command again with --verbose.
error: process didn't exit successfully: `C:\substrate-node-template2\target\debug\wbuild-runner\node-template-runtime6610820868370414452\target\x86_64-pc-windows-msvc\debug\wasm-build-runner-impl.exe` (exit code: 1)

这是本教程向我添加的runtime \ src \ lib.rs中的代码,这导致了此问题,而我的修改后的代码添加了“标志”和“ gas_consumed”,并删除了“状态”。

 /*** Add This Block ***/
    impl contracts_rpc_runtime_api::ContractsApi<Block,AccountId,Balance,BlockNumber>
        for Runtime
    {
        fn call(
            origin: AccountId,dest: AccountId,value: Balance,gas_limit: u64,input_data: Vec<u8>,) -> ContractExecResult {
            let exec_result =
                Contracts::bare_call(origin,dest.into(),value,gas_limit,input_data);
            match exec_result {
                Ok(v) => ContractExecResult::Success{
                flags: v.status,data: v.data,gas_consumed: v.gas_consumed,},Err(_) => ContractExecResult::Error,}
        }

        fn get_storage(
            address: AccountId,key: [u8; 32],) -> contracts_primitives::GetStorageResult {
            Contracts::get_storage(address,key)
        }

        fn rent_projection(
            address: AccountId,) -> contracts_primitives::RentProjectionResult<BlockNumber> {
            Contracts::rent_projection(address)
        }
    }
   /*** End Added Block ***/

解决方法

基于输出,看起来您正在使用节点模板的2.0.0-rc5版本。目前,Contracts托盘教程是v2.0.0-rc4的最新版本。您可以从该分支克隆节点模板并将其用作起点吗? git clone -b v2.0.0-rc4 --depth 1 https://github.com/substrate-developer-hub/substrate-node-template

,

从v2.0.0-rc5开始,Contracts托盘中的nude_call函数返回ExecResult和Gas,可以在line 633上看到,而在上一版本的Contracts托盘中仅返回ExecResult。

为了继续学习本教程,我对本教程中提供的代码段进行了一些调整。这是我的代码的版本。

fn call(
        origin: AccountId,dest: AccountId,value: Balance,gas_limit: u64,input_data: Vec<u8>,) -> ContractExecResult {
        let exec_result =
            Contracts::bare_call(origin,dest.into(),value,gas_limit,input_data);
        match exec_result {
            (Ok(v),gas) => ContractExecResult::Success {
                flags: v.flags.bits(),data: v.data,gas_consumed: gas,},(Err(_),_) => ContractExecResult::Error,}
    }

注意:Rust刚起步,所以我的代码可能不是最佳解决方案。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。