73

IOTA简介以及改进方案

 6 years ago
source link: http://mp.weixin.qq.com/s/xq60VxQm-XgvS_Ow9xwcGw
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Image

如果你关注区块链和加密货币,相信你已经听说了IOTA这个异军突起的加密货币。根据CoinMarketCap的数据显示,IOTA目前(2017-12-12)总市值排名第5,交易量排名第8,从半年前$0.8的价格一路飙升到现在$4.50。作为一个加密货币,IOTA的成绩单是非常漂亮的。但是你知道他背后的技术是怎么样的嘛?你知道IOTA在社区里的争议性不亚于BCH嘛?你了解IOTA团队的前世今生嘛?今天老钱来给大家聊聊IOTA。

IOTA是什么

IOTA的初衷是一个给IoT设计的加密货币,这个目的反映在了这个货币的名字里。在IOTA对物联网的世界观展望里,智能硬件终端之间将会根据用户设定的规则进行大量频繁的小额交易。想象有这么一天,你把你的智能汽车停在路边走进一家咖啡店,路边的智能咪表每分钟自动向你智能汽车里的钱包扣停车费,咖啡店的屋顶装着光伏板,太阳能发电供给这家咖啡店的所有电力设施,发电的盈余将会输给同区域的另外几家住户,这些住户家里的智能电表自动通过计算来买咖啡店的太阳能发电盈余。这些都是IoT终端之间交易的例子。

IOTA的核心团队成员有David Sønstebø,Sergey Ivancheglo,Serguei Popov,和Dominik Schiener,这个团队之前的产品是NXT,最早的一个基于POS的虚拟货币。

IOTA背后的分布式账本结构并不是传统区块链中“链式”的结构,而是一个有向无环图(DAG),IOTA称之为Tangle,中文翻译为“缠结”。在这个Tangle中,每一个节点代表的是一个交易。IOTA里没有区块的概念,也没有挖矿和矿工的概念。这可能是IOTA的最吸引人的亮点了,没有挖矿和矿工就代表没有交易费,币量也是恒定的,而且整个网络的吞吐量(Throughput)也能很高。听起来是不是一个很理想的系统?接下来我们就来深入了解一下IOTA的技术细节,一起看看哪些已经是现实,哪些东西社区还在探索和研究。

IOTA技术细节

在Tangle这个由交易组成的有向无环图里,一个网络节点要发起一笔新的交易时,需要在Tangle中找2笔其他交易去验证,并且将自己新发起的交易指向这两笔交易,整个Tangle就是这样一点一点扩大出去的。正因为这样的设计,整个网络中验证交易的责任从传统的矿工转移到了每个网络的使用者身上——你想要发起一笔交易,就必须帮着一起验证网络中的其他交易。

上图这个例子是截取了Tangle中的一部分(Tangle扩展的方向是从左到右,越往右的交易越新),交易A指向交易B和D,那么A就是直接验证了B和D(A directly verified B and D);A虽然没有直接指向F,但是A到F之间有一条通路(path),那么我们可以说A间接验证了F(A indirectly verified F)。上图中A和C称为2个tip,tip是指还没有任何其他交易直接或者间接指向他们。

一个网络节点发起一笔新的交易时,除了需要找Tangle里2笔其他交易去验证之外,还需要做一个POW计算。这个POW计算比比特币的POW计算要简单很多,一台普通电脑可能只需要5-10分钟就能完成计算。IOTA设计POW这一步是为了防止有人恶意发很多transaction从而阻塞整个网络,或者更进一步通过更改整个DAG的形状而达成一些攻击。上图中,每个表示交易的小方块里右下角的数字被称为权重(weight),这个weight是和POW所付出的计算量相关的,举个例子,假如有2笔交易,他们通过POW算出来的二进制值分别为x和y,x的开头是2个0,y的开头是4个0,那得到y所需要的计算量一定是大于x的,所以交易y的weight会比交易x的weight大。在IOTA里,weight的取值范围是3^n,也就是weight的取值只可能是1,3,9,27…

方块里左上角的数字被称为累积权重(cumulative weight),这个cumulative weight等于这个交易自己的weight 加上所有直接或间接指向它的交易的weight的总和。比如交易F,直接或间接指向F的有A,B,C,E,所以F的Cumulative Weight = 1+3+1+1+3=9.

除了weight和cumulative weight,每个交易还有一个分数(score),这个score等于这个交易自己的weight加上所有这个交易直接或者间接验证了的交易的weight的总和,举个例子,假如只看上图的话,E直接或间接的指向了除了A,B,C,D之外的所有交易,所以E的score=1+3+1+1+1=7。

