加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

区块链blockchain技术详解

(2017-08-02 14:10:39)
分类: 职场
在查看了一些网上的资料后,写了下面的一些个人的理解,文中也引用了部分资料上的文字。

首先可以从名字上来解释区块链:
1. 什么是区块
区块实际上是一个数据结构:
其中父区块的hash值记录了这个block的父block的hash值,这样就建立了一个从当前区块的上一个父区块的关联。这就是链式结构的基础。注意到目前每一个block的大小为1MB,这是中本聪开始设定的。这也意味着对于bitcoin来说,10分钟内的全球交易都会被记录在这个1MB的block中。在原来交易不活跃的时候,这个大小是合适的,但是现在bitcoin的交易非常活跃,10分钟产生的交易非常多。这也意味着一个block并不能记录所有的这10分钟的交易,因此发生在这10分钟的但是没有被记录在block的交易就被延迟到下一个block,这样不断的累积下去就导致交易不断的被延迟,这就是内存池拥堵现象。为了解决这一问题,比特币界提出了软分叉和硬分叉两种扩容方案。不同的方案有很多:

下面是从这里转载的:
http://s10/mw690/002mfkyxzy7dh30YQFX79&690
因为硬分叉后,如果用户不更新客户端,就无法再接受新的区块,所有交易都无法完成(不单单只是规则变更所影响的部分)。
另外,旧节点也不再有效。如果不升级,这些节点会被强行废弃,相当于是人为强行减少了网络上的完全节点数,这给网络安全也会造成影响。
所以,“硬分叉”根本不是矿工投票就可以操作的事儿,除非绝大多数用户、交易商、节点、矿池约定好在某一时点一起升级,否则“硬分叉”将直接造成混乱,所有人都会受影响。

最简单的两类分叉,即规则放宽和规则收紧
一种方案是规则收紧,这种方法不会导致区块链分裂。软分叉
硬分叉:另外一种就是规则放宽了。比如有一些客户端不升级,会认为这个规则放宽的block是无效的。这样支持不同规则的两个客户端会永远的分叉,这样就导致区块链分裂了(老的客户端永远无法接受新的规则的block)
比特币分叉你需要知道这几件事情



下面的时间戳/难度目标/Nonce 都是和挖矿有关的。
Nonce:是一个只使用一次的随机数,Nonce是Number used once或Number once的缩写,在密码学中Nonce是一个只被使用一次的任意或非重复的随机数值

难度值difficulty:  在比特币体系中,平均每十分钟就可以发现一个新的区块, 在完全去中心化的比特币网络中(即不受任何第三方控制),每个完整节点中独立自动发生难度调整,让新区块的产出速率维持在平均每十分钟一个。也就是自动对难度进行调整来保证产生的速率,这是因为在实际中难度是不均匀的和计算能力的提升也是不同的,为了保证固定的速率就需要自动进行难度的调整。比特币协会(Bitcoin Association)会根据算法自动调整挖block的难度(Target,或者直接就说成Difficulty)。伟大而神秘的中本聪先生早在开天地之始,就已经设定了,每产生2016个block,也就是区块之后,就会调整一次block被挖出来的难度。按照中本聪的设想,大概两周会挖出来2016个block。

一个block产生的产生时间=难度值x2的32次方/hashrate
(hashrate是每秒运算的hash数量)
难度值difficulty=最大目标值/当前目标值

merkle tree : 一种哈希二叉树,使用它可以快速校验大规模数据的完整性。在比特币网络中,Merkle 树被用来归纳一个区块中的所有交易信息,最终生成这个区块所有交易信息的一个统一的哈希值,区块中任何一笔交易信息的改变都会使得使得Merkle 树改变。 
注意到这是一个tree 结构,可以是二叉树也可以是多叉树。
一种常见的是merkle hash tree中的每一个叶子node都是hash值。中间节点是由它下面的每一个子节点的值进行组合来一起生成的。交易清单指的是,两个区块产生的时间间隙中(10分钟),这个世界上发生的所有的比特币交易!!!,也就是说这个新的block会记录所有的这10分钟内产生的交易的记录(因为一个block就是10分钟才产生一个)

创始区块: 这是root block,这是所有区块的父node。在bitcoin中,中本聪创建了这个创始块。

2. 什么是链

上面描述的block将会串成一个chain,下图中黑色block组成的就是一个最长的chain。绿色的是当前生成的block,紫色的是主链外的block。
下面是bitcoin里面的chain的结构: 其中的Tx_root 就是merkle tree。通过prev_hash来构成了这个chain。
上面就是block chain的基本的结构。

                                                     Bitcoin 比特币
下面通过bitcoin来看一下blockchain技术是如何来设计的。

