cntools 显示Funds(余额)为0 的问题,及解决办法。
cnode 最近发布了 8.0.0 版本的更新,虽然是一个 mainnet release ,但没有打算那么早更新。只是打算作为提早了解的心态找个本地节点进行了尝试,没想到陷进去一整个晚上搞到焦头烂额。从下午一直反复试错,到现在得出结果已经是凌晨 1:26。淦!
主要发现的问题是cntools无法正常使用,表现在所有的wallet显示余额为0,无法对资金进行任何的操作。
按惯例先说结论
由于一个cntools的历史升级,改了查询余额的方式,改用了远程的API,而好死不死这个API因为某些原因在本地不好使。导致所有的资金操作卡死,因为任何的tx操作需要支付fee,余额0会直接导致失败。
提示
ERROR: payment and/or stake signing keys missing from wallet!
解决办法,根据官方的文档恢复旧方式查询(命令行查询 UTxOs 或使用本地部署那个远程API, 不去调用远端的API)
废话特比别多的过程流水账
这次升级说大不大说小不小,实际更新的操作也不算复杂,还是旧方法替换bin文件就好。
最近的好几个版本都已经懒得自己费时编译直接用现成的官方提供的bin。
不过说改动小也不算,依赖的 libsodium
需要更新指定的版本,还需要 配置新的 conway-genesis.json
cntools也累积了不少版本跳过没有进行更新,于是手贱更新了一下。
然后蒙了,出现上述现象。我一时分不清是我升级过程损坏了配置文件,还是因为8.0的问题还是cntools的问题。
1. 检查是不是被黑了
第一个排除这个原因。黑客看不上我这一亩三分地。在 区块浏览器查询确认我的这个地址余额正确,且最近1年没有动过。稍微安心下来
2. 从 8.0.0 还原回 1.35.7
升到8.0的时候节点直接无法启动,把bin换回旧版本,也还是启动错误,用
systemctl status cnode
看启动状态,发现 exitcode=1 且再执行提示不允许启动,让我去看 journalctl -xe
按提示敲了这个命令,好家伙,发现全部 命令都提示找不到bin ,提示我是不是没有在env
配置路径。
手打路径,发现path是有效的。检查env文件,一不做二不休把注释全部去掉,不用它的缺省默认值,直接手动指定到实体的路径。
cnode 是启动起来了,但是没用。cntools还是提示Funds:0
进行tx相关操作会得到这样的失败提示
WARN: No funds in base address, please send funds to base address of wallet to cover withdraw transaction fee
3. 退一步,想想有没有不使用cntools而管理cli wallet的方法
研究了没多久就放弃了,因为之前就研究过。走不通。设计上不允许从 命令行生成的私钥地址 还原 助记词,而 yoroi之类的不支持直接导入 vkey/skey。官方也没有提供更多的工具,管理和使用 cli wallet了。
看似进入了死胡同...头发快要掉了
4. 退回研究 cntools. 去啃源码啃论坛
没有什么更好的办法。对着错误提示查源码找执行的命令,希望手动复现看是哪个命令得到 0 的结果看有没有具体的报错。
代码里全是变量和层层的引用,没法看,看晕了。
又在论坛里看了一堆别人的 issues.. 好像也没什么帮助。
收获寥寥
试着再检查一遍 env 和 cntools脚本的头部,也没什么大的发现
再回到跟踪日志, 执行查询余额的命令。在加载Funds值的上下文看到一行异样
2023-05-13 15:59:26 UTC [ACTION] curl -sSL -f -d _address=[马赛克] https://api.koios.rest/api/v0/address_info
发现不妥,去看这个网站...再翻查 cntools的手册关于这个接口的说明..果然在更新日志的角落里发现了万恶之源
艹!
[9.0.0] - 2022-01-10⚓︎
Changed
Due to changes in cardano-node 1.33.x -> for utxo ledger lookup and previous heavy pool-params query, Koios API is now the default option for these lookups.
You can update KOIOS_API env variable to connect to a local instance of koios (open source and incentivises all to build a decentralised query layer) if you'd not like to connect to remote instance.
Visit the https://www.koios.rest/ for more information about Koios or check out the API documentation at https://api.koios.rest.
If you'd like to revert to old behaviour (use CLI which could be slow to retrieve UTxOs), you can set ENABLE_KOIOS environment variable to N.
又往上翻了一下,好家伙,昨日的我打到今日的我。 一年前的第三方远端接口,一年后自己禁用了。
[10.2.0] - 2023-03-13⚓︎
Changed⚓︎
Disabled Koios for balance lookup to prefer local node check. In most circumstances this will be faster due to low latency. If needed, set WALLET_SELECTION_FILTER_LIMIT in cntools.sh to a lower limit to skip balance lookup on wallet selection if you have many wallets and delay is too long.
没猜错的话,就是cntools脚本自检升级的时候升级不完全或者因为像我这样的懒运维,隔了太多个版本导致升级的时候有些早期版本的残留形成了冲突。
问题就是这个API不靠谱。本意是通过这个外部的 接口来减轻直接对链的查询操作,减轻系统负担提速。但现在也不清楚是 这个 API崩了还是墙了。反正得到的结果是0。
解决的办:找到 env
里的 ENABLE_KOIOS
选项,从默认值Y改为N。即还原成旧方式查链,虽然效率会低点要多等几秒钟。
结论:
还是不该手贱,不到最后一刻不升级。
又不是不能用!
github: https://github.com/input-output-hk/cardano-node/releases
8.0.0升级指南: https://forum.cardano.org/t/upgrade-to-8-0-0-for-coincashew-users/117746
cntools changelog: https://cardano-community.github.io/guild-operators/Scripts/cntools-changelog/
