在 EOSIO 上做开发,用户可能会遇上一些报错信息。有时这些报错信息很不好被理解,导致我们经常在开发群里看到各种截图和问题。
为了帮助刚上手的开发者克服这些挑战,我们对一些最常见报错信息做了一个小总结。
请注意,一些钱包和其它的应用界面可能会对原消息格式做更改,让它更易懂。比如 nodeos
(EOSIO 的操作软件)的原输出可能会是这样的:
{
"code": 500,
"message": "Internal Service Error",
"error": {
"code": 3080004,
"name": "tx_cpu_usage_exceeded",
"what": "Transaction exceeded the current CPU usage limit imposed on the transaction",
"details": [
{
"message": "billed CPU time (2115 us) is greater than the maximum billable CPU time for the transaction (162 us)",
"file": "transaction_context.cpp",
"line_number": 553,
"method": "validate_cpu_usage_to_bill"
}
]
}
}
而你收到的报错信息可能是会变成:billed CPU time (2115 us) is greater than the maximum billable CPU time for the transaction (162 us)
译:需要的 CPU(2215 us)超出了交易允许的最大值
而在这篇文章中,我们会用后者这样更简洁的信息来进行讨论。
Transaction failed - billed CPU time (1342 us) is greater than the maximum billable CPU time for the transactions (71 us)
译:交易失败 - 需要的 CPU(1342 us)超出了交易允许的最大值 (71 us)
这个报错的意思是,在给这个交易提供 CPU 的账户中,为 CPU 抵押的代币数量不足。CPU 的单位是微秒(us),是按照 BP 节点处理一个交易所需的时间所计算的。
解决方法:你需要给 CPU 抵押更多代币
你可以抵押更多自己的代币在 CPU 上,也可以用其它账户为你抵押(抵押在这里指英文的 “stake” 或 “delegate”)。你也可以从 REX 中租赁某些 EOSIO 链的资源,CPU 一次可以租30天,30天期限到了还可以续租。
专家提示
你的 CPU 使用量是会每24小时被完全重置的。 在区块浏览器上查看帐户信息时,它可能显示你的帐户上的一些 CPU 是占用的,没显示重置,那是为它在你推送新的一笔交易后才会更新。
Provided keys, permissions, and delays do not satisfy declared authorizations, transaction declares authority '{"actor":"testaccount1","permission":"active"}', but does not have signatures for it under a provided delay of 0 ms, provided permissions [], provided keys [EOS7j9ViHGp….Po57], and a delay max limit of 3888000000
译:提供的密钥、权限和延迟无法满足授权需求,交易要求授权权限: '{"actor":"testaccount1","permission":"active"}',但无在延迟为 0 ms,权限为 [],密钥为[EOS7j9ViHGp….Po57] 和最大延迟上限为 3888000000 的条件下的签名
这个错误出现的原因是用户使用的密钥不能满足签署的交易所需要的权限。常见的情况是你的钱包里管理着多个密钥,或者你的钱包经过重置后无法访问之前的密钥。
解决方法:使用正确的密钥签署交易
不是每一个用户都知道怎么去确定应该用哪个密钥。首先,可以去区块浏览器上查下,一般在账户页面上会列出你的权限。如果你用 eosq,你可以看到如下信息:
然后,看到你的公钥,你用的私钥是要跟公钥匹配的。一般情况下你都是需要用你的 active
(活跃)权限签署交易,那你就需要检查下你用的私钥是不是跟 active 权限的公钥匹配的。
如果你重置过你的钱包,你可能需要通过之前的备份或密语恢复之前密钥,恢复方式区别于各个钱包,但一般钱包在你导入密钥/创建账户时都会说明它们的恢复方式。
专家提示
建议熟悉下 EOSIO 的账户权限系统。了解了它以后你会发现它能实现很多强大的功能。我们建议你在测试网上创建一个账户,更改你的密钥,自己设定不同的权限。这是个熟悉权限系统很好的方式,尝试过你就知道了,并没有那么复杂。
Transaction failed - Please enable arbitrary data on ledger device within EOS app. {"name":"TransportError","message":"Failed to sign with Ledger device: U2F TIMEOUT"
译:交易失败 - 请在EOS应用内的分类帐设备上启用任意数据。 {"name":"TransportError","message":"Failed to sign with Ledger device: U2F TIMEOUT"
解决方法:启用任意数据签名
使用分类账硬件钱包的用户如果没有启用任意数据签名, 就会遇到这个报错。大家会问:“什么是任意数据?”任何一个不属于核心系统合约的操作就是任意数据。如果你不想只能跟系统合约交互,你需要启用这个功能。
专家提示
当你在更新你的分类账设备的时候,你可能需要重新开启这个功能。所以如果你再遇到这个报错,请检查你是否需要启用它。
updateauth action declares irrelevant authority '{"actor":"testaccount1","permission":"active"}'; minimum authority is {"actor":"testaccount1","permission":"owner"}
译:updateauth (权限更新)操作发现无关的权限 '{"actor":"testaccount1","permission":"active"}'; 所需最小权限为 {"actor":"testaccount1","permission":"owner"}
这个报错可能出现在你尝试更改账户的 owner
(所有者)权限的时候。如果你想更改你的 owner
密钥,是需要原 owner
的权限授权的,而如果你不指定选择权限,一般钱包是默认使用 active
(活跃)权限签署交易的,不能满足执行的要求。
其实可以把账户权限想象成一个树型结构,最顶层的母权限可以控制下面的所有子权限,下面的每一级的权限又可以控制它们下面的其它权限。
解决方法:确定使用正确的权限
无论你用的是哪个钱包,确保用正确的密钥去签署相应的操作。owner
的级别最高,可以控制其下的所有权限。
专家提示
应时刻保持你的 owner
密钥的安全,尽量用 active
和级别低的密钥授权操作。这样的话,如果你的密钥被盗,还可以用 owner
密钥恢复你对账户的控制
Transaction failed - producer is not currently registered
译:交易失败 - 节点当前未注册
有的用户可能一次性的设置了对节点的投票后就不再去想它了,这时候我们需要去检查被投票的节点是否还是注册状态。如果你遇到这个报错,说明你支持的一个节点已经注销了他们的节点业务。
解决方案:确定节点的业务还在运行
可以在很多区块浏览器上查看你所支持的节点的状态。如果你之前投票的节点的业务停止了,你可以再选择投票给其它节点。
专家提示
也有一种情况是节点的基础架构遇到问题了,需要暂时注销去修复它。在你重新检查你的30个节点投票前,可以先等几个小时重新投票,看看报错还有没有再出现。
Assertion failure with message: only suffix may create this account
译:断言失败并显示消息:只有后缀可以创建此帐户
EOSIO 链有个命名空间拍卖的概念,让用户可以拥有小于12个字符的靓号。然后用户可以用这个命名空间去创建“子域名”账号。比如,你拍下了 com
这个账号,你就有了 .com
这个后缀的所有权,可以创建 123.com
、 crypto.com
这样的账号。如果你在没有相应的命名空间的情况下去创建自定义账户名,就会遇到这个报错。
解决方案: 拍下相应的命名空间
你需要赢下拍卖才能获得命名空间的拥有权。命名空间拍卖是最多每24小时关闭的,只有在整个24小时的期间,在所有命名空间的出价中最高的人才会获得他竞拍的命名空间。你可以阅读这篇文章来具体了解命名空间的拍卖系统。
专家提示
你也可以用现在市场上的一些服务去从拍下命名空间的人手中直接买到它。
Transaction failed - Account using more than allotted RAM usage, account testaccount1 has insufficient ram; needs 4468 bytes has 4382 bytes.
译:交易失败 - 帐户正要使用的 RAM 超过了分配的使用量,帐户 testaccount1 的 ram 不足; 需要 4468 个字节,却仅有 4382 个字节。
EOSIO 链上的三种资源之一是 RAM,RAM 是用来长期存储账户数据的。而正因为它是长期存储数据的,账户需要去购买它,而不是通过抵押来获得。
解决方案:购买更多 RAM
如果你遇到这个报错,买够能满足交易需要的 RAM 就行了。一般钱包都有相关的功能。
专家提示
即使你把账户上的某个代币全部交易出去,那个代币占用的 RAM 还是没有被释放的。想要释放相应的 RAM,需要先看代币合约中有没有 close 操作。调用 close 操作后,相应的 RAM 就会被释放了。
以上总结的是在与 EOSIO 链交互过程中可能遇到的一些最常见的报错。如果你遇到其它类型的报错信息,可以跟我们讨论,加入我们的微信、Telegram 开发者群,关注我们的 Twitter 和微博。如果你感兴趣,欢迎来访问我们的 Github 源码库,别忘了帮我们点亮星标哦!