← 返回文章列表

原文:Discovering Bitcoin Part 6: Digital Contracts

发现比特币第六部分:数字合约

作者:Giacamo Zucco· 2019-09-21· 5 分钟
发现比特币第六部分:数字合约

图片:Bitcoin Magazine

TL;DR — 快速摘要

  • 数字签名技术允许在无中央权威的情况下验证所有权,实现去中心化的资产转移
  • 脚本系统将交易转变为可编程的「智能合约」,可设定多签、时间锁等复杂条件
  • UTXO模型相比账户模型大幅提升了隐私性和可扩展性,CoinJoin技术通过混合交易打破统计关联性
  • 「线性签名」方案可聚合多个签名,进一步节约资源并模糊交易关联
发现比特币第六部分:数字合约

这是比特币爱好者 Giacomo Zucco 系列文章「发现比特币:从穴居人到闪电网络的简要概述」的第六篇。阅读该系列简介:发现比特币第一部分:关于时间,发现比特币第二部分:关于人,发现比特币第三部分:引入货币,发现比特币第四部分:一个错误的转向(需要新计划)!以及发现比特币第五部分:数字稀缺性。

在「发现比特币」系列的第六部分中,我们将基于使用数字谜题再现稀缺性的理念,以及供应控制机制对赋予数字货币「硬度」的重要性,来探讨通过签名和脚本证明所有权的概念,以及名为 CoinJoin 的技术。

证明所有权:签名

我们的货币 B 计划第二次将我们的注意力引向「人」的议题以及「谁?」的问题。

你已经为新的聪(sats)的发行设定了条件,但转账呢?谁有权更改共享资产负债表中的数据,转移所有权?

如果存在一个负责重新分配聪的中央机构,按照当前所有者的指令行事(也许像之前的 e-gold 实验那样用经典的用户名加密码登录系统),那就会再次出现一个马洛里(Mallory)可攻击的单点故障:既然如此,又何苦从实物黄金转向基于 PoW 的「数字稀缺性」呢?另一方面,如果每个用户都有平等的重新分配所有权的权利,那你的系统根本就无法运作:每个人都会不断地把别人的聪分配给自己。你需要某种一致的、可独立验证的权威定义协议。

解决方案是一种称为「数字签名」的密码学技术。它的工作原理如下:首先,爱丽丝(Alice)选择一个称为「私钥」的随机数,她将严格保密这个数字。然后,她将这个数字输入一个特殊的数学函数,这个函数单向容易计算但逆向几乎不可能。结果得到另一个称为「公钥」的数字,爱丽丝并不保密这个数字:相反,她确保鲍勃(Bob)知道这个公钥。最后,她将私钥和消息输入第二个同样难以逆向的函数,得到一个巨大的数字,称为「签名」。鲍勃可以用第三个数学函数,将消息、签名和爱丽丝的公钥作为输入,得出一个肯定或否定的验证结果。如果结果肯定,他可以确信爱丽丝授权了这条消息(「认证」),她以后无法否认该授权(「不可抵赖性」),并且消息在传输过程中未被篡改(「完整性」)。

数字签名示意图

在某种程度上,这类似于手写签名(因此得名),手写签名容易让大家对照一些公开样本进行验证,但如果没有「正确的手」就很难复制。或者像火漆印章:容易让大家对照公开印章登记册进行验证,但没有正确的蜡模就很难复制。

因此,你修改了协议,使得工作量证明的碎片可以通过数字签名独立重复使用。你实现的第一个模型很简单:每个用户独立生成一个私钥,并创建一个以相应公钥为标签的公开「账户」。当用户想要转移所有权时,他们创建一条包含其账户、接收账户以及想要转移的聪数量的消息。然后,他们对这条消息进行数字签名并广播,每个人都可以验证。

有趣的是,许多知名(尽管可能是化名的)开发者可以使用类似的方案来签署软件的不同版本,以便他们可以自由地修改、改进、修复、更新、审计和审查代码,而你系统的任何最终用户都可以在运行他们偏好的版本之前独立验证这些签名,利用一个最小化和碎片化的信任网络,无需单一权威机构来集中分发软件。这一过程实现了真正的代码去中心化。

代码签名

脚本与「智能合约」

然而,你并不希望将每个节点在接受共享资产负债表任何变更之前需要检查的条件,仅仅限制为数字签名的有效性。

你决定每条消息还可以包含一个「脚本」:一组指令,描述接收账户(或多个账户)在再次花费时需要满足的附加条件。例如,发送方可以要求多个密钥的组合(与关系或或关系),或指定一个特定的等待时间才能花费。从这些非常简单的(易于审计的)原语出发,可以构建复杂的「智能合约」,使货币真正实现「可编程」,即使没有中央参与方。

黑暗性(和可扩展性)问题

与加密消息系统不同(如果爱丽丝发送给鲍勃一些消息,只有鲍勃能阅读),你的方案并不真正针对黑暗性进行优化(如果爱丽丝发送给鲍勃一些聪,她的消息将不得不向鲍勃之外的人公开——至少会向以后将收到相同聪的人公开)。

