说说为什么一个比特币私钥可以对应多个地址

2021-04-22 03:13:27 +08:00
 acess
楼主来半桶水瞎掰扯一下这个蛋疼的问题……


(1)光是公钥就分两种:压缩和非压缩。现在一般用压缩的。

于是,光是 1 开头的 P2PKH 地址,就有两个,因为压缩公钥和非压缩公钥哈希出来也不一样。


(2)锁定脚本,或者叫输出脚本,这方面的写法几乎无穷无尽……虽然典型 /常见的也就那么几种。

这个说来话长。

不过到这里已经可以看到:

2 种公钥×N 种输出脚本=……
额,有点画美不看……

而且,未来激活了 taproot,公钥可以和脚本哈希合体,里面还可以藏入……额……嵌套多层的脚本哈希……
额……

(又不知道哪里触发 V 站的和谐了,哎,跟贴吧一样难用,楼下继续)
935 次点击
所在节点    Bitcoin
30 条回复
acess
2021-04-22 03:14:44 +08:00
(因为万恶的和谐,必须把文字拆开,看看哪里触发了和谐,抱歉)
acess
2021-04-22 03:14:59 +08:00
不过,幸运的是,对于现在最通用的 BIP39/44/49/84 钱包来说(不幸的是,最“官方”的 Bitcoin Core 目前还不是这个体系,尤其是有些开发者很抵制 BIP39 助记词,哎),不同的地址类型需要走不同的 HD 推导路径,不会出现一个公 /私钥被用到多种不同地址身上的情况。

只要你自己不自找麻烦,不把单个私钥或公钥手动导出后瞎折腾(换句话说,如果你瞎折腾了,那就可能出现问题,主要就是,你自己折腾出来的新地址,只能在你自己折腾的非标准钱包里看到交易记录和余额;而在标准的钱包里扫描不到,就好像丢了币一样),那还是:

[一个私钥]<=>[一个公钥]<=>[一个地址]
acess
2021-04-22 03:15:33 +08:00
还是 1-1 对应,还是那么简单清爽——虽然……
acess
2021-04-22 03:15:45 +08:00
……虽然,你给钱包导入 1 个 HD 助记词(或者叫 HD 种子)后,还是会:
acess
2021-04-22 03:15:55 +08:00
(1)生成好多个地址;
(2)每次无论是收款还是付款,都会换(生成)一个新的地址(但是别怕,只要 HD 种子备份好了,这些地址都可以恢复出来);
(3)而且这些地址还分 3 种:
acess
2021-04-22 03:16:14 +08:00
第一种:1 开头的 P2PKH 地址,最老、最经典、最通用;矿工费没有折扣所以最贵。
(公钥当然是压缩公钥。P2PKH 可以用非压缩公钥,但是现在一般都不用了。另外下面提到的隔离见证还是禁用压缩公钥的)
acess
2021-04-22 03:16:21 +08:00
第二种:3 开头的 P2SH-P2WPKH 地址,又叫 P2SH 封装隔离见证地址,或者叫“兼容”隔离见证地址。
兼容性和第一种差不多;
矿工费因为享受了折扣,所以(在转出时)比第一种便宜不少,但是因为 P2SH 封装本身也要占字节数,所以矿工费仍然比第三种贵;
acess
2021-04-22 03:16:28 +08:00
第三种:bc1 开头的 P2WPKH 地址,又叫 Bech32 地址,或者叫“原生”隔离见证地址。
前两种地址都是中本聪设计的 Base58check 编码,大小写混合; Bech32 编码是新设计的,不含混合大小写,要么全大写要么全小写。
因为 Bech32 编码是新设计的,所以存在兼容性问题:老钱包不识别新地址,于是老钱包(在操作上)就不能转账给这种新地址——把钱包升级到支持 Bech32 的新版,或者把私钥 /助记词导出,再导入给支持 Bech32 的其他钱包,就可以了。
新钱包从新地址转给老钱包是没问题的(顶多就是零确认看不到,进链确认了就能看到进账了)。
acess
2021-04-22 03:18:50 +08:00
下面展开说说输出脚本这个梗……
acess
2021-04-22 03:19:09 +08:00
1 开头的 P2PKH 地址,实际上对应了一个“锁定脚本”,它规定了,在满足什么条件下,可以把币“解锁”、转(花)出去。

如果条件不满足(比如,你没给出有效的数字签名;或者是锁定时间还没到期,等等),那这笔交易就是非法的,不能打包进链,哪个矿工敢打包,大家就都不承认他挖的区块。

