在这篇博文的第一部分中,我们讨论了引入可重用地址的目的。此外,我们提出在协议级别实现该功能的原因。在博文的这一部分,我们概述了我们的基本提案。
在您阅读本文之前,我们建议您首先了解IOTA种子如何用于生成和验证地址,相关文章请阅读Koen Maris和Eric Hop的一部分深度文章。对于本文,我们假设我们可以生成几乎无限数量的公钥/私钥对。
目前的方法(回顾)
每当我们从其中一个地址发出付款时,我们都会使用属于该地址的私钥对发出的信息进行签名。 节点可以通过根据地址本身验证交易签名来验证花费是由地址所有者发出的。 由于IOTA使用抗量子的签名方案,因此每当我们签署交易时,我们都会泄露私钥的某个部分。 这意味着我们不能多次使用同一个私钥,否则会损害该地址上的资金安全。
为了解决这个问题,我们建议用户:
- 永远不要使用同一地址发送两次以上的交易
- 在地址上支出小额资金时,所有的剩余资金应该同时发送到新地址(称为剩余地址)。从而允许将来从剩余地址安全地支出剩余资金。
IOTA钱包软件在后台自动处理以上要求,以便用户的资金保持安全。

新思路(我们的提案)
考虑到在不破坏IOTA的非常基本特征(即抗量子)的情况下,我们不能改变签名方案,我们必须设计另一种方法来为来自同一地址的连续支出行为使用新的私钥。
考虑到新的私钥始终与新的公钥相关联,这实际上意味着我们必须:
- 逻辑上将地址与用于验证交易签名的公钥分开。
- 引入一种方法来更改与地址关联的公钥,用于每次支出。
为实现这一目标,我们建议:
- 在交易元数据中引入新字段,允许我们更新地址的公钥并通知网络有关此更改的信息。
- 必须根据此不同的公钥而不是地址本身来验证此地址的下一次支出。
对于每笔支出,我们将生成一个新的公钥/私钥对,用于授权该地址的下一个花费,下一笔交易的公钥由当前交易的元数据设置。 发送交易的算法可归纳如下:
资金支出(来自某地址的第n次)
- 构建交易。
- 为下一次支出生成新的公钥/私钥对(pubkey_n,privkey_n)。
- 通过设置相应的字段,在交易元数据中包括新生成的密钥对的公钥:nextpubkey = pubkey_n。
- 使用属于上一个交易设置的公钥和私钥对交易进行签名:privkey_n-1(注意:第一笔支出将使用属于该地址的私钥)
- 广播交易。
分类帐状态将从按照以下模式更改:
变为:
注意:
- 如果我们还没有从地址中支出资金,公钥就是地址本身(参见示例中的AddressA)。
- KeyB7表示地址B的第7个公钥。
- KeyX9表示地址X的第9个公钥。
打个比方
IOTA目前签署付款的方法可以与您家用钻石制作的门进行比较。它们非常安全,但遗憾的是它们也是透明的。 因此,每当您使用钥匙离开房子走向银行时,在外面等待的人可以“看到”您用来打开门的钥匙的一小部分。 在某些时候,他们可能会看到足以伪造密钥并访问您地址的内容。
为了防止这种情况发生,我们目前将我们所有的财物带到一个新的剩余地址(带有一个新的锁和一个新密钥),并且永远不会返回我们的旧地址。
相比之下,这种新方法相当于您在出门进行后“更换锁”的行为。 因此,即使有人看到您的旧密钥,他们也无法访问您的资金。此外,您还可以获得稳定的地址,以便人们向您发送信息或资金。
非常棒,让我们用起来吧! 等一下! 还没那么快......
虽然我们提出的解决方案确实解决了地址重用的问题,但它也衍生了一些新问题。
本博文的最后部分将研究这些问题并讨论他们的解决方案。 且听下回分解!
原文链接:https://blog.iota.org/a-proposal-for-reusable-addresses-part-2-d83d328ff1b3