比特币和以太坊中的Multisig合约和地址


现代去中心化网络中的多重签约合同是一个功能强大的工具,可让您简单而可靠地保护集体帐户中的资金,以及与多个参与者进行交易。 如果您对如何使用此类地址感兴趣,则只需了解拥有这些地址的机制,并对交易顺序有所了解。 要使用此类地址,需要多个帐户的参与。


尽管名称相同且工作逻辑相似,但是与受多重签名保护的地址进行交互的内部算法和方法在比特币和以太坊中却大不相同。 本文将讨论有关此内部设备的信息。


我们将讨论两个网络:比特币和以太坊。 在其他区块链中,可以以完全不同的方式实现对加密资产的多重签名访问。


引言


假设我们有一项任务是保护资金免遭存放组织资金的地址(帐户,如果银行术语更接近您)的未经授权的访问。 几个人都可以访问该地址(从该地址到外部地址进行交易的能力),例如总帐,财务帐目和总帐。 为了保护金钱,如果有人迫使这个三位一体的人签署结论,那就有多重签名。 在比特币和以太坊中,您可以创建一个地址,从中提取资金不需要一个,但需要多次确认。


现在,希望创建提款交易的三个参与者中的每个参与者都必须提供其签名,以确认他同意交易。 收集到足够的签名后,资金便会转移。 此逻辑称为多重签名:发送M个签名中的N个(M> N)以确认操作。


对于分散网络,multisig是一种本机模式,因为通过设计发送到某个地址的任何有效交易都包含由发送者的秘密密钥创建的电子签名,因此,大多数现代区块链已经包含了multisig地址所需的几乎所有功能。


最有趣的是最简单的multisig地址2/3,只有通过三个参与者中的两个同意才能得出结论。 这样的多重签名能够方便且安全地与第三方进行许多交易,并且当两个参与者信任第三者来判断他们时可以解决问题。 使用multisig 2/3几乎可以实现其中存在第三方受信任方的所有金融服务。 例如,使用信用证:付款人赚钱并且不能接受,除非他说服银行(购买单据尚未到达)或收款人(善意)同意这一点。 如果卖方不退还(按照自己的意愿)钱,或者银行没有通知必要的单据已经到达并由他检查,则收款人也将无法收款。 在该计划中,银行的服务非常简单:当看到购买公寓的协议时,它没有将钥匙带到商店的钥匙,而是简单地将批准发送到多签名地址。


服务的会计和付款任务也趋向于multisig 2/3:通常需要第三方来决定是否提供服务以及提供的程度。 Multisig,三个签名之一属于该组织,该组织最终决定是否提供服务(例如,向法院提供),这意味着法院在对当事方之一有利的情况下,只需签署其决定并发送交易,即可自动解锁资金为胜利的一面。 对于U2或AirBnB之类的B2C服务,多重签名虽然是隐式的,但仍是主要的工作模式:提供服务时,服务发起请求的签名是由服务发起的,它从客户向驾驶员或公寓的所有者发送资金。


通常,一种方便实施的多重信号-如卡拉什尼科夫突击步枪:便宜而开朗,适合在家中使用,并需要花费数百万美元。 在区块链中,所有这些都是“无需注册和SMS”(从安全性的角度来看,顺便说一句,这是一个相当严肃的论点,如果您考虑一下的话)。


我们将考虑两个区块链-比特币和以太坊。 我必须说,它们中的内部multisig设备是完全不同的,一切工作都不同。 但是,让我们不要超越自己。


比特币multisig


比特币实际上并不像它看起来的那么简单。 它的设计使您可以实施轻量级且非常安全的方案,以获取资金。 好吧,我补充说,纯粹以我个人的观点,比特币的结构和算法都经过深思熟虑,是最优的,而且非常漂亮。 X比特币在地址之间的标准转换只是默认的交易类型,这是潜在比特币功能的冰山一角。 从代码的角度来看,转换BTC的默认交易是最简单的multisig 1/1:要使用地址a1中的X比特币,您需要在交易中附加使用属于地址a1的秘密密钥创建的电子签名。 让我们看一下比特币交易的结构,并对其工作原理进行更深入的研究。


图片


比特币中有一个要求:存储在某个地址的所有BTC总是整个消耗。 也就是说,在确认了自己拥有地址的权利后,交易将花费所有余额,并将其分配给多个输出。 在现实生活中,将投入和产出之间的差额留给矿工作为佣金,但是对于本文而言,这并不重要。


想象一下情况。 Vasya获得了50 BTC。 Vasya希望发送Peta 0.5 BTC。 为此,他必须花费全部50 BTC。 为了进行更改,Vasya接受一个输入(50 BTC)并创建两个输出:


  • 0.5 BTC到Petit的地址;
  • 49.5 BTC到您自己的地址之一。

当他们说“ Vasya签署交易”时,这对于比特币来说并不完全准确。 Vasya对交易中的所有输入进行签名,每个输入都是一个单独的比特币地址,每个输入都需要一个对应的密钥。 假设Vasya有三个地址,他的三个朋友分别向这三个地址发送了0.1 BTC。 要花费0.25 BTC,Vasya将必须签署三个输入(每个为0.1)并形成两个输出(作为更改,收件人的地址为0.25,本人的为0.05)。 这种方案尤其允许永远不要使用相同的地址两次,并且每次都将更改返回给新地址。 某些钱包(例如Electrum)允许所有者选择策略来重用地址,更私有(每次都是新地址)或更简单,但具有永久地址(如果您诉诸复杂的常规交易,则更方便)。 我提醒您,投入与产出之和的差额既是矿工的佣金,又简单又可靠。


现在,我说的不是“ Vasya签署交易”,而是“ Vasya签署输入”。 但是我故意遗漏了几点,以免使整个计划复杂化。 事实是,比特币中的地址不是其最纯粹形式的公钥,而是其哈希值(具有多个服务字节和版本的哈希值的两倍,Bitcoinwiki 文章中的详细信息),也就是说,在正常交易中,发送者甚至都不知道接收者的公共密钥。 因此,除了签名本身之外,Vasya还要对输入进行签名,还使用自己的公钥向Bitcoin Script呈现,从而将其公开。 自然,知道公钥,您可以轻松生成一个比特币地址。


除了对输入进行签名之外,Vasya还为每个输出设置条件,即如何从该特定输出中花费BTC。 但是“要求”是由将要接收比特币的人提供给他的:他担心他如何使用他的比特币。 这是非常重要的一点。 比特币地址包含代码中的哈希,该哈希将决定是否允许该地址的BTC。


如果您仍在寻找类比,那么Vasya将附加到每个输出(他由接收BTC的人收到的输出)的数据,该数据回答以下问题:“真正的签名者应返回什么代码和什么数据,才能认为签名者是此输出的所有者?” 。 这是Python学者的另一个类比:您可以想象每个输出都包含一个lambda函数,由Petya执行并为其提供参数的lambda函数将返回true或false。 如果返回true,则Petya可以将输出用作后续事务的输入。 在默认版本中,程序可以采用Petya提供的两个参数-输出的签名和Petin的公钥-并验证签名。 如果返回true,则Petya有权输出并可以使用它; 因此,交易有效。 不必在Script中深入研究本文的框架,但这是非常可取的。 顺便说一句,赎回脚本-这是非常聪明的合同,即BTC权利从一个地址传递到另一个地址的正式规则。 网络的客户端在交易期间执行每个交易中的每个脚本,以检查其是否有效。 如果有效-来自特定地址的有效和不可否认的比特币浪费。


这是关于该主题的第一篇优秀文章,我强烈建议您阅读该文章,并完整地描绘了python示例中的整个原始机制: 比特币是困难的方式:使用原始比特币协议 。 还有另一个: 简而言之,比特币-交易


让我们回到multisig 2/3,请注意,通常将带有比特币转让的交易也视为multisig 1/1。 假设Petya希望Vasya只是将BTC转移给他。 Petya为Vasya提供了用于缝制默认脚本哈希值的地址,并且比特币可以通过提供标准的签名验证码和签名本身来从该地址提取比特币。 比特币中的此类“传统”地址以数字1(单位)开头。 缝制“非常规”代码(检查multisig脚本)的地址称为按脚本付费,并以3(三重)开头。


比特币允许我们创建一个地址,在该地址中将缝制我们自己的赎回脚本的哈希值。 毕竟,这是我们的问题,因为我们将花费我们的BTC,而不是发送它的BTC。 我们不在乎谁将比特币转移到地址,但是重要的是,当我们要花费它们时,我们必须提供与该地址对应的代码。 也就是说,通过要求我将BTC转移到按脚本付款地址,我保证稍后在使用此输入的交易中提供脚本本身。


根据文档,对于这种multisig代码使用:


----------------------------------------------------------- Pubkey script: OP_HASH160 <Hash160(redeemScript)> OP_EQUAL Signature script: <sig> [sig] [sig...] <redeemScript> ----------------------------------------------------------- 

有关脚本和multisig的续篇


我们需要一个脚本,以便所有必需的签名都可以在消费交易中立即呈现。 例如,如果我们的multisig 2/3包含三个参与者(CEO,首席会计师和系统管理员)的地址,并且签名的密钥分别位于他们的计算机上,那么为了形成支出交易,系统管理员将必须:


  • 产生支出交易;
  • 创建自己的签名;
  • 将交易的内容转移到第二个签署人(例如,去会计部门或使用闪存驱动器的总帐);
  • 要求第二签名人在交易中添加签名;
  • 使用三个签名中的两个将交易发送到网络。

这不是一种非常简单的方法,但是它允许您使用与网络完全断开并且不能保证合并密钥的计算机作为签名方之一。 在这种情况下,资金提取完全是“手动”的,这对于大量提取来说是相当不错的。 朋友们,进入21世纪,现在流行的做法是将零笔记本电脑放在没有网络连接且安装了唯一软件-比特币钱包的保险箱中。


以太坊多重签名


由于内部客户端网络算法的设计不同,以太坊中的multisig的实现与比特币中的实现非常不同,但存在并行性。 在以太坊中,类型为“ create_contract”的特殊交易在网络上创建一个地址,特定合同的代码绑定到该地址。 该地址也有一个以太币余额。 如果您在此处发送以太币,地址“将使其平衡”。 反之亦然,如果您从该地址发送以太币,它将“从资产负债表中删除”。


我立即提出了一些非常准确的类比,以理解一个非常简单且合乎逻辑的厨房。 如果我们忘记了共识以及节点如何更新区块链,并将区块链视为抽象存储,那么可以将合同的放置与对象实例化进行比较,即将类变成RAM中的真实对象。 打个比方,内存是区块链,类代码是合同代码。 实例化之后,对象(合同)在“内存”中接收其自己的地址,并且网络知道与它的接口,以方法类中描述的形式表示。


在这种方案中到达地址的事务是写者方法,它们更改合同对象的内部状态。 网络的任何客户端都执行方法读取器,该方法读取器仅从合同状态读取数据,因为可以确保其对象的副本是正确的,并且已得到块生产者的共识确认。 同样重要的是要理解,当矿工“应用”到达现有合同的交易时,将执行合同代码,在我们的版本中,它仅调用其中嵌入了参数的合同方法之一。


好吧,由于合同具有内部状态(在我们的类比中为对象字段),因此它可以实现多重签名,而无需在一个事务中发送签名。 我们创建一个合同,当提款交易到达时,在其中我们对签署者的地址进行硬编码-我们将合同顺序转移到所需确认数量的等待状态。 如果我们谈论的是multisig 2/3,它可能看起来像这样:


  • 系统管理员将多重签名合同部署到网络中,并在其中放置总经理和总会计师的地址;
  • 满意的客户向合同发送了大量的乙醚;
  • 总会计师将要支付大笔费用,并向合同发送一笔交易,希望将一些以太币转移到外部地址;
  • multisig-contract进入“我希望有N个确认”状态,在我们的情况下,一个就足够了;
  • 首席执行官想帮助总会计师,但他忘记了在哪个笔记本电脑中需要密钥;
  • 系统管理员发送交易-确认向合同提取资金;
  • 合同在接受了系统管理员的交易后,便知道已经拨打了必要的N个确认,并将广播发送到总会计师指定的地址,同时又返回到简单的收款状态。

取决于多重签名合同的实现,许多事情可以以不同的方式实现。 这适用于存储未完成的提款单,等待提款的时间间隔,方便的限制。 例如,您可以允许提取不超过特定限制的金额,而无需多重签名,如果超过限制,则需要确认。


multisig钱包合同代码有多种选择;您可以轻松找到它们。 其中最正式的就是这个 。 多重签名合同以及多重签名合同还有很多修改,但是甚至不知道,因为在哲学意义上具有多个角色的任何合同都是多重签名。


结论


我们研究了构建复杂合同系统和组织多边交易的最重要砖头之一的操作方案。 在哪里可以感觉到多重签名地址的最简单方法是:


  • 对于比特币:Electrum钱包有详细的分步说明,并提供了有关如何创建和配置多重签名地址以及如何使用它的屏幕截图的截图。 只需搜索Electrum multisig;
  • 对于以太坊(Ethereum):标准以太坊钱包中有一个“合同”部分,您可以轻松地创建多重签名。 此外,在启动标准合同的平台上肯定会以多种形式显示multisig,例如,我们的Smartz.io中已经有一个。

如您所见,在区块链上,这些方案非常技术性和简单性,因此请乐于使用并正确保护您的加密货币财富。

Source: https://habr.com/ru/post/zh-CN412675/


All Articles