比特币地址生成的一些问题,自己实在是想不明白!

2022-12-05 18:19:31 +08:00
 RageBubble
1.比特币私钥为什么可以生成无限量的地址?
比特币的私钥通过椭圆曲线函数生成公钥,公钥通过两次哈希生成收款地址。
所以按道理来说同一个私钥应该是只能生成同一个公钥,然后生成同一个收款地址。然而现实是比特币钱包可以几乎无限量生成收款地址,是哪个变量造成的地址不同?

2.我用一个比特币钱包软件生成了 10 个比特币收款地址,我现在使用另一个比特币钱包(假设两个钱包使用同一协议),第二个钱包能识别出我生成的 10 个地址吗。如果可以,按照问题 1 的逻辑,是怎么刚好识别出我的 10 个地址而不是 9 个 ?如果不可以,那岂不是第二个钱包软件就无法准确计算我的比特币“余额”?(这里用余额是为了方便说明,我知道比特币用的是 UTXO )

请区块链大神解答一下疑惑,谢谢!!!!
3434 次点击
所在节点    Bitcoin
16 条回复
hellojay
2022-12-05 18:23:47 +08:00
哈哈,先问是不是,再问为什么
AoEiuV020CN
2022-12-05 18:38:09 +08:00
需要程序思想,不能太依赖物质世界的思维,

这我感觉和一个编程概念很相似,

内存只有一段比特位是 01010101 , 怎么判断这个变量是 chat 类型还是 int 类型,
答案是无法判断,读取的程序认为他是 char 类型就是 char 类型,认为是 int 类型就是 int 类型,

随便手写一个符合比特币私钥长度的规范的 01 比特位串,你说这是什么?比特币说这个是私钥地址并计算出公钥地址那这个就可以是比特币私钥,你就可以往里面打钱,
另外一个分支币也可以认为这是我这里的私钥,我也打钱不关比特币的事,
fazero
2022-12-05 18:45:58 +08:00
同一个私钥应该是只能生成同一个公钥,然后生成同一个收款地址,这没问题。你说的比特币钱包可以几乎无限量生成收款地址,是指一套助记词可以生成无限收款地址吧,可以研究下这个,https://iancoleman.io/bip39/
akulamatata
2022-12-05 19:11:24 +08:00
钱包会去链上查钱包地址对应的交易,然后算出你的余额,如果你的钱包地址做过交易,不管哪个钱包只要支持这个链就能识别出来
WinG
2022-12-05 19:16:32 +08:00
你需要搜索理解助记词派生私钥的原理,他们不是同一私钥。
acess
2022-12-07 23:35:39 +08:00
1.一个私钥只对应一个公钥(其实还可能是非压缩公钥,但现在一般不用了。另外 segwit 是禁止用非压缩公钥的,如果用非压缩公钥生成地址就无法转出)。

BIP39:助记词,可以用一串单词表示随机种子,方便保管。
BIP32:HD 钱包,可以从一个随机种子分层推导派生一堆公钥私钥,但需要指定一个路径。
BIP44/49/84/86:规定 4 种标准的推导路径,地址分别是 1 、3 、bc1q 、bc1p 开头,脚本类型是 P2PKH 、P2SH-P2WPKH 、P2WPKH 、P2TR 。
最后一种 P2TR 是最新的技术,taproot+schnorr 签名+mast 多合一统称叫做 taproot ,虽然已经激活一年了、而且要说提出其实早得多……但很遗憾到现在还不怎么普及。P2TR 是裸公钥,没有经过哈希。

2.BIP44 不止规定路径,还有在 HD 内进一步定义“账户”。还有就是 gap limit 。
除了盲猜 index 暴力搜索比对( index 有 32bit ),确实是没办法直接知道一个地址是不是属于你。所以钱包只能是从 index=0 开始往后多生成几个地址就停,只扫这些地址有没有交易,扫到了再继续往后推。
从助记词恢复钱包的时候,钱包软件怎么知道你当初是往后生成到第几个地址了?它不知道。
所以 BIP44 就规定了一个 gap limit ,从上一个有交易的地址开始,限制只能继续往后生成 20 个地址,只有这 20 个地址里产生交易了,才能继续往后生成(而且还是限制到 20 个)。
不过确实,这个规则是没办法强制约束钱包遵守的,所以有些钱包是约束自己不要坏了规矩,但导入助记词时就把别人尽量想得没素质一点、多往后派生地址、多扫描一些,仅此而已(虽然即便如此,能扫的范围也总是有限的,没办法 100%覆盖)。
acess
2022-12-07 23:37:44 +08:00
(啊还有,P2SH-P2WPKH 其实是经过 4 次哈希了,P2WPKH 和 P2SH 都是一次 SHA256 一次 RIPEMD160 )
litesoar
2022-12-08 14:35:06 +08:00
现在钱包都是助记词。
助记词相当于父私钥,父私钥可以生成很多子私钥,子私钥再生成公钥、公钥生成地址。
所以钱包可以生成很多地址,但用一套助记词就可以管理。
acess
2022-12-08 19:34:40 +08:00
@litesoar

这块其实蛮混乱的,有一家做硬件钱包的厂商就出于公益目的稍微总结了一下: https://walletsrecovery.org/

1.助记词本身其实只是最根源的随机种子。
2.然后 HD 是需要指定推导路径的。

首先第 1 个环节,助记词:
BIP39 可能算是业界最通行的,但不少开发者讨厌 BIP39 ,想取而代之。
更蛋疼的是他们甚至没换一套新的单词表、没考虑怎么跟 BIP39 区分开来。
于是光是作为随机种子的助记词就已经产生混淆了,有时候可能一个助记词既可以按照 BIP39 来解,也可以按照 Electrum2.0 、aezeed 等其他格式来解,所以如果解法不对,结果自然是驴头不对马嘴。

然后第 2 个环节更是不用多说……
虽然不少钱包还是遵守 BIP44/49/84/86 这些的,但其实……就像 BIP44 ,当时好像有像 bread 这样的钱包,在这个标准出来之前就支持 HD 了,所以它的推导路径很自然是跟 BIP44 不符的……
acess
2022-12-08 19:36:17 +08:00
@litesoar

我记得 walletsrecovery 里还列出有些钱包,乍一看好像遵守 BIP44 这些,但他自己有一些小动作实际上偏离了标准(比如 gap limit 过大之类的),反正是挺蛋疼。
acess
2022-12-08 19:41:05 +08:00
@litesoar 所以 walletsrecovery 上也说了,其实只拿着一个助记词是不够的,“一个助记词就够了”这个理想很美好但不接地气,作为用户你其实是还得知道这个助记词是哪个钱包(甚至是哪个版本)生成的,否则未来恢复钱包可能遇到问题不能正常或完整恢复。

像提出 aezeed 的开发者(也是 LND 的开发者)就认为,最终还是每个钱包自己做一套助记词格式。(所以呢?难道“不如干脆弃疗”?😂)
嘛……怎么说呢,毕竟每一家钱包都各有各的想法(摊手)。
RageBubble
2022-12-12 10:32:41 +08:00
好的 谢谢各位
RageBubble
2022-12-12 10:33:19 +08:00
@litesoar 谢谢
RageBubble
2022-12-12 10:34:04 +08:00
@WinG 好像是和派生私钥有关
RageBubble
2022-12-12 10:34:57 +08:00
@acess 那就太难受了
RageBubble
2022-12-12 10:45:55 +08:00
@acess 你的回答完美解答了我的疑惑 谢谢

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

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

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

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

© 2021 V2EX