Backend
Business
DataScienceAI
Frontend
InfoSecurity
Infrastructure
Product
ProgrammingLanguage
SoftwareEngineering

Blockchain-CheatSheet

返回目录

区块链

In essence, the blockchain is a shared, programmable, cryptographically secure and therefore trusted ledger which no single user controls and which can be inspected by anyone.- Klaus Schwab

区块链技术是最近在互联网技术前沿比较火的一个课题,它的出现解决了在点对点通信中一直存在的一个基本问题,即著名的拜占庭将军问题。通俗地讲就是在一个去中心化的网络中如何对一个信息传递(比如一笔支付)达成全网共识。

区块链由时间序列的链式数据块构成,提供了拜占庭容错、并基于共识协议保证了最终一致性的分布式数据库。

区块链本质上是一个去中心化的分布式账本数据库,是比特币的底层技术,和比特币是相伴相生的关系。区块链本身其实是一串使用密码学相关联所产生的数据块,每一个数据块中包含了多次比特币网络交易有效确认的信息。 每当有加密交易产生时,网络中有强大运算能力的矿工(Miner)就开始利用算法解密验证交易,创造出新的区块来记录最新的交易。新的区块按照时间顺序线性地被补充到原有的区块链末端,这个账本就会不停地增长和延长。

通过复杂的公共钥匙和私人钥匙的设置,区块链网络将整个金融网络的所有交易的账本实时广播,实时将交易记录分发到每一个客户端,同时还能保证每个人只能对自己的财产进行修改。当然,账本里也有别人的交易记录,虽然可以看到数值和对应的交易地址(基本上这是由一段冗长的乱序字母和数字组成),但是如果不借用其他

技术手段也根本无法知道交易者的真实身份。 如果从不同的技术角度来剖析,我们可以这样看待区块链:它是一种数据库、一种分布式系统,也是一种网络底层协议。 (1)数据库。区块链是一种公共数据库,它记录了网际间所有的交易信息,随时更新,让每个用户可以通过合法的手段从中读取信息,写入信息。但又有一套特殊的机制,防止以往的数据被篡改。 (2)分布式系统。区块链是一种分布式系统,它不存储放置在某一两个特定的服务器或安全节点上,而是分布式地存在于网络上所有的完整节点上,在每一个节点保留信息备份。 (3)网络底层协议。区块链是一种共识协议,基于这种协议,可以在其上开发出数目繁多的应用。这些应用在每一时刻都保存一条最长的、最具权威的、共同认可的数据记录,并遵循共同认可的机制进行无须中间权威仲裁的、直接的、点对点的交互信息。

数字货币

数字货币应用方向

数字货币是区块链的第一大应用类型,其实你可以简单理解为一种无主权 、社区自治的货币形式。数字货币通常是基于区块链技术、在全球范围内公开发行的、并且没有任何国家政府背书的虚拟货币,这种虚拟货币具有“去信任”、“点对点”、“公开记账”、“不可篡改”等特征。

总量透明公开。数字货币的发行是在项目创建之初,是白皮书事先就规定好了的,白皮书通常是一个区块链项目公开发布的一种阐述性文档,其中简述了项目的宗旨和愿景以及设计蓝图。

数字货币缓慢释放。数字货币缓慢释放。挖矿为数字货币的缓慢释放提供了一种方法。

代码执行规则。由于我们在白皮书中规定好了总量和数字货币释放的机制,白皮书的内容会成为整个社区的基础共识,所以在项目的主网上线之后,数字货币的释放不再是人为控制,而是在代码层面体现,代码将负责控制数字货币的释放,这里去除了人为操作的因素。

数字资产

虚拟资产一般包括有金融资产、游戏代币、数字版权、域名、 用户流量等。由于虚拟资产不需要与实体资产进行挂钩,所以在对应到区块链上更为方便。它具体的应用形式在供应链金融、票据市场都有所体现。

我们在这里,简单从技术的角度介绍一下 ICO,ICO 的中文名是首次代币发行,又称为区块链众筹,这是一种新型的融资模式,投资者可以用手中的比特币 或其他代币投 到一些区块链创始项目。

区块链的衍化

第一代

