搬运 | 协议基础 001——005

协议基础 001:密码学

Mario Havel 与 Tim Beiko

纵观历史,人类一直使用密码学(Cryptography)来保护敏感信息免受窃听。著名的例子是,为了避免依赖信使的忠诚度,朱利乌斯·恺撒(Julius Caesar)会对发送给前线将军的消息进行加密。他的具体做法是将原始消息中的每个字母替换为字母表中距离它固定位置的另一个字母。例如,通过使用3个偏移量,单词 ”attack“ 可被改为 “dwwdfn”:d 是 a 后面的第三个字母,w是t后面的第三个,以此类推。这种技术被称为恺撒密码(Caesar cipher)。只要凯撒事先与将军沟通好偏移量,他就能发送看似无法解读的消息,而将军们可以随后解密这些消息 [1]

随着时间推移,出现了比凯撒密码更难逆向破解的密码。维吉尼亚密码(Vigenère cipher)就是一个例子。这种密码不再使用固定值替换每个字母,而是根据一个秘密代码词(称为密钥,key)的字母在字母表中的顺序,为每个字符设定不同的偏移量。例如,密钥 “abc“ 会将编码单词的第一个字母按字母表顺序偏移一个位置,第二个字母偏移两个位置,第三个字母偏移三个位置,分别对应字母 a、b、c 在字母表中的位置。如果输入信息比密钥长,则密钥会循环使用 [2]

数学的进步催生了更复杂的加密技术。随着代数的出现,人们开始利用模运算(modular arithmetic)和指数运算(exponentiation)等原理,增加破译消息的难度。向数学密码学的转变为更精密的加密技术奠定了基础。最终,机器被用于提升密码的复杂程度,超越了人类可以直接计算的范围。德国在第二次世界大战期间依赖的(臭名昭著的)英格玛机(Enigma machine)就是这样一个例子 [3]

虽然消息加密的具体方式各不相同且日益复杂,但从概念上讲,所有这些技术都采用了相同的设计:

使用密钥加密输入信息,与接收者共享密钥,接收者再用密钥解密信息。

这种发送者和接收者使用同一密钥的设计被称为对称密钥加密(symmetric-key encryption)[4]

对称加密的最大缺陷在于其假设密钥可以被安全地传递给预期接收者,而不会泄露。换句话说,无论密钥是以单个数字、秘密单词,还是特定配置的机器的形式存在,都必须在可信环境中从发送方传递到接收方。所有后续消息的安全性都依赖于密钥的安全传输。

