注:都说好记性不如烂笔头,抱着猎奇的心态看了《区块链原理、设计与应用》(作者杨保华,陈昌)一书,并做下相关记录以备忘。其中加入部分个人理解,如有错漏,还望斧正。
一、区块链产生背景
首先了解下几种数字货币及其技术特点:
1、e-Cash:首个匿名化的数字加密货币,基于David Chaum自己发明的盲签名技术,曾被应用于部分银行的小额支付系统。e-Cash依赖于一个中心化的中介机构。
2、HashCash:首次提出用工作量证明(Proofof Work,PoW)机制来获取额度。
3、B-money:首个面向中心化设计的数字货币,将PoW引入数字货币生成过程中,但未能提出具体的设计实现。
4、比特币:首次从实践意义上实现了一套去中心化的数字货币系统,将PoW与共识机制联系在一起
其中,“区块链“这一称呼首次出现在一篇中本聪发布的论文,也便是在该论文中首次提出了比特币,其重点在于讨论比特币系统,实际上并没有明确提出区块链的定义和概念,在其中指出,区块链是用于记录比特币交易账目历史的数据结构。
二、区块链概念
区块链原是指比特币实现中使用的一种数据结构,如今经过众多开发者发展后,区块链更多的是指集合数字货币、密码学、博弈论、分布式系统、控制论等理论的一项新兴技术。
从狭义上讲,区块链包括三个基本概念:
三、区块链分类
根据参与者的不同,可以分为公开链、联盟链和私有链
注:现有大部分区块链实现都至少包括了网络层、共识层、智能合约和应用等结构,联盟链实现往往还会引入一定的权限管理机制
四、区块链与比特币
比特币网络是一个分布式点对点网络,网络中的矿工通过“挖矿”来完成对交易记录的记账过程,维护网络的正常运行。
基于区块链技术,比特币中交易的流程大致如下:
1.比特币客户端发起一项交易,广播到比特币网络中并等待确认
2.网络中的节点将一些收到的等待确认的交易记录打包在一起(包括前一个区块头部的哈希值等信息),组成一个候选区块。
3.然后,试图找到一个nonce串(随机串)放在区块里,使得候选区块的结果满足一定条件(比如小于某个值)。(此nonce创的查找需要一定的时间去进行计算尝试)。一旦节点算出来满足条件的nonce串,这个区块在格式上就被认为是“合法”的,便可以尝试在网络中将它广播出去。
4.其他节点收到候选区块,进行验证,发现确实符合约定条件了,就承认这个区块是一个合法的区块,并添加到自己维护的区块链上。
5.当大部分节点都将区块添加到自己维护的区块链结构上时,该区块被网络接受,区块中所包括的交易也就得到确认
注:比特币的基于算力寻找nonce串的共识机制称为工作量证明。目前,要让哈希结果满足一定条件,并无已知的快速启发式算法,只能进行尝试性的暴力计算。尝试的次数越多(工作量越大),算出来的概率越大
问题:区块链不适用与高频交易的场景,只能支持每秒约7笔的吞吐量,一般认为对于大额交易来说,安全的交易确认时间为一个小时左右。
解决方法:为了提高性能,一方面可以提升单个节点的性能(如采用高配置的硬件),同时设计优化的策略和算法;另外一个方面试图将大量高频的交易放到链外来,只用区块链记录最终交易信息,如比特币社区提出的“闪电网路”设计、侧链、影子链。
问题:如何避免重放攻击,即某个合法交易被多次重新发送造成攻击
解决方法:区块链网络提供一个公共可见的记账本,记录发生过的交易的历史信息,而不是每个账户的余额。
五、区块链与密码学
基于密码学原理的信息特性:机密性、完整性、认证性和不可抵赖性。
基于密码学有以下算法:Hash算法(不能用于加密)、 加解密算法
常见Hash算法可分为两类:
1、计算敏感性,此时计算资源是瓶颈,主频越高的CPU运行Hash算法的速度也越快,具体如下:
SHA1:模仿了MD4算法,采用了类似原理,输出为长度为160位的Hash值,但被证明不具备“强抗碰撞性”
SHA-2:包括SHA-224、SHA-256、SHA-384和SHA-512
2、非计算敏感性,如scrypt算法,计算过程需要大量的内存资源,节点不能通过简单得增加更多CPU来获得Hash性能的提升。
Hash算法应用:Hash值在应用中常被称为指纹或摘要,Hash算法的核心思想也经常被应用到基于内容的编址或命名算法中。具体如下:
(1)数字签名中,利用Hash函数的抗碰撞性特点,可以确保内容未被篡改;
(2) 用于对口令的保存上,如用户登录网站需要需要通过用户名和密码来进行验证,网站后台仅保存口令的Hash值(注:为了防止以空间换时间的攻击方式,如字典攻击和彩虹表攻击<只保存一条Hash链的首尾值,相对字典攻击可以节省存储空间>,采用加盐的方法。保存的不是口令明文的Hash值,而是口令明文再加上一段随机字符串,即“盐”之后的Hash值。Hash结果和“盐”分别存放在不同的地方,这样只要不是两者同时泄漏,攻击者就很难破解。)
(3)Merkle树结构:Merkle(默克尔)树,又叫哈希树,是一种典型的二叉树结构,由一个根节点、一组中间节点和一组叶节点组成。在区块链系统出现之前,广泛用于文件系统和P2P系统中。
其主要特点为:
最下面的叶节点包含存储数据或其哈希值;
非叶子节点(包含中间节点和根节点)都是它的两个孩子节点内容的哈希值。
基于以上特点,默克尔树具有以下特性:快速比较大量数据(比较两个默克尔树树根);快速定位修改;零知识证明(他人证明拥有的某组数据中包括给定某个内容而不暴露其他任何内容)
(4)布隆过滤器:一种基于Hash的高效查找结构,能够快速(常数时间内)回答“某个元素是否在同一个集合内”的问题。大量应用于网络和安全领域,如信息检索(BigTable和HBase)、垃圾邮件规则、注册管理等。其结构如下:
其中,布隆过滤器采用多个Hash函数来提高空间利用率。对同一个给定输入来说,多个Hash函数计算出多个地址,分别在位串的这些地址上标记为1。进行查找时,进行同样的计算过程,并查看对应元素,如果都为1,则说明较大概率是存在该输入的。
对于加解密算法,可以分为两类,如下表:
算法类型 | 特点 | 优势 | 缺陷 | 代表算法 |
对称加密 | 加解密的密钥相同 | 计算效率高,加密强度高 | 需提前共享密钥,易泄漏 | DES、3DES、AES、IDEA |
非对称加密 | 加解密的密钥不相关 | 无需提前共享密钥 | 计算效率低,仍存在中间人攻击可能 | RSA、ELGamal、椭圆曲线系列算法 |
1、 对称加密算法从实现原理上可以分为两种,分组密码(DES、3DES、AES、IDEA)和序列密码(又称流密码,代表算法RC4)
2、而对于非对称加密算法,其实现原理如下:
加解密算法的应用:HTTPS协议,HTTPS在传统的HTTP层和TCP层之间通过引入Transpo3rt Layer Security/Secure Socket Layer(TLS/SSL)加密层来实现可靠的传输。支持该加密层的算法方案较多,有DHE-RSA、ECDHE-RSA和ECDSA。而在对称密钥协商过程可用采用RSA非对称加密算法或Diffie-Hellman协议。
Hash算法与加解密算法的综合应用:
六、区块链与分布式系统
基于区块链技术实现的应用(如比特币)类似于一个“分布式数据库”,尽管区块链系统跟传统分布式系统有所不同,但基于分布式系统的特点进行讨论是不可避免的。
针对分布式系统的性能表现,对一致性与共识两个问题进行分析。
一致性往往指分布式系统中多个副本对外呈现的数据的状态。如顺序一致性、线性一致性,描述了多个节点对数据状态的维护能力。而共识则描述了分布式系统中多个节点之间,彼此对某个状态达成一致结果的过程。因此,一致性描述的是结果状态,共识则是一种手段。达成某种共识并不意味着就保障了一致性。
对于分布式系统中的节点,把出现故障但不会伪造信息的情况称为“非拜占庭错误”或“故障错误”,伪造信息恶意响应的情况称为“拜占庭错误”,对应节点为拜占庭节点。
与其相对应,有共识算法Crash Fault Tolerance(CFT)类算法和Byzantine Fault Tolerance(BFT)类算法
而针对常见的非拜占庭错误的情况,解决算法有,Paxos、Raft及其变种。这类容错算法往往性能比较好,处理较快,容忍不超过一半的故障节点;对于要能容忍拜占庭错误的情况,一般包括PBFT(Practical Byzantine Fault Tolerance)为代表的确定性算法、PoW为代表的概率算法等。拜占庭类容错算法往往性能较差,容忍不超过1/3的故障节点。
在分布式系统的研究中,存在以下经典原理:
FLP不可能原理:在网络可靠,但允许节点失效(即便只有一个)的最小化异步模型系统中,不存在一个可以解决一致性问题的确定性共识算法。FLP原理实际上说明对于允许节点失效情况下,纯粹异步系统无法确保一致性在有限时间内完成。即便对于非拜占庭错误的前提下,包括Paxos、Raft等算法也都存在无法达成共识的情况,只是在工程实践中出现这种情况的概率很小。
CAP原理:分布式计算系统不可能同时确保以下三个特性:一致性、可用性和分区容忍性,设计中往往需要弱化对某个特性的保证。 其中,
七、区块链进阶
开源界打造的区块链平台项目,包括“以太坊”和“超级账本”等项目