货币在流通。收款人无法信任任何资金转账,即使签名正确,如果他们无法验证所转的聪确实已被转移给该特定的付款人,依此类推,追溯上去,一直到最初的基于 PoW 的发行。随着聪的充分流通,活跃节点将了解到大量的历史交易,法证分析技术可以被用来统计关联金额、时间、元数据和账户,从而使许多用户去匿名化,剥夺他们的可否认性。

这是有问题的:正如第二部分所讨论的,黑暗性是货币的基本品质,无论是出于经济原因还是社会学原因。

智能合约使这个问题更加严重,因为特定的花费条件可能被用来识别特定的软件实现或特定的组织政策。

这种黑暗性的缺失比之前影响你的 e-gold 实验的问题更为严重:诚然,那时你将大部分交易元数据存储在你的中央服务器上,但至少只有你——而不是几乎所有人(包括许多马洛里的代理人)——能够访问这些数据!此外,你可以实现一些特别先进的密码学策略,让自己至少部分「盲目」于用户之间实际发生的事情。

这个设计还有一个较小的可扩展性问题:数字签名相当大,收款人为了验证一切需要接收的转账链条会包含许多签名,使验证的成本可能更高。此外,账户变更很难并行验证。

新范式:「CoinJoin」

为了缓解这些问题,你决定将模型的基本实体从类似银行的「账户」改为「未花费交易输出」(UTXO)。

每条消息不再包含将聪从一个账户转移到另一个账户的指令,而是包括一组来自过去交易、作为「原料」被「消耗」的旧 UTXO,以及一组作为「产品」被「生成」并准备用于未来交易的新 UTXO。鲍勃不再发布一个单一的静态公钥作为通用账户参考(如银行 IBAN 或电子邮件地址),而是必须为他想收到的每笔付款提供新的、一次性的公钥。当爱丽丝付款给他时,她签署一条消息,「解锁」一些来自先前创建的 UTXO 的聪,然后将它们「锁定」到新的 UTXO 中。

UTXO模型示意图

就像实物现金一样,可花费的钞票并不总是与付款请求完全匹配——常常需要找零。例如,如果爱丽丝想付给鲍勃 1,000 聪,但她只有几个各锁定 700 聪的 UTXO,她将签署一笔交易,消耗其中两个 700 聪的 UTXO(解锁总共 1,400 聪),并生成两个新 UTXO:一个与鲍勃的密钥关联,锁定付款(1,000 聪),另一个与爱丽丝的密钥关联,锁定找零(400 聪)。

假设人们不重复使用不同笔付款的密钥,这个设计本身就增加了黑暗性。但当你的用户开始意识到,一笔交易中消耗和生成的 UTXO 不必只来自两个实体时,效果就更明显了!爱丽丝可以创建一条消息,消耗她控制的旧 UTXO 并生成新 UTXO(与鲍勃关联),然后她将这条消息传给卡罗尔(Carol),卡罗尔只需添加她想消耗的旧 UTXO 和她想创建的新 UTXO(与丹尼尔(Daniel)关联)。最后,爱丽丝和卡罗尔都签名并广播这条复合消息(同时支付给鲍勃和丹尼尔)。

这种 UTXO 模型的特殊用途称为「CoinJoin」。(触发警告:在实际比特币历史中,这种用途并非中本聪设计 UTXO 模型本身的原因,而是在系统启动多年后,由其他开发者发现的该设计的一个潜在变体。)它打破了输出之间的统计可关联性,同时保留了所谓的「原子性」:交易要么完全有效,要么完全无效,因此爱丽丝和卡罗尔无需信任彼此。(如果其中一方在添加自己的签名之前试图篡改部分签名的消息,已有的签名将失效。)

CoinJoin概念

你的系统可能有一个变化,可以进一步改善这种情况:一种与你现在使用的不同的数字签名方案,这种方案「对签名是线性的」。这意味着:取两个私钥(无非是两个数字),用每个私钥签署同一条消息,然后将得到的两个签名(也只不过是两个非常大的数字)相加,结果恰好是对应于与那两个初始私钥相关联的两个公钥之和的正确签名!

这听起来很复杂,但其含义很简单:爱丽丝和卡罗尔在使用 CoinJoin 时,可以将它们各自的签名相加,只广播总和,每个人都可以用它们的公钥之和来验证!因为,正如我们所说,签名是交易中最「重」的部分,能够只广播一个签名而不是多个,可以节省大量资源。外部观察者最终会怀疑每一笔交易都是 CoinJoin,因为许多用户可能为了效率收益而使用它。这个假设将打破大多数法证启发式分析。

签名聚合

即使没有这一进一步改进,UTXO 模型已经在某种程度上提高了可扩展性:与账户模型中的状态变更不同,它允许验证被高效地批处理和并行化。

UTXO可扩展性

到目前为止,你已经了解到:

  • 你可以使用数字签名实现所有权去中心化,用于资产转移;
  • 你可以通过脚本系统将交易转变为可编程的「合约」;
  • 一个称为 CoinJoin 的更复杂范式可以进一步提升黑暗性和可扩展性。

但是现在,既然你的用户可以以完全去中心化的方式发行和转移聪,他们如何确保遵循单一的时间顺序,防止双重支付攻击或篡改通胀时间表?我们将在最后一篇「发现比特币第七部分:缺失的拼图」中回答这个问题。