Blockchain

传统交易模式

考虑一个转账的场景, Talia (300) 给 Lindsey(0) 微信转账 100元,Lindsey(100) 给 Cooper(300) 转账100元,Cooper 给 Merlin (0)转账 500 元, 交易正确性是如何确保的。

交易特征:以微信为中间节点,交易的正确进行依赖微信,微信保存所有的交易记录,所以的交易都发生在一个以微信为中心的网络里。你只能期望微信不会搞错你的余额。

问题

如果没有微信,支付宝这样传统的值得信任的第三方,在一个完全匿名的去中心化的网络里,前面提到的交易该如何正确进行,你该如何向我打钱?

为了解决这个问题,2008 年,一个叫中本聪的男人用9页论文解决了这个问题。这个叫中本聪的男人用这 9 页纸创造了价值1万亿人民币的比特币以及支撑其运行的技术区块链

Bitcoin: A Peer-to-Peer Electronic Cash System

区块链与比特币

在没有值得信任第三个方的去中心化网络里,最大的问题是每一个人都无法相互信任,所以在上述的场景中,每一次交易都需要广播,目的是网络中的让每一个人知道每一笔钱的来龙去脉,在发出的交易广播中携带一个电子签名,网络中的每一个节点都会验证这个签名,验证通过,则把这笔交易记录到账本中。这样 Talia 就少了100,Lindsey 就多了100。问题是大家如何确认我真的有100块呢,这个网络中所有节点都持有的账本会帮他们确认,这个账本就是区块,把所有的账本连起来,就是区块链。

区块链

在比特币系统中,区块链记录了比特币创立至今所有交易记录,现在大概有60万个区块,每个区块记录了2000-3000笔交易,每个账户有多少钱,从哪里来,花到哪儿去,都记录的一清二楚,透明公开。在区块链网络里,大家都持有一份相同的账本(分布式账本),当我要给 Lindsey 转100块的时候,大家手里的账本就会开始回溯,检查我到底有没有一百块,如果没有,那么转账就会失败。由此可以看出,账户的可靠性是数字货币的基石,如果账本出了问题,什么币都不好使。这就引出了两个新问题:

  • 谁来给大家记账?
  • 怎么保证账本不被造假?
谁来给大家记账

如果每一个人都能记账,那么每个账本上记录的交易及交易顺序可能都不一样,如果有人记假账,那就更乱了,不可能得到一个打开都认可的账本。所以,记账的人需要被所有人都接受,这样记下来的账本才能统一,这也被称为共识机制

共识机制,就是决定到底谁说了算的规则。在“去中心化”的世界里面,每一个人说的话都算数,问题在于大家意见都不一致的时候,听谁的?于是就应该有这么一套规则,最终决定大家到底应该听谁的,这么一些规则就是共识机制。共识机制的重要性在于它能够产生最终说了算的人,大家最终一起按照他说的去做。也可以说,共识机制间接地得出了决策的结果。

在比特币系统中,中本聪的方案是做题,谁先把答案算出来,谁先把答案算出来,谁就有权利记账,这一机制被称作工作量证明(POW:Proof-of-Work)。工作量证明的本质是穷举,设备算力越强,算出答案的可能性就越高。

计算过程

了解两个重要参数,难度值,目标值

难度值是随网络变动的,目的是为了在不同的网络环境下,确保每10分钟能生成一个块

新难度值 = 旧难度值 * ( 过去2016个区块花费时长 / 20160 分钟 )
复制代码

工作量证明需要有一个目标值。比特币工作量证明的目标值(Target)的计算公式如下:

目标值 = 最大目标值 / 难度值
其中最大目标值为一个恒定值:
0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
复制代码

目标值的大小与难度值成反比。比特币工作量证明的达成就是矿工计算出来的区块哈希值必须小于目标值。

具体过程:

  1. 生成Coinbase交易,并与其他所有准备打包进区块的交易组成交易列表,通过Merkle Tree算法生成Merkle Root Hash
  2. 把Merkle Root Hash及其他相关字段组装成区块头,将区块头的80字节数据(Block Header)作为工作量证明的输入
  3. 不停的变更区块头中的随机数即nonce的数值,并对每次变更后的的区块头做双重SHA256运算(即SHA256(SHA256(Block_Header))),将结果值与当前网络的目标值做对比,如果小于目标值,则解题成功,工作量证明完成。

但只要算出了结果,网络里的所有人就能瞬间验证你算没算对,如果没问题,大家就回把这个区块链接到账本上,开始打包下一个区块。这样,网络里的所有人就有一份相同且实时更新的账本了,为了让大家有动力做题记账,第一个完成打包的节点会获得比特币,这一过程也成为挖矿。这样通过奖励的方式,估计大家做题记账,就选出来了记账的人。

怎么保证账本不被造假

![](C:\Users\Administrator\Desktop\block info.png)

为了防止账本被篡改,每个区块中都会记录上一个区块的哈希值,也被称为哈希指针,这样一个不断向前的指针,最终会指向第一个创世区块,把所有的区块紧紧联系在一起。可以理解为一个每个区块存放上一区块地址的单向链表,上图, 下一个区块地址是比特币浏览器方便用户查看,处理后的数据。

如果修改任意一个区块里面的任意一个值,那么这个区块的哈希值就会改变,让下一个区块的指针失效,所以还需要修改下一个区块的指针,修改指针又会导致这个区块的哈希值改变,随意又需要重新计算随机数,完成后,还得依次修改后续所有区块,费事费力。

同时,因为电子签名的存在,不能伪造他人向自己的转账。又因为历史账本的存在,交易可回溯,不能凭空变出一笔钱来,这就保证了账本不会被造假。

问题1:如果两个人同时打包出一个区块,怎么办?

由于网络会延迟等原因,可能会出现两个矿工同一时间挖出区块的可能。如果他们一起参与记账,就会造成区块链分叉。难道我们两边都承认吗?

最长链原则

当然不是,我们必须要确立最长链,最长链是最难被篡改的。你要改就要全部一起,当然工作量就是最大的,这样有助于维护系统安全。系统会根据最长链进行取舍,哪条链上新产生的区块可以使得区块链变得更长,哪条便是最长链。

矿工在挖矿时,由于哈希值的产生是随机的,再加上网络的延迟,就存在两个矿工同时挖出区块的可能,当发生这种情况时,如果他们一起记账就会造成区块链的分叉。

此时,系统就会根据最长链原则进行取舍,即哪个新产生的区块能使其所在的区块链变得更长,则哪个区块得以被记录。所有矿工在最长链上挖矿有利于维护区块链账本的唯一性。

在区块链里最长的那条链就被人们称为“主链”。在主链上可能边上会有写分支,而这些分支通常就被人们称为备用链,如果新添加的区块使备用链累积了更多的工作量,那么这条备用链将被作为新的主链。

问题2:谁长就听谁的带来的问题

51 攻击,假账本成为主链

todo:待完善 比特黄金

问题3:既然账本记录的是交易数据,那第一个区块上的交易的钱是从哪里来的

中本聪写死的,给了自己50个币

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享