比特币基于的是区块链,而区块链是运行在因特网上的,而且涉及金融,就可能存在有人作恶的情况,而普通的拜占庭的问题,PBFT算法可能防止坏人作恶,但是这个防备有上限的
如果坏人不断的增加节点,打破了 (n-1)/3的限制
区块链如何改进的呢?就是POW算法
POW算法,简称Proof Of Work,可以认为是一份证明,证明做过一定量的工作,比如,就是大学的毕业证书,证明通过4年努力完成了相关课程学习
简单来说,就是做一定有难度的工作,得到一个结果,验证方检查客户端是否做了对应的工作
请求方做了一些运算,解决了某些问题,然后将运算结果发送给验证
请求方和验证方是不对称的,就是请求方需要大量运算,而验证方只需要简单的手段就能验证
如何进行证明自己做了一定量的工作呢?
通过哈希运算,区域链通过哈希运算,然后利用这个计算后的结果,证明自己做过了相关工作,
哈希运算就是一种散列函数,我们可以通过对任意长度的字符串进行SHA256哈希运算,得到一个32字节的哈希值
那么我们就利用这个哈希值来证明工作量
基于一个基本的字符,并且在字符串后面添加一个整数,比如 hello0000,计算后得到一个哈希值,如果得到的哈希值为0000开头的,就验证通过,不通过,就将后面的整数不断的加一,进行一个一个的运算
我们就通过35024次计算,得到了前面为0的哈希值
“geektime0” => 01f28c5df06ef0a575fd0e529be9a6f73b1290794762de014ec84182081e118e
“geektime1” => a2567c06fdb5775cb1e3ce17b72754cf146fcc6da75c8f1d87d7ab6a1b8c4523 … “geektime35022” => 8afc85049a9e92fe0b6c98b02b27c09fb869fbfe273d0ab84ad8c5ac17b8627e “geektime35023” => 0000ec5927ba10ea45a6822dcc205050ae74ae1ad2d9d41e978e1ec9762dc404 |
工作量证明就是通过哈希运算,经过一定时间的计算,得到符合条件的哈希值
这个规则,不是固定的,实际场景中,根据场景特点,指定不同的规则,比如分别找到前3位为0和前5位为0的哈希值
区域链如何融合的POW算法的?
区域链是通过SHA256来执行哈希运算,POW基于区块链中的区块信息,运算的
区块链中的区块,区块头主要是由上一个区块的哈希值,区块体的哈希值,和随机数组成的
区块提,区块包含的交易数据,其中第一笔是Coinbase交易,用于激励矿工的特殊交易
而且区块链中的区块头,就用于区块链工作证明的哈希运算中,作为输入字符串,通过双重SHA256哈希运算进行计算出的哈希值,必须小于一定的值,才能判定为有效,不然是无效的
然后算出符合条件的哈希值,矿工就会将这个信息广播到集群中所有其他节点,其他的节点验证后,将这个区域加入到自己的区块链中,形成一串的区块链
算力越强,系统会更加大概率的计算出这个哈希值,如果坏人掌握了51%的算力,就可以发动51算力攻击,实现双花 Double Spending,同一分钱花2次
简单来解释这个问题,就是攻击者掌握了较多的算力,能挖掘出一条比原链更长的攻击链,并且将攻击链向全网广播,这时候,更长的链会被节点接收,导致原链被丢弃
这种问题,就是攻击者可以先进行向原链消费,然后在利用新链进行消费,打一个时间差
但是,会存在一种问题,就是攻击者可能算力很大,也存在着半天无法算出一个区块的哈希值的可能性,避免了攻击成功,即时算力小,运气好也可能成功,这是有着一种概率性的,只不过算力越强概率越大
这样,我们主要了解了POW算法的原理,和51%攻击
比特币的区块链,POW算法,是通过SHA256进行哈希计算的,计算出符合条件的哈希值,证明工作量
51%攻击,就是利用了区块链的最长链胜出机制,来利用优势算力,实现对最长链的争夺
但是区块链和有着挖矿得币的奖励机制,保证了系统的稳定
但是由于区块链使用了Raft算法,那么恶意节点当选了领导者后,可以不断的告诉其他的节点,比特币是我的,按照Raft的约定,其他的节点也只能接收这些情况,谁让恶意节点是领导者呢?
我们通过计算得到了0000开头的哈希值,来做实现工作
那么约定更多的0开头的哈希值,比如000000,工作量是在增加了还是减少了?
理论上是增加了,因为000000包含了0000,所以理应更加难以计算