BitSignature如何在比特币中工作

在本文中,我们将研究多重签名在比特币协议中的工作方式。 请注意,在其他加密货币和数字货币中,这些机制的实现方式可能有所不同-取决于交易模型。 我们将给出一个多重签名的定义,我们将使用一个交易示例来示意性地分析其结构,并在使用时考虑使用它的选项和注意事项。 我们将尝试公开披露拟议的改进主题P2SH,并且还将在该图上分析将付款发送到具有多重签名的地址的机制。 我们认为,所介绍的材料将吸引其活动或关注领域与数字货币有关的读者。

多重签名地址


多重签名地址(简称为multisig地址)是一个比特币地址,一次将几对ECDSA密钥附加到该比特币地址。 每对都包含私钥和公钥。 可以使用这些键的组合模式可能不同。 而且,可以建立条件,在该条件下必须提供几个签名以便从地址花费硬币。

使用多重签名的比特币交易


可以更详细地显示它。 就目前而言,可以形象地想象一下,通过一次散列几个串联的公钥来形成一个多重签名地址。 我们将更详细地考虑这一点。 该图显示了使用多重签名地址进行交易的交易。

图片

灰色表示标题区域。 它包含两个字段。 蓝色表示两个输入,绿色表示两个输出。 第一个条目包含填充字段:写入前一交易的哈希值,该值花费硬币数据,出口号等。scriptSig字段包含公钥和签名,这对于正常交易是典型的。

注意事务的第二个输入。 scriptSig字段包含数据的另一种组合:列出了两个公用密钥和两个签名。 它们必须分别通过这些公钥进行验证。 这是花费具有多重签名地址的硬币的交易输入。 这就是硬币所有权证明的样子。

按键组合选项


使用多重签名地址时,有各种按键组合。 最常用的选项是2之2、3之2和3之3。 最大可能的选项是15之15。

最简单的组合是2之2。 这意味着存在一个将两个密钥对绑定到的多重签名地址,实际上,两个公共密钥连续散列在一起,并且接收到某个地址。 要从该地址花费硬币,您需要提供两个签名,这两个签名将由两个可用的公钥进行验证,以正确的顺序进行串联和散列应赋予该地址相同的值。 总而言之,有两个预安装的密钥,您需要两个签名,这两个签名将分别被检查。

多签名地址2之3的使用意味着必须使用三个预定义密钥中的任何两个来验证作为硬币所有权证明提供的两个签名。 换句话说,为了花费硬币,您需要提供两个签名,这些签名将通过预定义的三个中的两个公钥进行检查。

如您所知,三合三的组合需要三个签名,这将由三个预安装的密钥进行检查。 就所需的签名和公共密钥而言,最大数目为15的15。

让我们看一下使用这些组合的选项。

2之2


想象一下,夫妻希望维持共同的预算。

图片

他们同意,只有得到他们各自的同意,预算中的资金才能用于某些需求。 使用比特币,这可以非常简单地实现。 他们根据此方案创建一个多重签名地址,其中妻子控制一个密钥,而丈夫控制第二个密钥。 这样,家庭将在这些地址获得所有收入,并且只有经过双方同意才能花钱。

预测您对夫妻不同意的情况的问题,想象一下妻子认为自己有必要购买洗衣机,因为她厌倦了用手洗衣服,而丈夫认为这不是那么辛苦,将所有硬币花在上面更方便最新的PlayStation型号,并以此方式度过休闲时光。 妻子对丈夫发脾气,并用私钥吃了一张纸,使从这个住所花钱根本不可能。

如何避免这种情况并使硬币免受硬币的最终损失?

可以创建一个交易,将花费所有期望地址中的资金,尽管事先不知道金额。 输入的不是金额,而是指向交易的链接,可以从中消费这些硬币。 哈希类型之类的东西就是一种覆盖事务签名的方式。 它允许您预先创建签名,并且某些交易数据(例如输入)可以在以后替换。 因此,您可以创建一个交易,该交易将花费尚不存在的交易中的硬币,并在以后(即需要时)应用。

此外,您可以对此事务设置LockTime限制。 它使您不必立即确认交易,而是将其推迟一段时间。 因此,夫妻在创建多重签名地址后,甚至在未收到任何付款之前,都可以立即创建两个LockTime交易,其中所有将来的硬币都将重定向到夫妻独立的普通地址。 同时,交易将被推迟,并且只能在两个月后才能确认。 这些交易可以打印在纸上,并单独存放在保险箱中。 如果出现一种情况,即硬币位于多重签名地址的余额上,并且密钥丢失(一个或两个都丢失),则硬币将被冻结。 但是有一个LockTime事务。 发布此类交易的任何人都可以将这些资金提取到有效的外部地址。 硬币将被保存。 这是一个简化的示例,但是可能有更复杂的机制。

