lysS
V2EX  ›  Bitcoin

比特币这个分布式系统,是怎么保证节点之间互通的的?

  •  
  •   lysS · Dec 16, 2021 · 2439 views
    This topic created in 1643 days ago, the information mentioned may be changed or developed.
    包含两个意思:
    1. 逻辑层面的分布式,用的什么算法
    2. 网络上的互通:a.一个新的节点想加入比特币系统,它应该怎么做喃?广播?
    b.矿机、交易双方是怎么解决广泛使用的 NAT 带来的网络隔离的

    不太了解这个,贱笑了
    10 replies    2022-04-26 19:04:52 +08:00
    acess
        1
    acess  
       Dec 22, 2021 via Android   ❤️ 1
    1.工作证明,如果有分叉链,首先排除违反规则的(比如凭空瞎造币的,以及把已经花掉的钱再花一次,等效于凭空造币的),然后如果还有分叉就选取积累工作量最大的。(不单纯看最长,因为挖矿难度在变,基本趋势是上升,按照历史上的低难度很显然能高速爆块,这个漏洞是中本聪早期亲自修正过的)
    acess
        2
    acess  
       Dec 22, 2021 via Android
    (第 1 问我也不确定楼主的意思,大概是问共识算法,所以我就那么答了。另外别想得太高大上,比特币很简单粗暴低效的,就是从头把整条区•块•链账本全部下载回来捋一遍而已,现在已经攒到好几百 GB 了。所谓“trustless”(无需信任)其实就是因为每个全节点都把这几百 GB 亲自验证了一遍。另外白皮书里的裁剪其实也没有什么意义,因为“剪枝”后就无法“自证清白”了,不是完整的账本,就无法排除是不是被恶意挑选过 merkle 分支(比如把没花掉的币“修剪”掉,或者反之),所以实际实现的修剪就是简单粗暴删掉老区块,删掉不影响正常同步,因为继续同步只需要 utxo 集合,只有需要扫描旧区块找回交易历史的时候才会碰到问题)
    acess
        3
    acess  
       Dec 22, 2021 via Android
    2a.新节点可以通过 DNS seed 找到其他节点,说白了就是歪用 DNS 协议查询默认写到软件代码里的 DNS seed 服务器。虽然这个服务器你可以换成别的,或者不用 DNS seed 、自己指定导入节点 IP ,但这还是被批评为没有完全去中心化的一个点。另外听说过有可能直接扫端口( IPv4 还能扫,v6 估计扫不了了),不过不太清楚这方面。
    新节点加入后,其他节点会“认识”你(同理你也会“认识”别人),尤其是可以被 seed 服务器记住,然后别人(无论是不是 seed 服务器)可以把你“介绍”给其他人,具体比特币 P2P 协议里有规定。
    acess
        4
    acess  
       Dec 22, 2021 via Android   ❤️ 1
    2b.在 NAT 后面(而且如果没办法端口映射)确实会导致别人没办法主动连接到你,于是你就没有传入连接了,只能传出连接到别人(都是 TCP )。但连接都是双向的,所以不影响你正常使用,无论是同步、发送交易还是挖矿(当然挖矿需要对接算力,全节点本身没有挖矿能力)。
    acess
        5
    acess  
       Dec 22, 2021 via Android
    另外比特币只有极早期是“节点”“钱包”“矿机”三个功能或角色全部整合到一个软件里的。现在这三个角色早就分离开了。
    (全)节点没有挖矿能力(虽然还集成钱包,但其实编译期间就可以选择不编译钱包功能);
    钱包呢,说实话全节点虽然可以做钱包服务器,但是效率很低下( BIP37 协议还被默认禁用了,查询历史交易需要扫区块,太过低效),因为缺乏完备的索引,只有像 electrs/esplora 之类钱包服务器 /区块浏览器服务软件才会编制完备的索引,然后才能实现秒速出结果;
    矿机也是,通过 stratum 之类协议,其实矿机压根不知道自己挖了啥,都是矿池喂什么就挖什么,矿工自己可能也不在乎,只要能赚钱挖啥都 ok 。(这方面有 stratumv2 之类协议试图改善,但貌似矿工对此大都不怎么 care )
    acess
        6
    acess  
       Dec 22, 2021 via Android
    说到 SPV ,其实 SPV 是盲信算力的,SPV 本身只能证明一条链确实打包了那个交易,但并不能证明那个交易里的币有没有被花掉(这方面也许未来也许可以打补丁增补上),另外最根本的,无法证明那条链本身是否违反规则。
    这方面争议一直很大,有人认为盲信其实是正常的,因为如果多数算力都开始作弊不可信了,那也没啥其他可以依靠的了;有人则认为必须有“经济上的大多数”仍然跑着全节点验证链上的交易内容约束着矿工、矿工才没有动机去作弊。
    lysS
        7
    lysS  
    OP
       Dec 22, 2021
    万分感谢老哥,打这么多字也是辛苦了
    lysS
        8
    lysS  
    OP
       Dec 22, 2021
    第一个问题,我看了李永乐老师的视频,大概是明白了。
    而第二个问题,我看你提到 DNS, 估计也确实是这样的了。目前我想不到解决办法,就像种子一样,还是需要”中心“的,当然这样的话肯定就不是绝对的分布式的系统了。
    akriafly01
        9
    akriafly01  
       Jan 9, 2022
    @lysS 初始状态如果是完全分布式的,启动周期就太长了。比特币的代码是完全公开的,如果你不喜欢内置的几个域名,完全可以替换成自己的 ip 或者直接导入一个 ip 列表。
    acess
        10
    acess  
       Apr 26, 2022
    @akriafly01 不需要改源码,有命令行或配置选项。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   947 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 21:43 · PVG 05:43 · LAX 14:43 · JFK 17:43
    ♥ Do have faith in what you're doing.