You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何查询Rust合约存储时出现“storage decode error: input too short”错误

问题原因

你的实现和调用逻辑存在两处错误,共同触发了存储解码报错:

  • 错误1:直接为#[storage_mapper]修饰的方法添加了#[view]注解
    #[storage_mapper]是MultiversX框架提供的存储层注解,作用是生成存储映射的操作实例,本身没有适配端点的参数解析逻辑。直接给它加#[view]会导致ABI生成异常,查询传入的参数无法正确匹配存储key的拼接规则。
  • 错误2:查询时identifier参数编码不符合要求
    u64类型的参数在MultiversX链上查询/调用时,需要编码为8字节大端序的十六进制字符串,如果直接传入十进制数值或者小端编码的结果,节点解析参数时会因为字节长度不足,抛出input too short错误。

修复步骤

1. 调整合约代码

不要在storage mapper方法上直接加view注解,单独声明对外的查询接口:

// 仅保留storage mapper定义
#[storage_mapper("someValue")]
fn get_value(&self, identifier: u64) -> SingleValueMapper<u64>;

// 单独定义对外暴露的view接口
#[view(getVersion)]
fn get_version(&self, identifier: u64) -> u64 {
    self.get_value(identifier).get()
}

重新编译部署合约后,用新的ABI进行查询。

2. 正确编码查询参数

使用erdJs查询时,通过sdk自带的类型工具编码参数即可:

import { U64Value } from "@multiversx/sdk-core";

// 替换为你实际要查询的identifier值
const targetId = 1234;
const encodedId = new U64Value(targetId).hex();

// 后续用encodedId作为参数调用查询接口即可

如果直接调用网关API查询,手动将u64的identifier转为8字节大端的十六进制字符串传入即可,例如数值1234对应的编码结果为00000000000004d2。


内容的提问来源于stack exchange,提问作者Razvan M.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:54:03