1976年,《密码学的新方向》(New Directions in Cryptography[5] 提出了一种解决方案,为如今被视为现代密码学基础的技术奠定了基石:非对称加密(asymmetric encryption)。其概念突破在于从单一的共享密钥(对称密钥加密)转变为成对的密钥,即密钥对(keypair)。密钥对由私钥(private key)和公钥(public key)组成。

要加密一条消息,接收者首先生成一个私钥,这是一个很大的随机数。该数字必须范围足够大且随机,以确保无法被猜到——据说比宇宙中原子的数量还要多。然后以确定性方式从私钥生成公钥。公钥也是一个巨大的数字,但不会泄露私钥的信息。仅凭观察公钥,无法推测出生成它的私钥。

由于公钥是由私钥推导而来,且得益于加密算法的数学特性,使用公钥加密的消息总是且只能使用其对应的私钥解密。接收者可以安全地广泛公布公钥,任何人均可使用该公钥加密消息。而这些消息只能通过对应的私钥解密,私钥永远不需要共享。

这是密码学演进中一次微妙而深远的转变:

非对称加密允许任何人公开一个公钥,供他人用来以发送只有接收者能解密的消息。

可以把个人的上锁信箱看作是公钥和私钥的物理隐喻。任何人都可以往信箱里投递信件,但只有信箱的主人能够打开它并阅读其中消息。

使用公钥进行安全加密只是非对称加密的一种可能性。私钥还可用于创建将任意数据与公钥关联的数学证明。这种证明被称为数字签名(digital signature),任何能够访问相关数据和对应公钥的人都可以验证其真实性 [6]。这种机制为个人和机构提供了通用标准,以评估在线数据的真实性。

加密和数字签名已成为现代通信的支柱。每当你连接到一个网站时,浏览器会使用 HTTPS 协议(https protocol)加密与网站服务器的所有通信 [7]。这确保了第三方(例如互联网服务提供商,ISPs)无法读取通信内容,从而得以安全传输敏感信息,如密码或支付数据。安全连接通过验证来自可信来源的签名证书(signed certificate)建立。该证书证明服务器确实属于您所连接的域名。

然而,并非所有安全和加密的通信方案都需要可信第三方。“很好的隐私”(Pretty Good Privacy, PGP)是最早且最被广泛采用的电子邮件加密示例之一 [8]。用户通过未加密的电子邮件分享其公钥,接收者随后可使用该公钥发送加密的回复。在这种情况下,没有中央权威机构验证密钥的有效性:发送者信任他们所持有的接收者公钥是正确的。

用户还可以通过个人网站或名片等方式主动公开他们的公钥(public key)。通过成员使用自己的密钥来为其他成员的密钥真实性建立证明,社区可以进一步建立信任网络(web of trust)。当然,用户仍需评估每个信任网络的可信度。

在如今的聊天时代,一个更新的实用安全通信示例是 Signal 协议(Signal protocol)。该协议在同名应用程序中实现,使用一种公钥形式,为一对一对一和多对多(群聊)的对话提供无缝用户体验。Signal 协议已成为低延迟加密通信的黄金标准,并被其他主流应用程序(如WhatsApp)采用。

尽管 Signal 和 WhatsApp 实现了相同的协议,但它们的实现方式截然不同。Signal 是一款自由与开源软件产品(free and open source software),任何人都可以审计其代码以验证实现的准确性。相比之下,WhatsApp的代码库完全是专有的(proprietary),用户无法依赖独立的公开审计者来审查其代码。他们只能信任应用程序开发者,确保代码没有无意的错误(bugs)或恶意的隐藏功能,如后门(backdoors,即允许外部方故意绕过加密以访问解密后(明文)的消息)。用户最敏感的信息可能在未经同意的情况下暴露给外部方的风险,正是密码学社区强烈倾向于开放性的原因。

一般用户可能永远不会阅读他们使用的应用程序的源代码,但安全研究人员能够进行审计,并由他人评估他们的结论,这降低了有意或无意错误的风险。审查代码的人越多,存在未被发现的错误的可能性就越低。

密码学起源于古代战争策略,如今已成为数字安全的基石。它是一门利用数学力量,创造遵循宇宙不变法则的系统的科学,以确保一个安全、互联的世界。

参考文献

[1] en.wikipedia.org/wiki/Caesar_cipher

[2] en.wikipedia.org/wiki/Vigenère_cipher

[3] en.wikipedia.org/wiki/Enigma_machine

[4] en.wikipedia.org/wiki/Symmetric-key_algorithm

[5] www-ee.stanford.edu/~hellman/publications/24.pdf

[6] en.wikipedia.org/wiki/Digital_signature

[7] en.wikipedia.org/wiki/HTTPS

[8] en.wikipedia.org/wiki/Pretty_Good_Privacy

关于作者

Mario Havel 和 Tim Beiko 是以太坊基金会协议支持团队的成员,该团队负责协助以太坊网络升级以及其他协议相关的倡议,包括“协议之夏”。

MARIO | github.com/taxmeifyoucan
TIM | warpcast.com/tim

1 个赞

你可以在下方链接中发现其他相关文章,参与搬运,共同学习 :slightly_smiling_face:

當前一切的基石;未來量子領域的突破,不知道是不是會帶來革命性的顛覆?

在以太坊研究论坛我看到了相关帖子,术语很多,看不懂。Claude AI 帮忙总结下,可以得出这两点:

量子计算机对以太坊确实构成重大威胁,可能导致大规模资金被盗。但两位作者认为这个威胁是可管理的,因为:

  1. 有明确的技术解决路径
  2. 大部分用户资金可以通过巧妙的恢复机制挽救
  3. 相关基础设施可以提前准备

以下两篇帖子也由 Claude AI 翻译:

帖子一:在量子计算的紧急情况下如何通过硬分叉以保护绝大部分用户的资金

假设明天宣布量子计算机已经可用,恶意行为者已经可以访问它们并能够使用它们来窃取用户资金。防止这种情况是抗量子密码学(例如Winternitz签名、STARKs)的目标,一旦账户抽象化到位,任何用户都可以按照自己的时间表切换到使用抗量子签名方案。但是如果我们没有那么多时间,突然的量子转变在此之前很久就发生了怎么办?

我认为实际上,我们 已经 处于有利位置,可以进行一个相当简单的恢复分叉来处理这种情况。区块链必须进行硬分叉,用户必须下载新的钱包软件,但很少有用户会失去他们的资金。

量子计算机的主要挑战如下。以太坊地址被定义为keccak(priv_to_pub(k))[12:],其中k是私钥,priv_to_pub是将私钥转换为公钥的椭圆曲线乘法。使用量子计算机,椭圆曲线乘法变得可逆(因为这是一个离散对数问题),但哈希仍然是安全的。如果用户没有使用他们的账户进行任何交易,那么只有地址是公开可见的,他们已经是安全的。但是如果用户甚至进行了一次交易,那么该交易的签名就会泄露公钥,在后量子世界中这允许泄露私钥。因此大多数用户都会很脆弱。

但我们可以做得更好。关键认识是在实践中,大多数用户的私钥本身就是一系列哈希计算的结果。许多密钥使用BIP-32生成,它通过从主种子短语开始的一系列哈希来生成每个地址。许多非BIP-32的密钥生成方法工作方式类似:例如,如果用户有脑钱包,它通常是应用于某个密码短语的一系列哈希(或中等难度KDF)。

这暗示了一个EIP的自然结构,通过硬分叉链来从量子紧急情况中恢复:

  1. 回滚明确发生大规模盗窃的第一个区块之后的所有区块
  2. 传统的基于EOA的交易被禁用
  3. 添加新的交易类型以允许来自智能合约钱包的交易(例如RIP-7560的一部分),如果这还没有可用的话
  4. 添加新的交易类型或操作码,通过它你可以提供STARK证明,该证明证明了对以下内容的知识:(i) 私有原像x,(ii) 来自k个批准哈希函数列表的哈希函数ID 1 <= i < k,以及(iii) 公共地址A,使得keccak(priv_to_pub(hashes[i](x)))[12:] = A。STARK还接受该账户新验证代码的哈希作为公共输入。如果证明通过,你的账户代码将切换到新的验证代码,从那时起你将能够将其用作智能合约钱包。

出于Gas效率原因(毕竟,STARKs很大),我们可以允许STARK成为批量证明,证明上述类型的N个STARKs(它必须是STARKs的STARK而不是多个声明的直接证明,因为每个用户的x需要对聚合器保持私有)。

实现这样硬分叉的基础设施原则上可以从明天开始构建,使以太坊生态系统在量子紧急情况真的发生时做好最大准备。

帖子二:迈向后量子计算机时代的以太坊任务清单

背景

加密相关量子计算机一旦构建成功,将能够启用Shor算法和Grover算法。这些算法将完全破解ECDSA/ECDH,并将哈希函数(和密码)强度从2^n降低到2^(n/2)。

ETH中有一些不明显的部分需要升级。

仍然可用的部分

  • bip39(pbkdf2-sha512)看起来完全没问题
  • eip2333验证器提取密钥也没问题!

需要升级的部分

  • bip32 hdkey派生
    • 应该被后量子且更好的方案替换(没有"非强化"密钥)
    • 新方案可以基于HKDF(如EIP-2333),但不是HKDF-SHA256
    • 备选KDF是上下文模式的Blake3(后量子安全性尚不明确)
    • 提议的方案应同时支持ECC和新的后量子模式
  • 交易签名
    • 应该被基于格的Falcon(FN-DSA / FIPS-206)或基于哈希的Sphincs-plus(SLH-DSA / FIPS-205)替换
    • 新密钥和签名将消耗更多空间
    • Falcon-1024具有1.75KB密钥和1.25KB签名
    • SLH-DSA-256具有48-128B密钥和17-51KB签名
  • 发送者地址恢复
    • 这是ECDSA的特性(例如在Schnorr中不可用)
    • 也许交易(而不是签名)应该编码发送者地址
  • 地址格式
    • 目前是40个十六进制字符,keccak256(pubkey)
    • keccak256应该被keccak512 / sha3-512 / sha512 / blake3-512替换
    • Grover算法如何影响地址的暴力破解?应该将40个字符增加到80-128个吗?
    • 更长的地址格式应该可能使用类似bech32的方案进行校验和处理和人性化
    • 新地址如何与旧地址/EVM互操作?
  • 加密钱包
    • 应该从AES-128升级到AES-256或chacha20
    • hmac-sha256应该升级到hmac-sha512 / kmac / blake3-512(密钥模式)
  • KZG EIP-4844验证
    • 应该被后量子方案替换
    • 目前算法尚不明确,有什么建议吗?
  • EVM 0x20操作码(KECCAK256)
    • 应该被keccak512 / sha3-512 / sha512 / blake3-512(新操作码)替换
  • EVM的ECRECOVER预编译
    • 参见上面的地址恢复
  • EVM的BN / BLS / KZG预编译
    • 应该被更新的方案替换(尚不清楚是哪些?)
    • 不再使用Groth16、vanilla PLONK、Marlin、BulletProof
  • 共识层签名聚合
    • 目前每个时期(6分钟)聚合所有验证器的签名一次
    • 现在超过100万个签名?
    • 目前算法尚不明确,有什么建议吗?
  • ZK-rollups(非STARK)
  • 还有其他吗?

最终思考

我相信即使在有限的时间内,所有这些问题都能得到解决。让我们开始解决它们。

如果这样的计算机很快出现,可以采用Vitalik的技巧(如何在量子紧急情况下硬分叉以拯救大多数用户的资金):冻结所有账户,并利用BIP39与ZK证明将资金恢复到新的后量子方案中。

非对称加密我感觉是这一切的重要基石,密码学改变了世界线

1 个赞

协议基础002:寻址

Mario Havel 与 Tim Beiko

正如我们在现实世界中为建筑物分配地址,计算机必须跟踪其存储的每一片数据的位置。与物理建筑类似,更小的构建块——比特(bits)——被组合起来用以创建更高层次的结构,如文件或网页。但与建筑物不同的是,比特可被轻松移动或复制。这意味着计算机需要为不同使用场景采用不同的寻址方案(addressing schemes),理想情况下,不同方案之间能够无缝切换。

在最底层,每个比特在计算机内存中都有自己的地址。所有正在使用的变量的值都临时存储在设备硬件的物理部件中,应用程序根据这些物理地址来访问它们。只有硬件本身才能处理这种形式的寻址。极少数情况下,这种寻址形式会被暴露给正在修复错误(bugs)的程序员。大多数计算机地址对人类来说都是不可读的,只服务于机器的内部逻辑。不过,人们需要能够访问某些地址,因此计算机地址经常被抽象为人类可读的格式(human-readable formats)

人类可读的计算机地址通常对应更高层次的抽象,如文件或网页。存储在磁盘上的每个文件都有自己的地址,我们通常称之为路径(path)。磁盘上的物理位置被抽象为可读的路径,形式如 /user/folder/doc.txt。在文件路径中,斜杠表示不同的目录(directories),即文件分组,从文件系统的根目录开始,一直到文件名。这种组织结构形成树状层次结构,使用户在目录中组织文件。我们通过目录的路径访问文件。用物理世界再作类比,这就像为某人提供逐步导航指引,以到达特定位置,而不是直接给出地址本身。

浏览其他计算机上的数据时,也使用这种等效(equivalent)的地址形式。在互联网上,用户主要使用标准化的路径格式访问文件,这被称为统一资源定位符(uniform resource locators: URL)。URL 是一种人类易于理解的网页地址,它将我们引导至特定内容。它的基本形式指定了通信协议(communication protocol)、域名(domain)以及所请求文件的路径。

上图显示的 URL 易于理解,是因为它指向一个域名(domain),这是机器级地址的一个人类可读别名。使用基于域名的URL访问网页时,这一人类可读的地址会被翻译成其对应的数字形式,即互联网协议地址(IP address)。这个数字使计算机能够识别网络中的位置,并将数据路由到那里。IP地址(IP address)被分配给连接到任何网络的每个设备,也可以在多个用户、域名或服务之间共享。例如,一个具有单一IP地址的服务器可以托管多个具有不同域名的网站。类比物理世界,IP地址就像一栋公寓楼,而不同的租户共享同一个街道地址。

当内容按照清晰的层次结构组织时,在子目录中导航可能很实用。但是,随着越来越多的位置出现,需要搜索的分支数量增加,这种方式可能效率低下。

这个系统还允许不同目录保存相同文件,这对于归档等用途来说并不必要。处理可能随时间变化位置的数据时,使用路径位置也会产生问题。

幸运的是,存在另一种寻址方案来化解这些缺点。内容寻址(content addressing)是一种基于其内容而非位置来为每个文件赋予唯一地址的方案。这对于可能在多个位置重复、某些位置可能随时间不可用的文件尤其有用,因为其内容是稳定的。具体而言,内容可寻址的存储系统,如星际文件系统(InterPlanetary File System, IPFS),使用标识符来检索文件。标识符通过密码哈希函数(cryptographic hash functions)从文件内容中生成。这些函数以文件数据为输入,输出一个唯一指纹(fingerprint)。相同的文件总是生成相同的指纹,从而具有相同的内容标识符。即使文件内容发生最微小的变化,也会导致生成一个全新的标识符和地址。

由于标识符是从内容中派生出来的,即使文件中仅更改一个字符,尽管文件名不变,其IPFS地址也发生变化。

因此,内容寻址非常适合数据固定但位置可变的文件。标识符的唯一性使得即使文件在不同存储设备之间移动,也能在同一地址下检索到所需文件。在某些情况下,甚至可以从多个来源重建单个文件,因为标识符保证接收到的各种片段可以组装成一个单一、连贯的输出。这一特性使内容寻址成为各种现代去中心化协议的首选基础。最早的例子之一是BitTorrent,它实现了点对点文件共享。数据不是托管在单个服务器上,而是通过种子(torrents)检索由网络中各个对等节点(peers)共享的文件小块,并在本地重构。

一个更现代的例子是 IPFS,这是一个去中心化的存储网络,通过点对点网络中的主机而非单一实体管理服务器实现云存储。IPFS用户可以使用静态唯一地址无缝访问文件,而文件可以在网络中的任何地方由多个节点共同托管,具有不同程度的冗余性。将同一文件上传到网络会生成相同的内容标识符,并为协议增加冗余,而非浪费性的重复。

虽然内容寻址(content addressing)是一项宝贵的特性,但它牺牲了人类可读性。某些情况下,搜索引擎应运而生,以帮助内容发现,例如用于搜索种子文件的海盗湾(ThePirateBay)。其他情况下,类似于域名与IP地址之间的映射方案则更为实用。

例如,从特定私钥派生而来的区块链地址可被视为该私钥的内容寻址。它们甚至直接被称为区块链地址!在以太坊中,这些地址是20个字节的十六进制值,以0x为前缀(如: 0x00000000219ab540356cbb839cbe05303d7705fa)。以太坊域名服务(Ethereum Name Service, ENS)允许用户注册人类可读的名称来指向某个地址(例如,summerofprotocols.eth 指向上述地址),为原始地址提供了一个人类可读的替代方案。

总的来说,寻址是计算机存储、访问和交换数据的核心。计算机使用的寻址方案对人类来说不易理解,因此用户接触到的是更高层次的寻址方案,计算机再将其转译回其内部逻辑。

基于路径或URL的寻址强调内容的位置,形成一种树状的组织结构。这适用于特定位置的内容可能随时间变化的情况,但在不知道精确路径的情况下无法访问内容。

内容寻址为数据片段创建唯一标识符,使得无论位置如何都能轻松检索。其缺点是数据的任何变化都会导致不同的标识符。标识符通过哈希函数生成,对人类来说,不如文件路径或域名那样容易记忆。

关于作者

Mario Havel 和 Tim Beiko 是以太坊基金会协议支持团队的成员,该团队负责协助以太坊网络升级以及其他协议相关的倡议,包括“协议之夏”。

MARIO | github.com/taxmeifyoucan
TIM | warpcast.com/tim

协议基础 003:哈希

Mario Havel 和 Tim Beiko

基于《协议基础》系列之前介绍的概念,让我们来探讨另一个驱动数字世界的核心组件:哈希(Hashing)。

哈希是一种单向函数,它接受任意大小的数据作为输入,生成固定大小的、被称为哈希值(Hash)或摘要(Digest)的输出。它最重要的特性是给定的输入总是产生相同的输出。此外,通过密码学,哈希函数可以被设计成这样:函数输出不会泄露与函数输入相关的任何信息。与加密(encryption)不同——加密允许后续对密文进行解密——密码哈希(Cryptographic Hashing)在实际应用中几乎是不可逆的。

更准确地说,哈希函数是确定性的,这意味着对于相同的输入,其输出始终一致。此外,不同的输入(即使输入相似)会生成彼此无关的输出。例如,在一个大型输入文件中只更改一个比特(Bit),将完全改变其哈希值,且变化模式不可预测。然而,这并不意味着输出是随机的。尽管哈希输出字符串看似随机生成,甚至在转换输入值时可能使用伪随机性(Pseudorandomness),但它具有完全的确定性。


从输入字符串中移除某个字符,哈希函数(在此例中为 sha256)的输出会完全改变。

因此,哈希函数的主要特性是为每一任意输入产生唯一输出。虽然哈希函数的输出都有相同的格式(例如,256 位的输出由 64 个字符的 16 进制字符串表示 [1]),但其输出空间的范围应足够大,达到“宇宙中原子数量”的级别,以确保不同输入在输出空间中永不冲突。哈希碰撞(hash collision)指哈希函数为两个不同输入生成相同输出,这被认为是安全或实现上的失败。

举一个具体的例子,流行的哈希算法 sha256 产生长度为 256 位的哈希值,这意味着有 $2^256$ 种可能的输出组合。要找到输出为特定的 256 位哈希值的消息,必须反复尝试并检查随机消息的哈希值。即使利用全世界现有的全部计算能力,搜索如此庞大的空间也需要数十亿年。

这一宝贵特性为许多实际用例开启可能性,例如存储密码等敏感数据。网站服务通常不会(或至少不应该)直接存储注册用户的密码,而是存储密码的哈希值。用户登录时,输入的密码会被进行哈希处理,并与服务方数据库中存储的哈希值进行比较。这实现了密码验证,因为只有正确的密码才会产生相匹配的哈希值,同时不会让任何有权访问数据库的人——无论是员工还是黑客——获得明文密码。


固定大小的输出是哈希函数的另一个重要实用特性。为不同类型的输入创建统一的、固定大小的输出,会使数据存储和验证更加高效。例如,在提供重要文件的下载时,网站通常会向用户提供其内容的哈希值以供验证。用户随后可以对所下载文件独立地运行哈希函数,确保其哈希值与网站提供的哈希值相匹配,从而证明文件未被篡改。同样,允许用户上传文件的服务会对文件内容进行哈希处理,并使用该哈希值来检测重复上传。

哈希的最后一个具有高度影响力的用例是工作量证明机制(proof-of-work mechanism)。简而言之,其想法是创建一个“挑战”,即一个由有效哈希值们组成的受限输出空间(constrained output space)。挑战的解决者(solver)需要生成一个符合受限输出空间的哈希值。由于哈希输出之间互不相关,解决挑战的唯一方法是使用随机输入,重复运行哈希函数。输出空间受到的约束越多,就需要运行更多次哈希函数——因此需要更多的计算能力或“工作”(work)——以找到输出满足约束条件的输入。

举一个简单的例子,想象一副牌,挑战的解决者必须从中抽取一张牌。如果约束条件是“红桃或黑桃”,那么平均而言,解决者随机抽取的牌中有一半会满足条件。如果约束条件缩小到“仅红桃”,那么平均而言只有 1/4 的抽牌满足约束条件。工作量证明模拟了这个过程,但使用的是密码学哈希函数,并对其输出空间添加数值约束。如果我们用二进制格式表示哈希函数的数值输出——仅使用 1 和 0,我们可以要求特定的数值范围以作为预定义的模式。例如,要求输出的第一位数字为 0 会约束输出空间,使得一半的哈希函数输入产生有效输出,就像我们的牌组中的“红桃和黑桃”。要求第二位数字也为 0 会使有效输出的比例再次减半,仅 1/4 的输入能产生有效输出,以此类推。

工作量证明最开始被提出作为抵御垃圾电子邮件的解决方案。通过要求电子邮件发送者“挖掘”(mine)一个具有简单的约束条件的哈希值,并将附在消息中,个人用户可以像平常一样发送电子邮件,但大规模垃圾邮件活动的成本会过于昂贵而无法实施。

如今,工作量证明的主要用例是在不需要可信第三方的情况下保护区块链。区块链可以使用公开的工作量证明挑战来分配创建链中下一个区块的权利,以及与该区块相关的奖励和交易费用。这些网络公开广播约束条件(也被称为难度),然后等待解决者(也被称为矿工)提出解决方案。虽然矿工找到有效解决方案的计算成本可能相当高,但验证解决方案有效性的计算工作却微不足道。一旦矿工找到并分享有效输入,区块链网络中的所有其他节点都会通过网络中的标准哈希函数运行该输入,以确认输出是否满足所需的约束条件。回到我们的简单例子,这类似于“从一副牌中随机抽出黑桃 A”和“展示你所抽到的牌”之间的区别。

这一机制使加密货币网络能够通过增加或降低工作量证明难度来调节网络中新区块的产生速度,无需中心式干预即可响应挖矿需求的变化。

希望这里的描述澄清了关于加密货币挖矿的一个常见误解:认为它涉及“解决困难的计算问题”。实际上,矿工是在反复解决简单问题(计算哈希函数),重复数十亿到数万亿次,以在受限的输出空间中找到解决方案。其他人随后可以轻松验证该哈希值的有效性。

[1] 通过二进制表示法(即 0 和 1),256 个字符的字符串囊括了 2^256 个可能的数字。由于 2^256 等于 16^64,由于 2^256 等于 16^64,可以通过 64 个字符的 16 进制表示法(即 0-9 和 A-F)来呈现相同的数值。

勤劳的搬运工

哇塞

协议基础 004:数据证明

现代世界的数字化导致计算机系统需要处理的信息量呈指数级激增。我们在《协议基础003:哈希》中介绍过哈希(Hash)可被用于组织大量数据以实现对数据完整性的高效验证。一个常见的例子是数据库使用哈希作为索引来加快数据查找速度。所谓的哈希表(hash table)以键-值(key-value)对(pairs)的形式存储数据,并通过哈希来访问这些数据。在图一中,我们可以看到这种方法被应用于存储电话号码,这是哈希表最初的用途之一,可以追溯到 20 世纪 50 年代。

随着电话簿、参考书目和词典的数字化,哈希表能够实现快速查找,即使在大量数据中也是如此,每次查询的执行时间大致等于计算哈希的速度。传统的搜索算法需要逐个扫描条目,这使得搜索时间随着每个新增条目而增长。哈希表中的查找功能只需要计算作为索引的搜索键(search key)的哈希值。键的索引哈希指向其关联值的位置,因此无论有多少条目,查找只需一次操作。这是被用于寻址(在《协议基础 002:寻址》中已有介绍)的基本功能之一。

虽然哈希表使数据库能够更高效地检索数据,但它们并不是哈希所支持的唯一数据结构。在哈希表发明 25 年多之后,计算机科学家兼数学家拉尔夫·默克尔(Ralph Merkle)提出并命名了另一种由哈希树组成的数据结构:默克尔树(Merkle tree)。默克尔树的关键创新在于,它们既能高效验证整体数据的完整性,也能验证其中存储的任何单个值。这种验证只需要对数据的一个子集而非整个数据集计算哈希函数。此外,通过查看单个值——即根节点(root),就可以追踪树中任何值的变化。

将所有值一起进行哈希运算来验证大型数据集需要大量计算。如果数据频繁更改,成本可能很高;如果仅需验证数据的一小部分,效率就很低。默克尔树将数据分组为更小的、逻辑上相隔离的部分,每个部分都可以被进行哈希运算,并单独验证。图 2 展示了数据块们(如单条记录)如何被两两结对,形成树的最底层——叶子节点(leaves)。每个数据片段都被进行哈希运算,这些哈希值被两两结对,一起再次进行哈希运算。一起进行哈希运算是指将两个哈希值连起来,形成新的字符串,这也被称为拼接(concatenation)。这些中间层的哈希值被称为节点(nodes)。两两配对进行哈希运算的过程持续进行,直到生成唯一一个根哈希值(root hash)为止。

在这种树状结构中,叶子节点保存实际的数据值,每个非叶子节点都是其子节点们的哈希运算产物。位于最顶端的根节点是从下方所有哈希值派生出的单一哈希值,因此可以轻松地对所有数据进行完整性检查。如果任一叶子节点的数据发生一处变化,节点的哈希值将把变化一直向上传送到新的默克尔根。应用变化并更新根节点只需要对与变化相关的分支部分进行哈希运算。计算几个中间层哈希值比重新计算每个数据片段的哈希值要高效得多。例如,在图三的示例中,将值 3 改为 5 只需要我们对树的右侧和根节点重新进行哈希运算,左侧保持不变。

在这种结构中,也能非常高效地验证特定数据的存在,因为无需整个数据集。要证明某个叶子节点的数据被包含在根哈希中,我们只需其父母节点(parent nodes)到根节点的分支。下方展示了我们需要哪些哈希信息以验证某个特定的数据(叶子节点)确实存在于默克尔树中。

图 4 中的数据代表客户账户的余额。树底部有 6 个叶子节点,每个节点都包含相应余额值的哈希值,由哈希值的前 4 个字符表示。通过如上所述的过程,所有数据的哈希值被依次两两结对,进行哈希运算,得出默克尔根。为了证明余额 2600.00 确实被包含在根哈希中,我们只需要 3 个哈希值,而无需其他数据。图中被标记为红色的值是验证过程所需的 3 个哈希,要被验证的值被标为绿色。

被标为红色的值是外部提供的证明。为了验证值为 2600.00 的叶子节点确实位于上图所示位置,我们依据所提供的分支数据计算默克尔根。被存储的数据(账户余额 2600.00)的哈希值由 4e07 表示,需要首先与其相配对的邻居 4b22 结合。两个哈希值被拼接到一起,生成哈希值 1365,1365 接着与 33b6 配对,生成 85df。这个值与证明中提供的最后一个哈希值 e83e 相配对,生成默克尔根,值为 058b。对字符串的三次哈希运算计算出根节点的值,无需树的其余部分或数据值。

示例中还需注意的一点是,最后一个分支 4358 被复制并添加到所在行的末尾。这展示了树的二进制属性(binary property)。因为我们需要两两配对进行哈希运算,二叉树(binary tree)中任一行的哈希值数量不能是奇数。由于只有 6 个客户余额,会导致第二行有 3 个元素,所以将最后一个节点复制,并将其自身与复制节点相拼接,进行哈希运算,使z节点数量变为偶数。

加密货币的设计前提是任何人都应该能够验证交易的有效性;默克尔树是加密货币的基础构建块。区块链不仅通过连续进行哈希运算以将区块连接起来,每个区块中还包含其交易的默克尔树。用户交易是该树中的叶子节点,树的根节点代表区块中包含的所有交易的输出。如果区块中的某个交易发生变化,默克尔根就会不同,所有后续区块都会受到影响。因此,用户可以确信,如果网络上的其他对等节点(peers)同意最新的默克尔根,他们也同意整个区块链的历史。如果两个用户的最新区块具有不同的默克尔根节点,他们可以查看历史中的默克尔根节点,找出本地区块链副本与对方副本的具体差异之处。

本文介绍了默克尔树的基本形式。诸如默克尔求和树(Merkle sum trees)、稀疏默克尔树(sparse Merkle trees)、默克尔帕特里夏树(Merkle Patricia trees)等变体经过优化,适用于生成包含证明、类似数据库的键-值对存储、高效验证、低存储空间等用途。《协议基础002:寻址》中提过的星际文件系统(IPFS)使用默克尔有向无环图(Merkle Directed Acyclic Graphs,DAGs)来检索分布式数据块。在默克尔有向无环图中,文件数据构成节点。根节点(即整体内容的哈希)可以被网络中的节点用来高效检索数据片段,并验证它们确实属于被请求的文件。

协议基础 005:零知识证明

零知识(Zero-Knowledge,通常缩写为 ZK),是一个密码学领域,类似于我们在《协议基础》系列第一期中介绍的加密(encryption)。

零知识协议另一种方式应用密码学原理:它不像传统加密那样通过混淆数据来保护信息,而是允许在不完全透露数据的情况下证明我们知晓数据。如果我们把传统加密比作一个只能开或关的电灯开关——要么隐藏一切,要么揭示一切,那么零知识证明更像是一个调光器,可以控制可见信息的量。

换句话说,零知识证明使我们能够以概率的方式证明某个陈述或对信息的拥有,而无需透露信息本身。在不揭示实际数据的情况下证明关于数据的陈述的有效性,乍看也许违反直觉,甚至几乎不可能——这正是这些系统如此具有革命性的原因。这一突破性的特点为处理大量数据的、私密且可扩展的应用开辟了新范式。让我们通过一个简单例子以说明其中含义:

鲍勃是一个色盲患者。他的朋友爱丽丝有两个球,一个红色,一个绿色。对患色盲的鲍勃来说,两个球看起来一样。他不相信爱丽丝能可靠地区分它们。爱丽丝可以证明她能够分辨出两个球,而无需让鲍勃知道球的颜色。为了做到这一点,鲍勃在爱丽丝面前双手拿一个球,爱丽丝可以看到鲍勃的哪只手拿着哪个球。然后鲍勃把球放到背后,可能会交换两只手中的球,也可能保持不变。他再次将球展示给爱丽丝,并询问她球是否换了手。假设爱丽丝不是色盲,她会准确地告诉鲍勃。当球在他背后时,他是否交换了手中的球。

第一次这样做时,爱丽丝有 50% 的概率靠运气猜对。鲍勃可以反复重复这个过程。每次爱丽丝猜对,她单纯靠运气猜对的概率就会减半。如果他们重复这个过程 100 次,而爱丽丝每次都猜对了,那么她仅凭运气每次都得到正确答案的概率是 2^100 分之一——这个数字比宇宙中原子的数量还要大。

我们称此为零知识证明,鲍勃从未知道哪个球是绿色或红色,他在任何时候都无法区分它们,但他确信爱丽丝能够区分。

证明者和验证者。 在像爱丽丝与鲍勃和两个彩球这样的证明机制中,参与者有两个不同的角色:证明者 (Prover) 和验证者 (Verifier)。验证者(鲍勃)在改变球的顺序后向证明者(爱丽丝)发起挑战;证明者通过分享其观察结果来创建证明。随着过程的每次迭代,正确答案是巧合的概率迅速趋近于零。

论证(Arguments)。 这种方法的明显局限性是协议的交互性,证明者和验证者间需要进行多轮通信。即使在当今快速计算的环境下,这种持续的来回通信也不实用,因为它限制了协议的运行方式。在实践中,证明涉及复杂的逻辑陈述,这些陈述被分解为更小的组件,类似于高级编程语言被计算机分解为 0 和 1 的序列。在零知识系统中,被评估的陈述称为断言 (Assertion)。经由评估获得的结果称为论证 (Argument),也常被称为证明 (Proof)。

可扩展性(Scalability)。 自 1980 年代以来,零知识证明系统一直是活跃的研究领域。最近的密码学协议已经提高证明的生成效率,使零知识成为一些现实应用的可行解决方案。与零知识研究并行,如求和检查协议 (Sum-check Protocol) [1] 这样的系统被发明出来,通过计算多项式上的单个点来更容易地生成和验证证明。即使在零知识应用之前,求和检查协议就是一项卓越的成就,开辟了新的可能性。1993 年的一篇重要论文中,被广泛引用的句子道出可扩展性为何重要的核心所在:

在这种设置中,一台可靠的个人电脑可以监控一群超级计算机的运行,这些超级计算机可能运行着极其强大但不够可靠的软件和未经测试的硬件 [2]

该协议将检查整个求和简化为仅检查一个随机选择的点。只用单个点进行验证,使得实际的零知识证明可以非常小,从而无需繁重计算即可验证正确性。这些更新、更小的证明被称为简洁的 (Succinct) 或可扩展的 (Scalable)。在这种情况下,可扩展性意味着我们能够从大量数据中生成相对较小的证明,而且验证这个证明所需的资源不会随着数据量线性增长,而是以更慢的速度增加。

参考字符串。 零知识证明的另一个重要创新是引入了证明者和验证者之间共享的参考字符串 (Reference String)。通过在证明者和验证者之间共享一个秘密值,我们可以消除对交互式验证的需求。当然,这是以额外的信任假设为代价的:即共享的秘密未被泄露!

可信设置。 这种权衡简化了证明过程,但为运行此类系统增加了额外负担。如果参考字符串的值泄露给验证方之外的人,将导致不安全的证明系统,任何人都可以生成虚假证明。如果初始设置以安全的方式完成,例如通过使用多方计算 (Multi-party Computation, MPC),该系统可以被认为是安全的。这被称为可信设置 (Trusted Setup)。可信设置通常具有 “n=1” 的信任假设,这意味着只要多方计算中的一个参与者隐藏好她对秘密生成协议的输入,秘密就无法被重构。换句话说,计算秘密需要每个输入,而只要有一个参与者诚实地销毁其输入,就足以保证整个系统的安全性。有了创建安全可信设置的流程,这种权衡是可控的,这类系统已广泛应用于公众近十年。值得一提的是,以太坊社区最近使用了一个有超过 141000 名参与者的可信设置 [3]

SNARKs. 简洁性和可信设置构成了最常用的零知识证明系统的基础:简洁非交互式知识论证 (Succinct Non-interactive Arguments of Knowledge, SNARKs)。

STARKs. 零知识系统的进一步迭代是简洁透明知识论证 (Succinct Transparent Arguments of Knowledge, STARKs)——它们通过透明性改进了 SNARKs。与 SNARKs 不同,STARKs 不需要在系统中使用秘密的参考值来生成证明。因为不需要可信设置,STARKs 系统更易被创建,且在开放的公共系统中广受欢迎。权衡在于透明性要求更大的证明规模和更慢的计算速度,这使得 STARKs 在一些场景中不够实用。

这些方案的可扩展、简洁、以及非交互式特性极为有用。它们允许用户私密且快速地证明信息,并让其他人高效地验证这些证明。讨论零知识的理论可能比较抽象,但这些协议的影响深远。

以下是一些应用示例。零知识证明最明显的好处是为用户提供更好的隐私保护。例如,许多有年龄或地理位置限制的服务可能需要用户提交政府身份证件,而这会泄露其中包含的所有信息。通过零知识技术,用户无需提供完整身份证件,而是可以生成关于他们年龄、身份证件签发地点或两者皆有的证明,而不提供任何额外信息。为了实现这一点,身份证件中的数据需要在零知识协议中形式化。像 STARKs 或 SNARKs 这样的零知识协议是通用系统,其中包含被称为电路 (Circuit) 的特定工具。零知识电路是将计算机程序转换为一系列约束条件,例如,验证身份证件是由有效机构签发,其国家属于特定名单,或者证件尚未过期。

一个零知识电路可能与多个可能的证明生成过程相关联。它还定义了验证的工作方式。任何拥有验证软件的人都可以自行验证证明,而无需原始输入数据(在这个例子里就是身份证件)。

更进一步,支持零知识的身份证件甚至可以用于投票系统。数字化投票一直是一个挑战,因为隐私和信任假设在纸质投票中更容易解决——纸质投票更容易避免单点故障。由于零知识证明旨在保持信息私密的同时公开证明它,它们非常适合民主投票。选民可以投出可验证的选票,而无需透露自己的身份或所投票的党派,且投票的公正性可被独立审计。

通过创建一个公开和开源的证明系统(open-source proof system),并使用电路(circuits)来证明每个选民及其选票的有效性,这种审计成为可能。透明性是必要的,因为封闭系统更容易被操纵。该系统需要包含多个电路,以证明选民的真实性、他们是否已注册、以及他们投了什么票。首先,通过证明一个独特的选民 ID 存在于数据库中,而不透露是哪个ID,可以完成身份验证。基于此,选民可以投票并生成关于选票有效性的证明,以确保它对应于有效选择(例如,特定候选人),而不透露个人投票详情。

在这种情况下,选举的结果是一个系统级别的证明,能够显示所有选票都是合法的且被正确计算。在不披露任何个人选票的情况下,零知识证明是公开可验证的;且如果底层系统是透明的,证明几乎不可能被伪造。

零知识系统正被缓慢采用,应用程序仍在积极开发中,尚不足够稳健,无法完全替代经过更多实战检验的密码学协议。尽管如此,它们开启了令人兴奋的未来可能性。在适合依靠尖端技术的场景中,比如在已经依赖于这些协议的、基于区块链的应用中,零知识证明可以促成新颖协调机制的出现。随着时间的推移,希望其中一些将被证明适合主流使用!

[1] 最初发表于 Carsten Lund, Lance Fortnow, Howard Karloff, and Noam Nisan, “Algebraic methods for interactive proof systems,” Journal of the ACM 39, no. 4 (October 1992): 859–868 (doi.org/10.1145/146585.146605). 另见其中一位作者在其博客中的一些有趣回顾,以及 Eli Ben-Sasson 带来启发的评论:blog.computationalcomplexity.org/2024/02/sumchecks-andsnarks.html。

[2] Carsten Lund, Lance Fortnow, Howard Karloff, and Noam Nisan, “Algebraic methods for interactive proof systems,” Journal of the ACM 39, no. 4 (October 1992): 859–868. doi.org/10.1145/103418.103428

[3] KZG Summoning Ceremony,2022 年。ceremony.ethereum.org

完结 :face_with_tongue:

2 个赞

https://mp.weixin.qq.com/s/Swv48g-ZECCdpYSuM2Tk4A
看到ckb的一个资助项目,抗量子签名算法的网页钱包

1 个赞

这个论文集除了区块链,还有好多有意思的话题!但是我打不开全文:sob:

Their findings, catalogued here, comprise a variety of textual and non-textual artifacts (including art works, game designs, and software), organized around a set of research themes: built environments, danger and safety, dense hypermedia, technical standards, web content addressability, authorship, swarms, protocol death, and (artificial) memory.

1 个赞

你看看这个网站。已经做过三期,所有内容应该都是开源的。

1 个赞

确实反直觉有点绕。。。

我们称此为零知识证明,鲍勃从未知道哪个球是绿色或红色,他在任何时候都无法区分它们,但他确信爱丽丝能够区分。

这里的意思是 在不透露秘密本身的情况下,证明者向验证者确实知道它。

這段內容的理解,也是花了一點時間靜思的。
我是讓自己閉上眼,把自己化作為 Bob,想一下對方是 @跳来跳去
模擬一下,就能夠自己「相信」:跳是「有能力區分」我手中紅綠的球。

自己(Bob)是驗證者,負責驗證跳跳(Alice),是否有能力區分紅球、綠球;
但在整個驗證過程中,自己(Bob)是不需要、也不用、更不能夠獲得關於紅綠顏色的任何具體信息與知識的。

跳跳(Alice)則是證明者,為了證明自己有能力,她只需要如實回答,在不透露紅綠資訊的情況下,向自己(Bob)證明她能分辨紅球與綠球;同樣地,在整個證明過程中,跳跳(Alice)也不需要、也不用、更不能夠使用到關於紅綠顏色本身的任何說明或知識內容。

( 在這裡,我的理解是,自己(Bob)不能接觸也不需要去學習「紅綠知識」本身,卻仍然能夠驗證跳跳(Alice)是否擁有這項知識,並且具備依此進行區分的能力。)

這裡有意思的地方在於:

  1. 跳跳(Alice)要對自己(Bob)所提出的隨機挑戰給出正確回應,藉此證明她「有能力」區分紅綠。這個過程可以不斷重複,而自己(Bob)則是在完全不知紅綠具體狀況的前提下,逐步驗證出她確實擁有這個能力。
  2. 自己(Bob)則是透過將球背到身後,隨機執行「交換或不交換」的動作,然後再把隨機結果正面呈現給跳跳(Alice),發起一次隨機挑戰;由跳跳(Alice)回答這次是「交換」還是「沒交換」,藉以證明她能分辨。這樣的挑戰可以重複多次,直到自己(Bob)對跳跳(Alice)確有此能力感到足夠信服為止。

最後自己的 Memo
也就是身為自己(Bob),從頭到尾是“看不見、看不懂”其內容,但自己(Bob)在這個比喻中掌握隨機性與連續且重複實驗性,可以驗證他人擁有該內容的“能力”。而自己對“內容”一概不知。
而跳跳(Alice)整個過程,僅是實際掌握了“內容”,不需要、也不用提供該內容實際情況。經由進行與內容不直接相關的隨機性、重複性的驗證後,使他人信任掌握該內容的”能力“。


Alice 向 Bob 完成零知識證明!
Alice 透過對 Bob 一連串隨機且重複的挑戰回應,完成了「零知識證明」;
Alice 證明了自己擁有某個知識的能力,而 Bob 驗證了 Alice 擁有該能力;
但 Bob 也無從於 Alice 回應中,獲得某個知識本身,或學習到這份知識能力的

粗暴的說: Bob 知道 Alice 會那個知識。
Alice 會什麼知識」?Bob 不知道那個「知識」是什麼。
但 Bob 確實驗證過並信任:Alice 真的「會」那個連 Bob 自己不知道的「知識」。

非对称加密与零知识证明。区块链底层的密码学原理中最吸引人的两个地方。