我也是几个月前才开始了解比特币,不知道该 at 谁……@h4x3rotab
我可以说说我的理解。
钱包和备份这块……简而言之,比特币只认私钥不认人。
地址是公钥的两次 hash,一个私钥只对应一个公钥、一个地址。但是地址还有 3 字开头的,它可以是多重签名地址(实际上还可以是别的类型,比如目前使用的 SegWit 地址),可以对应多个私钥、执行逻辑判断:一共 N 个私钥里,有 M 个有效签名则通过验证。
私钥很重要,所以大笔资金建议用冷钱包,也就是私钥不上网。可以用不联网的设备,甚至还可以用纸张直接打印私钥(比如
bitaddress.org )。
比特币建议地址用一次换一个,因为比特币的转账记录都是公开的。如果只重复用一个地址,别人打开区块浏览器就看到你的所有过往交易了。还有说法认为换地址可以不暴露公钥,带来额外的安全性。
但老是换地址,备份私钥就成了问题,常常出现私钥丢失而丢币的问题。后来,就有了 HD 钱包,也就是分层确定性钱包,通过一个种子派生(还可以是树形结构)出一堆私钥,备份钱包时,备份种子就可以了,私钥都可以派生出来。种子的格式也是有标准的,也就是一串单词、汉字等组成的密语,不过标准好像修订过,所以偶尔会碰到不兼容的问题。
当然,即使用了 HD 钱包,仍然可以采取一个个备份私钥的办法,只是这个办法相对比较笨。
你说的“官方推荐了很多钱包,比如 electrum,它通过 random seed 生成一对主私钥和主公钥,根据公钥进行 10 次复杂的运算计算出地址。”我觉得好像不太对劲,不知道是主公钥、主私钥、10 次复杂运算是个啥……也许是我不懂具体技术细节?
比特币的交易,可以理解为让输入的币(每一个输入 UTXO )作废,然后铸造等额新币(输出 UTXO )。输出总额需要小于等于输入,多出的部分作为手续费被计入区块的 coinbase 交易里,被矿工拿走。
这里就有两个蛋疼的地方:找零和碎币。
找零问题不会坑到正常的用户,只是开发者和手动构造交易的玩家需要小心。前面说了,输入的币会被销毁,所以需要在输出里填自己的地址作为“找零”,如果忘了填这个地址,余额就被矿工当作手续费拿走了。以前也有矿工“拾金不昧”,捡到超高额手续费后说要退还。如果他们不想归还,好像你也没啥办法了。
一个地址里的多个 UTXO 也不会自动合并,就像现实中的硬币铸造成本可能超过币值一样,数额太小的“碎币” UTXO 会让你不想花出去,因为你把这个碎币加到交易输入里,会让交易数据量变大,导致你付出比币值更多的手续费。
钱包软件可以广播交易,但你也可以用别的方式来广播交易,比如用在线的 pushtx 服务:
https://blockchain.info/pushtxbtc.com 等矿池还提供付费加速的服务,实际上可以理解为补交手续费吧……
交易数据大小,钱包软件就可以显示出来,钱包软件还会根据未确认交易状况来动态判断手续费大小——只有部分钱包有这个功能(我记得 Electrum 和 Core 都有),有这个功能的话就不需要到网站上查了。
手续费高,矿工就更优先打包你的交易,但下一个块啥时候挖出来是看运气的。
如果当时的交易量不高,都填不满区块,那超低手续费也可以很快确认(不过也有矿池限定了最低手续费,更低的直接扔掉不打包)。
如果当时的交易量很大,拥堵了,那就得在发出交易时就把手续费加高,否则一大意被卡几天动弹不得——虽然交易没被打包进链,是未确认状态,但一般的矿工也拒绝“双花”这笔交易。
被卡后也不是完全没办法,比如 Child Pay For Parent,也就是用更高的手续费花掉“找零”,前后两笔交易综合起来手续费够高,矿工就会优先打包了(这个好像也看具体矿池?)。再有就是找矿池付费加速。
还可以在发出交易时就勾选“可替换”,也就是启用 RBF 特性(不知道商家、支付公司那边会不会有问题),这样就可以直接给已经广播出去、但还没进链确认的交易加手续费,同时还可以替换交易内容(这样可以双花,也就是撤销未确认交易,所以引来一些争议)。