簡體   English   中英

Pallet 中的類型不匹配

[英]mismatched types in Pallet

當我按照步驟公開合同托盤 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, sp_runtime::DispatchError>, 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, sp_runtime::DispatchError>, u64)`
...
482 |                 Err(_) => ContractExecResult::Error,
    |                 ^^^^^^ expected tuple, found enum `core::result::Result`
    |
    = note: expected tuple `(core::result::Result<pallet_contracts::ExecReturnValue, sp_runtime::DispatchError>, u64)`
                found enum `core::result::Result<_, _>`

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 中導致問題的代碼,以及我修改后的代碼,其中添加了“flags”和“gas_consumed”並刪除了“status”。

 /*** 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 ***/

基於 output,看起來您使用的是節點模板的 2.0.0-rc5 版本。 目前,合同托盤教程是最新的 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 托盤中的 bare_call function 返回 ExecResult 和 Gas,可以在第 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 相當陌生,所以我的代碼可能不是最佳解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM