0,fork: 在一些情境下,BTC system 中的 block chain 出现2条 (甚至 多条)分叉链。
根据 造成 fork 的 不同原因,可以 将fork分为以下2类:
1,state fork:
当有2个 fullnode 同时 挖到1个 block,他们 会 直接跟在 previous block 之后,形成2条分叉链。
在这种situation下,随着一条 分叉链 变为 最长合法链,势必 会有 1个 fullnode 变为 orphan block。
forking attack 属于一种 特殊的 state fork,其 fork 为 人为造成,mainly for double spending,是对BTC system的一种 harmful attack。
2, protocal fork:
当BTC agreement发生 modify 时,不同的 full node 会 in respective 沿用 new / old agreement,因此,导致 blockchain 发生分叉。
由于 agreement modification 而发生的 fork,根据 2 条分叉链 是否可以 并存与 system,将 protocal fork 分为 soft fork && hard fork。
2.1 hard fork:
对于 hard fork 来说,由于2条 分叉链 均 符合 new agreement 的 规定,因而 两条 forkingchain 均 会 并存于 BTC system。
以 BTC agreement 对 block size limit 进行 修改为例 说明:
在 旧协议 中,block size is limited within 1M (assume 1transaction 需占用 250bits ,一个 1M block 可以存储 4000个 transaciton。BTC 中 出块儿时间 为 10min/个,据此计算,在旧协议中,BTC system 平均每秒 可以 上链 7笔 tansaction , 每秒交易写入量 过小,会直接 导致 BTC system 网络延迟 过长。为解决这一问题,一些 new fullnode 会 将 block size 从 1M 修改为 4M)。假设,system中大多数 算力 均 confirm to new agreement,只有少数 old node 依然 沿用 old agreement,二者 产出的 block 上链时,会导致 blockchain 发生 forking。
对于 new fullnode 来说,只要block size在4M以内,均属 合法block,而对于 old node 来说,其 只 将 blocksize <= 1M 作为 legal block,因而,遵循 old agreement 的 fullnode 仅会 沿 1M forking chain 接着扩展,而 对于 new fullnode 来说,blockchain中2条 forking chain 均 合法,因而,其可能 会沿着 任意一条 forking chain 进行扩展,最终,会导致 blockchain中 同时存在 2 条 合法链。
对于BTC system中的一些 fullnode,因 system efficiency 原因,确实 会 refuse to obey the new agreement。actually,block也并非越大越好,因为,BTC system 中,info spread采用的是 P2P flooding 的 方式,block size 过大,需 消耗 很多 带宽,影响 block 在 网络的传播速度。
上述提及的 hard fork 可能 在 actual transaction 中 出现 sort of problem,举例说明:
在 blockchain 分叉前,A产生一笔交易,A->B。当 blockchain 发生 hard fork 之后,B便可通过在不同的 分叉链 上进行消费,而 实现 double spending。after hard fork,B可用在 A->B 获得的BTC,分别在 2条 硬分叉链 上 同时实现2笔交易(这就相当于,你可通过 在不同的 分叉链上 进行transaction,而用 一笔钱 购得 2倍的 商品), new agreement chain 的 block and old agreement chain的 block,均可通过 追踪 blockchain 中 A->B 这款交易,而 认为 其在 该链上 产生的交易 为 合法交易。
出上述situation外,hard fork 后,也可能出现 一些有恶意的节点 故意将在 一条分叉链中产生的 transaction ,在另一条 分叉链 上 进行回方,从而实现 double spending。如下图中,B->C then C->B 的情形:B make a deal with C first ,then 撤销该笔交易,通过这种操作,B可通过回放 “C refund” 这个操作,而在 2 条分叉链上 各获得 一笔钱。为handle this,BTC system中 设定了 “chain ID",通过 在 transaction 上 写入 chain ID,而 防止 用户在另外一条分叉链上 回放 transaction 的 操作。
在 以太坊 ETH 中,也曾 真实 发生过 hard fork的事件,hard fork 后的两条链 最终 in respective 作为了 不同的 digital coin 发展。分叉后的 区块链 ETC 在自成一家后,曾做出 将 ETC 中 ETH 退还给 ETH clients的 举动。
2.2 soft fork:
在 soft fork中,不会存在 永久性分叉。
如果我们 通过 在 BTC agreement 中 加入一些限制,来更新 BTC agreement,那么 原来 合法的一些机制 就会变得 不合法。在此 过程中,一些old fullnode 依然 会按照 旧有协议 来 出block,BTC blockchain 就会发生 分叉。new fullnode 自成一叉,原有的 一些 old fullnode 自成一叉。由于 BTC system中所有 new fullnode 仅 将 new agreement 的 forking chain 视为 legal chain,因此,随着时间的推移, 这条 forking chain 会 变为 系统中 the longest legal chain,对于 BTC system 中 即将 出块 的 old node 来说,为保证 其block 不变为 orphan block,其需 一直不断的调整 block在 blockchain 中的位置,只要old fullnode 不对其 软件进行更新,这种问题将一直困扰着他。最终结果便是,blockchain中,仅有符合 New agreement的block 被留存了下来。而其他 未进行 agreement upgrade 的forking blockchain最终都会被废弃。
举例说明:
将 block size 从 原有的1M 改为 0.5M,new fullnode 会将 1M block 视为 illegal,而 另外形成一条 forkingchain,从而 使 BTC system 发生 分叉。对于 new fullnode来说,只有 0.5M 的 forking chain 为 合法chain,因而,其会在这条forkingchain上不断扩展,0.5M forkingchain 会变为 系统中的 the longest chain。此时,即便 old fullnode 将其block 跟在 0.5M forkingchain上,由于,其 blocksize > 0.5M,会被 新上链的 new fullnode 视为 illegal,从而导致 blockchain 在次 发生 分叉。也即:after new agreement,只要有 1M block 上链,new fullnode 便会将其视为 illegal block,而重新分叉,所以,最终,仅有 0.5M block 上链成功,而1M block 统统被 遗弃。
**note that:**在实际中,并不会 有人真的将 blocksize 由 1M 改为 0.5M,因为,1M 的 block 对于 实际运行中的 BTC system 来说,已经比较小。
BTC system中,coinbase transaction中 存在一个 coinbase 域,一般,fullnode 会将其作为extra nonce使用(blockheader中 仅给 nonce
留了 4bytes ,相当于 fullnode 仅可 寻找 2^32 bits 的nonce,而将 coinbase 域 中的 前 8bytes 作为 extra nonce,可以将 nonce的搜索范围 扩大到 12bytes。)。但是,除前8bytes外,coinbase域中 还存在许多写入空间。因此, 有些 fullnode,便提议,将 UTXO 中的 unspent transaction 也组织成 一个 merkle tree,并将其 根哈希值 计入 coinbase 域中,这样,lightnode 便可以通过 从 fullnode 那里得到的 merkle proof,来 证明 某个 账户 是否 存有一定数量的 BTC,在这一步中,存在一个问题,在现有system中,UTXO 仅存储于 fullnode的本地内存,那么,lightnode 根据什么proof 来判定 fullnode 给出的是 正确的 unspent transaction info?
答:如果按照 some fullnodes 的提议,将 UTXO组织成merkle tree,并将其 根哈希值 写入 blockheader中的 coinbase 域,那么,便确保了 merkle root hash 的 不可更改性(一旦 merkle root hash 被 改动,则blockheader的hash值也会随之变动,而 lightnode 是拥有 blockheader信息的,因此,其可通过 确认 block header的hash值,来 判定 fullnode 有没有造假)。
Question:有一点不明,merkle proof 是 merkle tree 中的什么部分?
个人理解,这里所指的 merkle proof,是指 fullnode所提供的 unspent transaction的 info,lightnode 可以按照 fullnode 给出的 unspent transaction 自行计算其 hash值,并将其 代入 UTXO merkle tree 的相应部分,计算 merkle tree的 根哈希值,如果,计算结果 和 blockheader中保存的 roothash 相符,则证明,fullnode 给出了 正确的 unspent transaction info。
如果 系统 对 agreement 作了如上修改,其造成的 forking chain 为 soft fork。
BTC system中,一个 经典的 soft fork实例,便是 P2SH 的 应用:
由于 P2SH (PAY TO SCRIPT HASH) 中,其 交易合法性 认证 分为 2步,第一步 要验证 inputscript中给出的 redeemscript 和 outputscript中给出的redeemscript hash值 是否对的上(这一步 与 old node 所遵循的 PAY TO PUBLIC KEY HASH 的 验证过程一致);
在第二步中,需要验证 inputscript 给出的 publickey 和 signature(privatekey) 是否能够匹配的上,如果match,才能最终 证明 交易合法。
对于 old node 来说,其 只需做 P2SH 的第一步验证,而 new node 需要同时做 P2SH 的 第二步验证,因此,对于 old node 来说 合法的transaction,new node 不一定认为其合法(因为,transaction 可能 在P2SH 第二阶段的验证 中 通不过)。
这就导致了 一旦 new node block上链过程中,遇到 old node block which confirms to P2PKH,其便会进行分叉,久而久之,为了 block不被遗弃,old node便只能将其 script 改为 P2SH,从而使得 blockchain 中仅存在 应用 P2SH 的block。
总结:
在 hard fork中,old node认可的agreement 条款,new node也认可,而 new node 认可的 agreement 条款,old node则不予接受,这边使得BTC system中,同时出现 2 条 legalchain(对于 new node formed chain,old node不会选择链接其上,因为,根据 old agreement,new node为illegal,而 对于 old node formed chain ,new node 可以在此链上继续扩展,因为,new agreement 扩展了 old agreement 的 部分限制要求,相当于 old agreement 被包含于 new agreement。
soft fork中,情况刚好与 hard fork相反,old node 可以沿着 new node formed chain继续扩展,但是,new node 会将old node 所出 block 视为 illegal,这就导致,只要遇到 old node produced block,new node就会分叉,只要 系统中 new node 占据 50% 以上算力,从概率上来讲,new node formed chain 便会成为 the longest chain,即便 后来的 old node ,根据 链长,选择 在 new node formed chain 上扩展,但是,后来new node 在上链时,会在次 将 old node produced block 视为 illegal,从而 产生 新的分叉。如此循环反复,old node 要想在 block chain中 合法,不被遗弃,便只能 根据 new agreement 更新 其 软件。在 soft fork这一情景中,new agreement 为old agreement的子集,其 进一步 shrink 了 old agreement 的 restriction。
soft fork中,只要 系统中 50%以上的算力 更新了软件,便不会 出现 永久性分叉。
hard fork中,只有 系统中全部算力 均 更新了软件,系统 才不会 出现 永久分叉。