区块链是数据状态随时间变化的分布式数据库。
狭义来讲,区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构,并以密码学方式保证的不可篡改和不可伪造的分布式账本。
广义来讲,区块链技术是利用块链式数据结构来验证与存储数据、利用分布式节点共识算法来生成和更新数据、利用密码学的方式保证数据传输和访问的安全、利用由自动化脚本代码组成的智能合约来编程和操作数据的一种全新的分布式基础架构与计算方式。
术语 | 定义 |
---|---|
区块 | 数据的容器,数据通常是一组描述数据变化的交易集合,区块还包含头部,包含有关该区块的元数据和对前一个区块的引用。 |
哈希 | 通过某种算法计算得出的值,用来验证数据的完整性,区块头部包含前一个区块的哈希,可以快速验证整个链的完整性。 |
创世块 | 整个链的第一个区块。它是在区块链首次部署时创建的,用作所有其他区块的锚点。 |
交易 | 对数据集进行更改的记录。交易通常基于区块链定义的规则。这些规则包括各方之间的合同。 |
智能合约 | 合约,可能包含自己行为的触发事件。 |
节点 | 能够在网络中增加区块的网络中的主机。 |
分布式帐本 | 记录跨节点共享的事务记录。组成区块链的很多节点构成分布式账本。 |
共识算法 | 在分布式账本中的节点中使用,并由区块链定义以确定区块链正确性的方法。 |
工程领域从来没有黑科技;密码学不是工程。
Hash (哈希或散列)算法是信息技术领域非常基础也非常重要的技术。它能任意长度的二进制值(明文)映射为较短的固定长度的二进制值(Hash 值),并且不同的明文很难映射为相同的 Hash 值。
目前流行的 Hash 算法包括 MD5、SHA-1 和 SHA-2。 目前,一般认为 MD5 和 SHA1 已经不够安全,推荐至少使用 SHA2-256 算法。
一般的,Hash 算法都是算力敏感型,意味着计算资源是瓶颈,主频越高的 CPU 进行 Hash 的速度也越快。 也有一些 Hash 算法不是算力敏感的,例如 scrypt,需要大量的内存资源,节点不能通过简单的增加更多 CPU 来获得 hash 性能的提升。
算法类型 | 特点 | 优势 | 缺陷 | 代表算法 |
---|---|---|---|---|
对称加密 | 加解密密钥相同或可推算 | 计算效率高,加密强度高 | 需提前共享密钥;易泄露 | DES、3DES、AES、IDEA |
非对称加密 | 加解密密钥不相关 | 无需提前共享密钥 | 计算效率低,仍存在中间人攻击可能 | RSA、ElGamal、椭圆曲线系列算法 |
现代加密算法的典型组件包括:加解密算法、加密密钥、解密密钥。其中,加解密算法自身是固定不变的,一般是公开可见的;密钥则往往每次不同,并且需要保护起来,一般来说,对同一种算法,密钥长度越长,则加密强度越大。
- 加密过程中,通过加密算法和加密密钥,对明文进行加密,获得密文。
- 解密过程中,通过解密算法和解密密钥,对密文进行解密,获得明文。
顾名思义,加解密的密钥是相同的。 优点是加解密效率高(速度快,空间占用小),加密强度高。 缺点是参与多方都需要持有密钥,一旦有人泄露则安全性被破坏;另外如何在不安全通道下分发密钥也是个问题。
代表算法包括 DES、3DES、AES、IDEA 等。 适用于大量数据的加解密;不能用于签名场景;需要提前分发密钥。
非对称加密是现代密码学历史上最为伟大的发明,可以很好的解决对称加密需要的提前分发密钥问题。 顾名思义,加密密钥和解密密钥是不同的,分别称为公钥和私钥。 公钥一般是公开的,人人可获取的,私钥一般是个人自己持有,不能被他人获取。
优点是公私钥分开,不安全通道也可使用。 缺点是加解密速度慢,一般比对称加解密算法慢两到三个数量级;同时加密强度相比对称加密要差。
代表算法包括:RSA、ElGamal、椭圆曲线(Elliptic Curve Crytosystems,ECC)系列算法。
一般适用于签名场景或密钥协商,不适于大量数据的加解密。 RSA 算法等已被认为不够安全,一般推荐采用椭圆曲线系列算法。
即先用计算复杂度高的非对称加密协商一个临时的对称加密密钥(会话密钥,一般相对内容来说要短的多),然后双方再通过对称加密对传递的大量数据进行加解密处理。
类似在纸质合同上签名确认合同内容,数字签名用于证实某数字内容的完整性(integrity)和来源(或不可抵赖,non-repudiation)。
- HMAC (Hash-based Message Authentication Code,基本过程为对某个消息,利用提前共享的对称密钥和 Hash 算法进行加密处理,得到 HMAC 值)
- 盲签名 (1983 年由 David Chaum 提出。签名者在无法看到原始内容的前提下对信息进行签名。) https://en.wikipedia.org/wiki/RSA_(algorithm
- 多重签名 (n 个持有人中,收集到至少 m 个()的签名,即认为合法,这种签名被称为多重签名。)
- 环签名 (环签名属于一种简化的群签名)
区块链首先是一个分布式系统。
在分布式系统中,一致性(Consistency,早期也叫 Agreement)是指对于系统中的多个服务节点,给定一系列操作,在协议(往往通过某种共识算法)保障下,试图使得它们对处理结果达成某种程度的一致。
问题:
- 节点之间的网络通讯是不可靠的,包括任意延迟和内容故障;
- 节点的处理可能是错误的,甚至节点自身随时可能宕机;
- 同步调用会让系统变得不具备可扩展性。
理想的分布式系统一致性:
- 可终止性(Termination):一致的结果在有限时间内能完成;
- 共识性(Consensus):不同节点最终完成决策的结果应该相同;
- 合法性(Validity):决策的结果必须是其它进程提出的提案。
强一致的系统往往比较难实现。很多时候,人们发现实际需求并没有那么强,可以适当放宽一致性要求,降低系统实现的难度。例如在一定约束下实现所谓最终一致性(Eventual Consistency),即总会存在一个时刻(而不是立刻),系统达到一致的状态,这对于大部分的 Web 系统来说已经足够了。这一类弱化的一致性,被笼统称为弱一致性(Weak Consistency)
实际上,要保障系统满足不同程度的一致性,往往需要通过共识算法来达成。
共识算法解决的是对某个提案(Proposal),大家达成一致意见的过程。提案的含义在分布式系统中十分宽泛,如多个事件发生的顺序、某个键对应的值、谁是领导……等等,可以认为任何需要达成一致的信息都是一个提案。
问题: 分布式系统中总有一些故障的节点,把故障(不响应)的情况称为“非拜占庭错误”,恶意响应的情况称为“拜占庭错误”(对应节点为拜占庭节点)。
针对非拜占庭错误的情况,一般包括 Paxos、Raft 及其变种。
对于要能容忍拜占庭错误的情况,一般包括 PBFT 系列、PoW 系列算法等。从概率角度,PBFT 系列算法是确定的,一旦达成共识就不可逆转;而 PoW 系列算法则是不确定的,随着时间推移,被推翻的概率越来越小。
区块链中最普遍的共识算法是“Pow(工作证明)”,“(Pos)股权证明”和“(DPoS)委托股权证明”。
算法 | 解释 |
---|---|
工作证明(PoW) | 依靠计算难度的挑战来解决问题。计算新区块的难度很大,验证新区块的难度很小,能够快速认同新区块的正确性。 |
股权证明(PoS) | 一种基于节点的共识算法,节点持有可以参与区块链的股权。通过证明股权,区块可以更快地被添加到链中。 |
委托股权证明(DPoS) | 这是一种变化的股权证明算法,将创建块的责任委托给称为“证人”的第三方节点。 |
分布式计算系统不可能同时确保一致性(Consistency)、可用性(Availablity)和分区容忍性(Partition),设计中往往需要弱化对某个特性的保证。
- 一致性(Consistency):任何操作应该都是原子的,发生在后面的事件能看到前面事件发生导致的结果,注意这里指的是强一致性;
- 可用性(Availablity):在有限时间内,任何非失败节点都能应答请求;
- 分区容忍性(Partition):网络可能发生分区,即节点之间的通信不可保障。
弱化一致性: 对结果一致性不敏感的应用,可以允许在新版本上线后过一段时间才更新成功,期间不保证一致性。
弱化可用性: 对结果一致性很敏感的应用,例如银行取款机,当系统故障时候会拒绝服务。MongoDB、Redis 等为此设计。
弱化分区容忍性: 现实中,网络分区出现概率减小,但较难避免。某些关系型数据库、ZooKeeper 即为此设计。
拜占庭是古代东罗马帝国的首都,由于地域宽广,守卫边境的多个将军(系统中的多个节点)需要通过信使来传递消息,达成某些一致的决定。但由于将军中可能存在叛徒(系统中节点出错),这些叛徒将努力向不同的将军发送不同的消息,试图会干扰一致性的达成。
拜占庭问题即为在此情况下,如何让忠诚的将军们能达成行动的一致。
对于拜占庭问题来说,假如节点总数为 N,叛变将军数为 F,则当N >= 3F+1时,问题才有解,即 Byzantine Fault Tolerant (BFT) 算法。
拜占庭问题之所以难解,在于任何时候系统中都可能存在多个提案(因为提案成本很低),并且要完成最终的一致性确认过程十分困难,容易受干扰。但是一旦确认,即为最终确认。
比特币的区块链网络在设计时提出了创新的 PoW(Proof of Work) 算法思路。一个是限制一段时间内整个网络中出现提案的个数(增加提案成本),另外一个是放宽对最终一致性确认的需求,约定好大家都确认并沿着已知最长的链进行拓宽。系统的最终确认是概率意义上的存在。这样,即便有人试图恶意破坏,也会付出很大的经济代价(付出超过系统一半的算力)
分布式系统领域是计算机科学中十分重要的一个技术领域。常见的分布式一致性是个古老而重要的问题,无论在学术上还是工程上都存在很高的价值。理想化(各项指标均最优)的解决方案是不存在的。在现实各种约束条件下,往往需要通过牺牲掉某些需求,来设计出满足特定场景的协议
比特币白皮书,开始它的所有文件:https://bitcoin.org/bitcoin.pdf
以太坊白皮书,关于智能合约的讨论:http://www.the-blockchain.com/docs/Ethereum_white_paper-a_next_generation_smart_contract_and_decentralized_application_platform-vitalik-buterin.pdf
- 区块链是一个放在非安全环境中的分布式数据库(系统)。
- 区块链采用密码学的方法来保证已有数据不可能被篡改。
- 区块链采用共识算法来对于新增数据达成共识。
目前流行的项目: Ethereum <ethereum.org>,Hyperledger 超级账本项目。