为何查询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.
相关产品推荐
相关产品推荐

