一文看懂区块链:一步一步发明比特币

此文潜在面向群体是对区块链或比特币的运行原理完全不了解的人。所以会从用户需求的角度出发,一步一步发明区块链(或者说比特币,因为两者互相依存),在此之后的内容有关

因为贪婪,所以信任

加密货币

在一步一步发明发明比特币之前,解释几个直观的认知:

我们常说的 比特币 ,是 加密货币 (Cryptocurrency)的一种,而 加密货币 实现去中心化的最关键的技术是 区块

有些地方可能把 加密货币 又称为数字货币(或称电子货币),但实际上, 加密货币 是 数字货币 的子集,同为子集的还有虚拟货币(如Q币), 加密货币 的称谓要更加专业

加密货币 一定具有下列三个特点

    去中心的清算

    分布式的记账

    离散化的支付

    为了实现这些特点,需要使用到 区块 链 技术。这里的 区块 链 技术是一个很广义的范畴,它包含了密码学,算法等很多不同的内容,其中最精彩的点子,可算是工作量证明 = 共识了

    还有另一个层次更高的角度:从解决拜占庭将军问题的角度入手来分析和科普【 区块 链 技术】的(可参看我的另一篇博客【 区块 链 】如何解决拜占庭将军问题),我觉得这个角度更加接近于 区块 链 哲学的本质,毕竟, 比特币 具有价值属性和交易属性,和金融有紧密的联系,但是 区块 链 是一种分布式存储系统,若仅仅从 比特币 (代币)的角度来解释,非常片面。毕竟, 比特币 ,就是分布式去中心化共识记录系统中的一个字段

    一步一步发明 比特币

    第一个用户需求 - 账本和电子签名的由来

    第一个用户需求描述了中心化清算系统几个关键内容的由来,只对 区块 链 感兴趣的读者可以跳过

    经济体的蓬勃发展离不开交易。在交易过程中,人们早已发现使用一般等价物(如金银)十分麻烦,发明了纸币(最早的来自中国,北宋时代四川地区的纸币交子的清算体系,是生产力发展的必然产物,最终的目标是提高生产效率),现如今,人们发现,携带现金也很麻烦

    这是第一个基本用户需求:摆脱现金进行交易带来的不便

    【解决办法】几个用户使用公共账本记录转账记录,月底结算,账本公开,每个人都可以修改,也就是说可以在上面添加新行(一笔交易),如小明转账给小红10块钱

    产生的问题1:身份问题

    在这个账本条目上我们无法确认交易双方小明和小红是否是本人,可能出现伪造(逍遥法外电影中的伪造支票)

    【解决办法】使用电子签名,即公钥 - 私钥对

    记住,电子签名被发明的核心目的是希望在电子文档也能有一个类似与现实中个人笔迹的签名,目的一定是:确认写这个签名的人是本人,即身份确认(验证)

    私钥顾名思义,也叫做密钥,是你本人需要需要妥善保管和保存的Sign(信息,私钥)=电子签名Sign(信息,私钥)=电子签名Sign在这里是一个函数,可以理解为一连串计算(变换),这一连串计算有一个特点,就是输入值只要改变一点点,输出就会完全改变。信息和私钥一起,可以得到一个电子签名。并且这个电子签名不能被轻易的复制到其他信息里,原因是因为每一个电子签名都和这一段信息有关联。Verify(信息,电子签名,公钥)=真/假Verify(信息,电子签名,公钥)=真/假在进行验证的时候,Verify也是一个函数,输入值是信息,电子签名,公钥,输出是一个True or False,来判断这个电子签名是真的还是假的。

    这个时候可能有人就要问了,这个电子签名我难道不能试出来吗?很不幸,这是一个有256bit的1/0字符串,可能性是2的256次方,2的10次方是1024,我只能告诉你这么多了。

    解释完电子签名,我们来看看实例。小明使用自己的私钥加上小明转给小红10块钱这段话通过Sign函数生成一个签名(256位),把签名放在这条转账信息的后面,通过之前的讲解,这个签名就能保证小明已经过目了,并且说:“这真的是我小明,不用怀疑了!肯定是我”

    直观结果是,我们可以利用密码学的手段,只要有对应人的数字签名,我们保证小明和小红的身份能被100%确认真实

    但是这个解决方案有一个小漏洞:可以复制同一行信息来伪造交易记录,解决的办法是添加一个这笔交易独有的信息(比如时间戳)

    产生的问题2:欠债跑路问题

    如果小明在此时账户上已经没有足够的余额进行支付,就会出现超支问题

    【解决办法】添加余额记录,此时就不可避免的需要一个中间担保人(国家?信誉机构?银行?)为小明进行余额担保

    一个大家都遵守的协议

    此时,现代金融体系的框架基本建立完毕,协议内容是

      任何人都可以在账本上添加新行

      固定时间间隔时用真金白银进行清算

      只有有签名的交易是有效的

      中间担保的人保证不可超支

      此时发现一个很有趣的发现,这个比较严谨的协议有一个特点:如果所有人都按照这个协议来办事,我们可以用任何形式的东西来代替人民币了,换句话说,就是我根本不关心你在账本上添加的新行的交易内容是什么,可以是任何东西

      利用这个提出需求再解决问题的过程,强化一个认知:货币 = 交易记录(账本),即货币的本质是交易记录,在这背后,有一个前提是,货币的另一个本质是一种共识,我们都信任它有价值的共识

      第二个用户需求:账本放在哪里?

      传统的(现在的)解决方案当时是,使用中心代理-银行,来存放账本

      既然是第二个用户需求,那肯定就是因为现在的解决方案大家都不满意

      核心需求:去中心化

      中心化的痛点大致可以说几点

        银行效率低下,一笔跨国转账的等待时间较长

        胖银行金融体系因部分准备金制度等等方便的规则,能抬升杠杆,产生金融泡沫,进一步诱发金融危机

        私有财产神圣不可侵犯是精英与平民,剥削与被剥削者几个世纪以来博弈的风暴中心

        当然还有很多没有提到(比如好处,控制经济发展速度,调控供需平衡等),总之,是一种一直饱受诟病的清算方式,此时,中本聪在2009年横空出世,他提出了一种全新的清算方法,并且真正解决了陌生人间信用的问题!接下来就是真正的一步一步的发明 比特币 了

        如何实现分布记账(去中心化)

        为了去中心化,我们可以反其道而行之:每个用户保存账本,分布记账。用户产生一笔交易就将这笔交易广播到到网络上所有的节点上,这样不就完美的去中心化了?


        只要是明眼人都能发现,太天真的,这个方法行不通。若行不通,那就把行不通的原因总结出来

        遇到问题,总结不可行的原因,寻找解决方案。这是整个人类不断前进的核心最小单位

        这里有一个Trick,即所谓信任工作量最大不仅仅是出【一道难题】,还通过等待多个 区块 的产生引入世界上所有矿工之间的博弈(吃瓜群众,坐看大戏,谁厉害我选谁,你们尽管斗)

        个人观点: 区块 链 的Idea最核心的创新就是从技术上把信任和贪婪画了等号。因为贪婪(希望去竞争建立 区块 的建立和交易费)所以信任(全网算力越大,用户越放心),这句话甚至带上了些许哲学和传奇的色彩

        对于用户来说,是这样一种情景

        如何更新本地 区块 链

        其中的原因是,你可以假设Alice希望篡改一个交易信息,那么就意味着Alice需要不断的通过计算维护这个 区块 链 了。也就是说每一次有新的 区块 链 产生,Alice都需要不断的抢到这个彩票,理论上来说,他至少必须拥有全网51%以上的算力才能做到这一点,更多的,随着用户等待 区块 的增加,这个难度,幂次上升,在7-8个 区块 链 产生后,概率上来讲,就是绝对信任


        无穷大的篡改成本

        此时

          我们用数字签名保证了不能伪造交易记录

          用 区块 链 及工作量证明保证了不能篡改其中的信息

          这两点,就完成了:证明 区块 链 的每一条交易记录都是可信的这一终极目标

          总结 - 系统可行性分析

          只需给出一个命题来思考:我们如何才能在这个系统下骗人呢?

            如果你想篡改一笔不存在的交易记录,那么你必须比所有人都算的快,赢得这个彩票

            但所有用户会继续收听其他矿工的广播

            所以为了让所有用户继续相信这个伪造的 区块

            你必须投入自己所有的工作量,不断给篡改后的 区块 链 分叉增添新的 区块

            记住:根据协议,所有用户会一直信任他所知道的最长的链

            是的,你持续的竞争过世界上所有的矿工的概率或者说代价,实在太大了,得不偿失(其实法律也是一样的道理,它强制给违法的人给予惩罚,让违法者付出他们不能承受的代价了保证公平和社会稳定运行)

            注意,作为一个用户,你不能立马相信你所听到的最新 区块 ,而是应该等待多几个 区块 被创建过后,再确认这的确是世界所有人都在使用的 区块 链 ( 比特币 的原则中,等待6个 区块 ,才确认)

            发明过程中的关键点

              电子签名 Digital Signatures

              公共账本就是货币 The Ledger is the currency

              去中心化 Decentralize

              工作量证明 Proof of work

              区块 链 Block Chain

              比特币 技术

              到这里,已经发明了 比特币 ,解决了去中心化的信任这一难题。只对 比特币 和 区块 链 是什么这个问题感兴趣的读者,可以停在这里了,希望大家可以在我的叙述中解决一些困惑!鞠躬!

              针对 比特币 的一些实现的内在细节,继续在探索和学习的道路上披荆斩棘。新技术,新点子,要拥抱它,使用它,判断它,必须先追根究底了解它

              我们知道 区块 链 中记载的核心内容,对于 比特币 ( 加密货币 )来说就是转账记录。但是,一个概念真正落地成大众可以用的服务,有很多技术上,协议上的细节。接下里的部分主要探讨一些 比特币 具体实现方面的细节,如网络节点构成, 比特币 的计算难度系数, 比特币 总量的由来, 比特币 一笔交易发生的内部细节等

              比特币 网络节点的构成

              比特币 网络是一种点对点的数字现金系统(P2P),网络节点中每台机器都彼此对等。P2P网络不存在任何服务端、层级关系或者中心化服务。

              节点类型与分工


              一个全功能节点包含上述4个模块【钱包Wallet】【矿工Miner】【完整 区块 链 fullBlock-chain database】【网络路由节点Network routing】

                【网络路由节点】使得节点具有参与验证并传播交易与 区块 信息,发现监听并维持点对点的链接的能力

                【完整 区块 链 】具有此模块的节点被称为:全节点。它能够独自自主的校验所有交易,不需要任何其他信息。

                【钱包】 比特币 的所有权是通过数字密钥、 比特币 地址和数字签名来确定的,数字密钥实际上并不是存储在网络中,而是由用户生成并存储在一个文件或简单的数据库中,称为钱包。有些节点仅仅保留 区块 链 的一部分,通过一种”简易支付验证“(SPV Simplified Payment Verification)的方法来完成交易

                【矿工】挖矿节点以相互竞争的方式创造新的 区块 。有一些 挖矿 节点也是全节点,可以独立 挖矿 ;还有一些参与矿池 挖矿 的节点是轻量级节点,必须依赖 矿池 服务器维护全节点进行工作

                拥有全部四个模块被称之为核心客户端(Bitcoin Core),除了这些主要节点类型外,还有一些服务器及节点运行其他协议,如特殊 矿池 挖矿 协议、轻量级客户端访问协议。

                下表为扩展 比特币 网络的不同节点类型

                图示名称说明


                独立矿工具有完整 区块 链 副本


                完整 区块 链 节点此种节点有时有中继作用,不断收听网络广播,维护完整 区块 链


                轻量(SPV)钱包移动端,或者不想太过于笨重的桌面端,只需要进行交易广播操作


                矿池 协议服务器将运行其他协议的节点,连接至P2P网络的网关路由器


                挖矿 节点不具有 区块 链 ,但具备Stratum协议的节点或其他 矿池 挖矿 协议的网络节点


                轻量 Stratum 钱包不具有 区块 链 的钱包、运行Stratum协议的网络节点

                扩展 比特币 网络

                要在全世界的网络中完成整个的交易,下图描述了一个扩展 比特币 网络,它包含了多重类型的节点、网关服务器、边缘路由器、钱包客户端以及它们互相连接所需要的各类协议, 比特币 互相连接的接口一般使用8333端口

                可以参看这个文章了解Stratum协议,Stratum协议详解


                扩展 比特币 网络

                如何控制 区块 产生速度恒定

                难度系数

                我们在发明 比特币 的过程已经详细说明了工作量证明寻找一个特殊数字使得SHA256函数的输出字符串的前n位是零

                对于每一种不同的 加密货币 来说,都有一个值需要在建立货币的时候时候被定义,即每一个新 区块 在当前全网算力的条件被发现的【平均时间】,这也是难度系数的由来

                比特币 10分钟;以太坊15秒;瑞波币3.5秒;莱特币2.5分钟

                抛开代码算法层面来说,实现方法就是通过找前n位是0的方法。从概率角度来说,n值越大,意味找到这个这个数的解范围越小。

                随着需求0的数目一个一个增加,需要的计算时间将会程指数增长。

                那么肯定会问,这个难度值如何动态调整?由谁调整?

                难度调整方式

                难度的调整实在每个完整节点中自动发生的。如果网络发现 区块 产生速率比10分钟要快时会增加难度。如果发现比10分钟慢时则降低难度。

                例如 比特币 中的是这样定义的:每2016个 区块 后计算生成它们花费的时长,比上20160(14天)调整一次。有人可能会问,如果在这十四天内计算能力暴涨怎么办,其实这个10分钟的 区块 新建间隔的规定也只是一个估计要求,真实情况下,这个时间会偏离10分钟这个设定值很多,但是这种偏差并不会对整个 区块 链 的运行产生影响

                但是有人会问,这个过程是靠脚本(代码)来实现的,还是自己手动调整的呢?答案是,本地 挖矿 节点根据自己看到的链上信息自己调整。

                问题又来了,为何我不自己降低难度,让自己更加容易新建 区块 呢?其实,因为链上所有节点确认新的 区块 (只有确认了你才能得到回报)是按照最长链并且计算难度最大来判断的,你如果用很小的难度新加的 区块 ,是肯定跑不赢全网的其他矿工的

                比特币 总量的由来

                我们已经知道,矿工没新建一个 区块 就可以得到一定数量的 比特币 作为奖励,最开始,一个 区块 可以得到50BTC的奖励,之后每210000个 区块 ,奖励减半,直到2140年,所有的 比特币 将会发放完毕,可以得到公式Total=210000×(50+25+12.5+…)=20999999980≈2100万Total=210000×(50+25+12.5+…)=20999999980≈2100万而这个规则不同的竞争币种都可以自由设置。但是因为交易费的存在, 挖矿 的人还是会有收益,否则无法建立新的 区块 ,那么整个 比特币 网络就瘫痪了

                比特币 的交易处理能力

                现在 比特币 区块 链 的 区块 信息

                我现在直接从BLOCKCHAIN上,在我写下这句话的时候,最新的 区块 是情况

                区块 高度存在时间交易数量交易额创建人( 矿池 )大小(KB)重量(kWU)4868833分钟212625992.38 BTC .TOP999.343917.5448688223分钟242233926.89 BTC C Pool1034.393996.5848688151分钟3584480.22 BTC .TOP191.92718.1448688053分钟3523770.26 BTC .TOP197.27715.72

                其中的重量是指的实际存储的大小,这个值和交易协议有关,其实可以忽略。非常幸运的是,这几个 区块 放佛是专门为讲解这一节而出现的,这可能是天意吧

                另外插一句,你会发现平均 区块 建立间隔时间,的确和10分钟这个设计值差距很大吧

                区块 容量

                比特币 区块 链 从被第一次部署时,或者说源代码中已经规定, 区块 容量是1M。最初设计成1M的原因一方面,防止DOS攻击。另一方面,当年 中本聪 在创建 区块 链 的时候的容量是32M,但是他通过一个说明为”Clear up“这样毫不起眼的Commit把 区块 容量改成了1M,为防止 区块 链 体积增长过快,为 区块 容量这个问题添加了些神秘色彩。好吧,我承认, 中本聪 就已经非常具有神秘色彩了,是在神秘色彩上添上了些故事

                截止2018年4月1号,完整 区块 链 大小已经有约151GB的大小了

                上表中,可以观察到,1M的容量意味着 比特币 最大的处理交易数量在约2400(486882 区块 1034.39的大小很接近了),从代码及技术文档来看,一个 区块 的最大处理交易数量在2700笔,意味着在一定程度上 区块 利用率可以超过100%。下面再给出一张时间和每秒交易数量的关系图表(交互表格点击链接)

                每秒 比特币 交易数量

                【蓝色圆圈的大小】代表的是 比特币 内存池(mempool)的大小(交易在等待矿工处理之前都会暂时存在这里)直观来说,就是圆越大,在等待的交易数量越多【纵坐标】是每秒交易数量(对数变换后)【横坐标】是时间

                一句话总结,这是一个拥堵的网络,重负不堪。

                再来看一张 比特币 交易费和 区块 使用率之间的关系图(交互表格可以点击链接)

                Bitcoin Fees VS BlockSize

                【蓝色的圈大小】是Mempool的大小,直观来说,就是圆越大,在等待的交易数量越多【横坐标】是 区块 容量的使用情况【纵坐标】是每一个 区块 的可以得到的交易费用,单位是 BTC ,注意这里是一个 区块 被新建时候所有交易费之和(大约2400交易的所有交易费加起来)

                手续费随 区块 使用率开始增长,甚至出现了10 BTC 一个 区块 2400笔交易的情况,意味着挖到这个 区块 的人通过交易费得到的回报接近了本身建立 区块 的回报。另,之所以可能有人看到最大交易是2700笔,应该和这个 区块 链 大小为最大值的110%有关,从设计角度上来说,是一种缓冲

                有一个结论是,扩容后,因为每一个 区块 的交易承载量增加,矿工的交易费收入肯定会减少。因为,通过上表可以发现,只有当 区块 使用程度接近95%时候,交易费才有明显的增长

                再看一张用户执行交易需要等待的时长和 区块 使用比例间关系的图表(交互图表点击链接)


                Bitcoin Median Confirmation Time VS Bloacksize

                【蓝色的圈大小】是Mempool的大小,直观来说,就是圆越大,在等待的交易数量越多【横坐标】是 区块 容量的使用情况【纵坐标】是用户平均需要等待的时间,单位是分钟。

                通过上面三张表我们可以知道,矿工的计算力是整个 区块 链 信用的基石(记住贪婪=信任),所以对矿工的激励不能少,而对于用户来说,当然希望自己的交易越快速完成越好。

                对于矿工来说, 区块 使用率超过95%是一个很好的信号,那意味着可以拿到更多的奖励。奖励太低,在 区块 建立奖励越来越少的情况下,安全性(信任)就慢慢的得不到保障。这么说来,这也就变成了一个Trade-off博弈过程

                分析下来,类似门罗币(menero)实现的根据网络负载来动态调整 区块 容量的设计似乎很合理

                比特币 扩容之争

                这是一场复杂的博弈斗争,使用隔离见证增长 区块 容量,并出现了 比特币 现金这个新的币种。

                如果想要了解这里面的很多技术,英文是必须过硬的,因为 比特币 代码开源,可以随意fork,只要英文功底过硬,阅读白皮书,文档等,这些不同技术的处理方法都是能够学到的

                比特币 的一笔交易过程中到底发生了什么

                我们可以确认的是,每一笔都将记录在大账本中,那么我们需要研究的内容,就是 区块 中交易内容内的具体数据结构

                交易结构

                每一个交易块包含的内容如下表所示

                大小字段描述4 bytes版本明确这笔交易参照的规则1 - 9 bytes输入数量输入值的数量不定输入一个或多个交易输入1 - 9 bytes输出数量输出值的数量不定输出一个或多个交易输出4 bytes时钟时间UNIX时间戳或 区块 号

                最后这个值是解锁时间,定义了能被加到 区块 链 里的最早交易时间。大多是时候设为0,表示立马执行。

                一笔 比特币 交易是一个含有输入值和输出值的数据结构。该数据结构包含了将一笔资金从初始点(输入值)转移至目标地址(输出值)的代码信息。 比特币 交易的输入值和输出值与账号或者身份信息无关。可以把它理解为一种被特定秘密信息锁定的一定数量的 比特币 。只有拥有者或者知道这个秘密信息的人可以解锁

                交易的输入和输出

                比特币 交易的基本单位是未经使用的一个交易输出,简称UTXO(unspent transaction outputs)

                可以把UTXO类比为我们使用的人民币1,5,10,20,50,100的面值,对于UTXO来说,它的面值可以是一”聪“的任意倍数(1 BTC 等于一亿聪)但是这个有着任意面值的”人民币“不能随意打开,还被加上一道类似红包支付口令的密码,只有拥有这个密码的人才可以使用这个UTXO,UTXO包含,币值+一段代码(锁,只有有钥匙的人才能打开)

                被交易消耗的UTXO被称为交易输入,由交易创建的UTXO被称为交易输出

                交易输出

                不同面值的UTXO是由交易输出来提供的。你可以想象你需要购买一个3.1 BTC 的物品,你并不能从你的钱包中找到几个UTXO来得到3.1 BTC ,但是你刚好拥有一个4 BTC 的UTXO,你使用这个UTXO作为付款,那么你需要自己手动构建一个0.9的UTXO返还给你自己。

                一个交易输出包含两个部分

                  一定量的 比特币 。被命名为“聪”(satoshis)

                  一个锁定脚本。给这个UTXO上锁,保证只有收款人地址的私钥才可以打开

                  交易输入

                  每个交易输入是在构造的一笔交易(使用UTXO),比如你需要支付0.015 BTC ,钱包会寻找一个0.01 BTC 和0.005 BTC 的UTXO来组成这一笔交易。交易输入中还会包含一个解锁脚本,这是一个签名,可以类比成支付宝红包密码的口令

                  交易费

                  交易费 = 求和(所有输入) - 求和(所有输出)

                  这里有一个比较有意思的地方,就是因为找零的输出UTXO是交易的发起这自己构建的,如果很不幸,你忘记了自己构建找零的UTXO,那么这些多余的 BTC 就会变成矿工的劳务费

                  例如,我需要和小明进行交易,需要购买一个商品,花费0.8 BTC ,为了确保这笔交易能被更快的处理(添加到大账本上),我要在其中添加一笔交易费,假设0.01 BTC (忽略人傻钱多),那就意味着这笔交易会需要我从钱包中找到几个UTXO能组成0.81 BTC 。但如果我的钱包内找不出这样的UTXO,只有一个1 BTC 的UTXO可用,那么我就需要构建一个0.19 BTC 的UTXO作为找零回到自己的钱包

                  交易费只和交易字段使用的字节大小有关,与参与交易的 比特币 币值无关。UTXO是有尺寸的,比如某人想支付一笔很大的 BTC 交易,但是他的钱包中有很多小尺寸的UTXO,如果加入了很多个UTXO,就意味着他的交易会变复杂,存储空间需求多。当然,很多钱包会提供这方面的优化功能,保证你的交易使用的字段大小最优化

                  解锁和锁定脚本

                  在实际实现的时候,这个“支付宝红包口令”被称为脚本,是一种基于逆波兰表示法的基于堆栈的执行语言。具体细节感兴趣的读者可以去 比特币 的Github研究代码。关于脚本有很多细节上的定义和实现方法,这里限于篇幅不展开描述了

                  矿工费和优先级

                  我们知道,每一笔交易都是广播到 区块 链 上,由矿工决定是不是加入到新 区块 上的。那么这里就会涉及到一个问题,谁的交易的优先级更高,是先来后到?还是谁给前多谁就能加入到新 区块 中?

                  在 区块 容量一节中,有一张图表直观的展示了现在网络中一笔交易的等待时间,其中最长的,也就是30分钟,如果你不是一个超级急性子,很多时候还是可以接受的(毕竟跨国转账1-2个工作日)

                  优先级 = 输入值块龄 * 输出值块龄 / 交易总长度

                  一个交易想成为“较高优先级”,需满足条件:优先值大于57600000,等价于1个 BTC ,年龄为1天,交易的大小为250字节

                  区块 中前50KB的字节是保留给“较高优先级”的,其实这一机制也保证了一笔交易不会等待时间无现长。但是我们要知道,内存池(存放待处理交易的位置)中的交易,如果在没有处理后消失,所以钱包必须拥有不断重新广播未被处理交易的功能

                  创币交易 - Coinbase

                  每一个新建立的 区块 ,都会有新的 比特币 作为奖励被产生,这个交易是一个特殊交易,被称为创币交易( Coinbase 奖励)

                  创币交易中不存在解锁脚本(也叫ScriptSig字段),被 Coinbase 的数据取代,长度最小2字节,最大100字节,除了开始的几个自己以外,矿工可以任意使用 Coinbase 的其他部分。比如创世 区块 中, Coinbase 的输入中的字段是:The Times 03/Jan/2009 Chancellor on brink of second bailout for banks,是泰晤士日报当天的头版文章标题:财政大臣将再次对银行施以援手。

                  Merkle树

                  每个 区块 中的所有交易,都是用Merkle树来表示的。换句话说,交易的存储数据结构是,Merkle树

                  什么是Merkle树

                  Merkle树是一种哈希二叉树,它可以用来进行快速查找和检验大规模数据完整性。对于 比特币 网络来说,使用Merkle树来存储交易信息的目的是为了高效的查找和校验某笔交易的信息是否存在

                  当N个数据元素经过加密(使用两次SHA256算法,也称double-SHA256),至多计算2log2(N)2log2(N)次就能检查出任意某元素是否在树中

                  构造Merkle树

                  假设我们有A B C D四笔交易字段,首先需要把这四个数据Hash化。然后把这些哈细化的数据通过串联相邻叶子节点的哈希值然后哈希化。

                  Merkle树的构造过程

                  叶子节点必须是偶数(平衡树),如果遇到奇数的情况,把最后一个节点自身复制一个,凑偶


                  Merkle树的效率

                  下表显示了证明 区块 中存在某笔交易所需转化为Merkle路径的数据量

                  交易数量 区块 的近似大小路径大小(哈希数量)路径大小(字节)164KB4个哈希128 bytes512128KB9个哈希288 bytes2048512KB11个哈希352 bytes6553516MB16个哈希512 bytes

                  可以发现,即使 区块 容量达到16MB规模,为证明交易存在的Merkle路径长度增长也极其缓慢(幂指数增长取对数变为线性增长)

                  Merkle应用 - 简单支付验证节点(SPV)

                  我们知道,每当一笔新的交易产生的时候,我们必须验证这笔交易是否真的存在,在SPV节点中,不保存 区块 链 ,仅仅保存 区块 头。使用认证路径或者Merkle路径来验证交易是否存在于 区块 中

                  例如,一个SPV节点需要处理一笔支付,它需要验证这笔交易在某个 区块 中是否存在,才能决定是不是把这笔交易添加到这个 区块 中,那么它只需要接收少于1KB大小的,有关 区块 头和Merkle路径的信息,比接收完整 区块 (大约1MB)大小少了1千倍。简单来说,可以想象,Merkle树类似一个数组(这也是哈希表的最简单表示),下标是 区块 字段,下标对应数组存储的内容是这笔交易是否存在的值(True or False)

                  区块 链 ( 比特币 )与金融

                  BitInfoChart是我个人觉得最好的 加密货币 信息网站!可以添加到收藏夹

                  因为 比特币 具有价值,那就必须谈到它和金融的关系。

                  限于篇幅(太长了太可怕了,一个博客写2万字莫不是有病),这部分另起一篇:链接(直接点不会打开新标签),如果对ICO和金融方面感兴趣的读者欢迎移步讨论

                  竞争币和其他技术创新

                  所谓竞争币当然是利用 区块 链 技术为即使,仿照 比特币 的基本协议架构进行的创新后的新币种,或者是新的 区块 链 实现模式。这篇文章围绕什么是 区块 链 展开,这部分的内容请移步(持续更新)如何评估竞争币的价值与新技术创新(直接点不会打开新标签)

                  其中谈到了工作量证明的其他替代手段;到底什么是智能合约; 以太坊 开发技术栈等

                  总结

                  感谢您看到这里,写这篇文章的目的一方面也是回答 区块 链 ( 比特币 )到底是什么这个困扰了自己很久的问题,另一方面,也是因为最近 区块 链 技术非常火,需要一些接地气的科普文

                  比如最近最新的消息称一家保险公司,使用 区块 链 技术来赔偿航班晚点2小时,基于 以太坊 智能合约第一款落地应用。

                  如果你已经对 区块 链 的实现原理有了初步的认知,就明白这些应用利用了 区块 链 的分布式特点。说到底,并没有贪婪=信任工作量证明核心,只是一种基于云的新型运用,也很有想法,但是和 比特币 之类就没什么关系了(当然,这是我的个人看法,最近 区块 链 方面的有很多突破性技术,比如侧链,闪电网络等等,太多的新概念,新名词,新技术,对此,也只能不断学习)。

                  但你只需牢记,贪婪=信任, 以太坊 也是利用以太币这个媒介来实现了合约价值, 中本聪 用人内核的贪婪来给陌生人之间加上了信任的纽带,这个代价是永远不会变的。换句话说,如何抵抗共识攻击和安全漏洞是一个永远不会消失的议题。

                  一句话来说,万变不离其宗,道生一,一生二,二生三,三生万物。 中本聪 给了道,是个妙人,但是万物依旧有无穷可能。信任作为一个人类社会一直以来的重要问题(痛点),为了解决它,出现了权威机构进行信任背书(中心化)。建立信任,一定要付出代价,天底下没有免费的午餐,最终这些技术都会回归于一个投入产出的博弈过程(Trade-off),梳理主干,抓住要点,才能游刃有余!

声明:本文来自非小号平台用户投稿,观点仅代表作者本人,不代表【非小号-www.58d.com.cn】立场,文章内容仅供参考,如若转载请标注文章来源:【当前页面链接】

区块链相关

区块链媒体相关

区块链技术相关

挖矿相关

比特币相关