双花问题
在比特币系统中,Hash指针有两个用途:指向前一个区块和指向某笔交易。
比特币支付过程中,每笔交易都必须包含输入和输出。
交易输入中需要包含付款方此次交易的币的来源,付款方的公钥,交易输出包括此次要交易的币的数量以及收款方的地址。
币的来源中会包含付款方的地址,这样可以防止盗币事件的发生。
在交易时,首先会从区块中验证交易输入,验证通过后才会执行交易输出。这一步可以防止“双花”攻击。
共识
区块链是一个去中心化的分布式账本,既然是分布式,那就需要网络中的各个节点对账本信息达成共识,保证比特币网络中使用的都是同一份账本。
在生活中,当对某个问题产生分歧时,通常会采用投票的形式来进行表决,大部分情况下采用的都是“少数服从多数”的原则。当在区块链网络中是很难操作的。
假设区块链网络中的大多数节点都是诚实节点,只存在少部分恶意节点。如果采用投票的形式来决定区块的产生,那么会面临以下几个问题:
- 谁有投票权
- 网络延迟
- 存在弃权节点
- 女巫攻击或者“水军”攻击
针对以上问题,比特币使用了“算力”来进行投票,决定新区块的产生。
谁有投票权
\[H(version,target,nonce,Hash_{pre},MerkleTreeRoot) <= target\]在比特币网络中,一个区块的产生,需要完成上面的计算过程。只有求解出上面问题的节点才能将区块添加到区块链中。
在上面的计算式中,计算的实际是区块的block header。对于一个确定的区块,区块链的版本、计算难度、前一个区块的Hash以及MerkleTree的根节点的Hash,这些值都是确定的,只有nonce是不确定的。因此,求解上面计算公式的过程实际上就是不断查找符合要求的nonce的过程。
而求解过程需要耗费大量的算力,可以理解为每秒尝试的nonce数。每秒尝试nonce数越多的节点,出块的概率越大。
虽然找到符合要求的nonce很困难,但是使用给定的nonce验证结果很简单,这也就是比特币中要求的“Puzzle friendly”。
网络延迟
在比特币网络中,只有最长的链才是合法链。之后产生的区块都需要添加到最长链才会被整个网络认可。因此,如果网络延迟结束后,节点会首先更新自己本地的账本,以确保自己之后的出块操作会被网络认可。
弃权节点
在当前的比特币网络中,每个新生成的区块中都包含了一个铸币交易。铸币交易会凭空产生一定数量的比特币,当有新的区块添加到区块链上,这些新生成的比特币归生成该区块的节点所有。
注:比特币设计之初就明确了其总量是固定的,为2100万枚,每21万枚,铸币交易产生的比特币数量减半一次。最初每个区块会产生50枚比特币奖励。
引入了激励策略,可以最大限度的调动各节点的积极性。
女巫攻击
女巫攻击是将原本需要分散备份到多个节点上的数据通过不同身份的操作全都存储到自己的节点上。
在比特币网络中,出块节点需要算力的支持。女巫攻击相当于将自己的算力分到了多个节点上,这样降低了单个节点的算力。
在比特币网络中,算力为王。
声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin92
Github: mengbin92
cnblogs: 恋水无意