删除账号的时候报Error。错误类型是:DeleteAccountWithLargeState

删除合约的时候出现error:
image.png

阅读 2.1k
1 个回答

2022.2.13更新回答:

首先当我们用cli调用near view-state xxx.testnet --finality final 时,会得到类似如下的结果:

[
  {
    key: 'AAsAAAB4c2IudGVzdG5ldA==',
    value: 'AAEAAAAMAAAAd3JhcC50ZXN0bmV0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  },
  { key: 'AmkBAAAAAAAAAA==', value: 'AAAAAAAAAAA=' },
  { key: 'AmsAAAAAAAAAAA==', value: 'AQAAAAAAAAA=' },
  {
    key: 'AnYAAAAAAAAAAA==',
    value: 'AAAAAAAAAAAAAAAAAAEAAAAAAAAACwAAAHhzYi50ZXN0bmV0AQAAAAIAAAAAAAAADAAAAHdyYXAudGVzdG5ldAAAAKHtzM4bwtMAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAHZFhfF+AQAAdkWF8X4BAAAAAAAAAAAAAAAAAAAA'
  },
  {
    key: 'U1RBVEU=',
    value: 'AQAAAAACAAAAAmkBAAAAAAAAAAIAAAACawEAAAAAAAAAAgAAAAJ2AQAAAAAAAAAAAAAAAQAAAAAAAAACAAAAAAAAACAAAAB3aGl0ZWxpc3RfYWRtaW4uc3VwZXJpc2UudGVzdG5ldBoAAABwcml6ZXBvb2wuc3VwZXJpc2UudGVzdG5ldA=='
  }
]

这查询结果就是我们的合约状态的key/value形式。

在这个pr里,一龙提供了一个cleanup合约,将这个合约编译出来的state_cleanup.wasm发布到我们自己的合约账号后执行里面的clean函数,可以根据传入的key清理状态,如以下是删除key为U1RBVEU=这个状态的流程:

near deploy l.testmewell.testnet --wasmFile=res/state_cleanup.wasm
near call l.testmewell.testnet clean '{"keys": ["U1RBVEU="]}' --accountId testmewell.testnet

但是显然我们需要将near view-state xxx.testnet --finality final的查询结果传到这个清楚状态的函数的参数里,所以我自己写了个py脚本:

import os
import re
import sys

# cmd like: python state-clean.py your_contract_name.testnet your_account.testnet
contract_name = sys.argv[1]
account_name = sys.argv[2]

states = os.popen('near view-state prizepool.superise.testnet --finality final').read()
print("states:", states)

pattern = re.compile("key: '([^']+)'", )
state_keys = pattern.findall(states)  # ['AAsAAAB4c2IudGVzdG5ldA==', ... ,'U1RBVEU=']
state_keys_arg = "[" + ",".join(list(map(lambda e: "\"%s\"" % e, state_keys))) + "]" # "[\"AAsAAAB4c2IudGVzdG5ldA==\",\"AmkBAAAAAAAAAA==\",\"AmsAAAAAAAAAAA==\",\"AnYAAAAAAAAAAA==\",\"U1RBVEU=\"]"
print("states_key_arg:", state_keys_arg)

cmd = "near call %s clean \'{\"keys\": %s}\' --accountId %s" % (contract_name, state_keys_arg, account_name)
print("execute: "+cmd)

result = os.popen(cmd)
print(result.read())

执行完脚本后再用near view-state xxx.testnet --finality final查询合约的状态,应该得到结果: [],那状态就清理完毕了
最后重新部署自己业务的合约就ok了。

第一次回答

https://github.com/near/nearc... 这里有相关的讨论,最后我的解决办法就是自己添加一个清楚状态的函数并触发,然后再删除。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