去中心化:
在当前的金融体系中,存在一个被信任的第三方,比如银行。每一个人的资金交易都是通过银行进行实现的。银行的存在解决了互相不信任的个人之间的信任问题。拜占庭将军问题也是这样一个场景。但是中心化有很多的问题包括成本的增加等,因此目前提出了去中心化的思想。P2P直接进行交易而不需要第三方介入。

P2P的交易中因为没有第三方存在,因此需要解决几个问题:
下面是一笔交易的信息:

  a. 用户信息保密,交易透明化
    首先每一个用户的账号都是数字值(hash值,t通过MD5算法生成,比如MD5(123123) = d2fde576f44a6601b73201234b491904, MD5(SHA-256)算法在于如果你知道hash值你是不能解密出原始的输入123123的。目前有些黑客是通过对一些常用的word生成hash,比如John这类的,再通过对比看是否是这些常用的name来破解。),这样每一个人的真实信息就隐藏在了Hash中,没有人能破解。达到了保密和保护个人隐私的原则。这就像一个非实名制的网络ID一样,和真实世界的人没有可以推断的关系。 

  b. 每一笔发生的交易是否有效的验证方法
      比如付款方是否有足够多的钱来支持这笔交易,比如你只有10块钱,但是你发出了一笔12块的交易,那么这显然是无效的; 第二是double spending(双重交易)问题也就是一笔钱多次支付的问题,比如你只有10块钱,但是你同时向两个人支付了10块,这显然是无效的。这些交易可能有很多,需要有一种机制来验证哪些交易是有效的,哪些是无效的。另外还需要看付款方是否有足够的钱来支付;是否有double spending发生等。这些都需要计算量来验证。
目前区块链使用的方法就是:所有的交易都需要全网广播,并且每一个矿工都会记录每一笔交易。这样每一个矿工都会去计算每一笔交易是否是有效的。这个方法避开了第三方,而是采用了信息透明的方法来保证交易的有效性。如果每一个人都有所有的交易信息,那么他就很容易来查看每一笔交易是否有效:比如双重交易的问题,如果被交易的两个对象A,B都有所有的信息,知道C只有10块钱,如果A,B都发现C同时向他们两个发起了一个10块的交易,就很容易判断出这里有双重交易。另外,一笔交易是否有效最后是通过“投票决定的,也就是全网所有的矿工进行投票,如果51%认为有效,那么就有效。比如你可以宣称你有“10000个bitcoin”,如果有51%的计算能力认同,那么你就真的有10000个。

c. 记账权之争
因为所有的交易都是全网广播的,每一个矿工都会记录这些交易并且写到一个自己的block里面,这就是所谓的"全民记账",因为每一个人的网络和位置不同,因此每一笔交易达到每一个矿工的时间会有偏差,甚至后面的交易先于前面的交易到达等,因此每一个矿工记录的交易顺序可能是不同的,但是都是正确的,每一个矿工都会给自己生成的block中的每一笔交易打上一个时间戳。但是每一个人记的账需要提交到主干网络上的账本上(block chain),但是这个全网的账本只有一份,因此只有一个矿工可以的到记账权向主干网上提交自己生成的block。
这就是一个达成共识的过程:
http://s14/mw690/002mfkyxzy7d9j6QyhDed&690
基于上面的描述可以得到一些结论:如果每一个矿机都是从最小值开始枚举,那么一定就是计算量大的矿工获胜,胜利者永远就是这个人,但是如果是随机枚举或者其它的枚举方式,任何人都有可能获得胜利;但是从概率上来看,拥有最大计算能力的人有最大的获胜概率。也就是说普通用户用普通电脑采用不同的算法也有可能会幸运的获胜,当然最终获胜的概率还是决定于计算能力。

这就需要争夺这个"记账权"。那么怎么在这么多矿工中选择一个来得到这个记账权呢? 有两种方法:

在bitcoin中,设计了一个原则"根据计算能力,计算能力最强的那个矿工得到记账权。也就是pow的方法。

Bitcoin 中 Block 的产生是通过「工作量证明」来实现的,即所有参与「挖矿」的「矿工」都要进行一种与计算力相关的、具有随机性质的散列计算,直到算出一个满足特定条件的随机数,才能获得发布一个 Block 的权利。
因此bitcoin设计了一个很耗计算量的问题让所有的矿工同时解答,谁先解答出来就谁获得"记账权".
在设定上,每个矿工总是会去信任「最长的链」,在已知的、满足规则的最长的链的基础上去计算下一个 Block,否则你的计算力就会被白白浪费掉 —— 因为其他矿工也总是认可最长的链,而如果你不在最长的链的基础上开始工作,那么就是在和其他所有矿工的计算力对抗。

下面是一个比较计算的框图,要做这些计算:
从框图上可以看到,输入有三个:上一个block的编号,当前10分钟内的所有交易,一个只使用1次的随机数。
注意到这三个输入里面,前2个是已知的,而且每一个block都是变化的(每一个10分钟内发生的交易是不同的),而后面那个随机数是未知的。 如果要增加和调节难度,都是通过这个随机数来调节的。

