这是司马特小分队第11篇原创文章
最近币圈真的火的一塌糊涂,之前的比特币疯涨(总计7年疯涨100余万倍)、到现在周边朋友同事人人都在谈论代币,甚至那批征战股市多年的大妈们都已经开始蠢蠢欲动入市了,看来2018年的最牛热点非比特币之流莫属啊。
—小试牛刀之区块链篇—
说到比特币,不得不说区块链,两者什么关系呢?比特币是区块链技术的一种应用。
那么区块链技术是什么呢?我们可以把它理解成一种分布式账本。账本是用来记账的,只不过它是一种电子账本,需要服务器来记录数据。而分布式的概念其实IT行业一直都有,即去中心化,这里指由多个服务器节点完成记录,而非某一个中心化(比如银行、或者支付宝)平台单独记录。所以简单概括下:区块链1.0是由多个服务器节点完成数据记录的技术。
目前与智能合约结合的区块链2.0也是非常常见了,比如以太坊。
智能合约又是啥?举个非常容易理解的例子售货机:我放一美元进去,就会触发让我选商品的选项,选择以后售货机的可乐就会掉下来,这就是智能合约。一旦合约设定的某个条件被触发,就会执行相应的动作。
而以太坊是一个能够在区块链上实现智能合约、开源的底层系统,类似于计算机的操作系统,N多程序猿可以在上面编程开发应用。
没有一个东西是莫名其妙出现的,区块链的出现也必然是为了解决某些问题。传统的数据存储一旦出现丢失、窃取、损坏会比较麻烦,因为数据都是个人单独存储的,很多甚至都没有备份,而区块链很好的解决了这个问题,因为哪怕你的数据丢了,其他所有人依然存储着数据(包括你的数据),他们只要把数据同步给你就可以了,所以妈妈再也不用担心我了~
既然每个人都存储着全网所有数据,那么是不是就意味着我的账户上有多少钱别人也能看到?哎呀妈,这不是要被大家发现我“负二代”的身份了!!!!
别慌,区块链当然考虑到了这点,他采用了哈希摘要的方式,也就是说别人只能看到一串字符串摘要(比如1234567ABC),但并不能拿到隐藏在背后的信息,比如“我在1月5日借了隔壁老王250元”。哈希摘要是什么原理,且听我后面分解。
那聪明的你又会问:我借了老王250元,但是如果老王窜通楼上的小红、小白、小绿等一众小三一起造假记录“我借了老王500元”,那可怎么办?因为在中心化的管理模式下,比如支付宝,他的造假成本是非常高的,理论上他也不可能会去造假。但是在没有中心化机构的记账模式下,如何保证记录的信息是真实可靠的?而不是虚假伪造的?
那是因为:每次交易数据都会传给系统中的各个节点,大家都会在自己的节点上进行记录,如果有人伪造,而其他人按照正确的进行记录,一旦超过50%的节点认为这个记录不可靠,那么这个数据包包含的交易肯定有错误,是不被认可的。篡改数据也是一样的道理。
那么区块链到底是怎么记账的?
假如有这样一条交易信息:
区块链通过哈希函数y=hash(x)算出哈希值,这个过程就可以简要的理解为记账。其中第一页账本中的输入值 x 包括(账本序号、记账时间、交易记录),相信大家应该都知道,这些都是记账中的必要字段,缺一不可。而第二页账本的输入值 x 包括(上一页的哈希值、账本序号、记账时间、交易记录)。算出的哈希值代表着一个区块,就像你的身份证号码代表着你一样。
从中可以看出每个区块都是互相联系的,就像链子一样一环扣着一环,这样的区块链就构成了一个便于验证(只要验证最后一个区块的Hash值就相当于验证了整个账本),不可更改(任何一个交易信息的更改,会让所有之后的区块的Hash值发生变化,这样在验证时就无法通过)的总账本。所以看到大家是不是对整个区块链概念已经豁然开朗了~
图:这里附上一张总图方便大家理解—最火应用比特币基础篇—
其实比特币是早于区块链被大家所知晓的,就像大家知道了苹果手机,用起来后才开始了解苹果系统非常好用一样,正因为比特币的巨大市场,很多人开始关注其中的本质——区块链技术,并将其应用在其他领域。作为目前最火的应用,比特币到底和区块链有什么关系呢?
我们前面已经讲过:
区块是包含了一定时间内若干笔交易数据及时间戳的数据块
那么以比特币为例:
1、 比特币的本质是什么?它和区块的关系?
2、比特币系统中,区块记录了哪些信息?
3、 怎么生成区块?
4、 怎么链下去?
5、 谁来记录这些数据呢?
6、如何确认区块的有效性?
7、 为什么会形成分叉?
8、区块链为什么不可篡改?
接下来跟着马特的思路,我们逐步揭开事件的真相:
1、比特币的本质是什么?它和区块的关系?
比特币的本质是一种虚拟币,他其实并没有和现实中的任何一个实体币有关系。马特依然给大家举个通俗易懂的例子,像支付宝余额,他其实代表着是你在支付宝存的钱,这个钱是可以以纸币的形式取出来的,是以实体币作为背书的,所以他是有价值的。但是比特币并没有以实体币或是某种实物作为背书,或者说标的,理论上来讲他并没有价值。
它和区块啥关系?
区块只是记录了比特币交易的数据,当然区块中还包含其他信息,只是最重要的就是比特币的交易信息~
2、比特币系统中,区块记录了哪些信息?
简单来讲,区块有一个区块头,有一个区块体
我们简单介绍下:
2.1、哈希值前面讲过是类似于a8fdc205a9f19cc1c7507a60c4f01b13d11d7fd0(十六进制)这样一串字符串,转成二进制就是 256 位。
哈希值可以理解为一个区块的标识,所以每个区块的哈希值是不一样的。
比特币中的区块哈希值大概是这么算出来的(原谅我也不知道具体的函数公式是怎么样的):
h0 = Hash(A || Nonce0)
h1 = Hash(B || h0 || Nonce1)
从一个简易版的公式可以看出下一个区块的哈希值h1是根据上一个区块的哈希值h0、当前区块的待确认的交易信息B、Nonce值Nonce1(随机数)综合计算得出的。可以看到和前面区块链中的介绍的略有不同,但是本质一样。
另外我们需要了解哈希函数有几个特点:
同样的原始信息用同一个哈希函数总能得到相同的摘要信息
原始信息任何微小的变化都会哈希出面目全非的摘要信息
从摘要信息无法逆向推算出原始信息
2.2、难度目标是什么,为什么会有难度目标?
因为在比特币的世界里是这样设计的:
每个节点在计算hash值时,如果所计算出的hash值小于目标值,则这个节点才可以宣布解出谜题,打包出区块,并向全网传输。通过这个计算,系统将区块生成速度限定为约10分钟/块。但是随着算力(计算的节点)增加,区块生成会越来越快,假设上周区块平均生成速度为9分钟,那么本周算法难度(目标值会相应减小来增加难度)会上浮10%,以确保区块生成速度平均为10分钟/块,说白了就是动态调整计算难度来保持恒定的区块生成速度。
此外那个Nonce值随机数其实就是计算中不停的枚举、试错,最后找到那个满足目标值的Nonce值。
区块体:一个区块第一个交易规定为coinbase交易。
普通交易:
这里有很多数据、参数,看不懂没关系,后面都会讲到,大家只要知道区块体是记录交易数据为主的就行~
那么这些表格里要求的数据是怎么产生的?
比如A把10个比特币转给了B,那么这就是一笔交易,就会记录下来这笔交易的所有相关数据。聪明的小伙伴们可能会问:那如果没有交易呢?那就没有交易呗,那就不存交易信息,但是依然会生成区块。因为比特币系统中大概设定的是每10分钟左右一定会生成一个区块。
3、区块是怎么生成的?
前面也讲了,区块其实就是一串字符串,他是根据一段时间内的交易数据、时间戳、哈希值、难度、Nonce值等组合而成并记录到节点上(也即某一台服务器中)。
4、谁来记录这些数据呢?
答案是矿工,你可以理解为一个节点或一个人,矿工来帮你在他的节点进行区块的记录。
那它凭什么帮你?
因为他有收益呀,区块链的创始人在创造它的时候就规定了:矿工通过生成区块可以获得一定的比特币奖励。假如某一天比特币全部发完了,那么就会用交易佣金、或者叫手续费来奖励矿工。所以理论上来说,只要收益高于成本,就会有人愿意帮忙记账,反过来说只有矿工不断的努力工作,整个区块链系统才能不断延续下去。
5、区块怎么链下去?
每生成一个区块时,都必须以上一个所有节点公认的区块作为父区块,本区块中也必须带上父区块的哈希值,确保只有一条主链。那么问题又来了,怎么让一个区块大家都认可?这到底是怎么实现的?
其实很简单,在这样一个全网数据公开的环境中,每个矿工都在算一个目标值以下的哈希值,如果A算出来了,他会马上播报给全网,如果A是全网第一个算出来的,那么毫无疑问,大家都认可他作为本区块,其他矿工自动放弃,开始以他为父区块进行下一个区块的计算。
但是聪明的你又会问:如果同时有多人在同一个时间算出来呢?或者说广播传到B那里经过了一定时间,B在此之前已经生成了一个区块,那到底B是以A传过来的区块为准还是以自己的为准呢?
这就引发出了另一个问题:如何确认区块的有效性?
6、如何确认区块的有效性?
系统考虑了这个问题并规定了一个策略:那就是6次确认,即包含交易数据的区块链已经创建了6个区块以后,这笔交易(第一个区块中记录的这币交易)获得了6次确认,那么这个区块被废弃的可能性就无限趋于0了(别问我为什么,中老湿通过科学的验证后得出的),即这笔交易被记录且不可篡改。
7、 为什么会形成分叉?
回到5中提到的,区块生成后,会同步传输给其他节点。如果在传输过程中,其他还未被同步的节点同时生成了一个区块,那么一条主链就会形成分叉。分叉里又有一种情况叫双花。
什么是双花?假设A只有5比特币,A将5比特币交易给B,在交易确认前,又将5比特币交易给C,那么将有矿工决定这5比特币最终交易给了谁。如果此时两个矿工同时生成了区块,在分叉的两条线路中,其中一条给了B,一条给了C,这就形成了双花。
形成双花怎么办?比特币的处理方法是在这两条分叉的区块链下,由矿工继续进行挖矿行为。当多条链路同步给某个节点后,节点会选择链路更长的一条,交易给B的区块后已经创建了3个区块,交易给C的区块后只创建了2个区块,那么此时,节点废弃第二条链路,选择第一条。当所有节点做出选择时,全网的账单就统一了。
关于分叉,我们再做个详细的解释方便大家理解:
比如某个区块h1生成后,A节点根据h1在10分钟的时候生成h2,然后开始向全网传播,然后传了2分钟(事实上并没有那么久,因为一个区块也就1M,按照100M的网速花不了几秒),也就是在12分钟的时候传到B节点,但是B节点在11分钟的时候生成h3,那么这个时候到底是以h2还是h3为下一个区块呢?我们暂且假设一部分人优先听到h1,包括A、A1、A2、A3.。。。。A9共10个节点,另一部分优先听到h2,包括B、B1、B2、B3、。。。B9共10个节点;然后大家开始疯狂计算下个节点,此时A3最快计算出h3,于是广而告之,这时除非B~B9在听到h3之前算出h4,否则只能以h3作为下一个区块,然而h3并不是基于h2算出来的(事实上是基于h1算出来的),数据对不上了,于是B~B9啪啪啪打脸,认h3为真正的下一个区块,同时h2的分支则被无情抛弃,大家开始以h3作为父区块计算下一个区块了。
这里聪明的小伙伴可能已经考虑到了:
如果区块生成速度过快,那么出现分叉的可能性就会很高,假设区块链中有1000个节点,如果有两个分叉,则平均每个分叉有500个节点,此时只需要超过250个节点,就可以控制其中一条分叉(51%攻击)。区块生成速度越快,出现分叉的可能性越高,风险也就越高。因此综合考虑系统控制10分钟左右生成一个新区块。如果全网的区块节点越来越多时,分叉的可能性也更高。
8、区块链为什么不可篡改?
我们做个假设:假如区块内的数据被该节点篡改,那么他对应的哈希值就会变化(生成新的分支),新的分支区块会播报给所有节点,此时如果其他节点上已经记录的区块数大于播报给他的新分支的节点数(或者说所有区块的哈希值与传过来的不匹配),显然大家都会选择链路更长的一条,因此新分支不被承认,自动废弃。(请认真思考这段话)
那么此时问题又来了,如果超过50%的节点都窜通起来一起篡改呢?话说真有这种算力的团伙,只能说这个系统已经被操控了,没救了,大家自然会放弃它。而且按照比特币现在的节点数来看,要掌控50%以上的节点那基本上是富可敌国,哦不,富克敌好几国了,基本可能性为0!
总结:
看了上述的介绍,相信大家应该已经了解比特币的基本运作逻辑了,目前其他代币也基本上是这样一套原理,那么我们来总结下他的优缺点:
缺点:
1、缺乏时效性:交易确认时间长。
2、安全性问题:比特币发展至今,已经拥有足够多的节点以防止数据被篡改,而市面上新发行的各种货币,仍会因为节点数量过少而缺乏安全性。
3、能源消耗大:全球那么多节点同时在计算一件事件,重复劳动下所消耗的能源极大,并且最终在区块链的某个位置,只有一个节点计算出区块是真正有效的,也就是说其他节点计算中所消耗的能源全部无效,造成了极大的能源浪费。
4、难以最终做到去中心化:前面说生成区块需要做大量的计算,那么拥有更多算力的人更有可能在这个过程中获得矿工奖励。按照20%的人掌握全世界80%的资源这个规则,最终比特币80%的节点将最终掌握在20%的机构或人手中,这样去中心化的意义就不存在了。只能说是多中心化。
优点当然是去中心化的数据公开、不可篡改性等...
对于区块链和比特币的基本原理介绍基本到这里就差不多了,你全部看懂并理解了吗?如果还有疑问,可以留言问我们,我们将认真回复每个问题。
下一篇的主题将是“比特币进阶”和“联盟链、侧链”等一系列延伸产物的深度解析。
欢迎大家关注“司马特小分队”公号,不错过进阶篇,才能真正了解区块链和比特币。
欢迎大家关注公众号“司马特小分队”,后续有更多区块链的干货!
网友评论