调用 Rust 初始化函数时获得"Cannot deserialize the contract state"



我已经能够使用Rust合约的near-shell运行near dev-deploy,然后使用near call my-account new '{"param1": "foo"}'调用函数"new">

但是,当我将相同的合约部署到使用NEAR钱包创建的首选帐户时,这是不起作用的。

错误为:

Smart contract panicked: panicked at 'Cannot deserialize the contract state.: Custom { kind: InvalidInput, error: "Unexpected length of input" }',

事实证明,在区块链世界中,更新同一账户/地址的合同时存在一个常见问题。这里的解决方案是删除并重新创建帐户。我用near-shell删除它,然后用钱包重新创建它。

在命令行上:

near delete my-account another-account-getting-the-tokens

然后通过访问再次创建帐户:https://wallet.nearprotocol.com/create/

这清除了状态,我可以重新部署合同并运行init功能"新">

我在2021年遇到了同样的错误:Cannot deserialize the contract state在对合同进行修改后,这让我想到了这个stackoverflow问题。

我通过运行调用near dev-deployyarn dev在testnet上发布了合同。

对我来说,解决方案是生成一个新的开发用户,这可以通过传递-f作为参数来实现:

near dev-deploy -f path/to/contract.wasm

您可以通过运行dev-deploy--help:找到这一点

-f,--init,--force为部署创建新帐户(即使已有可用帐户(。默认值:错误

希望这能有所帮助。

根据NEAR的文档:https://docs.near.org/docs/concepts/account#:~:text=每个%20NEAR%20帐户%20can%20only%20hold%20%20smart%20contract每个NEAR账户只能持有一份合同。因此,您无法对现有的进行任何更新。有一些解决方案你可以尝试:

  • 删除您的testnet帐户,然后创建一个与Mike的答案同名的新帐户
  • 直接创建一个新帐户或子帐户,并将更新后的合同部署到新创建的合同中

相关内容

最新更新