读本好书 《区块链原理设计及应用》

可能自己渴望一个更高知的环境

简介

  • 书名:区块链原理设计及应用
  • 作者:杨保华 陈昌
  • ISBN:9787111577829

区块链和机器学习被誉为未来十年最有可能提供人类社会生产力两大创新科技。

区块链杂谈

在比特币项目的发展过程中,借鉴了来自 数字货币,密码学,博弈论,分布式系统,控制论等多个领域的成果。
比特币系统首次真正的从实践意义上实现了安全可靠的去中心化数字货币机制

BitCoin 解决了现有的数组货币的以下问题

  • 被掌握在单一的机构中容易被攻击
  • 自身的价值无法保证,容易出现波动
  • 无法匿名交易,不够匿名

运用之心夺造化,存乎一心胜天工。

区块链系统和普通的分布式系统不同,其处理性能很难通过单纯的增加节点数进行横向的扩展。实际上,传统区块链的系统的性能,在很大的程度上取决于单个节点的处理能力。高性能,安全,稳定性,硬件辅助加解密能力 是考察节点性能的核心要素。

严格意义上讲,货币(money)不等于现金或者通货(cash/currency),货币的含义更加广泛。在比特币白皮书的原版中(Bitcoin: A Peer-to-Peer Electronic Cash System)使用的是cash!

书中提出的一点设想,这里引用之:

大胆的预测,未来可能出现更具针对性的”BlockDB”,专门服务类类似的区块链这样的新型数据业务。最小的操作单位是一个块。

未来的几年内,区块链的演化应用场景有如下:

  • 金融服务
  • 征信和权属管理
  • 资源共享
  • 贸易管理
  • 物联网 (未来几年再租赁,物流等场景可能会有大规模应用。但是目前阶段,物联网自身的技术局限短期内是不会有大规模应用)

这里针对书中物联网,展开。

典型应用场景分析:给每个物联网设备分配一个地址,给该地址关联一个账户,用户通过账户支付,可以实现设备的租赁,达到一个承载价值的物联网。在此中,物联网的设备数量增多,边沿计算的增强,大量设备之间形成的分布式自组织的管理模式,而且具有很高的容错性。总结讲:区块链技术所具有的分布式和抗攻击的特点可以很好的融入


不过国外实际上早有以个成熟的项目 Slock,其主要的模式,是iot设备抽象成了一个锁

Slock Prj

这里我们设想,要是共享单车使用这种技术,那么架构,将会是巨大的改变。在2015 年 IBM已经与Samsung合作进行去中心化的P2P物联网技术。

在书中提到了IOT安全 这个Point 已经被提出了实在是遗憾

NeuroMesh Prj 物联网疫苗

包括公共网络服务,DNS。DNS是一直被诟病的系统,一个只有13个根节点,全球的域名托付于此,所以,这种共有的系统的去中心化是趋势和必然。

Emercoin Prj 崛起币

区链原理

区块链共识

  • 一致性

区块链作为一个分布式系统,其首要问题是 一致性(Consistency) 。在区块链中,有多个服务节点,可以试图他们的处理结果达成某种共识。这种共识叫做区块链共识

一致性并不代表着结果的正确与否,实际是是这个分布式系统对外呈现的结果的一致。

分布式系统最大的套装,就是在这个一致性,按照书中的例子,比如我们买火车票,全国的人们都可以去买一张票,然而售票处是全国都有的,所以如何保证,这个票最终只会被卖给一个正确的人。这个就是一个一致性的算法,实际是叫做 Paxos (这个在区块链核心算法中有讲到),这种思想,就是对可能引发不一致的并行操作进行串行化


  • 共识算法

共识(Consensus)和一致性(Consistency)实际是不是一个东西,从文中的理解来说,共识是一个过程,一致是一个状态。所以,共识算法的存在,就是使得区块链整体趋于一致的东西。在我们熟悉的BTC中,用于实现的共识算法,很简单。谁最长且合法,谁就是对的,在这个过程中中本聪先生引入了 PoW 机制,使得加入了成本和概率,所以说区块链技术,是对很多学科的一种综合

这部分可以看详细文章:拜占庭将军和共识算法


  • FLP不可能原理:

即使在网络通信可靠的情况下,可拓展的分布式系统的公式问题,其通用解法的下限是–没有下限(无解)。

在网络可靠,但运行节点失败(即使只有一个)的最小化异步模型系统中,不存在一个可以解决一致性问题的确定性共识算法

(No completely asynchronous consensus can tolerate even a single unannounced process death)

这个 FLP 可以称为分布式领域里的 “测不准原理”不要浪费时间,去为一部分布式系统设计在任意场景下都能实现共识的算法

关于 FLP 算法,实际上是在图论中有了系统的证明,但是在文章也是举了一个通俗的例子:

