交易发送
- 发送一笔交易有基本的3个过程
- 第一步:构建交易bundle,并且通过你的私钥对交易输入进行签名。IOTA中交易包 bundle是由多笔交易构成的,包括输出到接收地址,以及输入的花费地址;IOTA中存在两种交易,一种交易是有IOTA传输的非零交易,因此必须对输入进行签名,另一种交易是零值交易,仅仅是向地址发送消息;交易bundle代表的是含值交易; 一个交易对象包括地址,签名,交易值,以及tag等多个字段。
- 第二步:Tip选择。Tip选择是在缠结 tangle上的一个无规行走,然后随机选择两笔交易进行验证的过程。你发起的交易检查所选择的交易是否合法,如果所选择的交易经验证没有问题,你那么就加入到你的交易包的构造中,并称之为 branchTransaction和 trunkTransaction。
- 第三步:PoW。一旦交易包构建,将tips添加到bundle中,并签名后,那么对交易包中的每一笔交易进行PoW,交易包中的每笔交易需要一个nonce值(PoW得到的结果),从而被缠结网络所接受。IOTA中的PoW与Hashcash类似,也是作为防止垃圾交易的一个方法,并且用来防止女巫攻击。完成PoW之后,应该更新交易对象的nonce,然后交易就被广播到缠结网络中,并等待其他交易来进行验证。
CURL
- IOTA 团队创建了他们自己的加密哈希函数,称之为Curl。
- 哈希函数Curl在IOTA中有几个用途和目的,在这里仅集中讲述Curl在PoW中的应用。这里也不讨论Curl算法本身,以及Curl是如何实现的。
- IOTA轻钱包中使用Curl哈希函数来进行PoW做功,并且提供了两种方法来执行Curl哈希算法。
- 方法1: Webgl 的Curl实现。IOTA请钱包基于Electron 框架构建,Electron整合了Chromium(也被Google Chrome浏览器使用)和Node.js 为单一应用程序,并可以打包为Mac, Windows, Linux平台下的程序。Curl哈希算法已经导入到 Javascript(Curl.lib.js)代码中,从而可以在Chromium等支持WebGL的浏览器中使用。WebGL 是一个为其兼容的web浏览器的图形交互Javascript API,WebGL运行使用系统的GPU. Curl.lib.js 代码库: https://github.com/iotaledger/curl.lib.js
- 方法2: 使用CCurl实现。CCurl是Curl的 c语言版本库,其使用系统CPU来运行。Ccurl代码库: https://github.com/iotaledger/ccurl
- 通过GPU执行相对于CPU要更快。
- IOTA轻钱包默认使用 “Webgl 2 Curl”从而加速PoW的执行。如果在这种模式下,遇到类似于“非法交易哈希”等报错时,请选择”Ccurl实现“.
PoW
- PoW的目的就是防止垃圾交易,同时防止女巫攻击。
- PoW意味着在交易bundle中为每笔交易计算得到一个nonce.
- 在IOTA交易中,无论是零值消息交易还是非零值交易,你都不需要支付系统手续费,但是需要做功耗费微小的电能。
- MWM: 最小PoW权重系数,相当于是PoW的难度系数,在视频教程4中有介绍。
- IOTA交易数据经过编码并以2673trytes长度存储,其中交易对象的最后81trytes是为Nonce保留的。关于交易数据的更多信息可以从https://iota.readme.io查看。
- transactionObjectTrytes和MWM作为输入参数,执行PoW, 得到结果为Nonce,是81trytes。
- Nonce插入到transactionObjectTrytes,得到transactionObjectWithNonceTrytes.
PoW的验证
- 将 transactionObjectWithNonceTrytes转换为 trits, 即transactionObjectWithNonceTrits
- 创建并初始化 CheckHash对象( Int32Array(243)), 这个对象将用于存储Curl 哈希运算结果。
- 创建并初始化 CurlHash对象(Int32Array(3*243)), 这个对象将会:接收 absorb transactionObjectWithNonceTrits 作为输入; 执行Curl 哈希运算;输出结果,即squeeze数据到 CheckHash对象中。
- CheckHash对象中所存储的结果最后trits 为0的个数至少要到MWM,如果满足该要求,那么nonce 就是合法的。
- 具有合法nonce的交易才能被缠结网络所接受。