V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ling516
V2EX  ›  Bitcoin

比特币一个私钥可以生成几个地址?

  •  
  •   ling516 · 2021-04-21 03:45:52 +08:00 · 805 次点击
    这是一个创建于 1321 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请问下比特币一个私钥可以生成几个地址?我看到有 1 开头和 3 开头的

    如果同时向一个私钥的 2 个地址各发送 1 个比特币,那 2 个地址是各自都能查到 2 个比特币,还是 2 个地址各自只能查到 1 个比特币

    8 条回复    2021-04-23 01:46:57 +08:00
    frienmo
        1
    frienmo  
       2021-04-21 20:29:30 +08:00
    其实你看到的地址 内涵了(公约+包公约定格式)
    所以一个私钥可以生产多个地址(基于不同格式)
    所以 2 地址各自查到一个比特币
    acess
        2
    acess  
       2021-04-22 01:34:52 +08:00
    一个私钥可以控制很多很多种地址。

    一般来讲,不同的地址就是不同的地址。
    acess
        3
    acess  
       2021-04-22 01:39:41 +08:00
    按理说,A 地址有币就是 A 地址有币,不会用 B 地址去查,结果却查到了 A 地址上的币。

    (不过很显然,不同地址上的币是可以一起花出去的,毕竟比特币从一开始就推荐地址用一次就换一个,尤其是后来有了 HD 钱包,换地址后不需要重新备份私钥,只要备份好一个助记词种子就一劳永逸)

    但是因为历史遗留问题,在极少见的情况下(比如中本聪的币,用了 P2PK 裸公钥输出)在这方面会存在一些混淆。
    acess
        4
    acess  
       2021-04-22 02:42:11 +08:00
    中本聪那个时代我没经历过,不过从当时的官网软件截图来看,1 开头的地址(公钥哈希)只是考虑收款方不在线的时候才要用到的。如果收款方在线,就直接用 IP 地址从对方下载一个公钥回来,然后支付给这个公钥(而不是公钥哈希)。这个“付款给 IP 地址”的功能后来被删掉了。

    不仅如此,那个时候挖矿得到的币,也大多放到这种“裸公钥输出”( P2PK )上,而不是现在常用的公钥哈希输出( P2PKH )上。

    就比如 9 号区块,没记错的话这个区块挖到的币公认是中本聪的,中本聪后来用这些币发起第一笔比特币转账给 Hal Finney 。

    你去不同的区块浏览器查 9 号区块,显示出来的样子是就不一样的,虽然表示的内容实际上是一样的。
    blockchair . com 会显示 12cbQLTFMXRnSzktFkuoG3eHoMeFtpTu3S 这个地址;
    而 blockstream . info 和 btc . com 就不显示这个 1 开头的地址。

    9 号区块的 coinbase 输出用的就是这种 P2PK 裸公钥输出,而不是现在通用的 P2PKH 公钥哈希输出。

    如果继续查 12cbQLTFMXRnSzktFkuoG3eHoMeFtpTu3S 这个地址的交易记录,不同区块浏览器显示的结果也不一样。不出意外的话,就是因为有的区块浏览器把 P2PK 和 P2PKH 都统计在内;而有的区块浏览器就只统计 P2PKH,不包括 P2PK 。

    很多开发者都觉得,1 开头的地址就是 P2PKH 地址,只应该用来表示 P2PKH 输出,把它借用过来表示其他的东西是不对的,造成了混淆。但是毕竟这个“混淆”多年以前就一直这么干,现在要“纠正”反而还有点难受。毕竟,如果你一开始只知道 1 开头的 P2PKH 地址,它编码表示的是公钥哈希,从公钥哈希是无法逆推计算得到公钥的,只能扫描区·块·链账本才能找到哈希值匹配的公钥。
    acess
        5
    acess  
       2021-04-22 04:25:04 +08:00
    P2PK 这个中本聪时代的梗其实相对不太重要……

    楼主的问题,确实说来话长,我一写就刹不住车,新开了一个帖子:
    /t/772332
    acess
        6
    acess  
       2021-04-22 05:08:21 +08:00
    在 BTC 里面,一般而言(不去想 P2PK 这个历史包袱),不同的地址就是不同的地址。


    考虑其他币种的话……

    莱特币还有 M 开头的地址,表示的意思和 3 开头的地址一样,就是因为 3 开头的地址和比特币混淆了(),所以才改成 M 开头。这两种只是地址格式不一样,表示的内容是完全一模一样的,就是换了个编码方式,所以甚至还可以互相转换。不过很显然,这个转变有阵痛,而且也许很长很长时间都不能覆盖到所有人。

    BCH 的 CashAddr 也是类似的情况。
    acess
        7
    acess  
       2021-04-22 05:18:06 +08:00
    莱特币的 M 开头地址表示的是 P2SH,和比特币这边 3 开头的地址一样。原先两个币种 P2SH 都是 3 开头的地址,所以偶尔会出现 BTC 打到 LTC 地址(或反之)之类的错误……嗯,(据我所知)按理说出现这个情况,其实币没丢,只要私钥倒腾一下,从 LTC 钱包倒腾到 BTC 钱包(或反之)即可;不过像交易所充错地址之类情况,可能交易所就以各种理由拒绝找回了。

    BCH 因为去掉了隔离见证(当初从 BTC 分叉出去就是为了抵制隔离见证),貌似还新加了脚本操作码,所以情况会更复杂,打错币种可能出现币被锁死或者“任何人都可以花”的情况。
    ling516
        8
    ling516  
    OP
       2021-04-23 01:46:57 +08:00
    @acess 谢谢大佬的讲解
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3130 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 13:40 · PVG 21:40 · LAX 05:40 · JFK 08:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.