比如,在一个投票里面,有ABC,三个投票者,他们可以在任何时候投票(异步),他们之间可以通过电话通信(可靠网络),只是他们可能有时候会睡着。所以这里就出现了一个情况,任何一个人都有睡着的可能,那么获取投票的结果需要三个人都完成投票,才能实现系统的共识,即完成此次投票,产生结果,所以当有一个人睡着后,这个共识系统的共识结果将永远的不会得知,直到那个人醒来。

通过这个例子实际上说明了:纯粹的异步系统无法保证一致性在有限的时间内完成。但是,这种一致性我,称之强一致性

  • CAP 原理

在上面的FLP中,并不是说明共识是不可能实现了。实际上的应用远没有那么理论;这就是工程师和科学家

文章中有一句话,很棒:

科学家告诉你去赌博从概率上讲总是会输钱;工程师则告诉你,如果你愿意接受最终输钱的风险,中间说不定可以小赢几笔钱。

CAP原理,实际上来自于三个单词: Consistency,Availability,Partition

分布式计算系统,不可能同时确保以下三个特性: 一致性(Consistency),可用性(Availability),分区容忍性(Partition),设计中往往需要弱化某个特性的保证。

  • 一致性:任何操作应该是原子的,发生在后面的时间能看到签名事件发生所导致的结果,(强一致性)。
  • 可用性:在有限的时间内,任何非失败的节点都可以应答请求
  • 分区容忍性:网络可能发生分区,即节点之间的通信不可保障。

对于网络分区的理解:网络可能出现分区时,系统是无法保证一致性和可用性的。要么,节点收到请求后因为没有其他节点确认而不应答(牺牲可用性),要么节点只能应答非一致性的结果(牺牲一致性)。个人理解为,网络被分区,或者说分片


  • ACID 原则

原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Durability)。

操作原子性,要么成功,要么不做。状态一直,无中间态,彼此的操作独立,改变持久,不会有时效性。


PAXOS算法! 后面深入学习。

密码学基础

该部分有部分基础,简略带过,主要记录 Kayward

Hash:正向快速,逆向困难,输入敏感,冲突避免

对称加密:加解密速度快,前提是双方提前持有密钥

非对称加密:不需要提前密钥(RSA)广泛用于非可信信道

混合加密:TLS 握手协商过程

消息认证码(对称):HMAC(Hash-based Message Authentication Code) 验证消息完整性 integrity

数字签名(非对称):盲签名,多重签名,群签名,环签名。验证消息完整性 integrity

PKI体系:PEM证书


  • 默克尔树

默克尔(Merkle)树,又名哈希树,是一种典型的二叉树结构,在区块链出现之前,是广泛的应用在文件系统和P2P系统中

这里是一篇默克尔树的简介

What is Merkle-Tree

在这个结构中,一个巧妙的应用是零知识证明,以图为例,在图中我们只需要提供 Habc,Hab,Hb,那么验证者,就可以进行Ha的合法性检验,而不需要知道Ha的具体内容。通俗讲,我不需要告诉你这个东西的具体细节,就可以证明这个东西的正确

零知识证明


  • 布隆过滤器(Bloom Filter)

布隆过滤器是一种基于Hash的高效的查找结构。可以在常数时间内回答”某个元素是否在一个集合内”。

布隆过滤器是一种基于hash查找的优化,

Hash查找:Hash的本身可以使得任何输入得到一个定长的输出,所以,我们可以分配一个内容的数组,使得我们的Hash的函数的值不超过数组大小,,这样就可以实现快速的信息索引。

比如,H(“hallo”) == 100, 那么我们就把它放在 数组的索引为100的地方。这样的话查找任何内容,只需要进行一次hash就可以找到。

不过,问题存在时,如果我们的Hash的范围过大,那么就需要大量的内存分配,导致利用率太低。可是如果 Hash的输出范围过小,就很容易发生碰撞(collision)。所以在这两方面的制约下,就演化出了布隆过滤器

布隆过滤器 采用了多个Hash函数,得到了多组结果,从而提高对空间利用率。在这多个地址上把值置1,如果我们输入新的数据,存在着多个对应地址都是1,说明有较大几率是该记录。

所以布隆过滤器在提高空间利用率的前提下,降低了hash 碰撞率(重复率)。


  • 同态加密

这个是区块链目前的一个发展方向,因为同态加密技术,可以很好的适用于解决链上数据透明的情况。

同态加密(Homomorphic Encryption),允许对密文进行处理得到的依然是加密的结果,从抽象代数的角度讲,是保持了 同态性

密文直接处理,根明文进行处理之再加密,得到的结果相同。

En(X*P(Y)) = En(X)*P(E(Y))

上面的P就是同态加密的过程。

。。。 略去部分内容

