在这篇文章中,我将详细介绍导致神秘错误消息的原因"Smart contract panicked: panicked at 'Cannot deserialize the contract state.: Custom { kind: InvalidData, error: "Not all bytes read" }"
.
当您部署智能合约并存储信息时,状态将被序列化并存储在磁盘上。部署的时候出现问题another智能合约到您的帐户,您已经changed重要信息。 NEAR 运行时将尝试从磁盘读取序列化状态,并使用部署到您帐户的任何智能合约代码加载它。如果它不知道如何执行此操作,则会输出错误Not all bytes read
错误信息。
有关何时可能发生这种情况的示例,请参阅升级合同 https://docs.near.org/docs/tutorials/contracts/nfts/upgrade-contract我们的 DevDocs 中的 NFT 从零到英雄教程的部分。
要了解最佳实践以及如何避免此类情况,请参阅this https://www.near-sdk.io/upgrading/prototyping详细的文章。
正如您所指出的,问题是,如果您使用near-sdk构建合约,它会尝试加载存储以在每次函数调用时构建合约对象。如果合约的布局发生更改,则使用新布局反序列化旧存储将会失败。
检查这个模式 https://github.com/near/near-sdk-rs/blob/31cba6213919ec4866bc0fab7f6963de241cc43a/HELP.md#upgrading-a-contract升级后根据合同升级存储布局。使用near-sdk-rs
你应该装饰一个函数#[init(ignore_state)]
,然后这个函数默认不会加载状态(不过你可以手动加载)。该函数的结果将被序列化并存储为新状态。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)