@
memorybox @
memorybox 我还是逐条杠一下吧。
1. 写入区块链的交易才被承认,双花交易只存在于内存池中,所有的双花交易只能有一笔进入区块链
“内存池”是每一个节点自己维护的,它存放的是待打包的交易。每个节点都有自己的内存池,并不存在一个全网统一的“内存池”概念。
你愿意打包什么数据进区块,完全是你的自由,谁也管不着。你愿意的话,打包进去一笔从 0.01 个币凭空变出 1 亿个币的非法交易都不是不可以。
如果有人尝试双花,那就会产生 N 笔互相抵触的交易(因为这些交易都花掉了同一个币)。
但是,**正常的节点不会允许自己的内存池里出现多笔互相抵触的交易**,只可能保留其中的一笔。
说完了内存池,那区块链呢?
只要有算力,任何人都可以完全可以去挖一条非法链来同时把这 N 笔互相抵触的交易都给打包进去,这样其实凭空造出了币。
如果你不愿意挖这种非法链,那你也可以去挖出多条分叉链,每一条分叉链本身都只打包这 N 笔交易中的一笔,每一条分叉链都完全符合规则。
不过,**正常的节点都是先独立地从头验证一条链是否合法**,中间但凡有发现任何违反规则的数据,都会将其标记为非法,**拒收**这条分叉链自此以后的所有区块;
**如果正常的节点看到了多条合法链,则会跟随其中最长的那条链(严格来说是积累工作量最大,而不是最长)**。
但凡是理性的矿工,也就是脑子里只想着赚钱的矿工,他只要考虑到“其他矿工也会按照规则验证我挖出的区块,非法区块会被拒收”,就不会把非法的交易打包进去;
他只要考虑到“最长链规则”,就只会在最长链的末端进行挖矿,把这条最长链延长;
无论是乱七八糟的分叉链,还是虽然长但是包含非法内容的链,理性的矿工都不会去跟随,因为跟随了,就是浪费自己的算力,让矿机白白烧掉电费而拿不到奖励。
可以看出来,每个节点都只是遵照一个规则来独立进行判断,而不是交给某一个“权威服务器”来进行处理和判断。所以才说,比特币是去中心化的。
2. 更改已经进入区块链的交易,只有发动 50%攻击
51%攻击,这个我在 3 楼说过了。
至于“更改已经进入区块链的交易”,我也在上面几楼说了一下比特币社区的分歧:
目前占主流的一派认为“比特币区块链具有无需信任(可以自证清白)的能力,即使是 50%以上的算力也仍然不能主宰比特币系统,为了达到这个目的,只能劳烦用户去跑笨重的全节点软件,别无他法——这也是我们不应该随便扩大区块容量的众多理由之一”;
相对少数的“大区块党”就不认同这一点,他们认为“按照中本聪的很多发言,矿工本来就主宰着比特币系统,所以区块容量和全节点之类的东西,让矿工们去管理就可以了,一般用户不需要操心去掺和;至于什么‘欺诈证明’都是很边缘的问题,不能拿来作为阻碍扩大区块的借口”。
3. 消费 coinbase 交易需要 100 block 的成熟期,现在不少裁剪节点是以 prune 方式运行的,一般设定 prune=4096,所以说,理论上区块链重组是有可能的,但是 100 个 block,4000 个 block 级别就变成近乎不可能的事情,一般情况下,6 个 block 确认就基本上确保一切; 历史上曾发生过最多 31 个 block 的重组事件,是在 2013 年 3 月份发生的,现在几乎不可能再有这种情况发生了;
coinbase 成熟度和区块修剪,这两个都是发生链重组时(也就是“回滚”,放弃一条分叉链,改为跟随另一条分叉链),可能带来连带损害的地方。就是为了防止出现连带损害,才要设置比较大、比较保守的限制。
coinbase 交易,就是矿工挖出新币+手续费奖励的特殊交易。如果过早允许矿工花掉这种“新挖出的币”,那很显然这些币还可以被接手的人再次花出去,这样就会产生一连串交易。如果发生了链重组,那源头的 coinbase 交易不能放到另一条链上,所以它后面的一大串交易也都会随之被判为非法、被丢弃掉,这很显然很糟糕,所以就需要尽量避免这种情况,就是为了这个才加了 100 个区块的确认的 coinbase 成熟度限制。
不过要注意,这个 100 区块确认的限制是写在全节点软件代码里的共识规则,谁都不能打破,否则就会被拒收。平时说的 6 确认就不是这样,6 确认只是一种典型的参考值,实际上在 0 确认的时候你就已经可以把收到的币发出去。一般说“请等待至少 6 个确认”,或者更多个确认,这个是**收款方为了保护自己而自愿选择去等**。对于交易所充值来说,也是如此,交易所也要保护自己,防止恶意用户利用双重支付来变相实现偷币。
区块修剪,这个很显然也是因为删掉了老区块数据就无法回滚到这个时间点之前,导致整个全节点软件都不能正常运作,所以目前就是至少也得保留 550MiB 的历史区块。