这里可以看出cumulative weight是一个可变值,从发出交易之后这个值会一直增加,score是一个不可变的值,交易发出之后,它的score就定了。这个cumulative weight和score能用来干什么呢?且看下面继续分析。

假如我要发起一个交易,我要怎么选2个交易去验证呢?理论上你可以随便选。你可以随机选择网络中的2个交易,或者你也可以永远只选几个很老的交易(在Tangle中处于很左边的位置的交易)。但是一个健康的Tangle应该是不断有人发起新的交易形成新的tips,这些tips也应该尽快被之后来的交易所验证。所以选择2个交易时,我们更应该倾向选择tips。

IOTA官方推荐用一种马尔可夫蒙特卡洛(MCMC)随机游走的方法去选择2个tips,这样能保证整个Tangle良好的发展。这个MCMC的过程是这样的:

1. 挑选一个cumulative weight区间,比如270-300之间。

2. 挑选Tangle中N个cumulative weight在这个区间内的交易节点(particles)。这些cumulative weight落在区间内的节点在有向无环图里可以想象成纵向上的一条slice,你可以想象这些particles都处于一个差不多的垂直面上,理论上他们距离整个Tangle最右边边缘的距离也差不多相当。

3. 这N个节点往右随机游走,两个相邻节点A和B之间的cumulative weight相差越小,那么A游走到B的机率也越大。

4. 这N个particles中最先完成游走并到达的2个tips,这2个tips就是你的交易需要去验证的2个交易。

但是这只是推荐的做法,怎么防止有人只验证一些很老的交易呢?这里就要用到前面说的score了。IOTA客户端在发起交易时,只会选择那些score大于某个特定值的交易去验证。这个特定值与当前tips的数量正相关。也就是说如果一个交易指向的是2个非常老的交易,那么它的score就很可能不满足这个特定值的条件,这样他们被新的交易选到的可能性就很小。

那一笔交易要怎么才能算成功确认呢?这里要介绍一个非常重要的概念,叫做Finality(最终确认性)。如果我们说某一个交易或者转账在某一个分布式的账本上被“最终确认”,那么这个交易无论发生什么,也无法被回滚和撤销。

大家可能觉得,不对啊,区块链的一个基本特性不就是“历史不可更改”么?

这里要指出一个认知上普遍的误解,大部分区块链中的交易不存在“最终确认”这种说法。拿比特币来说,你的交易打包进区块,并得到6个确认之后,并不是指这笔交易100%确认了,如果有人发起了51%攻击,你的交易在攻击之后的最长链里就不一定是被确认的状态。但是如果我们假设比特币不会出现51%攻击,那么随着区块链的增长,你的交易被逆转的可能性是越来越低。你对这个交易被确认的“信心”也越来越高。IOTA里呢,这个“信心”是可能变高也可能变低的。IOTA里交易的确认是这样一个“信心值”,这个信心值=当前所有tips中,有多少tips存在一条能连通到你的交易的路径,或者换句话说,当前有多少tips间接确认了你的交易。假设当前一共有100个tips,其中有90个tips间接确认了你的交易,那你的这条交易就是90%确认。如果我能造出100个新的tips使得这100个tips都不间接确认你的交易,那么现在你的交易就变成只有45%确认了。相信你看到这儿不难看出,一个交易要想得到一个足够高的确认信心,那需要等待的时间也不短。如果每个交易都想要超过50%的确认信心的话,那网络中交易的吞吐量并没有实质性比比特币这些传统的区块链提高到哪里去。IOTA更灵活的地方是体现在交易的延迟上,因为如果你选择只要10%的确认信心的话,一笔交易被对方接受的速度会快很多。

交易确认的信心值居然可以那么简单就改变,这种情况很恐怖吧?IOTA现在是怎么处理这个问题的呢?很简单,他们在客户端里写死了一个网络节点的地址,这个节点叫coordinator,coordinator是IOTA团队维护的一个闭源的component,coordinator每分钟会发一条交易,为了区别这个特殊交易和别的交易,coordinator发出的交易称为milestone。IOTA现在默认所有被milestone间接确认的交易都是100%确认的状态。因为没有人可以伪造coordinator的交易,所以这个办法是最直接,最简单的解决办法。那么问题来了,这样整个IOTA网络不就成了coordinator一个人说的算了吗?是的。。。很多币圈大佬和学者都有指出过这个问题,称IOTA完全就是一个中心化的系统。IOTA团队也反击称coordinator只是在IOTA还没有被大规模应用前的一个临时方案。他只是初期出来带一下节奏,等IOTA整体网络的负载上去之后,会移除coordinator。但关键的问题在于,如何移除coordinator?或者如何建立一个具有良性激励机制的“coordinator集团”, IOTA团队并没有给出完美的答案,社区的一种观点是, IOTA用复杂的参数和ledger维护的方法,包裹了从根本上没有解决的类似“权益证明”(POS)的问题。

