并非所有字节都读取常见解决方案

Ben*_*rek 10 nearprotocol

在这篇文章中,我将详细介绍导致神秘错误消息的原因"Smart contract panicked: panicked at 'Cannot deserialize the contract state.: Custom { kind: InvalidData, error: "Not all bytes read" }"

当您部署智能合约并存储信息时,状态将被序列化并存储在磁盘上。当您将另一个智能合约部署到您的帐户并且您更改了重要信息时,就会出现问题。NEAR 运行时将尝试从磁盘读取序列化状态,并使用部署到您帐户的任何智能合约代码加载它。如果它无法弄清楚如何执行此操作,则会输出错误消息Not all bytes read

有关何时可能发生这种情况的示例,请参阅我们的 DevDocs 中的 NFT 从零到英雄教程的升级合约部分。

要了解最佳实践以及如何避免此类情况,请参阅这篇详细文章。

小智 6

正如您所指出的,问题是,如果您使用near-sdk构建合约,它将尝试加载存储以在每次函数调用时构建合约对象。如果合约的布局发生更改,则使用新布局反序列化旧存储将会失败。

检查此模式以在升级后根据合同升级存储布局。使用时near-sdk-rs你应该用 装饰一个函数#[init(ignore_state)],然后这个函数默认不会加载状态(不过你可以手动加载)。该函数的结果将被序列化并存储为新状态。