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