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

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

  •  
  •   lysS · 2021-12-16 16:14:33 +08:00 · 1742 次点击
    这是一个创建于 1077 天前的主题,其中的信息可能已经有所发展或是发生改变。
    包含两个意思:
    1. 逻辑层面的分布式,用的什么算法
    2. 网络上的互通:a.一个新的节点想加入比特币系统,它应该怎么做喃?广播?
    b.矿机、交易双方是怎么解决广泛使用的 NAT 带来的网络隔离的

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