IOTA对于上面的观点也做出了一些反驳,他们认为IOTA因为没有矿工和区块的概念,所以整个网络的算力可以大致等同于整个网络的交易吞吐量(Throughput),理想状态下,如果吞吐量大了,上面说的那种把交易确认信心值降低的攻击方式不会很简单,因为如果大部分交易流量都是来自诚实的好节点,都跟着规则走,那么一个attacker通过添加没用的tips来降低一个交易的确认信心会变得杯水车薪。IOTA的白皮书里提到,只要attacker不掌握1/3以上的算力,那么attack成功的概率会很低。我们来计算一下,现在IOTA整个网络的交易吞吐量还很低,大约每小时1500个交易。attacker如果能发每小时500个交易就足以可以改变Tangle的形状,attacker如果能每小时发750个交易(每5秒一个交易),那么基本上整个网络他一个人就能说的算了。5秒一个交易并不是很难达到的一个目标,所以现在IOTA放了coordinator这么一个网络秩序的维护者在里面。

Curl哈希函数与三进制

年中的时候,MIT的密码学教授Neha Narula发表了一篇报告(https://medium.com/@neha/cryptographic-vulnerabilities-in-iota-9a6a9ddc4367),称IOTA内部自己实现的Curl哈希函数有严重的漏洞。Narula教授称Curl哈希函数有碰撞漏洞,她的团队用普通计算机几分钟内就能找出哈希碰撞,attacker可以利用这个漏洞来伪造别的用户的签名,从根本上瓦解IOTA的安全性。Narula教授将这个发现告诉了IOTA团队,IOTA团队很快就把这个漏洞修复了。但是对外呢,IOTA声称(https://gist.github.com/Come-from-Beyond/a84ab8615aac13a4543c786f9e35b84a)这个漏洞是他们故意放在那里的,因为这样如果有人把IOTA开源的代码复制出去做了一个新的Tangle,他们就有办法去整这些抄袭的人。。。我听到这句话的时候,内心是崩溃的。这可能是我听到过的最荒唐的狡辩了。

密码学界有一句话:“永远不要自己写加密函数(never roll your own crypto)” 但我认为IOTA自己写哈希函数还是有他的原因的,IOTA里对数据的编码采用了一种特殊的三进制编码,主要原因是IOTA的团队相信三进制CPU理论上具有比二进制CPU更好的能效。IOTA团队在创造IOTA之前,自己也在研发一款叫JINN的三进制CPU,他们的理想中,JINN如果成功普及开,IOTA的三进制模式就非常适合在JINN上跑了。这个想法是挺超前的,但是,目前三进制CPU仅仅是在科研阶段。JINN后续也没有什么进展。我猜IOTA自己写哈希函数一开始也是为了适配内部三进制的编码不得已为之的。IOTA目前所谓的三进制其实也只是一个模拟,IOTA的代码全都是二进制形式,在程序里需要将三进制转化成二进制,处理完后再转回三进制。

IOTA白皮书里提到了几种可能发生的attack,这里我就不一一描述了。综合看来,白皮书里提到的attack的方式归根结底都是attacker能够改变整个DAG的形状而造成的。那么如果我们设计一种机制让attacker没那么容易自由的改变DAG的形状,是不是就可以防止很多attack,或者大大降低这些attack的成功机率了呢?换句话说,如果发起交易选择tip不是一个不确定性(undeterministic)的过程,而是一个确定性(deterministic)的过程呢?这样你的交易指向哪两个tips就不是任你选择的,而是能预先判断出来的。比如你发起的交易所需要指向的2个tips是确定的,而不是通过MCMC这种随机游走的方式得到的,会怎么样?我还没有想好这么一个deterministic tip selection的方法,但是我有几个idea。比如挑选的tips是通过交易的hash值来决定的,这样是不是确定性就会比MCMC要高。这样要想改变整个DAG的形状,是不是难度就变得更大了?欢迎大家留言一起讨论这种deterministic tip selection的可行性以及对安全性的帮助。


老钱(BS’14, MS’18),UIUC计算机科学系硕士。近3年互联网工作经验。目前担任NAD Grid技术合伙人。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK