协调器(Coordinator)是一种IOTA在网络早期,为了保障网络安全采用的临时策略,这种类似机制在比特币早期也存在,而竞争者一直以此来攻击IOTA并没有做到完全的去中心化,为了彻底移除协调器,并实现IOTA网络的扩容,IOTA启动了Cooridice计划,在整个计划当中,mana机制被引入并成为关键,真正可以算的上IOTA的Coordicide新魔法的“魔力值(在电脑游戏中,魔力值的英文通常叫作mana)”。
目前coordicide的原型项目Shimmer逐渐接近开发尾声,笔者通过分析它在Git的开放源码,特对该机制给大家做一下分析和解读。
一、代码分析(本节适合有初步编程基础的人阅读)
全局控制常量
burnedMana(焚毁Mana):每次发起交易须扣减的Mana值;
decayInterval(衰减间隔):一个时间间隔,用于控制衰减速度,数字越小,衰减次数越频繁,衰减得越快。
decayFactor(衰减因子):用于调控mana衰减的速率,数字越大,衰减得越慢。
ManaScaleFactor(Mana缩放因子):用于控制发起交易时产生的mana的倍数,数字越大,相同交易获得的Mana就越多。
关键参数
coins(转出币数):发起交易时每笔输出的token数量,可以简单理解为从节点地址转出的币数;
decayTime(衰减时间):当前时间到上次mana计算的时间差;
heldTime(持有时间):转出的币在原地址上停留的时间,根据本次转出的时间减去上次转入的时间得出;
新增Mana的计算公式:
gainedMana:=float64(coins)*calculator.options.ManaScaleFactor*(1- math.Pow(calculator.decayFactor, float64(heldTime)/calculator.decayInterval))
简单说:新增Mana=转出币数×Mana缩放因子×(1-衰减因子的(持有时间÷衰减间隔)次方)
Mana衰减的计算公式:
erodedMana:=float64(mana)*math.Pow(calculator.decayFactor, float64(decayTime)/calculator.decayInterval)
简单说:衰减后的Mana=原Mana值×(衰减因子的(衰减时间÷衰减间隔)次方)
Mana余额查询实时计算公式:
result, _ = balance.calculator.ErodeMana(lastBalanceHistoryEntry.(*BalanceHistoryEntry).balance, now[0]-lastErosionTime)
简单说:公式参考Mana衰减计算公式,将(当前时间-上一次发起交易的时间)作为衰减时间
在这里需要说明的是,节点只会在本地保存上一次交易发起的余额记录,而不会在每次查询时保留记录。
二、算法总结(适合所有人阅读)
通过分析以上源码,我们可以得出以下结论:
- mana是节点通过创建有值交易(这个交易的地址所有者可以是节点本身地址,也可以是其他人通过私钥签名)来获得。0值交易不会产生mana值;
- mana定期会以指数级进行衰减,假如初始mana为5000,衰减因子为0.5的话,那么第一次衰减后的mana就是2500,第二次衰减后就是1250,以此类推;
- 发送一次交易会消耗(扣减)固定数量的mana值。
三、对节点和生态的影响问答
mana值会运用在哪些场景?
从目前官方公开的情报来看,mana值已经确定的在节点共识形成(网络节点发生争议时进行投票)中使用,而目前在评估它在控制节点交易发送频率(防止恶意发送垃圾交易而造成网络拥堵)上使用的可能性,简单说,两个场景,一个已明确,一个在评估待定。
1、这种机制是否能改善恶意垃圾交易(Spam)的肆虐?
能,因为只有有值交易才会产生mana值,而发送交易则会消耗固定的mana值,mana值按周期进行衰减,针对于以大量的0值,或者低值交易为特征的Spam,最终发送时因为mana值不够,而无法频繁发送,最终网络拥堵消失。
2、 这种机制会减少能耗吗?
能,取消动态Pow控制机制以后,任何站点都不再需要参与到算力竞争当中。
3、这种机制真的会对币价产生良性影响吗?
一定程度上能,虽然在网络非拥堵情形下,mana值不会产生太大的实际作用,但是真正使用IOTA网络的大量物联网运营企业,无论网络目前是否拥堵,为了保障自己的交易能顺利的进行,都会通过持有一定量的token,用于与上下游行业节点进行结算,或者通过自己倒账来获得mana值。
4、这种机制能优化整个生态吗?
一定程度上能,这种机制明确的表达了IOTA基金会对参与者的指引,即鼓励IOTA网络的参与者充分使用token来与其他实体(企业或个人)进行结算,让数据具有价值。同时,对有利于Token流通的做出贡献的节点,不仅在共识形成时给予更高权重,同时也让他们在使用网络时有更多的资源。
5、在一种常见的主从结构的部署当中:某个中心节点专门用于结算(高mana),而大量的物联网终端(低或者0Mana)只是对中心节点做数据传递,这些终端通常都没有Token,那是不是这种终端的交易会在网络拥堵时因为无法获得mana而无法正常工作?
这个问题一开始也困扰了笔者,后来通过与IF的人交流找到了可行的解决方案。
方案一、可以让这些无Token的节点,不再充当节点,只分配钱包私钥,这些节点通过私钥签名以后,将交易数据发给高mana的结算节点进行广播代发。
方案二、分片(sharding),虽然目前iota的分片代码还没开始公开,但根据核心开发Hans Moog在官方交流平台透露的消息,子分片的交易因为与主网隔离,所以笔者大胆推测,可以将结算节点和物联网终端的交易划分到同一个分片中进行处理,具体原理暂不做详解。
6、这个方案的难点在哪里?
因为目前shimmer还没有正式进行有值交易的测试,笔者从源码中分析,感觉如何正确的评估网络的现实的容量上限和网络攻击的规模,以此来确定几个全局的控制变量,这个是关键,需要shimmer在测试环境下进行大量的模拟才能最终确定。
本文原文非中文版本,由BruceX进行翻译,如若转载,请注明出处:http://www.iota.love/201909/source-code-decryption-mana-value-calculation-and-the-impact-on-nodes-and-ecology/