如何通过区块链数字合约实现所有权下放?

发表时间: 2020-03-27 20:53

作者 | Giacomo Zucco

译者 | 天道酬勤 责编 | 徐威龙

出品 | 区块链大本营(blockchain_camp)

在本文中,我们将基于使用数字拼图作为重现稀缺性方式的思想,及基于供应控制机制以赋予数字货币一定硬度的重要性,以探索货币的概念。通过签名和脚本以及称为CoinJoin的技术证明所有权。

证明所有权:签名

我们的资金计划使我们第二次把注意力集中在人的话题和“谁”的问题上。

你为发行新sat确定了条件,但转让它们又如何呢?谁有权更改共享资产负债表中的数据,转移所有权呢?

如果有一个负责重新分配sat的中央机构,则按照当前所有者的指示进行操作(例如,可以使用经典的用户名和密码方法登录系统,就像你之前的电子黄金实验一样), 脆弱的单点故障再次出现:为什么还要从物理黄金转移到基于PoW的“数字稀缺”呢?另一方面,如果每个用户都具有重新分配所有权的平等权利,那么你的系统将根本无法正常工作:所有人都会被鼓励继续将其他人的sat分配给自己。你需要某种一致的权威定义协议,每个人都可以独立检查。 解决方案是一种称为数字签名的加密技术。它是这样工作的:首先,Alice选择一个随机数,称为私钥,她将这个数字绝对保密。然后,她通过一个特殊的数学函数将该数字传递给该数学函数,该函数易于在一个方向上应用,但几乎不可能反转。结果是另一个称为公钥的数字,Alice根本没有保密,相反,她确保Bob知道它。最终,她通过第二个函数传递私钥和消息,该函数又很难逆转,这导致一个很大的数字,称为签名。 Bob可以将第三个也是最后一个数学函数应用于消息,签名和Alice的公钥,从而进行肯定或否定验证。如果结果是肯定的,则他可以确定Alice授权了该消息(身份验证),她以后将无法拒绝该授权(不可否认性)并且该消息在传输过程中没有被更改(完整性)。

在某种程度上,它类似于手写签名(因此得名),每个人都可以很容易地检查一些公开样本,但是如果没有”正确的手“的所有者,则很难复制。或者打蜡封印,每个人都很容易根据公章等即便进行检查,但是如果没有正确的蜡模,则很难复制。因此,你可以更改协议,来使工作证明的一部分可以通过数字签名独立地重复使用你实现的第一个模型很简单:每个用户独立生成一个私钥并创建一个公共帐户,并标有相应的公共密钥。当用户想要转让所有权时,他们会创建一条消息,其中包括他们的帐户,接收帐户以及他们想要转让的sat数量。然后,他们对消息进行数字签名和广播,每个人都可以验证。 有趣的是,许多著名的(但可能是假名的)开发人员都可以使用类似的方案来对软件的不同版本进行签名,以便他们可以自由地更改,改进,修复,更新,审核和查看软件,以及系统的任何最终用户。可以在运行各自的首选版本之前,利用最小化和零散的信任网络独立地验证所述签名,而无需单一授权来集中分发软件。此过程可实现真正的代码去中心化。

脚本和智能合约

不过,你不希望在接受共享资产负债表中的任何更改之前将每个对等方必须检查的条件限制为仅仅是数字签名的有效性。

你决定每个消息还可以包含脚本:一个描述说明接收帐户(或多个帐户)必须再次满足才能再次花费的其他条件。例如,发件人可能需要几个秘钥的组合(链接或分离)或特定的等待时间才能消费。从这些非常简单(且易于审计)的基本类型开始,可以构建复杂的智能合约,即使在没有中央参与者的情况下也可以有效地对资金编程。

耐用性(和可伸缩性)问题

与一个加密的消息传递系统(如果Alice向Bob发送一些消息,只有Bob可以阅读它们)不同,你的方案并未真正针对耐用性进行优化(如果Alice发送Bob给sat,则必须在Bob之外显示她的消息,至少对以后将获得相同sat的人而言)。

资金在循环。收款人不能信任任何转账,即使签名正确,也不能验证所转让的sat是否已真正转移给该特定付款人,依此类推,从上游回到最初的基于PoW的发行。只要sat有足够的流通量,活跃的同行就可以了解大量过去的交易,并且可以使用取证分析技术对数量,时间,元数据和帐户进行统计关联,从而使许多用户匿名,并消除他们的可否认性。

