本站曾发表过一篇“深入讲解 IOTA 如何发起一笔交易”,相比本文略显难懂,可以与本篇相互参照阅读,以更好的加深理解。另外,本文原作者还发布过一篇姊妹文章“ 比特币是如何完成一笔交易的 ”,可以用来对照Tangle与区块链之间交易的区别。
1.概述
这篇文章将给大家展示IOTA钱包与钱包之间是如何转移iota资金的。 我们会首先搞明白IOTA钱包的工作原理,并了解如何实现免费交易。最后,我们来讨论一下这个交易以及它是如何存储在分布式账本(IOTA Tangle)中的。
在这个设置中使用了IOTA Testnet,并为IOTA Testnet的访问设置IOTA Light Wallet。节点控制台(node console)用于访问IOTA API以便更深入的了解细节。
2.设置
在这个场景中我们使用两台电脑,每台电脑都安装一个IOTA Light Wallet。每个钱包用一个不同的种子登录,我们将它们指定为钱包A和钱包B。
注意,在IOTA中,address是由种子决定的。
3.资金转移
3.1资金转移之前
我们设置钱包A上有资金 1000 iota,钱包B是空的(余额为0),以下是我们在两个Light Wallet中看到的内容。
如果我们在钱包A中更深入的发掘细节,我们会看到这1000 iota是如何组成的。
如上所述,每个钱包都有一个明确的address列表。为了计算iota的数量,每个钱包都要搜索分类账,并从这些address的记录中统计余额。在这里我们看到了钱包A中有4个有余额的输入(input)记录,4个address上分别有不同的余额,这4个address的余额加起来就是钱包的总余额1000 iota。
我们保持钱包B为空(余额为0)。
下图就是目前两个钱包的分别的总计金额。钱包A上有带有不同数量IOTA的4个address(A0,A1,A2,A3),4个address相加总额为1000。钱包B上只有一个address(B0),余额为0。
3.2资金转移
在钱包A上,我们输入一个钱包B的接收address(这里是上图右侧表格中的address:B0),并发送650 iota。
3.3等待交易确认
在钱包A发送金额后,我们看到资金转帐(交易)出现在两个钱包中(查看钱包中的历史),钱包A支出650 iota,钱包B收入650 iota,此交易尚待确认。由于交易尚待确认,因此钱包内显示的余额不会更新。
3.4 交易已确认
一旦此交易被确认,如交易历史中所示,余额也会更新(钱包A支出650 iota,钱包B收入650 iota)。
4. 交易细节
4.1 交易后两个钱包中的帐户数据
在钱包A中,我们现在只能看到一个“entry”(entry,我理解为是一个数组结构),除了先前的4个address外,多了一个新address,里面有350个iota。
在钱包B中,我们现在看到一个新的“entry”(钱包B之前是空的),有650个iota。
下图交易后的金额总计。
4.2 如何交易资金
正如我们之前所看到的,在交易之前,钱包A有4个输入(input),每个输入都有一个address和一个余额。很明显,在此次交易中,所有4个输入都被花费掉了(资金设置为0),并且剩下的350个iota被转移到一个新的“entry”中。这就是IOTA如何处理交易的。
我们首先看一下钱包A中的bundle细节(与钱包B中的相同)。点击历史中的 Show bundle 链接。
现在我们对发生的事情有了一个清晰的了解。
- 一个650 iota的“entry”到(钱包B的)address B0。
- 4个“entry”变为负值,即表示花费掉了。 我们从100,200等开始,它需要所有4个“entry”来提供650 iota。我们可以验证上面钱包A上的address。
- 在每个负值“entry”下面都另外增加了一个0值“entry”,这是签名部分。 我们可以在细节上忽略它们,它们可以被认为是负值“entry”的“一部分”。
- 最后,我们看到一个新的“entry”上有350 iota。这是钱包A中的新address。这是向钱包B支付650 iota后剩余下的那350 iota。
- 所以这个bundle是平衡的,即正值和负值是相等的。
- 更重要的是,这笔交易没有交易费用,IOTA的方法(称为DAG)可以实现小金额的交易。如果我们熟悉基于区块链的分布式账本技术,比如比特币,如果你转移小额资金,可能手续费都要比转移的金额本身要高。
4.3 了解bundle的内部
我们可以在bundle中获取更多的细节,探索每个“entry”。在这个bundle中,总共有10个“entry”。在IOTA中,“entry”的术语是“交易”,我觉得这有点困惑,因为我们可以把转账看作是“交易”。下面我将继续使用“bundle”进行资金转移,“entry”显示每个bundle的内部。
注意当前索引(currentIndex),显示的是“entry”的索引。请注意,索引0(#0)是bundle的尾部,索引9(#9)是bundle的头部。 在这个bundle中共有10个“entry”(从#0到#9)
下图是“entry”#0。
在这里我们从output中看到:
- 这个“entry”的散列 (HIIFXH ...)也是这个bundle的散列。
- address和value与我们在bundle屏幕截图中看到的一致(章节4.2的配图的第一个“entry”)。
- signatureMessageFragment具有不同的含义。 对于不带消息(message)的正值 ,它全部是9,意思是空的。
下图是“entry”#1。
从“entry”的output看到:
- address和value与我们在bundle截图中看到的一致(章节4.2的配图的第二个“entry”)。
- 对于负值,signatureMessageFragment是签名的存储位置。签名是钱包如何花费这笔钱。除非提供正确且经过验证的签名,否则无人可以使用这笔钱(100 iota)。在我们的案例中,只有钱包A可以创建此签名。
- 请注意,这只是签名的第一部分。 见下面的“entry”#2。
下图是“entry”#2。
从“entry”的output看到:
- address和value与我们在bundle截图中看到的一致(章节4.2的配图的第三个“entry”)。具体来说,address与“entry”#1的相同,并且该值为0。
- 对于0值, signatureMessageFragment是先前“entry”(#1)的签名的其余部分。合并的signatureMessageFragment是使用此金额(100 iota)的完整签名。
其他“entry”遵循与前三个类似的逻辑,也就是说,
- (#1,#2)类似于(#3,#4),(#5,#6),(#7,#8)
- #9类似于#0
4.4 bundle保留在哪里?
在这里,我们谈谈IOTA中使用的数据结构Tangle。它是一种有向无环图(DAG)方法,不同于常见的区块链实现(比如比特币)。每个bundle(一个正方形)在附加到“tangle”之前需要批准另外两个未批准的bundle(称为Tips)。而这个bundle后来也会以同样的方式被其他新的bundle批准,这就是tangle如何增长的。
下面一个Tangle的图示。
来源:IOTA白皮书
灰色方块代表未经批准的bundle(Tip)。
如果我们看看bundle的头部,即最后一个“entry”(#9),我们在这里看到两个项目: trunkTransaction(KLVRDC ...)和branchTransaction(NEYTTF ...)。他们是这个bundle批准的 其它两个tips。
至于bundleTransaction和branchTransaction是如何指向bundle的,我们就不详细讨论,下图是我的bundle在Tangle内的位置。
5、 总结
我们已经探讨了在IOTA的钱包之间资金的转移方式,以及这种转移背后发生了什么。我们还讨论了一些非常基本的交易组合结构,以及它是如何在tangle中定位的。其间跳过了一些细节,但是这应该足以使您了解IOTA的更多信息。
原文链接:https://medium.com/@kctheservant/how-fund-transfer-is-done-in-iota-3acdb66a17ca