IOTA科普系列(4): 安全使用IOTA钱包的最佳实践

IOTA 是为物联网(IoT)设备而设计的协议。这些设备可以非常流畅地遵循任何规则来严格、择优和安全地使用这一协议。可悲的是,人们不善于遵守规则 - 即使他们了解所有的这些规则 - 他们也常常不知道某些行为造成的后果。所以我决定写一篇关于最佳实践的文章,并解释其原理。

以下是这些规则:

规则1不重复使用同一地址。不。没有例外。

规则2始终附加一个新的接收地址到缠结中。

规则3始终等待一个交易被确认之后再送其他交易

 

以下是其原因:

所有规则都与多次花费相关,即对同一个地址存在多次花费。这里关键的问题是IOTA使用了一次性的签名。对于每个地址,在花费发生之后,该地址不应该被继续使用。这是因为在对外发送IOTA后,这个地址对应的私钥将有一个随机的50%被暴露。这本身并不是问题,在任何单笔花费后收到的IOTA仍然是相当安全的,因为破解另外50%的密钥仍然是一项艰巨的任务。(译者添加:请注意,目前已经有IOTA被偷窃的案例发生,就是因为这个用户向已经花费过的地址继续存入IOTA,从而私钥被暴力破解

 

但是当你使用上面相同的地址进行第二次花费后,该地址对应的私钥将又有一个随机的50%被暴露。理论上来说,统计数据将会告诉你,现在75%的密钥已经被暴露,但是理论和实际有所不同。实际中,你可能会非常不幸,因为它是一个“随机的”50%,如果这两个50%中只有10%的部分重叠,那么你私钥的90%已经被暴露了!这时,你的私钥就会非常容易被窃取并被破坏。

 

所以,简单来说,2次及以上的对同一地址的花费是非常糟糕的!

 

现在我们来看一看什么样的情况会终结一个多重花费,以及为什么这些规则是好的:

 

规则1:绝不重复使用同一地址。绝不。没有例外。

 

我将很快能听到有些人说:“但是你可以使用同一地址多次接收IOTA!”。从技术角度讲,这是正确的,因为loT设备将会自始至终这么做。但IoT设备的优点在于它们知道交互各方将要做什么以及什么时候该做什么。因此,它们可以安全地做这些事情。这里有一个例子可以展示为什么在同一地址上进行多次花费是一个坏主意:

 

比方说,我有一个交易是从交易所取出X个IOTA到我的钱包地址A。整个交易过程需要一些时间,但是最终这X个IOTA被提取了地址A中。

由于这次的成功操作,我决定提取Y个IOTA并放入相同地址A中。毕竟,我可以向同一地址发送多次,对吗?所以,我开始向交易所提交提取IOTA订单,交易所也开始处理我的订单。请注意,这次提币操作有时可能需要数小时或者数天时间。

与此同时,我在和朋友讨论IOTA, 并且告诉他我想转给他一些(比如Z个)IOTA。于是,他安装了IOTA钱包,并给了我一个接收地址B。我从自己的钱包里转出Z个IOTA到地址B。钱包顺利地执行命令,从地址A中转出Z个IOTA到地址B。并且,为了使地址A免于多重花费,钱包把剩余的X-Z个IOTA转入一个新生成的地址C中。

 

到目前为止,似乎一切看起来都顺利。但是有一个问题:交易所还没有处理我的提币请求。当交易所最终处理到我的这个请求的时候,就像我说的那样,Y个IOTA将会发送到地址A,但这个地址之前已经有一个花费了。哎呀!

为避免以上情况,我们应该生成一个新地址D,并使用该地址代替地址A作为第二次提币的地址。所以,永远不要重复使用一个地址,甚至接收的时候也不要使用已经用过的地址

 

规则2始终附加一个新的接收地址到缠结中。

 

我将很快就会听到有些人说:“你没“必要”真的去这么做!“是的,从技术角度讲,这是正确的。将IOTA发送到一个没有附加到缠结的地址是完全正确的,而且这些IOTA也会被很好的传输到这个地址。同样,loT设备也一直是这么做的,但是它们也跟踪它们给出的地址。

但是,IOTA钱包做法则有所不同。因为可以将钱包安装在不同的设备上,并且使用相同的种子登陆两个钱包,所以,开发人员直接从缠结中获取钱包的状态。这样一来,两个钱包都会收到同样的回复。否则,就会造成一个钱包可以追踪一些重要的地址,而另一个则不了解这些。很漂亮的解决方案。

但是这种方法将会带来隐藏的花销。为了理解这一点,我们需要看一看钱包是如何决定哪些地址是已经被使用过了。事实上,钱包是通过向它连接到的节点查询来获得包含该地址的交易列表。如果没有交易产生,那么就可以认为该地址尚未被使用。

通过把一个地址附加到缠结,你显示地创建了一个零值转移交易到这个地址。现在,钱包可以在缠结中找到这次交易记录,并得知该地址已经被使用。是的,一旦有人向该地址发送IOTA,钱包可以在缠结中找到该交易,并再次得知该地址已经被使用。所以,我们不需要明确地将这次交易附加到缠结中,对吗?不不不,大错特错!

假设我的地址A中有X个IOTA。我决定从交易所取出Y个IOTA并存入地址B。这是按照规则1的要求做的:使用不同的地址。我不打算明确的将地址B附加到缠结上,因为我之前被告知这么做不是绝对必要的。因此,我将提币请求加入订单,之后交易所开始处理我的订单。请注意,这个订单处理也要花费一些时间。

为了传播我的喜悦之情,我决定再向我的朋友发送Z个IOTA。我发起了转账操作,这次钱包可以从地址A中向我的朋友发送Z个IOTA。然后钱包想要把剩余的X-Z个IOTA发送到一个新的接收地址。所以,钱包向缠结查询哪个地址尚未被使用。哈哈,地址B还没有被使用。于是,钱包就愉快地把剩余的IOTA发送到地址B去。老天,现在我们处于与规定1相悖的情况中了。

因此,如果我们现在决定向另一个朋友发送另一笔IOTA,最终的结果是,在交易所将IOTA提取到地址B完成之前,我们将花费地址B中的IOTA。这将使我们必然再次发生多次花费。

我们把地址B附加到缠结就可以轻松避免这种情况。这时,钱包将会知道地址B已经被使用,并且将剩余IOTA发送到新地址C。

这个例子告诉我们:总是附加一个新的接收地址到缠结中

 

规则3始终等待一个交易被确认之后再送其他交易

 

我可能很快听到有人说:“但是钱包会帮我避免多重花费!”从技术角度讲,这是正确的。钱包会在花费IOTA之前检查,对于某个地址,如果发现有一个确认的花费,钱包不会允许第二次花费。但是考虑以下情况:

我在地址A中有X个IOTA。 现在我决定向交易所发送Y个IOTA,这将产生从地址A花费Y个IOTA的交易#1。现在我又决定在交易#1得到确认之前向我的朋友发送Z个IOTA。由于钱包仍然在地址A中看到X个IOTA,它将很顺利地生成从地址A中花费Z个IOTA的交易#2 。糟糕!同一地址产生了两次花费.

这种情况的解决办法就是在交易#1被确认后再发送交易#2.

这个例子表明:等待一个交易被确认之后再送其他的求。

请注意,因为你不知道钱包从哪个地址提取IOTA,然后又把余额发送到何处,所以,许多类似的情况也许会更为混乱。

另外注意,对于每一条规则,我只是提供了一个例子用来说明可能出错的地方。当快照发生的时候,情况将会更加混乱。但这需要其它文章来说明,非本文讨论之列。

原文

https://forum.helloiota.com/1973/Best-practices-for-using-the-IOTA-wallets-safely

专栏作者:blaise

个人简介:我共发表了 4 篇文章,总计被阅读了24,224 次,共获得了 49 个赞。

作者邮箱 作者主页 Ta的文章

1条评论 “IOTA科普系列(4): 安全使用IOTA钱包的最佳实践”

发表评论

邮箱地址不会被公开。 必填项已用*标注