近期,Qtum社群中有人不小心将QTUM发送到莱特币地址后,在热心的社区技术人员帮助下利用WIF的创建机制,尝试并找回了丢失QTUM,如果你也担心会出现这样的情况,不妨收藏本篇文章吧。
数字钱包的设计为了方便更多的社区用户,采用钱包导入格式(Wallet Import Format)来显示私钥。对于那些容易操作失误的人来说,私钥的某些特性可以让他们更加安全地使用加密钱包(见参考资料1),本文将会讲述WIF私钥的构造和分解,帮助找回发送到莱特币地址的QTUM。
如果我的QTUM打到了莱特币地址怎么办?
如果你不小心把QTUM发送到了其他地址,通常情况下,这些QTUM肯定就永久丢失了。
这个案例较为特殊,错误的地址属于莱特币钱包,但是这个地址恰是可以找回的。为什么这么说呢?因为莱特币和Qtum从钱包底层技术来说是“同父异母的兄弟”。这两款钱包都基于比特币开发的代码和功能,并分别做了一些修改和更新。莱特币核心钱包默认创建SegWit(隔离见证-支付给脚本哈希隔离见证)地址;这些地址以“M”开头,与部分以“M”开头的Qtum地址一样。
一定要确认好地址再发送!一定要确认好地址再发送!
一定要确认好地址再发送!
在找回QTUM之前,先快速回顾下WIF私钥的特点。WIF有三个特点使得它比原生的64位字符的私钥更安全:
删除了易混淆字符的Base58编码
用于标识区块链的1个字节
用于校验和的4个字节
base58 编码
私钥是64个十六进制(以16为基数)数字。中本聪在设计时为了防止长字符串和数字的结合容易出错,尤其是出现这些容易混淆的字符时:
“
I - 大写字母“i” l - 小写字母“L”
O - 大写字母 “o”0 - 数字0
/ - 正斜杠 = - 等号
”
为了减少难以区分的字符串使得不能记住私钥,中本聪团队提出了base58编码,它只是简单地舍去了这6个容易令人混淆的字符。
对于base58编码来说,表示字母和数字的64个字符被映射到一个由58个字符构成的数据集中。现在你知道为什么在加密地址中从来没有看到“I”、“l”、“O”和“0”了吧,中本聪十年前就再也不用了。(见参考资料2)
区块链标识前缀
WIF的第一个字节(两个字符)将区块链定义如下:
已注册的bip-0044前缀见已注册的bip-0044 Token 前缀:https://github.com/satoshilabs/slips/blob/master/slip-0044.md
校验和
校验和是一种检测数字是否错误或损坏的技术。莱特币和Qtum使用SHA-256哈希算法为WIF私钥创建校验和,实际上他们应用了SHA-256算法两次。要获得正确的校验和结果,需要确保SHA-256哈希的输入是十六进制的数据,而不是ASCII文本。
将莱特币私钥更改为Qtum私钥的详细步骤见下面的步骤。如果您想复制这些步骤,这些私钥不会被混淆,他们对于莱特币和QTUM都是完全有效的。
创建一个WIF
介绍完毕,下面是创建Qtum WIF的步骤,由一个原生私钥开始:
添加一个区块链前缀 (对于Qtum主网而言是0x80)
使用SHA-256 哈希
再次使用SHA-256 哈希
将第二个SHA-256哈希的前8个字符作为校验和
整体使用base58进行编码
WIF生成完毕(见参考资料3)
丢失Qtum按照以下步骤执行,一步步地,将莱特币WIF转换为Qtum WIF 就可以找回来啦。
*私钥请保密,在线使用时请确保安全性
1、提取莱特币私钥
在您的莱特币核心钱包(需要被解锁)的控制台(帮助-调试窗口-控制台)中使用dumpprivkey命令:
dumpprivkey MALEJA87Syy9iTm14v7A7Jo7Sfx9J6jZZr
该命令将返回一个私钥
结果:
TB85YEE8uu23cFc7wZDEPkLdT2mwoBHHU18RfkE9QhsUcPDmHxoU
将私钥复制到文本文件并保存在计算机上.
退出莱特币钱包.
2、在你的电脑浏览器中载入这两个网址
https://incoherency.co.uk/base58/
https://anyhash.com/sha256
这些站点加载完毕后,断开计算机的网络连接,这些站点仍然可以工作
3、 将步骤1中生成的私钥解码为原始十六进制数据
在https://incoherency.co中,将步骤1中的私钥复制粘贴到右侧的“base58数据”(下图未显示),并按下解码按钮。(将单选按钮设置为十六进制)
结果b0f0cf31978d2b92ca2a6f4b72de5458a944944f89cba3932bb2a6fd72eef891b501d19dc203
删除前面的“b0”(用于莱特币主网)和尾部的8个字符“d19dc203”(校验和):
f0cf31978d2b92ca2a6f4b72de5458a944944f89cba3932bb2a6fd72eef891b501
这就是原生的64个十六进制的字符私钥
4、创建一个Qtum WIF 私钥
在前面添加字符“80”(80 -用于Qtum主网)
结果:
80f0cf31978d2b92ca2a6f4b72de5458a944944f89cba3932bb2a6fd72eef891b501
5、https://anyhash.com/sha256生成SHA256哈希
请确保选中“十六进制”复选框
复制粘贴第四步的结果到 “输入”框中:
结果:
b263d8dfa27c2558e41c125e79341a81067c6b0d32d077cc58df85fe7a9c8a24
6、生成第二个 SHA256哈希
将第五步的结果再次复制粘贴到AnyHash 站点的 “输入” 框中。
结果:
2e2a2aa01a55f8d928492f793d6e90b2fd24572494ac79d47a97136330b990d9
7、将2e2a2aa0作为校验和添加到上面步骤4中
结果:
80f0cf31978d2b92ca2a6f4b72de5458a944944f89cba3932bb2a6fd72eef891b5012e2a2aa0
8、在https://incoherency.co.uk/base58/中进行base58 编码将步骤7的结果复制粘贴到左侧并按下编码按钮
结果:
L5Hp6UvxWX3SqQyFPvGNBPoFWB8dj6GPeoEAowbbqjhK6VboC1QK
这就是Qtum的WIF 私钥了, 复制并保存到文本文件中
退出浏览器,重启计算机并且重新连接到网络
9、将此私钥导入至Qtum Core钱包中
启动Qtum Core钱包,同步区块链并解锁钱包。
在控制台中使用命令importprivkey并复制粘贴步骤8中的私钥:
importprivkey L5Hp6UvxWX3SqQyFPvGNBPoFWB8dj6GPeoEAowbbqjhK6VboC1QK
钱包将重新扫描几分钟,读取整个区块链以获取新地址的余额,然后在控制台会显示结果“null”。如果你查看文件---接收地址,你应该会看到新地址:MALEJA87Syy9iTm14v7A7Jo7Sfx9J6jZZr
以“M”开头的Qtum地址是“p2sh-segwit”(支付给遗留包装的脚本哈希隔离见证)地址。导入私钥还会在钱包中创建另外两个以“Q”和“qc1”开头的地址:
Qdkz3dRBC4YH8HjhDTE6UBN59MjhsfCFQZ — “legacy” 非隔离见证地址
qc1qhskagsa2t763vhkqf8cq9ph07eynazxea4zml5 — “bech32” (比特币增强提案173) 原生的隔离见证地址
以上三个都是有效的Qtum地址
10、发送QTUM (清除私钥)
因为该私钥已经暴露在钱包之外(在您计算机上的文本文件中),所以最好将这个新地址的全部余额发送到另一个地址(该地址的私钥没有被暴露)。
这可以是同一个钱包里的另一个地址,如果要这样做,选择发送,并在QTUM控制功能中,选择输入…按钮,然后选择从这个新地址发送。
参考资料
钱包输入格式:https://en.bitcoin.it/wiki/Wallet_import_format
Base58编码:
https://en.wikipedia.org/wiki/Base58
比特币私钥计算 :http://gobittest.appspot.com/PrivateKey
用WIF生成私钥的python代码:https://bitcoin.stackexchange.com/questions/58114/convert-wif-to-private-key
先前关于钱包和密钥的博客:https://medium.com/@jb395official/wallets-and-keys-july-23-2018-92abf2a2d2bf