我已经能够使用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-deploy
的yarn 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的答案同名的新帐户
- 直接创建一个新帐户或子帐户,并将更新后的合同部署到新创建的合同中