2.1 区块链的技术原理

区块链系统的设计思想和很多传统系统的设计思想本来就是截然相反的:

  • 区块链是分布式的,传统系统是集中的。

  • 区块链上的数据有N个备份,传统系统的数据是在单个或者少数几个节点上的。

  • 区块链是不需要信任的,传统系统的运营者必须是被信任的。

  • 区块链上的所有记录都是可追溯的,传统系统的记录可能没有上下文。

  • 区块链的系统是24×7×365不间断运行的,而传统系统需要停机维护或者更新。

下面首先从区块链技术的算法思想开始说起。

账户地址的产生方式

在介绍中本聪的算法之前,下面先简单普及一下公钥私钥加密系统的原理。

系统上的每一个人都有一把公钥和一把私钥,私钥是保密的,而公钥对大家都是公开的。系统上的一个人John要把一段内容发送给另一个人Brian。John可以用他的私钥对内容加密,然后发送给Brian,而Brian可以用John的公钥来解密,从而看到这段内容。

如果Brian需要的是John的数字签名,那么用同样的方式,Brian可以用John的公钥来验证这个签名确实是用John的私钥创建的,也就是说,这确实是John的签名。

用系统认同的算法,我们可以用私钥来产生公钥,不过这个过程是不可逆的,也就是说我们是无法用公钥反过来把私钥推算出来的。

下面看一下比特币上的地址是如何从公钥产生的。

如图2-1所示,从公钥生成比特币地址的方式是:

(1)计算公钥的SHA-256哈希值。

(2)计算第(1)步结果的RIPEMD-160哈希值,这个结果是fingerprint(指纹)。

(3)计算fingerprint的SHA-256哈希值。

(4)对第(3)步的结果再做一次SHA-256哈希值,这个结果是checksum(校验码)。

(5)在第(2)步的结果fingerprint的前面加上0×00,后面加上checksum。

(6)用Base58表示法转换第(5)步的结果,就得到了比特币的地址。

在此,我们需要对Base58做一下解释。Base58是专门为比特币区块链算法设计的进位方法,其实就是把字母表分大小写加上所有的数字,然后去除容易混淆的数字“0”,大写字母“O”,大写字母“I”和数字“1”。

image.png