hack:
另外,注意到这里使用了上一个block的hash值参与了计算,这意味着这些block之间的hash计算是相关的。如果一个人要修改一个已经存在的block(修改了交易,那么这个block的hash也会变化,后续block的hash也会变化),那么很明显,它需要修改的不仅仅是这个block,还有后续已经生成的block和即将生成的block。因为主流的账本仍然在按照正确的账本在继续记录,你只有比主流账本的生成速度更快,也就说你在和全网的计算能力对抗,如果你能战胜全网的计算能力,那么你就可以随便修改任何block并且可以取代主流的账本成为新的主线账本。这就是所谓的51%规则,你拥有全网51%的计算能力,你就是上帝。

工作量证明本质上是一CPU一票(one-CPU-one-vote)。主要的(大多数)的决定是由最长的链所代表,最长链拥有最大的工作量花费在其中。如果一个大多数CPU算力都被诚实节点所控制,那么最诚实的链就会增长的最快且超过其他任何计算链。想要改变一个过去的区块,攻击者需要重做这个区块和所有在这个块后的区块的工作量证明,之后还要追赶上并超过现在所有诚实节点的工作。我们之后会展示,一个慢速的攻击者能够追赶上(catching up)的可能性将会指数级的减少,但后续的块被添加时。

工作量证明机制引入了对某一个特定值的扫描工作,比方说SHA-256下,随机散列值以一个或多个0开始。那么随着0的数目的上升, 找到这个解所需要的工作量将呈指数增长,而对结果进行检验则仅需要一次随机散列运算。

通过运行SHA-256算法来得到一个256个字符的输出,这个字符的输出需要满足下面条件才算成功:
这个条件可以是前20位字符必须为0,这就导致了矿机需要大量计算和大量舍弃,才能满足256个字符的完全匹配,从而生成一个new block。这就是需要耗费大量的计算来找到这个有效的输出。


bitcoin采用的方法就是全网竞争,这就是矿工在做的事情,看谁能抢到这个记账权,这就是所谓的“挖矿”。 目前bitcoin是以大概10分钟为一个时间间隔,在这10分钟内的交易会作为一次竞争,,这就是所谓的“记账权”:block里面记录了所有10分钟内发生的有效交易。这个block就是一个新的交易记录的block。这就是为什么bitcoin又称为“电子账本”的原因,因为每一个block里面实际的信息就是10分钟内的有效的交易信息,也就是记账。注意到因为每一个新的交易的验证是需要历史信息的,这就是为什么需要“chain”的原因。通过chain可以追溯所有的历史交易记录,因此可以计算出当前交易的有效性。而且有记账权的矿工生成了block后必须全网告知,所有的人都可以更新到最新的chain上,这样才能开始下面的一个block的交易生成,因为这些过程都需要时间,因此目前设置10分钟作为一个新的block生成的时间周期,也就是我们所说的“每10分钟产生一个bitcoin的来源”。

但是上面的例子比较简单,记账权之争不是说有一个机制可以保证全网只有一个矿工胜出,而是可能在全网各个地方都有矿工计算出了这个题,理论上每一个计算出这个题的人都会以为自己就是获得记账权的人,都会向全网广播自己的block。这样全网可能存在多个广播的block,而全网的其它节点会把第一个接收到的block进行验证,验证这个block上的信息是否是valid(符合规则),并且把它引入自己本地保存的chain中。这种方法会导致全网不同的用户手中的账簿不同,这就是“分叉”。事实上区块链技术中分叉的存在是很普遍的。但是区块链规定了一个规则“最长的链才是主链“来解决分歧,如果某个用户在下面的时间发现自己手上的链不是最长的,那么就需要更新到这个主链上。另外,不同的客户端版本支持的规则不同也会导致分叉的产生。分叉-》达成共识是区块链中经常发生的事情。共识实际上最终是由拥有更大算力的一方决定的。

d. 获得记账权后的收益是什么?
现在的问题是,我付出了这么多计算能力来抢夺这个记账权,那么我的收益是什么?
在你得到这个记账权后,实际上你可以在这个block上写上一笔交易给你自己,比如支付给我的账户上多少的bitcoin,这样bitcoin就无中生有了,是不是我可以给自己写上任何数量的bitcoin呢,当然不是,看下面:
http://s3/mw690/002mfkyxzy7d7Vq1D2ie2&690
http://s14/mw690/002mfkyxzy7d9k8vErr0d&690
就是每个区块的第一交易,是一个特殊的交易,这个交易就是只有Input,且对于输入这个input的output(前一个交易的output)是个空。这就是留给获得记账权的矿工可以给自己写上这样一笔交易,奖励给自己多少bitcoin。
















0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有