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