比特币地址的生成示意图
(来源:http://en.bitcoinwiki.org/Bitcoin_address)

如下表所示,用Base58表示的数字是58进位的。比如Base58的“1B”就等于十进制中的69(58+11),“22”就等于十进制中的118(58×2+2)。

image.png

比特币的地址是这个样子的:

1JArS6jzC4FJ9sZ3aFij1CmTcpFGgN86hG

149RkVbBt1tLGwedZzPJCXkHqewjhcKkQS

1KBrS6jzC7FJ3sZ3BFij1TnTcpFGgN73hB

1LCrS9jzC7F4JieWad3kLaGF4ppFGgN6hC

……

区块链的算法和设计

如果要详细说明区块链的算法,我们还得回到中本聪在2008年发表的那篇经典之作——“Bitcoin:A Peer-to-Peer Electronic Cash System”。如果读者对区块链技术有兴趣,那么笔者建议你仔细阅读一下原文:https://bitcoin.org/bitcoin.pdf,因为这篇文章是整个区块链技术的基础。

双重消费问题

在中本聪设计的算法出现之前,下面这个问题没有一个去中心化的系统能够完整实现:

image.png

没有固有的方法可以决定这两笔交易哪一笔先成功,只有首先被确认的交易才会生效。如果两笔交易都被确认了,那么“双重消费”的问题就出现了。在中本聪的解答出来以前,这个问题阻碍了去中心化数字货币的发展许多年。

“拜占庭将军”问题

另外一个问题是“拜占庭将军”问题(Byzantine failures)。所谓的“拜占庭将军”问题是一个协议问题:

当年的拜占庭罗马帝国国土辽阔,为了防御,每个军队都被分隔得很远,将军与将军之间只能靠信差传消息。拜占庭帝国军队的将军们必须全体一致决定是否攻击某一支敌军,不过问题是这些将军在地理上是被分隔开来的,并且在将军中存在叛徒。叛徒可以任意行动以达到以下目标:

  • 欺骗某些将军采取进攻行动。

  • 促成一个不是所有将军都同意的决定,例如当将军们不希望进攻时促成进攻行动;或者迷惑某些将军,使他们无法做出决定。

如果叛徒达到了这些目的之一,则任何攻击行动的结果都注定是失败的,只有完全达成一致才能获得胜利。

“拜占庭将军”问题是对现实世界的模型化,由于硬件错误、网络拥塞或断开,以及遭到恶意攻击,计算机和网络可能出现不可预料的行为。拜占庭容错协议必须要处理这些失效,并且这些协议还要满足所要解决的问题要求的规范。

中本聪的设计要解决以下几个关键问题:

  • 分布式的共识

  • 不需要第三方介入的交易

  • 避免“双重消费”的问题

  • 解决“拜占庭将军”的问题

另外,中本聪的设计还做了以下几个假设:

  • 所有的交易在P2P网络上完成

  • 每一个节点可以随意加入和离开P2P网络

  • 每一个交易都是不可逆的

  • 所有的交易都是可追溯的

  • 网络上良性的节点数量要大于恶性的节点数量

每一个比特币从出生开始所有的交易记录都会被保留,都可以被追溯起源。

在中本聪提出的区块链加密算法中,交易完成的过程如下图所示。

image.png

区块链技术上的交易示意图
(来源:Bitcoin:A Peer-to-Peer Electronic Cash System,中本聪)

在比特币网络上的每一个人都有一对钥匙:对外公开的公钥和自己保留的秘钥。交易的过程是这样的:

(1)区块链的最后一个环节是Owner1,他用Owner0的公钥验证了前一笔交易。

(2)Owner1用自己的秘钥签署了交易(Transaction)。

(3)交易从Owner1传送给Owner2,并向全网广播。

(4)Owner2用Owner1的公钥来验证交易。

(5)交易成功,Owner2加到链条中。

如 果交易仅此而已,那么我们并没有解决所谓的double spending(双重消费)的问题。如果Owner1同时把比特币发送给两个人,那么如何解决冲突呢?在中本聪之前,有很多人试图解决这个双重消费的问 题,不过最后的解决方案要么需要一个中心节点,要么就回到了需要第三方来仲裁的方式。而这两种解决方案都违背了最初设计的初衷。

中本聪提出的解决方式就是在上述步骤的第(3)步加入的。如果要去掉中心,则需要做到两点:

(1)每次的交易都向整个网络做广播。

(2)在P2P网络中最早打上时间戳的那个交易被认定为是成功的交易。

当交易在广播的时候,需要得到足够多节点的确认,那么交易才能够完成,在第(5)步之后这条交易才能够顺利打包加入到区块中。

区块组成区块链的方式

下 图是对区块链中间一段的简单描述。其中每个区块都有指向前一个区块的链接,一直到最初创建的区块,而在区块链系统上发生的每一笔交易都会存在于某一个区块 中,并被永久保存。例如区块54中包含了链接,链接到区块53;区块53中包含了链接,链接到区块52;区块52中包含了链接,链接到区块51,以此类 推,直到最初的一个区块。

image.png

我们来看一下区块链中最核心的区块是怎样组织的。

区块的结构

每个区块的结构都如下表所示。

区块的结构

 

  数据项  

  描述  

  长度  

  Magic no魔术数  

  常数0xD9B4BEF9  

  4字节  

  Blocksize块大小  

  到区块结束的字节长度  

  4字节  

  Blockheader区块头  

  包含6个数据项  

  80字节  

  Transaction counter交易数量  

  正整数VI=VarInt  

  1~9字节  

  Transactions交易  

  交易列表  

  Multiple Transactions多个交易  

每个区块都包括了一个被称为“魔术数”的常数0×D9B4BEF9、区块的大小、区块头、区块所包含的交易数量以及一些或所有近期的新交易。

在每个区块中,对整个区块链起决定作用的是区块头。下表展示的是区块头中包含的数据项。

区块头的结构

 

  数据项  

  描述  

  更新时间  

  大小  

  Version版本  

  区域版本号  

  更新软件后指定的新版本号  

  4字节  

  hashPrevBlock前一区块的Hash  

  前一区块的256位Hash值  

  新的区块进来时  

  32字节  

  hashMerkleRootMerkele根节点Hash值  

  一个区块中所有交易的256位Hash值  

  接受一个交易时  

  32字节  

  Time时间戳  

  从1970-01-01 00:00UTC开始到现在,以秒为单位的当前时间戳  

  每几秒就更新  

  4字节  

  Bits当前目标Hash值  

  压缩格式的当前目标Hash值  

  当“挖矿”难度调整时  

  4字节  

  Nonce随机数  

  从0开始的32位随机  

  产生Hash时  

  4字节  

这 里的hashPrevBlock数值就是区块之所以能够连接成区块链的关键字段,该字段使得各个区块之间可以连接起来,形成一个巨大的“链条”。每个区块 都必须指向前一个区块,否则无法验证通过。这个区块链条一直追溯至源头,也就是指向创世区块。创世区块的hashPrevBlock值为零,或者说为空。

在区块头中最关键的数据项是一个随机数Nonce。这串数字是一个答案,而这个答案对于每个区块是唯一的:

  • 这个答案很难获得。

  • 有效答案有多个,不过我们只需要找到一个答案就可以了。

  • 其他区块对有效答案的验证很容易。

因为问题很难解答,没有固定的算法可以求出答案,所以唯一的做法是不断尝试。找寻这个答案的过程就叫作“挖矿”,同时有很多人都在“挖矿”,他们互相之间是相互竞争的关系。

工作量证明

目前,要在比特币区块链系统上找到这串能够作为解答的编码,除随机尝试外没有更好的方法。生产这么一串正确的数字编码是需要消耗大量计算资源(CPU、硬盘和电源)的,而这个过程就是我们经常所说的POW(Proof of Work,工作量证明)。

如下图所示,工作量证明就是确保正确答案很难被获取,不过却很容易被验证的一种方式。

image.png

工作量证明的示意图
(来源:https://www.bitcoinmining.com/what-is-proof-of-work/)

换 一种方式说,工作量证明很简单,它就像是一门很难的课程的资格考试。想要答对所有的试题是需要精力和时间的,不过如果试题全部是选择题,则验证答案是否正 确是非常容易的。好事者可能会问:“如果我不知道答案,可以不断尝试啊!”的确,你可以试着不断提交答案,不过如果有100道题,而每道题有4个选择,那 么答案的组合方式有4^100种。你是无法在有限的时间内把答案尝试出来的,况且,你能够尝试的时间只有10分钟。10分钟之后,会有100道不同的题目 来等着你回答。

如果某个节点回答出一个合理的区块Hash值,那么说明该节点做出了工作量证明,确实经过了大量的尝试计算。我们是无法得出计算次数的绝对值的,因为寻找合理的Hash值是一个概率事件。当一个节点拥有占全网n%的算力时,那么该节点即有n/100的概率找到Hash值。

权益证明机制

POW是达成共识(consensus)的一种方式,不过它不是唯一的方式,还可以有其他的方式让各个节点达成共识,例如POS。

POS(Proof of Stake,权益证明机制)不同于POW之处在于,在POS系统上“挖矿”是以货币的持有数量为基础的。换句话说,在POS的情况下,一个人拥有虚拟货币的5%和在比特币系统上拥有系统5%的算力的效果是一样的。

对于POW和POS孰是孰非的争论在比特币区块链社区中吵得人仰马翻。究竟哪种方式更好或者是否还有更好的“挖矿”机制不是本书讨论的重点。有兴趣的读者不妨去研究一下区块链社区中的各种说法,自己来做判断。

“矿工”存在的意义

当“矿工”找出一串编码来解答问题的时候,整个比特币的用户群体会奖励那个造币者一定数额的比特币(目前是25个比特币)。正是为了这些奖励,大量的极客加入到开发比特币的过程中来。

因为每解决一个区块,都会得到新产生的比特币奖励,所以在区块头中包含了一个记录,记录中的比特币地址是有权获得比特币奖励的地址,也就是“矿工”的比特币地址。

读者可能会想到,如果用一台或者很多台计算速度很快的电脑,那么能否快速解决问题呢?中本聪已经考虑到这个问题,所以在他的系统设计中,问题的难度是随着时间变化而进行调整的。

下图中展示的问题的难度已经用指数的方式调整过了。随着时间的变化,“挖矿”的难度是呈指数级上升的。

image.png

每个区块在新生产的时候,比特币的奖励数量在最初的时候是设定为50个,而每产生21万个区块后奖励数量会减少 一半。目前开发出来的区块约有39万个,所以奖励的比特币数量是50个的一半,也就是25个,等到开发的区块达到42万个的时候,奖励的比特币数量还会再 减半,变成12.5个比特币;达到63万个的时候,奖励数量会再次减半,变成6.25个比特币。以此类推。

区块链是所有比特币节点链接在一起之后形成的共享交易数据库,区块链中的节点都是通过上述的方式加入到比特币网络中的。所以,在区块链中包含了每一个在比特币系统上执行过的交易。根据这个信息,人们可以找到任何时候任何一个地址中的比特币数量。

在比特币区块链系统上的第一个区块被称作创世区块(Genesis block),它是由中本聪创建的。创世区块中包含了一条消息:

The Times 03/Jan/2009 Chancellor on brink of second bailout for banks.

(泰晤士报,2009年1月3日,首相府在第二次拯救银行的边缘。)

如果我们翻阅2009年1月3日的《泰晤士报》,则会在头版看到“Chancellor on brink of second bailout for banks”这条信息。

这条信息说明创世区块的构建时间不会早于报纸出版的时间,而通常我们会把2009年1月3日作为创世区块创建的时间。

区块链上的每个区块都会包含前一个区块的Hash值,这就使得从创世区块一直到当前区块形成了一根链条。链条上的每个区块必定按时间顺序跟随在前一个区块之后,因为如果不知道前一个区块的Hash值则是没法生成当前区块的。

对 于区块链中的任何一个区块,只有一条路径通向创世区块。然而,从创世区块出发,却可能有分叉。当两个区块生成的时间很接近的时候,可能会产生一个分叉。当 分叉出现时,每个矿工节点会根据收到区块的时间,在先收到的区块基础上继续“挖矿”。哪个区块的后续区块先出现,则这个区块就被包括进主链,因为这条区块 链更长,而分叉的另外一支就被废弃了。

如果有人想要改变一个在区块链中已经存在一段时间的区块,那么从理论上来说是有可能的,不过从概率上来说是不可行的,因为如果它被改变了,那么它之后的每个区块必须随之改变。在中本聪的算法中证明了这一点。如果各位读者有兴趣,不妨去阅读一下原文。

“矿工”,区块链系统上的核心

最早在区块链上做研究的是一群沉迷于密码学的极客,而这些人中的大部分对区块链产生兴趣是从在比特币上“挖矿”开始的。

在区块链上的“挖矿”工作有三大功能:

  • 发行新的货币

  • 维系货币的支付功能

  • 保障系统安全

“挖 矿”是在比特币区块链系统中产生新的货币的唯一方式。在比特币系统中的交易一定是加载在区块中的,如果没有“矿工”的存在,则新的区块不会产生,交易也就 无法完成。如果系统上的整体算力比较少,那么侵入者会比较容易占据51%的算力,从而威胁到系统的安全,所以“矿工”提供自己的算力也是保障系统的安全。

2016年1月,支持比特币区块链系统运行的计算能力已经达到了800000000GH/s,代表其每秒能够进行8×1018次运算,相当于号称世界运行最快的计算机——美国的蓝色基因超级计算机每秒运算速度的28571倍。

当 “挖矿”的难度持续上升,而获取的奖励变少时,“矿工”的日子是一天不如一天了。当奖励从50个比特币减少到25个比特币时,“矿工”的数量也减少了。现 在的总区块数已经超过39万块,而等到总区块数到达42万块时,系统奖励会从25个比特币减少到12.5个比特币。这个时间点会是在2016年。

我们可以观察到的是,和2014年相比,比特币网络上的节点数在显著减少。

从下图中可以看出,比特币网络上的节点数和一年之前相比,减少了837个,也就是减少了12.64%。这是一件令我们担忧的事情:如果节点数少到一定的地步,则会很难找到一个P2P节点去连接和同步网络数据,整个区块链网络甚至有可能会逐渐陷入瘫痪。

下表列出了目前节点的国家分布。

区块链节点的国家分布
(来源:https://bitnodes.21.co/)

 

  排名  

  国家  

  节点  

  1  

  美国  

  1949(33.40%)  

  2  

  德国  

  792(13.57%)  

  3  

  法国  

  419(7.18%)  

  4  

  荷兰  

  335(5.74%)  

  5  

  加拿大  

  271(4.64%)  

  6  

  英国  

  269(4.61%)  

  7  

  俄罗斯  

  170(2.91%)  

  8  

  瑞曲  

  139(2.38%)  

  9  

  中国  

  107(1.83%)  

  10  

  澳大利亚  

  105(1.80%)  

有趣的是,虽然在“矿工”的比例和比特币交易的比例上,中国占比很高,不过在运行节点的比例上,中国只排到第9名,节点占比数只有1.83%。

“挖 矿”需要消耗大量的电力,运行节点同样也需要资源,所以维护整个比特币网络是很耗费资源的。据估算,目前运行比特币网络需要的电力会超过1GW(100万 千瓦),差不多相当于整个爱尔兰所耗费的电力。仅仅从能耗的角度来看,比特币网络其实是相当不环保的。当然我们分析问题不能只从能耗这一个角度出发,要考 虑其带来的深远影响。

之前我们在讲述POW的概念时,也提到过取代性的证明方式,例如POS权益证明机制。在POS体系中,只有打开节点其上的区块才会获得利息,这就让很多本来不愿意长期维护节点的人,也会经常把自己的节点打开。

其 实,笔者在阅读关于POW和POS之争的时候,对于“挖矿机”这样对于计算资源的浪费还是很心痛的。如果将这些计算资源用在更有价值的科学研究上,例如 2.2节提到的SETI@Home项目上,如果解决一个数学问题就能有概率获取一定的虚拟货币,那么这样不是两全其美吗?


来源:我是码农,转载请保留出处和链接!

本文链接:http://www.54manong.com/?id=864

'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })();
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值