【问题标题】:Not All Bytes Read Common Solutions并非所有字节都读取常见解决方案
【发布时间】:2021-12-22 21:43:44
【问题描述】:

在这篇文章中,我将介绍导致神秘错误消息"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 零到英雄教程的 upgrade a contract 部分。

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

【问题讨论】:

    标签: nearprotocol


    【解决方案1】:

    正如您所指出的,问题在于,如果您使用 Near-sdk 构建合约,它会尝试从每个函数调用中加载存储以构建合约对象。如果合约布局发生变化,用新布局反序列化旧存储会失败。

    Check this pattern 升级后从合约升级存储布局。使用near-sdk-rs你应该用#[init(ignore_state)]装饰一个函数,然后这个函数默认不会加载状态(你可以手动加载)。该函数的结果将被序列化并存储为新状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-20
      • 1970-01-01
      • 2021-09-19
      • 2011-02-26
      • 2012-09-11
      • 1970-01-01
      • 2019-08-14
      • 1970-01-01
      相关资源
      最近更新 更多