第一代区块链技术发展出的去中心化、不依赖第三方认证的防止多重支付的技术解决方案,大幅度降低了中间交易和支付费用。另外就是依赖于密码技术,解决了参与方的信任问题。 但是这一代技术,在于哲学思维上对全民选举形成共识机制的过于理想化的坚持,导致了效率的低下。比如比特币的任何交易和支付需要至少 10 分钟才能初步完成(通过改进的其他系统,可以

比特币的区块链应用于价值传递,就是转账,所以最简单的应用就是在金融领域,比如跨境转账,支付汇兑。严格说起来,数字货币其实是区块链最简单、最直接的应用场景。绝大多数的区块链项目,都会有自己的内生代币。

共识机制,就是所有记账节点之间如何区域达成共识,来选择和认定记录的真实性和有效性。全网认可的是最长的一条区块链,因为在此之上的工作量最大。如果想要修改某个区块内的交易信息,就必须将该区块和后面所有区块的信息进行修改。这种共识机制既可以作为认定的手段,又可以避免虚假交易和信息篡改。

区块与账本

区块链网络中,数据以文件的形式被永久记录,我们称之为区块。一个区块是一些或所有最新比特币交易的记录集,且未被其他先前的区块记录。区块可以想像为一个城市记录者的记录本上的单独一页纸(对房地产产权的变更记录)或者是股票交易所的总帐本。在绝大多数情况下,新区块被加入到记录最后(在比特币中的名称为:块链),一旦写上,就再也不能改变或删除。每个区块记录了它被创建之前发生的所有事件。

每个区块包括一些或所有近期交易、前一个区块的引用,以及其他数据。它还包括一个挖矿难度的答案——该答案对每个区块是唯一的。新区块如果没有正确答案,不能被发送到网络中——“挖矿”的过程本质上是在竞争中 “解决”当前区块。每个区块中的数学问题难以解决,但是一旦发现了一个有效解,其他网络节点很容易验证这个解的正确性,对于给定的区块可能有多个有效解,但对于要解决的区块来说只需一个解。 因为每解决一个区块,都会得到新产生的比特币奖励,每个区块包含一个记录,记录中的比特币地址是有权获得比特币奖励的地址。这个纪录被称为生产交易或者 Coinbase 交易,它经常是每个区块的第一个交易。每个区块生产的比特币数量是 50 个,每产生 21 万个区块后减少一半(时间大约是 4 年)。

发送者在网络中广播比特币交易,所有试图解决区块的矿工节点,收集了这些交易记录,把它们加到矿工节点正在解决的区块中。 挖矿难度由比特币网络自动调整,使之实现平均每小时解决 6 个区块的目标。每 2016 个区块(大约两周)后,所有客户端把新区块的实际数目与目标数量相比较,并且按照差异的百分比调整目标 Hash 值,来增加(或降低)产生区块的难度。

共识机制与工作量证明

POW:Proof of Work,工作证明。 比特币在 Block 的生成过程中使用了 POW 机制,一个符合要求的 Block Hash 由 N 个前导零构成,零的个数取决于网络的难度值。要得到合理的 Block Hash 需要经过大量尝试计算,计算时间取决于机器的哈希运算速度。当某个节点提供出一个合理的 Block Hash 值,说明该节点确实经过了大量的尝试计算,当然,并不能得出计算次数的绝对值,因为寻找合理 Hash 是一个概率事件。当节点拥有占全网 n% 的算力时,该节点即有 n/100 的概率找到 Block Hash。 POS:Proof of Stake,股权证明。 POS,也称股权证明,类似于财产储存在银行,这种模式会根据你持有数字货币的量和时间,分配给你相应的利息。 简单来说,就是一个根据你持有货币的量和时间,给你发利息的一个制度,在股权证明 POS 模式下,有一个名词叫币龄,每个币每天产生 1 币龄,比如你持有 100 个币,总共持有了 30 天,那么,此时你的币龄就为 3000,这个时候,如果你发现了一个 POS 区块,你的币龄就会被清空为 0。你每被清空 365 币龄,你将会从区块中获得 0.05 个币的利息(假定利息可理解为年利率 5%),那么在这个案例中,利息 = 3000 * 5% / 365 = 0.41 个币,这下就很有意思了,持币有利息。

  1. 瑞波币(Ripple)

    瑞波币是 Ripple 网络运行的基础货币,就像比特币一样可以在整个网络中流通,而不必局限于熟人圈子。瑞波币引入网关系统,它类似于货币兑换机构,允许人们把法定货币注入、抽离 Ripple 网络,并可充当借贷双方的桥梁。

  2. 莱特币(Litecoin)

    莱特币与比特币相比具有三种显著差异:第一,莱特币网络大约每 2.5 分钟(而不是 10 分钟)就可以处理一个块,因此可以提供更快的交易确认;第二,莱特币网络预期产出 8400 万个莱特币,是比特币网络发行货币量的四倍之多;第三,莱特币在其工作量证明算法中使用了由 Colin Percival(科林 · 珀西瓦尔)首次提出的 Scrypt 加密算法,这使得相比于比特币,在普通计算机上进行莱特币挖掘更为容易(在 ASIC 矿机诞生之前)。每一个莱特币被分成 100000000 个更小的单位,通过 8 位小数来界定。不同于比特币,Scrypt 所具有的内存密集特性让莱特币更适合用图形处理器(GPU)进行“挖矿”。为 Scrypt 实施的 FPGA(现场可编辑逻辑门阵列)和 ASIC(专用集成电路),相比于比特币使用的 sha256,更为昂贵。

第二代

智能合约

1.以太坊(Ethereum) 以太坊是下一代密码学账本,支持众多的高级功能,包括用户发行货币、智能协议、去中心化的交易、普遍认为的第一个完全的去中心化自治组织(DAOs)或去中心化自治公司(DACs)应用。使以太坊与众不同的是实现这些功能的方式。以太坊并不是把每一单个类型的功能作为特性来特别支持,相反,以太坊包括一个内置的图灵完备的脚本语言,允许通过被称为“合同”的机制来为自己想实现的特性写代码。一个合同就像一个自动的代理,每当接收到一笔交易,合同就会运行特定的一段代码,这段代码能修改合同内部的数据存储或者发送交易。高级的合同甚至能修改自身的代码。

智能合约,完全由代码组成、自动执行的合约。可以自动核查某事是否发生、某物是否存在、某事是否完成等“条件判断”类条款,并据此对资金进行相应的转移。

代议制

第二代区块链技术的一个方向就是像美国的 Ripple 公司(详见本书第四章第三节)那样,开始考虑用人民代表大会的代议制度来达成系统共识——就是对各种交易和支付的认定,不是传统中心化的单一中心认定,也不是第一代区块链技术的全民参与认定,而是依靠大家信任的人民代表大会制度来代议。

第三代

第三代区块链技术版本的核心用一句话概括,就是变“绝对去中心化”为“有效去中心化”。

应用与不足

  1. 公开记账

每家每户都记账,账簿上不再记载每户村民的余额,而只记载每一笔 Transaction,即记载每一笔交易的付款人、收款人和付款金额。“公开记账”就是全网所有人都可以随时查看一套账本,然后按照规则透明公开地进行记账。

  1. 创建创世区块

创世区块是我们生成全村公开账本的第一笔交易的第一个信封,好比一篇文章总得有个开头一样。

  1. 交易

村长写好 Transaction 以后,还需要拿出自己的印章,在 Transaction 上盖章,这个盖章的过程也就相当于区块链中的签名。这个章,全村人都可以拿扫描器扫一下验证是否有效,即验证付款人的章是否有效。

用自己的私钥签名,证明交易是自己发起的。用对方的公钥加密,以保证只有正确的接收方才能获得信息。

  1. 打包 Transaction (挖矿)

是为了让打包交易的人能够在信封上署名,表示这次打包是由某某某打包的,其次全村的交易可能非常多,需要装配标号,方便大家查询。我们用一个特殊的信封把 Transaction 装起来,这个信封就是区块链中的“区块”,这个封装过程就是“打包交易”。

我给大家出一个难题,谁先解出这个难题的答案,谁就有权利把 Transaction 装到一个信封中,并且要在此信封上盖上自己的章。答案非常好验证,但是计算过程是一个尝试的过程,需要耗费大量的精力。而在真实的比特币中,采用的是寻找符合条件的目标哈希,这也就是比特币矿工所做的事情。

矿工在打包之后能够获得对应的奖励

  1. 广播交易

广播的内容分两种,一种是广播 Transaction,一种是广播信封。第一种广播是意味着还有未被打包的 Transaction,而第二种广播信封则意味着这个 Transaction 已经被某个矿工确认。

收到了广播的通知后,大家先验证信封上难题的答案是否正确,这样便可以验证出信封是否被伪造,接着验里面的每笔交易,最后还要验证信封背面的内容,即上一个信封的摘要是否正确。因为上一个信封大家都已经确认,所以这样可以极大地规避作弊的可能。如果觉得没问题,就可以存入本地数据库中了。

比特币的发布时间为 2009 年 1 月 9 号,预计它的挖矿可以一直持续到 2140 年,发行总量收敛到 2100 万。比特币的出块时间是 10 分钟,出块时间是指全网平均产生一个区块的时间间隔。

以太坊是一个区块链应用平台,它的极大创新在于它提供了智能合约这种可以自定义业务逻辑的工具,智能合约是一种可编程的合约,合约是由用户编写并且部署到区块链上的。 以太坊的优势是为全世界的开发者们提供了一种开发工具,这种工具让所有人都能释放出巨大的创造力,所以基本上可以看成:只要是有一定技术基础的开发者,通过智能合约可以随时为以太坊贡献内容。

瑞波币(Ripple)是一个比较另类的区块链项目,因为从本质上来说,它更像是一种支付结算协议,瑞波币不需要挖矿,它是通过一种叫“Open Coin”的算法,提供瑞波协议共识来达到记账的目的。 瑞波币旨在为全球跨境机构提供了高效率的支付过程,提供较好的全球支付体验。因为涉及了机构之间的资产转移,瑞波币被设计成需要准入许可才能进入瑞波的支付网络,这一点有些像我们所说的联盟链。

匿名性区块链项目是指:使用交易匿名技术,让公开可查询的交易内容变成私密的匿名性区块链项目。市值比较不错的有门罗币、达世币、Zcash 三种,它们分别使用了不同类型的匿名技术,为区块链技术的匿名特性发展做出了贡献。

共识机制

共识机制是区块链是核心的组成要素之一,它决定了区块链的业务吞吐量、交易速度、不可篡改性、准入门槛等等,是最为关键的技术要素之一。

共识机制主要解决了两个问题:

谁有权利; 作弊问题。

PoW (Proof of Work)工作量证明可以解决上述的两个问题,PoW (Proof of Work)工作量证明可以解决上述的两个问题,这个问题可以简化成谁拥有的计算资源更多,谁就拥有整个系统的最大概率的记账权。一旦这个概率超过一半以上,那么这个系统就有一定的中心化风险。

而影响记账权的唯一因素只有计算资源(算力)的大小,如果想篡改交易,只能投入大量的计算资源与整个系统中其他所有人进行对抗,这是十分困难的,尤其在整个系统有一定基础计算资源(算力)的情况下。

PoW 中一个有趣的设计是激励机制,在 PoW 共识机制下,我们假设所有参与者都是理性的,理性的人如果作弊、篡改账本肯定需要投入成本,也就是计算资源,收益是篡改账本获得的收益减去投入成本,这个收益往往小于诚实计算所获得的收益。所以,作弊者在作弊过程中投入的计算资源过大,反而得不偿失。

双花攻击是指一个代币被花费了两次,这在任意的区块链系统中是不被允许的。如果避免了双花问题,基本就能避免上述作弊中收益过大的问题,因为攻击者首先要窃取到你的私钥,同时又能控制了你的计算资源(算力)。

规则一:一个代币如果已经被花费,那么会被标记成已花费,如果再次接收到这个代币被花费的请求,那么记账节点会拒绝打包这笔交易;

规则二:如果同时接收到两个信封,这两个信封中装的两笔交易出现了一个代币被花费了两次的情况,这种情况也就是我们所说的分叉(Fork),那么选择挖矿难度比较大的那个信封。

简单来说,区块链是一个提供了拜占庭容错、并保证了最终一致性的分布式数据库;从数据结构上看,它是基于时间序列的链式数据块结构,区块链按时间序列化区块数据,整个网络有一个最终确定状态;从节点拓扑上看,它所有的节点互为冗余备份;从操作上看,它提供了基于密码学的公私钥管理体系来管理账户。

通过以上我们可以发现比特币、以太坊等公链是偏重高可用性、分区容忍性(AP),满足最终一致性(C)且 TPS 较低的分布式系统。 我们在讨论区块链时,通常指的是公有区块链。

,我们采用什么样的算法(共识机制)才能够为它提供一个可信任的环境,并且使得:

节点之间的数据交换过程不可篡改,并且已生成的历史记录不可被篡改; 每个节点的数据会同步到最新数据,并且会验证最新数据的有效性; 基于少数服从多数的原则,整体节点维护的数据本身可以客观反映交换历史。

所谓联盟链,就是这个区块链具有准入许可,不像公链,任何人都可以随时进入。准入许可也就意味着候选节点进入区块链时需要得到已经在网络中的节点许可,所以联盟链也叫做许可链。

除了公链和联盟链的概念,还有一种区块链概念,叫作侧链。

侧链是一种双向挂钩技术,将主链中的代币锁定到侧链中使用。所以可以将主链看作主干道,侧链看作与主链相对独立的一条分支道,作为主链功能的低耦合拓展。

比特币的 P2P 网络基于 TCP 构建,主网默认通信端口为 8333。

以太坊的 P2P 网络则与比特币不太相同,以太坊 P2P 网络是一个完全加密的网络,提供 UDP 和 TCP 两种连接方式,主网默认 TCP 通信端口是 30303,推荐的 UDP 发现端口为 30301。

  1. P2P 网络协议

    P2P 网络协议是所有区块链的最底层模块,负责交易数据的网络传输和广播、节点发现和维护。

通常我们所用的都是比特币 P2P 网络协议模块,它遵循一定的交互原则。比如:初次连接到其他节点会被要求按照握手协议来确认状态,在握手之后开始请求 Peer 节点的地址数据以及区块数据。

这套 P2P 交互协议也具有自己的指令集合,指令体现在在消息头(Message Header) 的命令(command)域中,这些命令为上层提供了节点发现、节点获取、区块头获取、区块获取等功能。

  1. 分布式一致性算法

    在经典分布式计算领域,我们有 Raft 和 Paxos 算法家族代表的非拜占庭容错算法,以及具有拜占庭容错特性的 PBFT 共识算法。

如果从技术演化的角度来看,我们可以得出一个图,其中,区块链技术把原来的分布式算法进行了经济学上的拓展。

而在区块链领域,多采用 PoW 工作量证明算法、PoS 权益证明算法,以及 DPoS 代理权益证明算法,以上三种是业界主流的共识算法,这些算法与经典分布式一致性算法不同的是融入了经济学博弈的概念,下面我分别简单介绍这三种共识算法。

PoW:通常是指在给定的约束下,求解一个特定难度的数学问题,谁解的速度快,谁就能获得记账权(出块)权利。这个求解过程往往会转换成计算问题,所以在比拼速度的情况下,也就变成了谁的计算方法更优,以及谁的设备性能更好。比特币本身的演化很好地诠释了这个问题,中本聪设计的思路本来是由 CPU 计算。随着市场发展,人们发现 GPU 也可以参与其中,而且效率可以达到十倍百倍,现在,这项工作基本以 ASIC 专业挖矿芯片为主。

PoS:这是一种股权证明机制,它的基本概念是产生区块的难度应该与你在网络里所占的股权(所有权占比)成比例,目前有三个版本 PoS1.0、PoS2.0、PoS3.0。它实现的核心思路是:使用你所锁定代币的币龄(CoinAge)以及一个小的工作量证明,去计算一个目标值,当满足目标值时,你将可能获取记账权。

DPoS:简单来理解就是将 PoS 共识算法中的记账者转换为指定节点数组成的小圈子,而不是所有人都可以参与记账,这个圈子可能是 21 个节点,也有可能是 101 个节点。这一点取决于设计,只有这个圈子中的节点才能获得记账权。这将极大地提高系统的吞吐量,因为更少的节点也就意味着网络和节点的可控。

  1. 加密签名算法

在区块链领域,哈希算法是应用得最多的算法。哈希算法具有抗碰撞性、原像不可逆、难题友好性等特征。

当然,除了挖矿算法,我们还会使用到 RIPEMD160 算法,主要用于生成地址,众多的比特币衍生代码中,绝大部分都采用了比特币的地址设计。

除了地址,我们还会使用到最核心的,也是区块链 Token 系统的基石:公私钥密码算法。

在比特币大类的代码中,基本上使用的都是 ECDSA。ECDSA 是 ECC 与 DSA 的结合,整个签名过程与 DSA 类似,所不一样的是签名中采取的算法为 ECC(椭圆曲线函数)。

  1. 账户与交易模型

区块链的账本特性,通常分为 UTXO 结构以及基于 Account-Balance 结构的账本结构,我们也称为账本模型。UTXO 是“unspent transaction input/output”的缩写,翻译过来就是指“未花费的交易输入输出”。

区块链的共识算法,我在某些场合直接称作基于经济学的博弈算法 ,以区别于经典分布式一致性算法思路,它的整体思路就是让攻击者的攻击成本远远大于收益。

区块链中的共识算法目前具有工业成熟度的是 PoW,另外两种比较成熟的是 PoS 和 DPoS,其次还有一些变种和单一币种使用的共识算法,例如 Ripple 共识、PoC 共识(概念性证明)、PoE 共识(存在性证明)。

在使用 PoW 共识算法的情况下,容错阈值是 50%,而 PBFT 及其变种的容错阈值是 33% 左右,这里的百分比是指作弊节点占全网节点的 比例。

PoX 类的算法其实都延续了 PoW 的设计理念,相比较经典分布式一致性算法,PoX 类算法通过 概率选择记账者降低了潜在的提案者,另外是延长了达成最终一致性的时间。

第一条降低了系统通信复杂度,每次记账系统的确定性其实是概率确定的, 又由于被选中需要付出成本,此处才提高了记账成本阈值,结合区块链的基础代币设计,是一个非常天才的想法。