目前,已知的同态加密的技术往往需要较高的计算时间或者存储空间。相信,不远的将来,会有革命。

比特币

  • 2008/10/31 中本聪(Satoshi Nakamoto)发布比特币白皮书

  • 2009/1/3 18:15:05 比特币的创世纪


基本的交易流程,基于UTXO(Unspent Transaction Outputs)的模型,每个解一包含一些输入输出,未经使用的交易输出可以被新的交易引用作为合法输入,被使用过的交易的输出则无法被引用为合法输入。

最小的转账单位是 0.0001BTC 最小的交易单位是 0.00000001BTC (即 1聪 )

比特币的账户地址 实际上非对称加密中的公钥,进行一系列的 Hash 即编码生成的 160位 20字节的的字符串。一般的,对账户的地址串进行 Base58Check 编码,被添加前导字节(说明支持哪种脚本)和4字节的校验字节。

比特币交易脚本 每个交易会有输出脚本(scriptPubKey)和认领脚本(scriptSig)。输出脚本用于对收款方对该笔输入的使用限制。认领脚本 是证明自己可以满足仅以输出脚本的锁定条件。

这篇文章的后部,有关于区块的部分简介

Py区块链源码笔记

由于区链的性质,对区块链进行完整性的校验是很容易,只需要校验每个区块的区块头信息,不需要得到内容,这个是简单交易认证(Simple Payment Verification SPV)的基本原理。


  • BTC 的设计创意

避免作恶 使用了经济博弈论的思想来避免作恶,我们无法确保每个人都是合作的。但是我们可以通过经济博弈使得合作者得到利益,让非合作者遭受损失和风险。 在比特币网络中,每个参与网络的(矿工)都要付出挖矿的成本代价,进行计算能力的消耗,在概率角度,越想拿到新区块的记账权,则付出的算力也会越多。一旦是一次失败的争夺,那么付出的算力讲是被没收掉。所以意味着一次作恶所需要的成本可能远远高于所带来的收益。

负反馈调节 在比特币网络上很好的使用了负反馈控制论基础原理。网络中的矿工越多,系统越稳定,比特币的价格也越高,但是也更难得到区块奖励。所以比特币的价格应该会稳定在一个合适的值,使得出产量和价格的积符合矿工的预期。(具体的区块链网络会进行自己的难度调节)

共识机制 传统共识机制往往考虑是一个相对封闭的分布式系统中,允许存在故障节点,也能达成共识。但是对比特币网络来讲,这个是高度开放性的,人人可接入,所以面临的问题会更加的复杂,那么传统的共识算法可能会无法使用。

所以,比特币网络对共识的目标进行了进一步的限制,提出了基于 PoW 的共识机制。这种机制,不是面向最终的确认共识,而是基于概率,随时间逐步加强确认的共识。现有的共识在理论上是可能被推翻,但是随着时间的演进,攻击者所付出的代价会随着时间指数上升,被推翻的可能性也随指数下降。

此外,由于Internet的尺度之大,所以按照区块为单位进行确认(快照),从而提高网络整体的可用性。此外,限制网络中的共识噪声。通过大量的Hash和少数的合法性结果来限制合法提案的个数 可以进一步提高稳定性。


  • 挖矿 。。。

这部分采用Keyword

  • 四年一减产
  • 十分钟一区块,难度自动调整(两周)
  • 避免震荡,每次难度最多是4倍
  • 历史上最快出块10S,最慢1H

看见我们的 Satoshi 先生真的考虑到了太多太多的因素!

比特币的区块链(通过挖矿)提供了一个局部的,迄今为止最优的解决方案:如何在分散的系统中验证信任。

所以,意味着,区块链系统,本质上解决了传统的依赖于第三方的问题。因为这个协议不只满足了中心化机构追踪交易的需求,还使得陌生人之间产生信任。区块链技术和安全的过程使得陌生人之间在没有被信任的第三方时产生信任

在当前所由的其他的证明机制(PoW,PoS,PoA…),这些证明机制都无法解决所有的问题,在原作者提出的,一种可能是 以入随机代理人制度 ,通过算法在某段时间确保只是让部分的节点参加共识的提案,并且发放一部分的奖励给所有在线贡献的节点。


  • 共识机制

工作量证明 在大量的Hash下只有少数的合法提案。可得合法提案者需要付出工作量。

少数的合法提案会在网络上进行广播,用户收到广播后,停止当前计算,立马开始在新的最长链的基础上进行计算。由于网络尺度大,所以可能出现分叉(Fork)现象,但是最终会是一条最长链。

权益证明 PoS 这个是在2013年提出,在peercoin 中实现,类似于现在的股东机制,用于越多的股份(币)的人越容易获得记账的权力。

