区块链概述
1、区块链属于一种去中心化的记录技术。参与到系统上的节点,可能不属于同一组织、彼此无需信任;区块链数据由所有节点共同维护,每个参与维护节点都能复制获得一份完整记录的拷贝。
2、跟传统的记账技术相比,其特点包括:
① 维护一条不断增长的链,只可能添加记录,而发生过的记录都不可篡改;
② 去中心化,或者说多中心化,无需集中的控制而能达成共识,实现上尽量分布式;
③ 通过密码学的机制来确保交易无法抵赖和破坏,并尽量保护用户信息和记录的隐私性。
3、区块链的基本概念包括:
① 交易(Transaction):一次操作,导致账本状态的一次改变,如添加一条记录;
② 区块(Block):记录一段时间内发生的交易和状态结果,是对当前账本状态的一次共识;
③ 链(Chain):由一个个区块按照发生顺序串联而成,是整个状态变化的日志记录。
如果把区块链作为一个状态机,则每次交易就是试图改变一次状态,而每次共识生成的区块,就是参与者对于区块中所有交易内容导致状态改变的结果进行确认。
4、分类
根据参与者的不同,可以分为公开(Public)链、联盟(Consortium)链和私有(Private)链。
① 公开链,顾名思义,任何人都可以参与使用和维护,典型的如比特币区块链,信息是完全公开的。
如果引入许可机制,包括私有链和联盟链两种。
② 私有链,则是集中管理者进行限制,只能得到内部少数人可以使用,信息不公开。
联盟链则介于两者之间,由若干组织一起合作维护一条区块链,该区块链的使用必须是有权限的管理,相关信息会得到保护,典型如银联组织。
目前来看,公开链将会更多的吸引社区和媒体的眼球,但更多的商业价值应该在联盟链和私有链上。
根据使用目的和场景的不同,又可以分为以数字货币为目的的货币链,以记录产权为目的的产权链,以众筹为目的的众筹链等。
5、从技术特点上,区块链一般被认为具有:
① 分布式容错性:网络极其鲁棒,容错 1/3 左右节点的异常状态。
② 不可篡改性:一致提交后的数据会一直存在,不可被销毁或修改。
③ 隐私保护性:密码学保证了未经授权者能访问到数据,但无法解析。
随之带来的业务特性将可能包括:
① 可信任性:区块链技术可以提供天然可信的分布式账本平台,不需要额外第三方中介机构。
② 降低成本:跟传统技术相比,区块链技术可能带来更短的时间、更少的人力和维护成本。
③ 增强安全:区块链技术将有利于安全可靠的审计管理和账目清算,减少犯罪可能性,和各种风险。
基于区块链技术,任何基于数字交易的活动成本和追踪成本都会降低,并且能提高安全性。
6、从技术角度讲,区块链涉及到的领域比较杂,包括分布式、存储、密码学、心理学、经济学、博弈论、网络协议等
7、应用场景
实际上,要找到合适的应用场景,还是要从区块链自身的特性出发进行分析。区块链在不引入第三方中介机构的前提下,可以提供去中心化、不可篡改、安全可靠等特性保证。因此,所有直接或间接依赖于第三方担保信任机构的活动,均可能从区块链技术中获益。
未来几年内,可能深入应用区块链的场景将包括:
① 金融服务:主要是降低交易成本,减少跨组织交易风险等。该领域的区块链应用将最快成熟起来,银行和金融交易机构将是主力推动者。
② 征信和权属管理:这是大型社交平台和保险公司都梦寐以求的,目前还缺乏足够的数据来源、可靠的平台支持和有效的数据分析和管理。该领域创业的门槛极高,需要自上而下的推动。
③ 资源共享:airbnb 为代表的公司将欢迎这类应用,极大降低管理成本。这个领域创业门槛低,主题集中,会受到投资热捧。
④ 投资管理:无论公募还是私募基金,都可以应用区块链技术降低管理成本和管控风险。虽然有 DAO 这样的试水,谨慎认为该领域的需求还未成熟。
⑤ 物联网与供应链:物联网是很适合的一个领域,短期内会有大量应用出现,特别是租赁、物流等特定场景。但物联网自身的发展局限将导致短期内较难出现规模应用。
分布式协议
1、Paxos
Paxos 问题是指分布式的系统中存在故障(fault),但不存在恶意(corrupt)节点(可能响应、消息丢失或重复,但无错误消息)场景下的一致性问题。Paxos 被广泛应用在 Chubby、ZooKeeper 这样的系统中。
下面,我们简化认为更大的提案号意味着更新的提案。
① 准备阶段,比较简单,多个提案者可以发送提案: ,接收者收到提案就返回收到消息,并且只保留最新的提案。如果收到一个请求的提案号比目前保留的小,则返回保留的提案给提案者,告诉它已经有其它人发出更新的提案了。
② 提交阶段,如果一个提案者在准备阶段收到大多数的回复(表示大部分人听到它的请求,可能做好了最终确认的准备了),则再次发出确认消息。如果再次收到大多数的回复,并且大家都返回空,则带上原来的提案号和内容;如果返回中有更新的提案,则替换提案值为更新提案的值。如果没收到足够多的回复,则需要再次发出请求。
③ 接收者如果发现这个提案号跟自己目前保留的一致,则确认该提案。
2、Raft
Raft 算法是Paxos 算法的一种简化实现。
包括三种角色:leader、candiate 和 follower,其基本过程为:
① Leader 选举:每个 candidate 随机经过一定时间都会提出选举方案,最近阶段中得票最多者被选为 leader;
② 同步 log:leader 会找到系统中 log 最新的记录,并强制所有的 follower 来刷新到这个记录;
注:此处 log 并非是指日志消息,而是各种事件的发生记录。
3、PoW
比特币的区块链网络在设计时提出了创新的 PoW(Proof of Work) 算法思路。一个是限制一段时间内整个网络中出现提案的个数,另外一个是放宽对最终一致性确认的需求,约定好大家都确认并沿着已知最长的链进行拓宽。系统的最终确认是概率意义上的存在。这样,即便有人试图恶意破坏,也会付出很大的经济代价(付出超过系统一半的算力)。
加密算法
1、Hash算法
目前流行的 hash 算法包括 MD5(已被证明不够安全)和 SHA-1,两者均以 MD4 为基础设计的。
MD4,MD 是 Message Digest的缩写。其输出为 128 位。MD4 并不足够安全。
MD5是对 MD4 的改进版本。输入仍以 512 位分组,其输出是 128 位。MD5 比 MD4 复杂,并且计算速度要慢一点,但更安全一些。但是,MD5 仍并不足够安全。
SHA1 (Secure Hash Algorithm)输出为长度 160 位的 hash值,因此抗穷举性更好。SHA-1 设计时基于和 MD4 相同原理,并且模仿了该算法。
为了提高安全性,NIST NSA 还设计出了 SHA-224、SHA-256、SHA-384,和 SHA-512 算法(统称为 SHA-2),跟 SHA-1 算法原理类似。
目前,一般认为 SHA1 和 SHA2 已经不够安全,推荐至少使用 SHA3-256 算法。
一般的,hash 算法都是算力敏感型,意味着计算资源是瓶颈,主频越高的 CPU 进行 Hash的速度也越快。
也有一些 Hash 算法不是算力敏感的,例如 scrypt,需要大量的内存资源,节点不能通过简单的增加更多 CPU 来获得 hash 性能的提升。
2、数字摘要
数字摘要是对数字内容进行 Hash 运算,获取唯一的摘要值来指代原始数字内容。
数字摘要是解决确保内容没被篡改过的问题(利用 Hash 函数的抗碰撞性特点)。
数字摘要是 Hash 算法最重要的一个用途。在网络上下载软件或文件时,往往同时会提供一个数字摘要值,用户下载下来原始文件可以自行进行计算,并同提供的摘要值进行比对,以确保内容没有被修改过。
3、对称加密
公钥和私钥相同。优点是加解密速度快,空间占用小,保密强度高。缺点是参与多方都需要持有密钥,一旦有人泄露则安全性被破坏;另外如何分发密钥也是个问题。
代表算法包括 DES、3DES、AES、IDEA 等。适用于大量数据的加解密,不能用于签名场景。
4、非对称加密
公钥和私钥不同。公钥一般是公开的,人人可获取的,私钥一般是个人自己持有,不能被他人获取。优点是公私钥分开,容易管理,并且容易完成密钥分发。缺点是加解密速度慢。
代表算法包括:RSA、ElGamal、椭圆曲线系列算法。一般适用于签名场景或密钥协商,不适于大量数据的加解密。
RSA 算法等已被认为不够安全,一般推荐采用椭圆曲线系列算法。
5、组合机制
即先用计算复杂度高的非对称加密协商一个临时的对称加密密钥(会话密钥),然后双方再通过对称加密对传递的大量数据进行加解密处理。
6、PKI
PKI (Public Key Infrastructure)体系不代表某一种技术,而是综合多种密码学手段来实现安全可靠传递消息和身份确认的一个框架和规范。
一般情况下,包括如下组件:
① CA(Certification Authority):负责证书的颁发和作废,接收来自 RA 的请求;
② RA(Registration Authority):对用户身份进行验证,校验数据合法性,负责登记,审核过了就发给 CA;
③ 证书数据库:存放证书,一般采用 LDAP 目录服务,标准格式采用 X.500 系列。
CA 是最核心的组件,主要完成对公钥的管理。我们知道,密钥有两种类型:用于签名和用于加解密,对应称为 签名密钥对 和 加密密钥对 。
用户基于 PKI 体系要申请一个证书,一般可以由 CA 来生成证书和私钥,也可以自己生成公钥和私钥,然后由 CA 来对公钥进行签发。
7、Merkle 树
默克尔树(又叫哈希树)是一种二叉树,由一个根节点、一组中间节点和一组叶节点组成。最下面的叶节点包含存储数据或其哈希值,每个中间节点是它的两个孩子节点内容的哈希值,根节点也是由它的两个子节点内容的哈希值组成。
默克尔树的特点是,底层数据的任何变动,都会传递到其父亲节点,一直到树根。
默克尔树的典型应用场景包括:
快速比较大量数据:当两个默克尔树根相同时,则意味着所代表的数据必然相同。
快速定位修改:例如上例中,如果 D1 中数据被修改,会影响到 N1,N4 和 Root。因此,沿着 Root –> N4 –> N1,可以快速定位到发生改变的 D1;
零知识证明:例如如何证明某个数据(D0……D3)中包括给定内容 D0,很简单,构造一个默克尔树,公布 N0,N1,N4,Root,D0 拥有者可以很容易检测 D0 存在,但不知道其它内容。
8、同态加密
同态加密(Homomorphic Encryption)是一种特殊的加密方法,允许对密文进行处理得到仍然是加密的结果,即对密文直接进行处理,跟对明文进行处理再加密,得到的结果相同。从代数的角度讲,即同态性。
9、函数加密
同态加密保护的是数据本身,而函数加密顾名思义保护的是处理函数本身,即让第三方看不到处理过程的前提下,对数据进行处理。
比特币
1、比特币区块链原理和设计
比特币网络是一个分布式的点对点网络,网络中的矿工通过“挖矿”来完成对交易记录的记账过程,维护网络的正常运行。
比特币通过区块链网络提供一个公共可见的记账本,用来记录发生过的交易的历史信息。
每次发生交易,用户需要将新交易记录写到比特币区块链网络中,等网络确认后即可认为交易完成。每个交易包括一些输入和一些输出,未经使用的交易的输出( Unspent TransactionOutputs,UTXO)可以被新的交易引用作为合法的输入。
一笔合法的交易,即引用某些已存在交易的 UTXO,作为交易的输入,并生成新的输出的过程。
在交易过程中,转账方需要通过签名脚本来证明自己是 UTXO 的合法使用者,并且指定输出脚本来限制未来对本交易的使用者(为收款方)。对每笔交易,转账方需要进行签名确认。并且,对每一笔交易来说,总输入不能小于总输出。
2、概念
① 账户/地址
比特币账户采用了非对称的加密算法,用户自己保留私钥,对他发出的交易进行签名确认,并公开公钥。
比特币的账户地址其实就是用户公钥经过一系列 hash(HASH160,或先进行 SHA256,然后进行 RIPEMD160)及编码运算后生成的 160 位(20 字节)的字符串。
一般,也常常对账户地址串进行 Base58Check 编码,并添加前导字节(表明支持哪种脚本)和 4 字节校验字节,以提高可读性和准确性。
② 交易
交易是完成比特币功能的核心概念,一条交易将可能包括如下信息:
付款人地址:合法的地址,公钥经过 SHA256 和 RIPEMD160 两次 hash,得到 160 位hash 串;
付款人对交易的签字确认:确保交易内容不被篡改;
付款人资金的来源交易 ID:从哪个交易的输出作为本次交易的输入;
交易的金额:多少钱,跟输入的差额为交易的服务费;
收款人地址:合法的地址;
收款人的公钥:收款人的公钥;
时间戳:交易何时能生效。
网络中节点收到交易信息后,将进行如下检查:
交易是否已经处理过;
交易是否合法。包括地址是否合法、发起交易者是输入地址的合法拥有者、是否是
UTXO;
交易的输入之和是否大于输出之和。
检查都通过,则将交易标记为合法的未确认交易,并在网络内进行广播。
③ 脚本
脚本(Script) 是保障交易完成(主要用于检验交易是否合法)的核心机制,当所依附的交易发生时被触发。通过脚本机制而非写死交易过程,比特币网络实现了一定的可扩展性。比特币脚本语言是一种非图灵完备的语言,类似 Forth 语言。
一般每个交易都会包括两个脚本:输出脚本(scriptPubKey)和认领脚本(scriptSig)。
输出脚本一般由付款方对交易设置锁定,用来对能动用这笔交易输出(例如,要花费交易的输出)的对象(收款方)进行权限控制,例如限制必须是某个公钥的拥有者才能花费这笔交易。
认领脚本则用来证明自己可以满足交易输出脚本的锁定条件,即对某个交易的输出(比特币)的拥有权。
输出脚本目前支持两种类型:
P2PKH:Pay-To-Public-Key-Hash,允许用户将比特币发送到一个或多个典型的比特币地址上(证明拥有该公钥),前导字节一般为 0x00;
P2SH:Pay-To-Script-Hash,支付者创建一个输出脚本,里边包含另一个脚本(认领脚本)的哈希,一般用于需要多人签名的场景,前导字节一般为 0x05;
④ 区块
一个区块将包括如下内容:
4 字节的区块大小信息;
80 字节的区块头信息:
·版本号:4 字节;
·上一个区块头的 SHA256 hash 值:链接到一个合法的块上,32 字节;
·包含的所有验证过的交易的 Merkle 树根的哈希值,32 字节;
·时间戳:4 字节;
·难度指标:4 字节;
·Nonce:4 字节,PoW 问题的答案;
交易个数计数器;
所有交易的内容。
3、设计理念
① 如何避免作恶
基于经济博弈原理。在一个开放的网络中,无法通过技术手段保证每个人都是合作的。但可以通过经济博弈来让合作者得到利益,让非合作者遭受损失和风险。
比特币网络需要所有试图参与者(矿工)都首先要付出挖矿的代价,进行算力消耗,越想拿到新区块的决定权,意味着抵押的算力越多。一旦失败,这些算力都会被没收掉,成为沉没成本。当网络中存在众多参与者时,个体试图拿到新区块决定权要付出的算力成本是巨大的,意味着进行一次作恶付出的代价已经超过可能带来的好处。
② 负反馈调节
比特币网络在设计上,很好的体现了负反馈的控制论基本原理。
比特币网络中矿工越多,系统就越稳定,比特币价值就越高,但挖到矿的概率会降低。
反之,网络中矿工减少,会让系统更容易导致被攻击,比特币价值越低,但挖到矿的概率会提高。
因此,比特币的价格理论上应该稳定在一个合适的值(网络稳定性也会稳定在相应的值),这个价格乘以挖到矿的概率,恰好达到矿工的收益预期。
从长远角度看,硬件成本是下降的,但每个区块的比特币奖励每隔 4 年减半,最终将在 2140年达到 2100 万枚,之后将完全依靠交易的服务费来鼓励矿工对网络的维护。
③ 共识机制
传统的共识问题是考虑在一个相对封闭的体系中,存在好节点、坏节点,然后如何达成一致。
对于比特币网络来说,因为它是开放的,网络质量也是完全无法保证的,导致问题更加复杂,难以依靠传统的一致性算法来实现。
比特币网络对共识进行了一系列的放宽,同时对参与共识进行了一系列的限制。
首先是不实现最终共识,理论上现有达成的任何结果都可能被推翻,只是被推翻的可能性随着时间而指数级的下降,要付出的代价迅速上升。
此外,达成共识的时间比较长,而且是按照块来进行阶段性的确认(快照),提高网络可用性。
此外,通过进行 PoW 限制合法提案的个数,提高网络的稳定性。
4、挖矿
挖矿的具体过程为:参与者根据上一个区块的 hash 值,10 分钟内的验证过的交易内容,再加上自己猜测的一个随机数 X,让新区块的 hash 值小于比特币网络中给定的一个数。这个数越小,计算出来就越难。系统每隔两周(即经过 2016 个区块)会根据上一周期的挖矿时间来调整挖矿难度(通过调整限制数的大小),来调节生成区块的时间稳定在 10 分钟左右。为了避免震荡,每次调整的最大幅度为 4 倍。
为了挖到矿,参与处理区块的用户端往往需要付出大量的时间和计算力。算力一般以每秒进行多少次 hash 计算为单位,记为 h/s。
5、闪电网络
闪电网络的主要思路十分简单 – 将大量交易放到比特币区块链之外进行。
核心的概念主要有两个:RSMC(Recoverable Sequence Maturity Contract)和HTLC(Hashed Timelock Contract)。前者解决了链下交易的确认问题,后者解决了支付通道的问题。
6、侧链
允许资产在比特币区块链和其它链之间互转。降低核心的区块链上发生交易的次数。
也来自比特币社区, 2013 年 12 月提出,2014 年 4 月成立项目。
通过简单地复用现有比特币的方式,实现比特币和其他帐簿资产在多个区块链间的转移。
7、以太坊
目前采用了 PoW 作为一致达成保证,未来可能迁移到 PoS 上。
降低攻击
设计核心思想是通过经济激励机制防止少数人作恶:
所有交易都要提供交易费用,避免 DDoS 攻击;
程序运行指令数通过 gas 来限制,所消耗的费用超过设定上限时会被取消,避免恶意合约。