一文读懂加密事实:信任最小化的计算和记录

本文是关于未来信任模式系列科普文章的第二篇。 有兴趣的读者可以阅读上一篇文章《一文读懂加密技术》,深入了解区块链、智能合约和预言机所解决的社会问题。

区块链技术与其他计算模式存在许多不同之处,其中最关键的一点就是区块链可以生成加密事实。用一句话来概括加密事实,那就是:加密事实是一种在准确性、可访问性和可审计性方面完全超越现有机制且不可篡改的后端计算和记录机制

加密事实源于信任最小化的基础架构。由于代码执行和验证不依赖对陌生人的信任或不可控的变量,因此代码可以严丝合缝地执行。区块链采用加密技术实现信任最小化,认证数据并保障记录和去中心化共识的时间顺序,以对新添加的数据进行验证并确保数据无法被篡改。通过这个机制,多方流程可以在一个中立、可信且共享的后端系统中追踪和执行,并且系统会采用经济激励机制来进行高效管理。

Cryptographic Truth
加密事实结合了加密技术和去中心化的共识,在分布式的网络中达成共识,创建统一的记录,并以确定性的方式为应用展开计算。

下文将详细阐述区块链如何结合加密技术和去中心化共识来生成加密事实;并探讨预言机如何能扩展加密事实,验证任何类型的链下数据或任何形式的链下计算。

