托盘中的类型不匹配

问题描述

当我按照步骤暴露合同托盘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刚起步,所以我的代码可能不是最佳解决方案。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...