这是有问题的:正如在第2部分中所讨论的,耐用性对于金钱来说是一种基本的品质,无论从经济还是社会学的角度来看都是如此。

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

这种耐用性的缺乏比影响你先前的电子黄金实验更为严重。那时,你将大多数交易元数据存储在中央服务器上,但至少是只有你自己,而不是任何人 (包括许多Mallory的代理商),谁可以访问!此外,你可以实施一些特别高级的加密策略,以使自己至少部分看不见用户之间实际发生的情况。

与此设计相关的还有一个小的规模问题:数字签名非常大,为了验证一切,收款人需要接收的传输链包括许多签名,这可能会增加验证的成本。此外,帐户更改很难并行验证。

一个新范例:“ CoinJoin”

为了缓解此类问题,你决定将模型的基本实体从类似银行的帐户更改为未使用的交易输出(UTXO)。

与将sat从一个账户转移到另一个账户的指令不同,现在每条消息都包含一个旧的UTXOs列表,这些旧的UTXOs来自于过去的交易,作为成分被消费,还有一个新UTXOs列表,作为产品“生成”,为未来的交易做好准备。

Bob必须为他希望接收的每笔付款提供新的、一次性的公钥,而不是发布一个单一的、静态的公钥作为通用帐户引用(如银行IBAN或电子邮件地址)。当Alice付钱给他时,她签署了一条信息,解锁以前创建的UTXO的一些sat,并将它们重新锁定到一些新的UTXO中。

就像有现金一样,可支出的账单并不总是与付款请求匹配,因此经常需要进行更改。例如,如果Alice想向Bob支付1,000座卫星,但她仅控制几个锁定700座卫星的UTXO,她将签署一项消耗700颗卫星的UTXO(解锁总数为1,400座卫星)中的两个并生成两个交易新的UTXO:一个与Bob的密钥相关联,锁定付款(1,000 sat),另一个与Alice的密钥相关联,锁定更改(400 sat)。

假设人们不会为了不同的支付而重复使用密钥,那么这种设计本身就增加了黑暗。但是,当您的用户开始意识到由单个事务消费和生成的UTXOs并不一定来自两个实体时,情况更是如此。

Alice可以创建一条消息,使用她控制的旧UTXOs并生成新的UTXOs(与Bob关联),然后她可以将该消息传递给Carol, Carol可以简单地添加她想要消费的旧UTXOs和她想要创建的新UTXOs(与Daniel关联)。最后,Alice和Carol都签名并广播了合成消息(同时向Bob和Daniel付费)。

UTXO模型的这种特殊用法称为“CoinJoin”。(触发警告:在比特币的实际历史中,这种用法并不是中本聪设计UTXO模型本身的依据,而是在UTXO发布多年后,其他开发者在设计上发现了一个潜在的问题)。它打破了输出之间的统计可链接性,同时保留了所谓的原子性:事务要么完全有效,要么无效,因此Alice和Carol不必相互信任。(如果其中一个试图在添加自己的签名之前更改部分签名的消息,则现有的签名将无效。)

你的系统可能会进行更改,实际上可能会进一步改善这种情况:一种不同的数字签名方案,可以替代你现在使用的数字签名方案,它是线性签名。这意味着:在获取两个私钥(除了两个数字之外什么都没有),对每个消息签名相同的消息,然后将结果签名(也就是两个非常大的数字)加在一起,结果恰好是对应的正确签名与两个初始私钥相关联的两个公钥之和。

这听起来很复杂,但是含义很简单:当CoinJoining时,Alice和Carol可以将其各自的签名加起来,然后只广播总和,每个人都可以对照他们的公钥总和进行验证。正如我们所说,由于签名是交易中最重的部分,因此只广播一个而不是多个广播的可能性将节省大量资源。外部观察者最终会怀疑每笔交易都是CoinJoin,因为许多用户可能会追求效率提高。该假设将打破大多数法医启发式。

即使没有进一步的改进,UTXO模型也已经以某种方式提高了可伸缩性:与帐户模型中的状态更改不同,它可以使验证有效地进行批处理和并行化。

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

  • 你可以使用数字签名进行所有权下放;

  • 你可以使用脚本系统将交易转换为可编程的智能合约;

  • 称为CoinJoin的更复杂的范式可以进一步增加黑暗度和规模。

但是,既然你的用户可以完全去中心化的方式发行sat并转移它们,它们如何才能确保遵循单一的年表,从而避免双重支出的攻击或试图修改通货膨胀时间表?

这是留给大家的思考题,希望这篇文章对你有用,欢迎评论区和我们讨论。