NEAR Rust智能合约调用view方法返回Borsh反序列化错误求助
错误根因
你遇到的Cannot deserialize value with Borsh错误是NEAR虚拟机执行合约view方法时,无法将链上存储的二进制数据/前端传入的参数,按合约声明的Borsh序列化规则完成反序列化导致的,针对你要返回Vec<u128>的场景,常见问题和修复方案如下:
常见问题&修复方案
- 合约侧类型定义不匹配
- 确认合约中对应view方法声明的返回值类型确实为
Vec<u128>,排查是否误写为其他类型:比如Vec<u64>、自定义封装的U128类型(非原生u128的序列化规则不同),或者返回值实际是带其他字段的结构体 - 如果合约最近做过升级,确认升级前后对应存储位置的类型定义没有变动,旧数据和新类型的序列化规则不兼容也会触发该错误
- 确认合约中对应view方法声明的返回值类型确实为
- 前端调用侧参数错误
- 如果该view方法需要入参,确认你传入的参数符合合约要求的类型:u128类型的入参必须转成字符串传入,不能直接传Number类型,否则会触发溢出导致序列化错误
- 如果你是手动用Borsh反序列化返回值,确认你写的schema中对应返回值的类型定义为
Array(u128),不要写错类型
- 快速排查方法
可以先用near-cli调用同一个view方法验证问题归属,命令参考:near view <你的合约地址> <调用的方法名> '{"参数名":"参数值"}' --networkId <mainnet/testnet>
如果cli调用也报相同错误,问题出在合约侧;如果cli能正常返回结果,问题出在前端的调用参数或者类型声明配置。
内容的提问来源于stack exchange,提问作者Dorian Crutcher
相关产品推荐
相关产品推荐