目录

  • 什么是加密技术?加密技术如何用于区块链?
    • 加密技术综述
    • 现代加密技术
      • 哈希函数
      • 对称加密
      • 非对称加密
    • 区块链采用的加密技术
      • 交易认证和验证
      • 出块、抗女巫攻击以及终局
      • 数据存储
      • 其他用于区块链的加密技术
    • 基于去中心化共识的事实
      • 博弈的架构
      • 博弈的经济激励
      • 博弈的结果
    • Chainlink如何利用加密事实来打造全局事实机器(Global Truth Machine
    • 一个由加密事实驱动的世界

什么是加密技术?加密技术如何用于区块链?

要充分理解加密事实及其在区块链上的作用,就必须首先了解现代加密技术的概念及其基本运作逻辑(注:如果你已经知道什么是加密技术,请跳转至下一章《区块链采用的加密技术》)。

加密技术综述

加密技术的本质是在攻击行为发生时安全地保障通信。在多数人看来,加密技术的主要价值是保护通信隐私(如:为消息传输应用加密),但其实这项技术还可以用于认证消息来源、验证消息完整性以及保障消息的不可否认性。换而言之,就是确定消息来自某个特定的对象,没有经过篡改,并且其属性无法被消息发送方否认。

加密技术可以将原始消息转换成常人无法辨认的信息,只有特定对象才能破解消息内容。加密函数(encryption)是一种双向函数,可以将原始消息(即:明文)加密成无法辨认的消息(即:密文),只有收件人才能重新还原成明文。也有些密码学函数是单向的,只是为了证明某个信息或数据属性,而不用揭示完整的数据。

加密算法被称为密码(cipher),而密钥则被称为secret。密钥通常由一串字符串组成,持有密钥的人可以破解密码。密码通常分为两类,即:替换密码和置换密码(也称为换位密码)。替换密码(substitution ciphers)用其他字母、数字和符号替换了明文中的字母、数字和符号。置换密码则保留了明文中的字母、数字和符号,但打乱了其原有的顺序。这些技术通常会混用或叠用,并基于外部数据或时间而变化,以增加其复杂性。

Substitution and permutation ciphers
密码通常分为两类,即:替换密码和置换密码(也称为换位密码)。

最早出现的密码是硬件加密的。换句话说,最早的密码是记在脑子里,写在纸上,或者通过其他非数字化的方式保存的。然而,随着计算机的发展,软件加密算法成为了主流的加密方式。

现代加密技术

现代加密技术重点围绕计算硬度假设(computational hardness assumptions)展开,这个概念假设特定问题无法有效被攻破。虽然大多数加密函数在理论上都可能被破解,但实际上由于目前算力存在上限,因此函数无法被破解。所以,现代加密算法的目的是在计算效率和计算安全性之间达到适当的平衡,基于数学和计算机科学来正确地决定密钥长度等因素。许多加密函数都是基于现代计算机系统要解开数学难题所需的时间和预算而设计的,如离散对数整数分解椭圆曲线理论问题等。

现代通用的软件加密技术分为三类,即:哈希函数、对称加密以及非对称加密。

哈希函数

哈希函数可以将任何长度的数据转换成名为“哈希值”的固定长度的值。哈希值类似于数据的指纹,每个都是独一无二的,可以验证数据的真实性。哈希函数通常用于索引数据,并高效地从数据库获取数据。它还可以用来安全地储存数据,比如网站只会储存加盐(salted)的用户密码哈希,以防止数据库被攻击而导致密码泄露。

哈希函数不使用密钥,并基于单向函数来抵御原像攻击。不知道原始消息的人几乎不可能单凭哈希值破解消息。破解原始消息唯一可行的方法就是蛮力攻击,即:每个可能的密码都挨个试一次。而哈希值有无数种字符组合方式。哈希算法通常也可以防止共谋,两个不同的输入几乎不可能生成同样的哈希值。由于存在上述特质,对输入进行任何一点修改,比如将某一字母大写或添加一个标点符号,都会生成完全不同且看似随机的哈希值结果。

如今,最主流的哈希算法是SHA-256。这个哈希算法会生成长度为256位的字符串(即:连续256个1和0组成的字符串)。256位的哈希值通常会显示成十六进制字符串,因此它们的长度可能是32或64个字符。SHA-2系列哈希函数中包含SHA-256,代替了目前已经被破解的SHA-1。2015年基于加密原型Keccak推出了SHA-3。

Hashing in blockchains
改变输入中任何一个字符,如在添加一个逗号,都会完全改变哈希结果,并且呈现出完全不同的随机字符。

对称加密

对称加密 (也称“密钥加密”Secret-Key Encryption)包含一个共用的密钥,发件人和收件人都用这把密钥来加密和解密消息。对称加密速度快且效率高,但是也存在一个问题,那就是很难在网上安全地共享密钥。虽然可以在私下共享密钥,但是这个方法无法全局扩展,因为必须要每个对手方之间都建立正式的联系。另一个问题是,一旦密钥被盗,所有使用密钥的人在此之前或之后收发的所有消息都有可能被破解。因此,许多采用对称加密的互联网协议(比如TLS)也会采用密钥交换协议,在不通过互联网发送密钥的前提下安全地共享密钥。

最主流的对称加密密码是Advanced Encryption System(AES)。AES的密钥长度分为128、192和256位,这在Data Encryption Standard(DES)标准的56位密钥之上进行了大幅改进。DES标准在安全方面远不如AES。56位的密钥有256(等于72000兆)种可能的密钥组合方式,蛮力攻击的话只需不到24小时就能破解。而即使是AES最短的密钥也需要集结全世界所有计算机花几万亿年时间才能把所有2128种可能性都试一遍。

Symmetric Encryption
对称加密使用同一个密钥来加密和解密消息。

非对称加密

非对称加密 (也称为公开密钥加密Public-Key Cryptography)会给每个用户一对公钥和私钥。公钥所有人都能看见,而私钥只有持有者一人能看见。用户可以用自己的私钥加密消息,任何持有公钥的人都可以破解。这项技术也被称为“数字签名”,它能在不透露隐私的前提下证明隐私数据(即:用户持有对应公钥地址的私钥)。用户还可以用别人的公钥来加密消息,只有持有私钥的人才能破解(即:发送私密数据)。

最主流的非对称加密算法是RSA(以其发明者Ramis、 Shamir和Adleman三人的名字首字母命名)、ECC(椭圆曲线加密算法)、Diffie Hellman(主流的密钥交换协议)以及DSS(数字签名算法)。一些非对称加密算法可以抵御量子计算攻击,而一些则不具备这个能力,有待在未来进行升级或直接被弃用。

Asymmetric encryption
非对称加密需要每名用户持一个密钥对,密钥对包含公钥和私钥。

区块链采用的加密技术

区块链主要采用两种加密技术,即:公开密钥加密和哈希函数。不过,其他加密技术也在不断涌现出来,用于区块链的扩容、隐私和外部连通性解决方案。以下是区块链加密技术的部分用例。

交易认证和验证

区块链上的每名用户都必须持有一对公钥和私钥以及区块链地址,以此向网络提交交易。用户用私钥来生成公钥,并用公钥来生成区块链地址,区块链地址通常是公钥的哈希值,其末尾20位字符添加在0x等前缀后。值得注意的是,区块链钱包和传统交易平台一般会为用户简化公钥和私钥的生成过程。

 

区块链地址类似与用户银行账户绑定的真实姓名,唯一的区别是,区块链地址是一串由数字和字母组成的伪匿名字符串。用户可以在区块链地址中存放资金并部署智能合约。私钥类似用户要进入账户时必须输入的密码,用户需要私钥来进行转账和修改智能合约等操作。公钥类似用户的银行账户,用于验证用户的私钥签名。

用户提交交易时,会从自己的区块链地址向网络发送一条消息,消息中包含交易数据和一个数字签名。交易数据描述了用户希望在网络中进行的操作,而数字签名是对这个操作的认证。数字签名包含两个部分,即:用户交易数据的哈希值以及用户的私钥。数字签名会附加在交易数据上,以生成一个经过数字签名的交易。

负责管理区块链的矿工/验证节点和全节点会运行数字签名验证协议,以验证交易的有效性。这个验证协议会对原始交易数据进行哈希运算。另外,它还会使用用户的公钥来解密数字签名,并生成一个哈希值。如果两个哈希值完美匹配,那么就证明交易是有效的。区块链结合了哈希运算和公开密钥加密技术来实现数字签名功能,保障了只有私钥持有者才能访问区块链地址中的资金。

Blockchain transaction authentication and verification
区块链采用数字签名来认证并验证用户交易。

出块、抗女巫攻击以及终局

出块指矿工/验证节点将待确认的交易打包成名为“区块”的数据结构,并提交至网络中。区块通常由其中的所有交易以及一个区块头组成,区块头包含区块的元数据。要生成区块,矿工/验证节点需要生成一个有效的区块哈希值,否则区块将被拒绝。

工作量证明 (PoW)区块链(如:比特币区块链)采用的机制是所有矿工参与公开竞争,第一个通过蛮力法生成有效哈希值的矿工(注:有效哈希指至少以x个0开头的哈希值)会被选中向账本提交区块。PoW区块链在出块环节采用哈希函数来抵御女巫攻击,以防止某一实体控制多个节点来操控网络中区块生成。由于PoW矿工唯一提高自己成为出块节点概率的方式就是提高哈希算力,因此这也意味着他们要相应花更多钱来增强自己的计算装备,以获得更高的算力。这不仅可以防止DoS攻击,而且矿工也需要付出更多努力,才能有机会获得区块奖励。

权益证明 (PoS)区块链(比如合并后的以太坊)也会在区块生成过程中进行哈希运算,但是这个环节故意设计得比较简单,因为验证节点之间不存在竞争。相反,PoS区块链通常会随机在验证节点中筛选出块节点,筛选机制通常基于节点的权益质押权重。PoS区块链会要求验证节点必须质押一定数量的cryptocurrency,才能参与出块环节,以此来抵御女巫攻击。因此,PoS区块链的验证节点必须将一部分资产质押,以提高自己被选为出块节点的概率。如果出块节点违背了协议条款,比如区块中包含无效交易或在同一区块高度重复签名了两个区块,那么他们质押的保证金就会被没收。

通常,有效的区块哈希必须包含以下两部分:

  • Merkle root——在默克尔树数据结构中,区块中包含的所有交易的根哈希值。
  • Nonce——随机的数字/字母组合,这个组合会生成有效的哈希值,并满足当前的挖矿难度目标。PoW区块链会根据某一出块频率(如:每十分钟出一个块)来定期调整nonce的难度;而PoS区块链则相对比较容易就能生成nonce。
  • 其他的区块链元数据——每条区块链的要求不一样,但是大致可能包括:区块链当前的软件版本、时间戳、挖矿难度目标、整条区块链的状态根哈希值或者当前区块号码。
  • 之前一个区块的哈希值——之前验证过的区块的有效区块哈希值。
Blockchain blocks
区块链中包含交易数据、Merkle root、其他的区块元数据、有效的nonce以及之前一个区块的哈希值。

每个区块中包含前一个区块的区块哈希值,通过加密技术将区块连成一条链,并维持账本的时间顺序。因此,区块链的一个特征就是不可篡改性,因为要更改之前验证过的区块需要耗费巨大的算力和财力,这个过程也被称为区块重组或re-org。即使一个区块中的一条交易被修改了,整个区块的哈希值都会发生变化,因此也会被其他节点发现。值得一提的是,并非所有区块重组都是恶意的。比如,由于异步网络的特征,区块链最前端发生区块重组是比较常见的现象。然而,深度的区块重组可能更具争议,重组发生的时间越晚,实现的难度就越大。

PoW区块链上的矿工如果要发起区块重组攻击,必须要针对所有区块生成新的有效哈希值。而且在这段时间内,网络中的其他矿工还在不断扩张算力,向最近的这个区块添加新的区块。而中本聪共识就在这里发挥出价值了。中本聪共识规定:“工作量最大且最长的链就是有效的链。”,这个共识让矿工可以直观地判断哪个版本的账本才是正确的。

正因如此,PoW区块链被认为是“概率性确定”(probabilistic finality)的,即:修改发起的时间越晚,攻击成功的概率就越低。而概率性确定就引出了“51%攻击”这一概念,即:矿工需要控制至少51%的哈希算力,才能发起深度区块重组攻击,或操控其他矿工的区块。正因为概率性确定的存在,中心化的cryptocurrency交易平台往往会等到后续区块达到一定数量时才批准转账交易(比如比特币区块链需要等待6个后续区块,以太坊则需要等待32个区块)。这个机制可以避免双花攻击,即:同一笔钱被花出去两次。

在PoS网络中,除出块节点以外的所有或部分验证节点都需要通过投票来验证新区块的有效性。验证节点如果要发起区块重组,就可能被没收质押的保证金,攻击越深入,罚款金额就会越高(注:共识通常是超过2/3的验证节点)。PoS区块链通常采用这样的模式,将加密经济机制与共识算法相结合,包括实用拜占庭容错算法TendermintCasper以及HotStuff

一些PoS区块链还对区块链账本设置了修改上限,N个区块之前的区块无法再被修改,拥有完全的确定性。比如,PoS信标链合并入目前的以太坊网络后,会把出块和验证分为两个epoch ,每个epoch有32个slot,每个slot的时长是12秒。 在每个epoch中,所有验证节点都被随机分到不同委员会中,每个委员会至少包含128个成员。每个epoch都会重新分配一次验证节点。每个slot中,都会有一个验证节点提交区块,并由一个或多个委员会中的其他验证节点验证区块。这样设计的目的是让验证节点在每个epoch中验证一个提交的区块。

Ethereum epoch
在合并后,以太坊区块的出块和验证会被划分成多个epoch,每个epoch有32个slot,每个slot都可以提交并验证区块。资料来源

在每个epoch结束时,如果所有质押权益的验证节点都验证了之前一个epoch中区块的有效性,那么这些区块就被认为是有效的。如果连续验证了前两个epoch的有效性,那么其中更早的那个epoch就被认定终局了。在网络状况和验证节点参与都正常的情况下,交易终局的平均时间为14分钟。一旦一个epoch被认定终局,依据协议规定,这个epoch将无法被撤回,除非启动外部社会共识。

数据存储

区块链是一个账本,帐本中按照时间顺序记录了每一笔发生在区块链网络中的交易(注:不过也有一些区块链在尝试修剪某一时间点之后的历史数据)。区块链运行的时间越长,账本就会越大,而节点存储和同步需要花费的成本也就越高。存储和带宽要求过高也会使运行全节点的硬件需求更加严格,这样可能会导致一小撮人控制网络,因而威胁到区块链网络的去中心化水平。

为了安全高效地加密账本数据,区块链采用了一种叫作“默克尔树”(Merkle tree)的数据结构。在默克尔树中,每笔用户交易都经过哈希计算,然后与另一笔交易的哈希值放在一起再次进行哈希计算。就这样不断合并进行哈希计算,直到最终算出一个根哈希值,即:Merkle Root。

比特币采用了基于UTXO(即:未花费的交易输出)模式的默克尔树来记录交易,而以太坊则使用默克尔树来记录交易、状态以及日志和事件等数据。这个模式也被称为基于通用智能合约的“账户模式”。

Blockchain hashing in Merkle trees
默克尔树可以高效地在链上储存交易数据。

默克尔树非常有价值,它与其他数据结构相比占用的空间更小,而且可以高效地验证帐本中的数据完整性。另外,由于Merkle roots放在区块头中,因此轻客户端可以连接至一个可信的全节点,既使不下载整条区块链,也能快速安全地验证具体的交易是否包含在某一区块中。

其他用于区块链的加密技术

其他用于区块链的加密原型包括:

  • 零知识证明ZKP——用户(证明者)用来向另一方(验证者)证明他知道某个信息,并同时不披露信息的具体内容。比如,在Zcash区块链上,全节点可以在不知道交易双方或交易金额的情况下证明交易的有效性。
  • 可信执行环境(TEE——使用英特尔SGX等可信硬件执行隐私计算,可以通过加密证明来证明计算的完整性。其中一个实例是Oasis区块链。链上所有验证