典型的过程是,通过保证金,来对赌一个合法的块称为一个新的区块。虽说这种机制试图解决PoW中的资源浪费的问题,不过实际上,这种机制导致的结果是屯币,一样的回事流通的量减少。


  • 闪电网络

在BTC的网络环境下,最为诟病的是其交易性能,现在的全网只有 7TPS(Transcation Per Second)这样的吞吐量,显然远低于现代需求,而且, 6min/block的块确认速度,导致完全可信交易需要等待1H以上(6个确认)。所以为了提高速度,社区提出了闪电网络(Lighting Network),其思路是 把大量交易放在链外进行,只把关键环节放在链上

BTC区块链的机制自身提高了极高的可信保证,但是相对较慢。那么,我们的大量的小额交易是否需要如此之高的可信。这个可能就是闪电网络的思想起源

所以现在的闪电网络主要是通过引入智能合约的思想来完成链下的交易渠道。核心概念由两个

  • RSMC (Recoverable Sequence Maturity Contract) 可撤销的顺序成熟合同
  • HTLC (Hashed TimeLock Contract) 哈希的带时钟的合约

RSMC 这个中文是麻烦,不过作者在书中讲解的是,实际上原理很简单,类似于一个资金池机制。

假定双方之间存在一个 “微支付通道”(资金池)。双方都进行一些金额的预存,每次进行支付时,即双方进行签名认证,只是在池内进行资金份额的分配,当需要进行提现的时候,才需要把资金池的分配情况写回区块链,所以这个主要的过程(资金池)完全可以在链下实现。

HTLC 实际上可以称作,限时转账。通过智能合约,双方约定先对转账方一笔钱进行冻结,并且提供一个Hash,如果在一定的时间里,有人可以提出一个字符串使得,其哈希之后和已知的哈希值匹配(实际上意味着,转账方授权了接收方对该冻结金额进行提现),之后这笔钱才真正的给了接收方(reciper)

综上 :在闪电网络中,RSMC 保证了两个人的交易可以在链下完成,HTLC 保证了任意两人之间可以通过虚拟通道进行链下的支付。


  • 侧链

这个是个蛮重要的功能,自己之前没有理解。侧链就是以比特币为主链(Parent Chain),其他的区块链为侧链,二者通过双向挂钩(Two-Way Peg),实现了比特币可以到侧链中进行流通。

侧链是一个独立的链,可以有自己的账本,共识机制,交易类型,等等。侧链不能发行BTC,不过可以通过从主链,取引入一定数量的BTC,在侧链中流通,侧链流通中的比特币,在主链上时会被锁定,直到侧链的币回到主链之中。

侧链的机制,可以将一些定制化或者高频的交易放在主链之外进行,实现了BTC的区块链拓展性

  • SPV 证明

在比特币的区块链中,交易的合法性,是通过UTXO实现的。但是很多时候,用户只是关心,自己的相关的那些交易,而不需要对一个UTXO的交易链进行校验。这里就是中本聪先生设计的 : SPV(Simplified Payment Verification) 的机制.简单支付验证,可以通过较小的代价判断某个交易是否已经被区块链所确认,以及得到多少有效算力的保护(多少确认)。

SPV 客户端只需要下载所有的区块的区块头。进行SPV证明 : 一组区块头的列表,表示工作量证明;一个特定输出确实存在某个区块的密码学证明。

问题

  • 区块容量:更大的容量,由更高的吞吐性能,但是增加挖矿成本,由中心化的风险,和更大的存储空间的需求。
  • 出块时间的间隔:这样回事确如时间缩短,但是增加了分叉的可能
  • 脚本支持

交易延展性(Transaction Malleability) 是比特币的一个设计缺陷。在交易发起者对交易签名后,交易的ID仍然有可能改变。

扩容圣战: 隔离见证(Segregated Witness)

以太坊

Ethereum,2015/7 主网运行。

采用了账户模型,为每一个地址有一个世界变量

开发库:

  • go-etheremu
  • Parity
  • cpp-ethereum
  • ethereumjs-lib
  • EthereumJ
  • ethereumH
  • pyethapp
  • ruby-ethereum

关于以太坊的简介即教程之前是有的,所以这部分由于文中没有就其特点做深入的探讨,主要篇幅在与智能合约应用,所以这部略去。

HyperLedger

超级账本是linux基金会下面的一个杀手级的项目。向作为自己学习的一个重点方向,此书的后半部分,主要针对其应用和部署做了大量的讲解,所以,为了定位明显,后面将会以超级账本的转向进行学习。

故此处略去大量内容

这本书,由浅至深的讲解了区块链体现设计的方方面面,真的可谓是从出色到卓越。通过此书,也是补习了很多基础知识,和新的概念,作为一个入门书籍,十分不错。夜深,睡。

2018/5/1 3:43:45

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注