我们打开了有关各种区块链设备的一系列出版物,并开始与Monero进行研究。 这是一种相当知名的加密货币,它实现了许多有趣的算法和加密解决方案。 几个月前,Monero Core中增加了对多重签名的支持,在今天的文章中,我们将对这种技术进行更深入的研究。
多重签名是一种用于创建和使用共享钱包的机制。 这个概念本身并不是什么新鲜事物,它已经在某些加密货币中实现,例如比特币,以太坊等。 其实质在于共同拥有和处置钱包资金。 对资金的处理施加了一些限制:对于交易,有必要收集一定数量的票,这是在创建钱包时设置的,并取决于所有者的数量。
这些参数代表了钱包的所谓“方案”,例如3/3(三个所有者的钱包,具有三个必须的签名以发送交易),或2 / 3-三个所有者的钱包,具有三个所有者的任何签名(必须具有其任何所有者)。 应当指出,在多重签名钱包中没有“您的份额”和“我的份额”的概念,所有资金同时属于所有参与者。
门罗币密码学
门罗币中的密码学(与大多数其他加密货币一样)建立在椭圆曲线上。 您可以
在Wikipedia上阅读有关它们的
信息 。 简而言之,这种加密系统的优点是与传统的加密系统相比,具有更高的加密强度,较小的密钥大小和较高的加密操作速度。
门罗币网络中的每个钱包都有两对(私钥和公钥)密钥-查看和消费。 公钥对的查看和支出称为钱包地址。 您可以将其用作接收资金的地址。 如果您想向第三方提供有关您的钱包收据的数量和大小的信息,除了地址外,您还可以提供私人查看密钥。 一对私有视图密钥和公共支出被称为跟踪密钥。 有了它,您可以看到钱包中的资金收据(但看不到费用),而且绝对安全-拥有这样的钥匙对不能花费您的资金。
也许最秘密的钥匙是私人消费-您不应与任何人共享,因为 拥有它和一个私有视图密钥,就可以管理钱包。
在本文的进一步内容中,我们将用大写字母表示公共密钥(例如B-公共支出密钥),以及私有-小写字母(b-私有支出密钥)。 为了理解下面的一些计算,在本文中,我们展示了如何从私有密钥继承公共密钥:
,其中
G是固定点,将其乘以私钥(标量)即可得到公钥,该公钥也是椭圆曲线上的一个点。
门罗网络签名
该技术的基本原理很简单:每个钱包参与者仅保留一部分私人支出密钥,并且在进行交易和签名交易时,所有这些部分加起来就形成一个密钥。
当然,任何时候都没有参与者可以收集整个密钥。 公共支出密钥完全由每个参与者存储。 每个参与者还存储了完整版的私有和公共查看密钥,该密钥与公共支出一起使您可以查看到公用地址的收据。
在Monero中创建多重签名钱包
当前的Monero发行版仅支持N / N和N-1 / N方案。
对于N / N和N-1 / N电路,创建过程分别分1或2个阶段进行。 在第一阶段,过程的参与者彼此交换私密视图和公共支出密钥,并计算这些密钥的总和-所有视图和所有支出。 因此,钱包的私用视图密钥成为所有方案的视图密钥的总和,N / N方案的公共支出密钥是所有参与者的公共支出密钥的总和。 N / N钱包的生成到此结束。
对于N-1 / N个钱包,将出现另一组密钥。 此集合是一组私有密钥,由其他参与者的每个公共支出密钥计算为其当前私有支出密钥的乘积,即(为简单起见,不包括哈希函数):
同样,对于每个参与者。
每个参与者的私人消费密钥将是其多重签名密钥的总和,即:
每个参与者执行此操作。 此类作品的一项重要特性应予注意,例如:
从这种相等性可以得出,每个钱包都有一个(在我们的示例中为2/3方案)多重签名密钥,另一个参与者拥有。
生成后,参与者交换公共多重签名密钥:
最后,通过将公共多重签名密钥的唯一值相加来计算公共支出钱包密钥,也就是说,在我们的示例中,将是:
如我们所见,在2/3的情况下,要计算支出密钥(私人和公共),我们需要来自任何两个参与者的足够信息。
这样就完成了钱包的创建,并且可以根据所选方案使用它。
在门罗币的交易
为了说明如何创建多重签名交易,让我们简要回顾一下Monero中交易的组织方式。 简化后(没有环签名和RingCT)可以想象如下:
图1.简化的事务视图
在这里,在右边显示交易的输出-它产生的钱(直接类比:钱包里的钞票),左边的输入是它燃烧的钱。
因此,当爱丽丝(Alice)要向鲍勃(Bob)发送1个XMR时,她会在未使用的输出中收取1个XMR加佣金,将它们放在交易输入的位置,为每个输入计算一个关键图像,为1个XMR量生成输出,并为每个计算他们输出密钥。
收到交易后,Bob使用私有视图和公共支出密钥为每个输出恢复输出密钥,如果在交易中恢复和接收的密钥匹配,则他认为此输出适合他。
尽管从网络的角度来看多重签名事务与任何其他事务都没有什么不同,但它的创建要复杂一些,并且分几个阶段:
- 参与者将部分关键图像交换为已知输出(或仅交换输出)
- 考虑到已经完成的关键图像,参与者重新同步他们的钱包以便获得准确的余额
- 发件人准备交易,对其进行签名并将其发送给下一个参与者
- 随后的每个参与者都添加了他们的RingCT签名的一部分。
- 最后签名者完成RingCT
现在,可以将交易发送到网络了。
关键图像生成和输出共享
在扫描区块链(同步)期间,钱包无法确定哪些特定输入花费了其输出,因为它没有能力为其计算关键图像。 因此,他只看到传入的事务(对于他们来说,仅跟踪密钥对就足够了)。
为了形成正确的交易,您需要为每个输出还原关键图像,扫描区块链并确定花费了哪些,然后才继续生成它。
考虑形成关键图像的过程。 它由以下公式计算:
,其中
Hp是某个预定的哈希函数,
P是公共出口密钥(请参见图1),
x是我们将为该输出的接收者还原的私有出口密钥,其计算如下:
,其中
Hs是某个众所周知的加密哈希函数,
a是私有视图密钥,
R是公共事务密钥(Tx pub密钥,请参见图1),
b是私有支出密钥。 将一个表达式替换为另一个表达式并打开方括号,我们得到:
但是,由于我们没有完整的支出密钥,因此我们需要对其进行还原。 在N / N的情况下,一切都很简单(例如3/3):
在此,
H p (P)b i是从第i个参与者接收的
部分关键图像 。
对于计划N-1 / N(2/3代表第一个参与者,而没有第三个参与者):
在这种情况下,
H p (P)b i B j是
部分关键图像。交换出口的过程的本质就是,交易的必要数量的签署者将每个出口的部分密钥图像发送给钱包中的其他参与者。 同时,参与者不会公开其私钥,因此外部观察者或不道德的参与者没有机会收回全部花费的密钥并仅拥有钱包。
有了这些数据,事务启动器就可以形成它并准备进行签名。 将生成的交易发送给所有同意对其进行签名以生成Ring CT签名的人,创建所有必要的签名,并将交易发送到网络。
数据交换自动化
描述了上述过程,用于交换每次交易发送一次或之后需要执行的部分密钥和密钥图像。 在当前的Monero Core Wallet实现中,建议手动执行这些操作,方法是通过安全的通信通道与其对应方进行手动交换必要的数据(通过从钱包中导出必要的数据并通过即时通讯程序或其他方式将其发送)。
您可以通过根据2/3方案创建钱包并签署交易的示例来证明这一点。 每个参与者都使用monero-wallet-cli实用程序执行以下命令:
[钱包9uKCgo]:prepare_multisig
MultisigV1baCWviNomMXe271W8HW4imh8SsnNEWP2bCswQfoB9MGzNZ8FUG3e8UCNm5toKQzSQH2e8rUWUCGazaCcvej1ToCQYBMovJZYaYiYWQvzsvyWruXycZdVDSsyugjEzwQNK3FUEkug2LXiH91NmekGb7kp9gK9kuoxDDhGn1nLKXUpnXR5
将此multisig信息发送给所有其他参与者,然后将make_multisig <阈值> <info1> [<info2> ...]与其他人的multisig信息一起使用
这包括PRIVATE视图键,因此仅需要向该multisig钱包的参与者公开
[电子钱包9uKCgo]:make_multisig 2 MultisigV1XQugvU4JwcwTQbKdH5qGFnavxUX54wGxNis2iN6zoLD94DahnXbyNxH1NQBp2rYRFFJCT2uiJbssHLJYEAb8X1tS5UCqTXYu3FkgRNSZt5mRNgE58iXZHPj839Pbm3ozGcXmRT6GcRMMxMjRonfYKpnPq1UyZSMN7Qr9AYin1gYyoJSh MultisigV1HVqTW8P4UNWUE8QfBaEdwDWJuXBWEPnTrKqVJiUudGG14cHREk9TKmeR9xzSs4wf4jd22mV94C2ehSViApawnpp2SpRqp19eKXLHz2JmNp7eGR6TJMt4VsDTqANRwb1FtD9weef342f5KXDRZK7iQT1MTubyHhEcFyV5aLCjjQ8owMkH
还需要一步
MultisigxV1PQwytRuYGkB6UEVJ7v2S7q492cwNTdwySXyasToAuQQq73TvM1rBrog5bcYz5w2P6Z4jwKtzrHr7shRGo5mAShvLVbYtBdQNhQsizMb51K7iaWQB4te5mQaiB1cok84CbvA9WKnVpTJGyb7SbS7NwAgmpEhU812RTdzrdHp5sD41duYtRNW6qna5mTMYmtTjAEdKpKCvM6EwhV4ncWscpvoBfyYP
将此multisig信息发送给所有其他参与者,然后将finalize_multisig <info1> [<info2> ...]与其他人的multisig信息一起使用
[电子钱包9uKCgo]:finalize_multisig MultisigxV1PdeMJo5rxcWTXDJ7rbyuacBseugsn2djZKKEdwvFYVmz73TvM1rBrog5bcYz5w2P6Z4jwKtzrHr7shRGo5mAShvLUxykuq5gho7gGQBCEa3JmBaY7rNHqqUaCUs1WWQi9tojZTMmCJJ4evwJzcXEDqcAd7ShwxsJtJtXdiATs54BbBfyCbwXbnDRKAtagJF36z74KJA58NgEmnHv23ZQeePCoacM MultisigxV1RTwyE53FjKPQaAn4ZMWM5hc8C92eJndpyKby4L9HpF2TUxykuq5gho7gGQBCEa3JmBaY7rNHqqUaCUs1WWQi9tojVbYtBdQNhQsizMb51K7iaWQB4te5mQaiB1cok84CbvA928U2yJFK86jNxtMopxHkcnYjjeYfp8TAB53Y1CukBiHfL2M4EztDALXLReXjJxkMry65Jw6vVePJp2T5CW8T8QE5
在发送交易之前,各方必须交换部分密钥映像:
[钱包9uKCgo]:export_multisig_info ki1
多重签名信息导出到ki1
[钱包9uKCgo]:import_multisig_info ki2 ki3
高度1103873,txid <f7e648915287fafca1dc67eb26267e09f92bba7ab7fd52a12600c3e6440db0eb>,2.000000000000,idx 0/0
高度1103882,txid <2e3a5591c741c0943a47a2bcbd1ec26493158088c88308bcbfc97423ea95c491>,0.009000000000,idx 0/0
导入了多重签名信息
接下来,在考虑到完整密钥的情况下重新同步钱包,并且在收到有关付款的数据之后,参与者可以准备交易:
[wallet 9uKCgo]:传输9vUnTucAioDHD4ZqrFHXAgfLqrsC3LkZ6JFr5axBLhDiFMaHuEk33aqXimoZEMtQh5ibdYxcNSBw2hBZLAsCnuw4B4rBeZX 1
此交易不包含付款ID。 这样可以吗 (是/是/否/否):是
该收费水平目前有2块积压的订单。 这样可以吗 (是/是/否/否)是
交易1/1:
从地址索引0支出
正在发送1.000000000000。 交易手续费为0.012000000000
这样可以吗 (是/是/否/否):是
未签名的事务已成功写入文件:multisig_monero_tx
必须将生成的文件传输给另一个参与者以进行签名并发送到网络:
[钱包9twQxU]:sign_multisig multisig_monero_tx
装1周的交易,对1.031762770000,费0.012000000000,发送到1.000000000000 9vUnTucAioDHD4ZqrFHXAgfLqrsC3LkZ6JFr5axBLhDiFMaHuEk33aqXimoZEMtQh5ibdYxcNSBw2hBZLAsCnuw4B4rBeZX,0.019762770000变化9uKCgopHzXrQLnph1ZNFQgdxZZyGhKRLfaNv7EEgWc1f3LQPSZR7BP4ZZn4oH7kAbX3kCd4oDYHg6hE541rQTKtHB7ufnmk,具有最小环尺寸7,没有付款的ID。 这样可以吗 (是/是/否/否):是
事务已成功签名到文件multisig_monero_tx,txid 1d28af64bc78d05b625c4f7af7c321d4c8943c4c2692f57aa53e303387f40db6
[钱包9twQxU]:submit_multisig multisig_monero_tx
装1周的交易,对1.031762770000,费0.012000000000,发送到1.000000000000 9vUnTucAioDHD4ZqrFHXAgfLqrsC3LkZ6JFr5axBLhDiFMaHuEk33aqXimoZEMtQh5ibdYxcNSBw2hBZLAsCnuw4B4rBeZX,0.019762770000变化9uKCgopHzXrQLnph1ZNFQgdxZZyGhKRLfaNv7EEgWc1f3LQPSZR7BP4ZZn4oH7kAbX3kCd4oDYHg6hE541rQTKtHB7ufnmk,具有最小环尺寸7,没有付款的ID。 这样可以吗 (是/是/否/否):是
事务已成功提交,事务<1d28af64bc78d05b625c4f7af7c321d4c8943c4c2692f57aa53e303387f40db6>
您可以使用show_transfers命令来检查其状态。
显然,这种方法虽然可以让您真正使用多签名钱包,但是经验不足的用户或移动钱包用户都无法使用这种方法。
因此,我们正在开发自己的解决方案,该解决方案将自动交换这些数据,而又不损害各方的隐私和交易的安全性,以便使更多人可以使用Monero中的多重签名技术。 该解决方案基于同时支持标准和多签名钱包的应用程序,以及提供数据交换和转发到适当钱包的开放服务器部分。
您可以在
wallet.exan.tech上了解有关此项目的更多信息,以及我们为Monero网络支持的资源,请参阅
exan.tech/en/projects/monero 。
结论
我们研究了在Monero中创建多重签名钱包和形成具有多重签名的交易的机制。 当前,仅支持有限的一组签名方案,但是它将扩展为2/5等形式的任意公式。 现有的交换钱包功能所需的数据的机制相当不方便,但是由于Monero生态系统借助第三方解决方案的开放性,可以为普通用户带来通常的质量。
在以下文章中,我们将讨论Monero设备的其他方面:RingCT和环签名,钱包架构和libwallet库,以及此区块链的发展前景。
提出您的问题,为有关加密货币技术的新文章提出主题,并在
Facebook上订阅我们的小组以了解我们的事件和出版物。