3之2


假设有一群人拥有共同的预算。

图片

他们创建了一个包含三个密钥的多重签名地址,但是两个签名足以签署交易。 经占小组多数的参与者同意,这些资金就可以支出。 换句话说,三分之二的参与者可以花费硬币。 为此,将交易分散到网络就足够了。

钱包服务示例


有一种更有趣的方式来使用2之3组合,它被用于所谓的电子钱包服务。 在这种情况下,钱包服务不应与用户独立控制的普通比特币钱包混淆。 该服务不提供硬币的完整存储,也不拥有它们,而仅提供方便工作的服务。

如果您以这种方式示意地想象这种情况,那么一个密钥直接属于服务,第二个密钥仅由用户生成(并且只有他知道),第三个密钥也由用户生成和存储,但分别存储。 之后,计算与这些个人密钥相对应的公共密钥,并编译多重签名地址。 硬币到达那里,现在的消费条件是有限的。

图片

想象一下,我们正在处理某种Web服务,您可以通过浏览器输入其资源。 浏览器下载比特币钱包代码,该地址在此地址接收未花费的硬币列表,计算其余额并准备好花费。 如果用户想花硬币,那么他可以直接在浏览器中进行交易,并用他(必要的签名)签名。

请注意,用户可以从其密码接收私钥,也可以随机生成密钥,并用用户的密码加密并存储在服务中。 然后,用户向服务发送请求,接收带有加密密钥的容器,使用其密码对其解密,并且已经可以访问其私钥。

当用户签署交易时,交易将被发送到服务端,以便放置第二个必要的签名并发送交易。 该服务阐明了需要通过第二个身份验证通道(即,通过预先设置的不同通道)签署交易的事实,该通道可以是移动电话,SMS,电子邮件和其他替代通信方法的呼叫(如果安全级别要求,则可以进行个人访问) 。 当服务确保注册用户实际上发起了交易签名请求时,它将使用其密钥放置丢失的签名。 在那之后,交易变为有效,并且可以分配给网络以进行确认。

当服务被拒绝服务时,将使用第三个密钥。 该软件会生成此密钥,并以方便您的方式保存它。 用户通常将其存储在安全的地方。 如果该服务被拒绝服务,则用户可以使用自己的密钥(第二个和第三个)签署交易。 如果第二个密钥存储在服务端,则带有此密钥的受保护容器将通过备用数据通道(例如,通过电子邮件)提前发送给用户。 用户使用其密码使用密钥对容器解密。

用户收到两个必要的私钥,并输入预先提供服务的特殊软件。 此外,该软件无需用户参与即可在用户计算机上自主运行。 值得注意的是,仅在极端情况下才可使用此软件,当服务拒绝服务(即被黑,损坏或不复存在)时。 然后,用户用他的钥匙签署交易并在必要时转移硬币。

三合二电子钱包服务的优势


我们将更详细地介绍此类电子钱包服务的优势。 这是一种安全的存储方式,因为该服务并不拥有所有必要的密钥集-它仅拥有一部分,不足以占用资金。 而且,服务本身和破解它的黑客都无法获得资金。

这种方法的便利之处在于,用户不必具有对该服务的安全访问权限。 它可能具有可以感染病毒或受骗子控制的常规设备,并且数据可能会受到破坏或替换。 但是,仅拥有此设备对于攻击者来说是不够的,因为只能从中获得两个签名之一。

另一个优点是,如果服务拒绝服务,则用户不会失去访问其硬币的权限。 这些只是使用多重签名地址的可能方案中的一些,足以用于约会。

多签名注意事项


现在值得讨论有关多重签名的注意事项。 对于2之2,您需要创建LockTime交易,以将冻结的资金转移到特定地址。 当发生密钥丢失时,情况就是如此。

如果您使用的是多重签名地址2之3,那么将密钥存放在安全的地方非常重要。 万一丢失了三个密钥之一,您必须立即转帐资金,而不要等到必要的三个密钥中的两个丢失的那一刻。

比特币脚本的工作原理(例如)