这个锁定脚本的写法,很显然是很自由的……但是如果你写的不是标准的脚本,那按理说就没有对应的地址可以表示这个脚本了。
acess
2021-04-22 03:19:20 +08:00
于是,很久很久以前(没记错的话是 2012 年),比特币引入了一个新功能,P2SH 。
acess
2021-04-22 03:19:46 +08:00
无论你的锁定脚本写得多么乱七八糟,都可以哈希一下,然后,这个脚本的哈希值就可以用一个 3 开头的地址来表示。

3 开头的地址——看看,有地址了!无论多么乱七八糟的锁定脚本,都可以用一个标准的、3 开头的地址来表示。
acess
2021-04-22 03:19:57 +08:00
这个脚本哈希值就可以代表你原先写的那个脚本,这种情况下,哈希之前的锁定脚本就改叫“赎回脚本”( redeem script )了。

未来要把币“解锁”转出去的时候,不仅要提供“解锁”的条件(一般就是数字签名),还要把“赎回脚本”的原文一同给出。
大家把你给出的赎回脚本进行哈希,和当初的脚本哈希比对,结果一致,然后就按照赎回脚本规定的步骤,去验证币能不能“解锁”花出去。
acess
2021-04-22 03:20:19 +08:00
(其实 P2SH 是把原先存在的一种很鸡肋的输出脚本语义改变了……这种很鸡肋的输出脚本,在比特币引入 P2SH 功能之前,只走到“把你给出的赎回脚本进行哈希,和当初的脚本哈希比对,结果一致”这一步,就算验证通过了。这种情况,乍一看,好像是“输入密码即可提款”,很简单,但没有实用性。为什么没有实用性?因为任何人都可以把交易输出里的收款地址篡改成自己的,篡改完了交易仍然有效。P2PKH 就不是这样,交易输出是受数字签名保护的,篡改了输出,交易就无效了。总之,P2SH 用一种很 hack 的方式,把之前几乎无用的一种输出脚本重新定义,改进了现在广泛使用的新功能)
acess
2021-04-22 03:21:52 +08:00
(楼上“P2PKH 就不是这样”这里没打错,我就是拿 P2PKH 举个例子,和 P2SH 的前身做一个对比)
acess
2021-04-22 03:23:12 +08:00
(哎,14 楼还是有一处打字错误,纠正一下:“改进 [后就变成] 了现在广泛使用的新功能”,抱歉)
acess
2021-04-22 03:27:18 +08:00
然后回到主贴提到的:
“未来激活了 taproot,公钥可以和脚本哈希合体,里面还可以藏入……额……嵌套多层的脚本哈希……”

乍一看很可怕。但是,只要明白了 P2SH 是咋回事——无非就是,先登记合同的哈希值,未来要按照合同内容执行时,再提供完整的合同全文——那就会明白,taproot (这里不单指 taproot 本身,还包括了 MAST )并不是吓人的复杂怪物。

(不过老实说楼主也没亲自测试过 taproot,可能很多地方还有误解,轻喷)
acess
2021-04-22 03:35:05 +08:00
首先,P2SH 不是用来封装锁定脚本的么,实际上都被大家用来封装什么了呢?
大多数时候,都是多重签名(其次就是隔离见证)。
一个地址,被多把私钥共同控制。
M of N 多重签名,就是一共有 N 把私钥参与,其中至少 M 把私钥签名后,就可以把币花(转)出去。
acess
2021-04-22 03:41:52 +08:00
实际上 P2SH (以及隔离见证改进版的 P2SH,也就是 P2WSH 。P2WSH 也是 bc1 开头,但是比 P2WPKH 更长)用到多重签名上还存在一个陷阱:

如果你把币存到了 2of3 多重签名地址上,但是只备份了其中两把私钥,
那么不好意思,
(如果你把设置好的钱包文件删了)你的币丢了,永久丢失,谁也找不回来。

欸,不是 2of3 么,2 把私钥不是够了么,怎么会找不回来呢?

因为,要从 P2SH 地址里把币花出去,你不仅需要用 2 把私钥签名,还要知道被哈希的那个赎回脚本的完整原文是什么。如果你不知道第三把私钥对应的公钥,那也就等于你不知道赎回脚本。
当初建立多重签名钱包的时候,肯定是三个公钥都参与进来,才得到赎回脚本,然后赎回脚本哈希后就可以得到 3 开头的 P2SH 地址。

很显然,从脚本哈希是不能反推出脚本原文的,包括公钥。
如果你既没有赎回脚本本身,又没有第三把私钥对应的公钥(用这个公钥很显然可以重建赎回脚本),那就回天乏术了。
acess
2021-04-22 03:42:24 +08:00
taproot 本身,就是说,一个公钥(这里需要配合将来要支持的 Schnorr 数字签名,而不是现在用的 ECDSA 数字签名),你看来看去,怎么看,它都只是一个公钥;但实际上,它不止是个公钥,这个公钥里还隐含了一个哈希值。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/772332

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX