BTC系统维护的数据结构
BTC的全节点会要维护一个UTXO(没被花掉的交易的输出的集合)的数据结构,作用是快速检测双花攻击(是否一个BTC被花两次)
矿工的两个激励
矿工挖出区块了,除了出块奖励,还有第二个激励机制:交易费,就是在写下一个区块的时候可以把其他的交易信息写上,并从中抽取一部分手续费。当然目前而言,矿工主要的收益还是出块奖励的BTC。
为啥会有交易费呢,因为写入下一个区块是要消耗资源的。例如带宽这种,有的矿工可能选择不打包你的交易信息,所以需要奖励矿工一部分交易的BTC,那么即使这个矿工不打包,下一个挖出区块的矿工也会选择打包(钱不赚白不赚)
一个区块的信息BTC会通过调节难度,来让出块时间保持在10分钟左右,所以你出块的概率是你在全网算力所占的比例。所以当有矿工退出挖矿之后,你会更容易挖到BTC。
正是由于出块时间稳定在10分钟,那么21万个区块大概四年挖完,也就是每四年币的奖励衰减一半。
到后期当出块奖励很少的时候,可能矿工的主要收益就是手续费了(挖矿是可以一直持续下去的)。当然会有部分矿工退出市场,那么在场的矿工算力比例会提高,等于提高了收益。
由于现在挖矿竞争很大,所以难度已经调的很高,Nonce的搜索空间只有4字节已经不能满足需求,需要修改coinbase 从而修改了merkle root,取一部分值作为随机值来扩大搜索空间。
挖矿的概率分析
需要无记忆性(memoryless),就像掷硬币,他正面朝上的结果是与上一次无关的,在BTC系统中是也是同样,每次尝试nonce成功的概率很小,尝试次数很多。在这里就是如果10分钟还没挖出区块,那么后面也还是要平均10分钟才能挖出(和前面挖没挖出无关,并不是已经过去5分钟了,那么后面五分钟一定会出一个)。
如果虚拟货币设计的挖矿有记忆性,也就是前面试的越多,后面挖到的可能性越大,这样的话,算力强的矿工会有不成比例的优势。比如两个矿工,A的算力是B的10倍,在无记忆性的系统中挖矿,A的概率就是B的10倍,显然在有记忆性的系统中就会大于10倍。
正是因为这种无记忆性,才能保证挖矿的公平。
上面是BTC总量,虽然挖矿过程除了比拼算力之外没有其他现实意义(并不是求解某个数学难题),但是对于维护BTC系统来说是至关重要的(不挖就没人记账了,交易也无法完成),只要大部分算力是在诚实的人手中,那么整个系统的安全性就有了保证。
对安全性分析
如果有恶意的节点想发布一个非法交易,那么他需要在获得记账权的时候,才能发布这个非法交易,但是善良的节点不接受这个区块的话(除非恶意节点的算力超过51%),基本是不会出现在最长合法链上,会导致这个节点所获得的的出块奖励作废(代价挺大的)。
有一种攻击方式是selfish mining
就是当他挖到区块但是不公布出来,而是接着这个区块挖,在别人挖出一个区块的时候,他广播出两个区块,这样别人挖出来的区块就作废了,减少了竞争。当然这是理想情况,风险就是,你还没有公布出来你挖出来的一串区块链时,另一个分叉上的区块已经超过了你手上的区块,变成了最长合法链,那么你的所有算力都浪费了,不会拿到出块奖励的BTC(这就是恶意矿工,只要大部分的算力在诚实的矿工手上,这种分叉攻击是很难成功的)。
那么,还有一个问题,在BTC交易确认是一般要等待后面6个区块的产生,才会写入区块链,也是为了防止分叉攻击,因为当A和B交易BTC,A转完这个BTC后,接着上一个区块的后面插入一个新的区块,形成分叉,在这个新区块中A把BTC转给自己,如果后面这一条链成为最长合法链,那么B手上的BTC就会回滚到A,财币两空。防范这种攻击就是等6个区块的确认,再写入基本保证写入的就是最长合法链。
网友评论