为了更详细地了解多重签名的工作原理,我们需要讨论一下比特币脚本的工作原理:如何设置硬币消费规则,如何使它们满意,描述规则的操作是什么,什么是比特币脚本以及如何执行。

考虑一个简单的消费硬币的例子,其中有一个与一个公钥的哈希值相关联的常规地址,一个设置消费条件的脚本和一个满足这些条件的脚本。

图片

在左侧的图中,我们看到了数据堆栈,而右侧则是脚本本身。 脚本行的前两个部分是签名和公钥,即所谓的解锁脚本,即在花费硬币的交易输入中指示的脚本。 随后是事务输出中指示的数据集-这称为锁定脚本。 换句话说,这里显示了两个脚本的串联:一个解锁硬币的脚本和一个锁定硬币的脚本。 如果交易已经被网络节点验证,则将这两个脚本结合起来以检查花费硬币的条件。 因此,首先是解锁脚本,然后是锁定脚本。

之后是顺序执行完整的一组操作数和数据。 执行点针对每个操作数和每个数据依次运行。 如果执行点命中了一条数据,则将其压入堆栈。 正如我们在图中所看到的,顶部的脚本执行光标指示签名数据,然后将其压入堆栈。

此外,执行光标指向公共密钥-它也被推入堆栈。

第三步是执行复制操作,这意味着复制堆栈的顶部并将此数据再次放在堆栈上。

之后,使用哈希函数Hash-160执行哈希。 这意味着堆栈的顶部首先由SHA-2算法以256位的长度进行哈希处理,然后由RIPEMD-160函数以160位的长度进行哈希处理。 该操作与哈希公钥并获取地址时完全相同。 实际上就是这样。

图片

我们有一个堆栈,签名,公共密钥和公共密钥的哈希值。 脚本执行游标指向事务输出中指定的地址,即公钥的哈希值,该值在将硬币发送给它时指示。 这部分数据也进入堆栈。

下一个操作等于验证。

图片

比较堆栈的前两个元素。 如果它们是完全相同的字节,则将从堆栈中删除此数据,并认为检查已成功。 之后,签名和公钥保留在堆栈中。 因此,检查签名操作采用这两个操作数,并用公钥验证签名。 如果签名相对于当前正在验证的事务是正确的,因为签名覆盖了事务的一部分,因此,您需要从该事务的某些字段中获取哈希值。 这是由哈希类型结构的单独字节设置的,也就是说,将哈希值与签名本身和公钥一起输入到签名验证输入中。 如果检查正确进行,那么检查结果为true,则将该值压入堆栈。 这样就完成了脚本的执行。 数据被传递到调用函数并在那里进行检查。 如果堆栈为true,则此事务输入的验证是正确的。 如果所有交易输入均已正确验证,则认为整个交易正确。

我们了解了比特币脚本如何工作以验证交易的简单输入和输出。 现在,我们将讨论多重签名的组织方式及其在使用比特币脚本时的工作方式。

P2SH


BIP16曾经被提出过,它在比特币协议中定义了一个新概念-所谓的按脚本付费哈希(P2SH)。 这是一个设置硬币支出规则的机会,而不是在打开的脚本中编写的,您可以在其中连续写入操作数和一些数据,然后以我们检查的方式执行这些操作,然后以所需脚本中的哈希值的形式执行这些操作,即这些操作数的校验和。 这使得交易的退出设置了花费硬币的大而复杂的条件,但是退出本身仍然很短。

为了在这样的条件下花费这些硬币,您需要在交易输入时指定满足该脚本的数据,并指定整个脚本以证明您知道发送硬币时设置了哪些条件,以便源脚本的哈希值与要发送的地址匹配。硬币已发送。 换句话说,证明您知道条件并满足这些条件。

这项改善比特币的提案于2012年1月3日被接受。 实际上,是比特币的生日。 现在,它被积极地用于实现多重签名地址。

P2SH如何工作?


让我们看一个例子。 要建立事务,我们需要了解一些概念,例如“赎回脚本”,“锁定脚本”和“解锁脚本”。

兑换脚本包含将多重签名地址绑定到的公共密钥。 在这种情况下,我们正在考虑组合键“ 5之2”。 首先是值2,即我们指示需要2个签名,这将由相应的公钥进行验证。 这之后是公共密钥,在我们的例子中是5。接下来,由于我们指定了5个公共密钥,因此我们将值指定为5,并且以相反的顺序读取数据时,需要此值来了解需要读取多少个密钥。 此后,将显示操作检查多重签名。

锁定脚本-交易的输出中指示的脚本,用于支付多重签名地址。这里将执行获取哈希值的操作,对此我们已经很熟悉了。接下来是Redeem脚本哈希值,该值占20个字节。之后,执行操作以验证数据与实际哈希值匹配。

解锁脚本是交易输入处的脚本与支付给该地址的交易输出处的脚本的串联。花费硬币需要两个签名,以及完整的赎回脚本,该脚本随后将被散列并检查与硬币发送到的地址是否一致。之后,脚本将完整执行,包括检查多重签名。

限制列出的每个脚本的最大大小非常重要,这是520个字节。此数字是根据“解锁脚本”最多可容纳15个签名和15个对应的公共密钥以及若干验证这些值的操作计算得出的。这样便获得了一定的数字,四舍五入后得到了520个字节。应该说,这个数字是在期望“ 15 of 15”类型的多重签名地址对于实际使用足够合理的限制的前提下获得的。使用大量签名时,赎回脚本的数量非常大。使用多重签名地址或其他P2SH地址的用户在从中消费硬币时,交易量非常大。这意味着为了确认他的交易,他将不得不支付巨额佣金。

P2SH的好处


我们将分别考虑P2SH的优点。第一个是可以使用Base58以熟悉的形式对此类地址进行编码,其长度为34个字符。根据BIP13(该规则定义了为由Base58Check编码的比特币地址设置版本字节的规则),该地址将以三元组开头,即在此处插入特定的版本字节。

例如,您可以看到P2SH地址。

3P14159f73E4gFr7JterCCQh9QjiTjiZrG

这可能不是多重签名地址。兑换脚本不仅可以描述多重签名地址,还可以描述其他花费硬币的复杂规则。

我们补充说,这不是在比特币中组织多重签名的唯一方法。您不能使用P2SH,但是在输出中将使用多重签名地址,而不是脚本中的哈希值,而是脚本本身(即,直接在输出中列出所有公钥并将操作设置为多重签名)。但是,当您将硬币发送到该地址时,您会立即公开公共密钥,因为它们将位于公共领域,并且此时将在其上存储硬币。

另一个缺点是,在多重签名地址的硬币发送者交易量很大,为此您将不得不支付大量的佣金。发送者不太可能因接收者想要使用多重签名这一事实而多付钱。 P2SH允许您将佣金成本转给收款人。如果收件人希望在多重签名地址接受硬币,那么他本人将为大型交易付款,这是一种更公平的方法。

我们补充说,P2SH允许您实现这种多重签名的不同组合(2-of-2、2-of-3和其他)。
示意性地考虑发送到多重签名地址。

图片

假设爱丽丝想付给鲍勃(Bob),后者只使用多重签名地址。为此,Bob在他的计算机本地(顺便说一句,可能有某种组织来代替Bob)生成了几个私钥,并从中接收相应的公钥,这些公钥以某种方式串联在一起。最常见的是,首先使用Base58Check对公钥进行编码,然后将其按字母顺序排序,然后进行串联。

当需要从个人密钥重新计算公共密钥时,这种方法将奏效。它们的连接顺序必须完全相同,因为下一步是创建一个Redeem脚本并对其进行哈希处理。如果完全相同的键进入“赎回脚本”,但顺序不同,我们将获得不同的哈希值和不同的地址。这将带来某些误解。因此,在串联之前,必须根据某些规则对公钥进行排序。而且大多数情况下,他们在Base58数字系统中使用字母排序。

因此,鲍勃从“兑换脚本”中计算出哈希值。他可以将其表示为20个字节,并将其发送给Alice,并说这是使用P2SH的多重签名地址。但是,Bob可以使用版本字节(例如常规地址)对其进行编码,然后将其发送给Alice。爱丽丝将从版本字节中了解到这是一个多重签名地址,编写一个事务,并相应地填充其输出,以便鲍勃接收他的硬币。然后,它将事务传播到网络。他们正在等待确认,Bob接受了Alice的付款。例如,替换鲍勃提供服务或转移货物。

有一段时间,鲍勃想花这些硬币。应当理解,当代币在其多重签名地址时,并未完整披露完整的赎回脚本。甚至爱丽丝也没有确切知道鲍勃使用了哪些公共密钥,有多少个公共密钥,等等。她根本不知道此P2SH地址由什么规则组成,是否具有多重签名地址等。因此,对电子设备的攻击数字签名(在椭圆曲线上)仍然是不可能的。

假设鲍勃想将付款发送给夏娃。

图片

她生成一个新地址并将其提供给Bob。他在输入中创建了一个交易空白,其中指出了他从爱丽丝那里收到硬币的交易,输出是Eva的地址。现在,他必须提供所花费硬币的所有权的证据。为此,他使用了两个私钥(我们在上文中提到过,他的多重签名地址表示“ 2之5”选项),他从中计算出该交易的两个签名。接下来,他获取完整的兑换脚本并将其添加到事务输入中。

请注意,此赎回脚本必须完全存储在Bob的计算机上,否则他必须记住他使用公共密钥编写此脚本的顺序。如果他应用了某些排序规则,那么他必须记住它们。他还应该记住,多重签名地址已绑定到某些私钥。没有这个知识,Bob将不会知道要操作他的哪些私钥以及应该对它们进行散列以获取所需地址的顺序。

因此,他有两个签名和完整的赎回脚本。交易被认为是正确的,鲍勃将其分发到网络,然后等待确认。这是使用多重签名地址消费的主要内容。

问题


现在我们来回答您的问题。

-是否可以在三台不同的计算机上同时运行同一个钱包并开始同步?

最有可能的是,我们正在谈论某种网络节点:SPV节点或完整节点。使用了几台不同的计算机和一个钱包。钱包意味着私钥。有几个实现钱包功能的完整节点。在这些节点上,我们插入相同的私钥并开始同步。通过与网络的完全同步,最有可能在每个使用其自己节点的钱包上看到相同的余额。如果您看到一个节点上的更改,则在与网络同步之后,您将在所有其他节点上看到完全相同的更改。事务不是保密的,如果涉及事务的地址,则将事务分发给验证它并显示相应更改的所有节点。实际上,是的,您可以在多个节点上使用相同的密钥,但所有交易也会自动同步。比特币肯定不会因此增加一倍,而且不会增加三倍。

— P2SH Segregated Witness?

隔离见证是一种交易结构,其中将硬币所有权的证据转移到一个单独的结构中,它们不会落入区块链中,但是在验证交易时,它们会分布在一起,即所有验证者都在一个单独的结构中使用证据来验证交易的正确性。交易确认后,由于没有意义,因此不会保存证据。构造这样的交易链也有好处,其中某些在当前交易中没有实际确认的硬币已经在基于它的基础上的下一个硬币中花费了,但是它们没有分配给网络。因此,形成了不公开硬币所有权证据的交易链。这有助于数据传输并增加隐私。隔离见证人使用了另一种地址,它包含略有不同的操作数。可以将存储在常规地址(包括P2SH地址)中的硬币发送到见证P2SH地址。

-前三名的地址是否始于照明网络?

BIP13定义了为测试网络中的比特币地址,其他货币等选择版本字节的规则。是的,Lighting Network使用多重签名地址,该地址也使用设置条件的P2SH方法。

-为什么不可能个性化钱包,也就是将其绑定到特定的人?
比特币作为支付系统的协议不需要识别钱包,因为它根据数学定律工作,并且数学不允许将一个人描述为一个人。此外,这不是检查交易的先决条件。有足够的数字签名。可以生成此类签名的人是其所有者-不适用于比特币协议。因此,签名可以由一个人,几个人的团体,一个机器人等所有
。对于个性化,如果您在特定地址和特定人之间建立连接,那么您将侵犯隐私权,并且可以以一定程度的匿名性来匿名化网络的一部分。通常,数据库是打开的,但是其中没有身份数据。

— , 70-80%, ?

众所周知,这是一种货币,而不是一种加密货币,因为加密货币的工作原理与比特币相同,也就是说,所有流程都被最大程度地分散了:排放,交易验证,数据存储,更改接受等。但是有这种货币,我们将其称为数字货币,其中并非所有列出的流程都是分散的。选择之一可能是集中的问题,即没有采矿,采矿之类的东西,也就是说,没有解决复杂问题的方法。根据这一原则,Ripple,Stellar,数字货币NXT,卡尔达诺工作。在那里还应用了其他在用户之间分配硬币的原则,例如通过ICO,身份证明等。由于并非所有流程都可以分散和独立,因此您无法命名任何数字货币cryptocurrency另外,对特定货币的信任问题本质上是个人的。您可以决定此信任的数量。有必要考虑使用该货币的目的及其风险和局限性。

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


All Articles