本身这篇文章原本是在上次与合作方联合举办的Avalanche活动里的主讲稿。但是因为当时的时间问题,有些内容和细节并没有讲到。所以今天我来整理了下当时的内容,梳理一下Avalanche整个脉络,尤其是关于其subtnet对Avalanche未来的影响。
Avalanche共识协议
一条链最基本的任务就是确保网络安全性,这涉及到的东西就是共识。所以我们在了解Avalanche的时候,首先需要介绍的就是Avalanche的共识协议。
一个通用的共识引擎
首先需要明确的一点,Avalanche原本是一个通用共识协议。我们所熟悉的“Avalanche”去中心化平台实际上是该共识协议+一系列配套设施组成的。而Avalanche共识协议本身用一句话概括的话就是“通过不断反复对网络中的节点进行抽样,收集他们对某个提议/交易的响应,达成最终共识。
所以本质上,Avalanche是为有关联的交易提供一个Partial Order, 形成没有冲突的交易集合。
当然,这样的叙述过于抽象,所以我们不妨举个例子来看下这个共识是什么样子。
假设在一个房间里挤满了人,他们试图就午餐吃什么这一问题达成共识(当然,我们为了简单,在此假设午餐只有两种选择,披萨和烤肉)。通常来说,有些人最初喜欢披萨,有些人最初喜欢烤肉。我们的目标就是最后确定要吃哪一种。这时候,每个人都会随机询问房间里的一部分人,问午餐想吃哪一个,如果超过一半的人选择了披萨,那么他也会选择披萨,反之就是烧烤。因为每个人都在重复这个过程,所以每一轮都会越来越多的人有了相同的偏好,经过足够多的回合,就会达成最终的共识。
我们用稍微条理的方式来看下这个过程:
我们假设房间里有n个人,他们在决定吃什么之前,会每次随机问k个人的偏好,每次有大于等于α人数给予同一个回应的时候,本次询问结束,进入下一轮,一直到连续β次的询问轮次得到的结果一致,则最后吃什么也就确定了。
这也解释了这种共识之所以成立的一个原理,由随机抽样引起的偏好随机变化会导致网络对一个选择的偏好,这会导致网络对该选择的偏好更多,直到它变得不可逆,然后节点才能做出决定。我们可以发现这个过程本身就和比特币的概率最终性确认的过程很像,后面我们会详细来说这个事情。
而对于整个共识的形象化体验,可以去其demo网站玩一玩:
https://tedyin.com/archive/snow-bft-demo/#/snow
上述就是对于共识过程的一个简单概览。但是,如果想要深入了解Avalanche是如何发展到现在的,就需要回顾下它的历史发展过程。所以接下来,我们就来看下Avalanche的共识发展史。
共识协议历史发展
Slush
一开始,Avalanche提出的协议并不是叫雪崩,而是叫Slush,采用UTXO模型。这个协议实现了我们上述达成“中午吃啥”这个共识的基本功能。其过程用人话来说就是:
1. 一开始每个人都没有偏好,不知道吃披萨还是烧烤。
2. 由于某些触发条件,比如节点收到交易,其有了偏好,并且开始多次随机选取一组很小的样本k个人去询问,过程和前面类似。
3. 但是不同的是,在这个过程中,没有偏好的人被有偏好的人询问时,自己会变成询问人的偏好,比如我没想法,但是有个人过来问我:“我今天吃披萨,你想吃啥”。那么我就也会选择吃披萨。如果我本身有偏好,比如我爱烧烤,我就会回复自己的偏好给询问人。
4. 如果每次有超过α的人回复了同一种偏好给我,而我本身的偏好和这个大多数偏好不同,那么这个我也会改变成大多数偏好。然后重复询问过程,一直到询问X轮为止,才会决定最终的偏好。这个X是为了不让这个过程无限重复下去的一个保险。
从这个过程中我们可以发现Slush的特点:
- 只会记录当前轮次的状态,不会记录历史状态,进而会有最后的拜占庭问题。
- 询问样本小,不用和其他链一样询问所有节点,效率高的概率最终性。
- 反复抽样,放大随机扰动,完成最终性确认最重要的特点。
- 但是,如果遇到恶意节点故意改变自己的偏好来和大众偏好不同,扰乱平衡的话,那么整个网络的安全性将大大降低。由此可见,Slush是一种非拜占庭协议,即无法容忍恶意节点的存在。
Snowflake
由于Slush本身的特点并不足以支撑起一个安全的网络共识,所以Avalanche在其基础推出了升级版的协议,snowflake,雪花协议。其新加入了一个counter功能,让每个节点来记录自己当前偏好的可信度, 即每次询问其他节点后,如果收到大于α的统一偏好回复,节点的counter就会给该偏好+1,反之则重置为0。当counter到达阈值β时,节点就接受当前偏好,不再改变。这样的好处是节点不需要等x轮结束才能确定自己的偏好,受到恶意节点信息干扰的效果也会减少。这样,snowflake成了拜占庭容错协议。
不过,其依旧有个问题,Snowflake 可以保证对最小的状态做出很强的保证(尽可能少的询问就可以确定结果),但是其状态记录也是较为短暂的,counter的值在每次偏好变化的时候都会被reset,同时,这种状态的保留也只是针对节点本身的状态,而不是对整个网络的历史状态进行保留。说白了就是没法做整个网络的状态历史比较,,依旧会有安全问题。所以为了解决这个问题,Avalanche又对协议做出了改进, 同时也是整Avalanche未来的基石 — -snowball。
Snowball
雪球协议的改进其实说起来也很简单。既然雪花和slush都无法保留长久的状态,那么为什么不让网络保存多种状态,然后新加一个变量用来判断哪个才是正确的状态呢?所以Snowball引入了一个confidence counter。这样的话,每次询问成功(对方和我一样的偏好),就会让confidence counter+1,如果遇到对方和我的偏好不一样,那就比谁的偏好confidence counter高,选高的。这样提高了协议共识结果的可靠性,也提升整个网络的安全性。当然,这样看的话Snowball已经可以达到我们的安全目的了,不过Avalanche并不会局限于此,于是其推出了我们现在看到的最终协议 — -Avalanche。
Avalanche
Avalanche在snowball上引入了动态并且仅限追加的DAG(有向无环图)结构来提高自己的效率和安全性。我们直接用一张图来看下Avalanche DAG结构:
从上图中我们看到,所谓的“动态并且仅限追加的DAG “,其实就是新的节点(DAG里的节点,不是我们认为参与共识的节点)只能在后面追加,而不能在已有节点之前添加。
同时这里需要明确里面的一个概念,就是祖先和后辈。在一个节点之后追加的任何与它有联系的节点都是其后辈,而它自己就是祖先。按照上图来说的话,bcde都是a的后辈,de是c的后辈,但是e不是d的后辈。
但是,可以看到,如果用交易组成DAG的话,会发现这种结构没有处理“冲突交易”,也就是类似双花的问题。所以Avalanche做出了规定:冲突交易集中只能有一个交易可以被包含在DAG中,每个节点都只能偏好冲突集中的一个交易。当然,这里不止是交易,是所有冲突的提议。
知道这个概念,我们就可以去了解下Avalanche新增的另一个特点 — — 传递投票,给后辈投票,同时也相当于给它的所有祖先投票。这也是高效解决冲突交易(比如双花)的一种方式。
举例来说,假设我们目前运行着一个有以下参数的Avalanche网络,每次随机选取的样本数为k=4,单次通过阈值α=3,需要连续成功的次数是β=4。
我们先来看下正常情况下这个网络是如何工作的:这时候,如果我收到了一笔交易Y,并且把这笔交易广播到被选中的样本节点,询问偏好的时候,结果应该是这些节点会有个多数偏好,如下:
可以看到,它得到了三个yes和一个no。这意味着它在这轮询问中获得了肯定,所以这笔交易的合法性更新成true。而该节点更新的DAG如下:
这里先看几个变量的定义,Chit, 本次询问该交易的合法性,confidence ,该交易的可信度, consecutive success 是连续几轮获得合法性的记录。这里面chit是布尔值,只有真假,confidence是只要该交易在一轮询问中被确认合法,自己本身会+1,同时其祖先也会+1,一直传递到确认了最终性的祖先。consecutive successes则是连续几轮确认合法就一直+1,一旦出现非法或无结果的轮次,就会归零。祖先同理。
现在,我们可以回到这个例子本身,我们发现这个DAG是由V ,W, X, Y四笔交易组成。虽然本轮询问的是交易Y,但是因为V,W,X都是其祖先节点,所以按照avalanche里的“给后辈投票也相当于给祖先投票”的思路,其祖先节点会在各自的confidence, consecutive success上各加1,变成如图里的样。同时,因为需要连续成功的次数β=4,我们可以看到交易V的β已经是4了,所以交易V的最终性被确认,不会参与下一轮的打分。
如果这时候发生了一笔冲突交易Y’,情况会变得怎么样呢?
我们依旧按照之前的过程,但是假设Y’被大家否决了,那么按照我们说的几个参数的更新规则,这次我的DAG会变成什么样?如下:
各个值的更新规则和上一轮一样,这里就不再赘述。这里主要注意的是Tx W,因为其新的后辈Y’是冲突交易而且被拒绝,会导致它的consecutive success归零,同时confidence -1.
所以,我们可以看到,通过DAG这种数据结构,其最终性确认的效率很高,同时因为没有采用单一的状态复制机,而是由节点各自维护自己的状态机,独立状态转换,但是又可以最终同步,所以其安全性很高。
到此,我们已经分析了Avalanche整个协议的发展历程和特点。现在可以做一下简单的总结。
共识小结
1. 用BTC的机制,做了公链的事情(利用consecutive success+ confidence作为最终性确认的手段,避免了PoW效率较低的问题)。同时分离了共识层和应用层,性能和扩展性都提升了非常多。
2. 两大创新,subsamlping(其共识投票并不是全部节点参与,而是每次随机选取节点参与)& transitive voting(给后辈投票同时也是给祖先),无论网络规模多大都能做到高速响应和最终性确认。所以,其推出的subnet具有很大的可行性。我们会在后面讲
3. 缺点也是有,处理不了链下交易,或者说很难处理链下交易。
当然。前面的都是他们理论上是怎么设计共识的,最终我们还得落实到技术实现上。这一点Avalabs本身对设计进行了一些优化。我们来简单看下。
Avalanche工程实现上的优化
引入顶点
如果完全按照白皮书中的设计来,被选中的节点需要对每笔交易进行投票确认,这在出现大量交易的时候势必会影响网络整体的效率。所以为了减少这种情况的出现,在工程实现的时候,Avalabs引入了“顶点”的概念,就和区块一样。
- 具体来说,节点在收到新交易的时候,不会直接把交易广播到网络中进行询问,而是会把交易打包到“顶点” Vertex中。每个Vertex可以包含大量交易,而每轮被选中的节点现在成了对Vertices投票,而这个投票本身就被视作了对vertices里包含的所有交易进行投票。这样Avalanche DAG的节点就是由一个个包含了大量交易的顶点组成。而不是单个交易。
- 同时,在真正的询问中,节点问的不是说“你喜欢这个顶点吗?”,而是“比起这个顶点,你更喜欢哪个顶点?”,这样其他节点返回的都是他们认为更加合法的交易集,省去了该节点的排序,直接更新DAG的结果就行。进一步提高效率。尤其是它并没有删除非法顶点这个操作,而是让其无效,这和比特币还有以太坊是不一样的。比特币和以太坊是会删除不良区块。
- 如果一个顶点包含恶意交易,那么整个顶点都会被拒绝。该顶点里其他合法交易会被打包到下一个顶点里。同时,因为最终性的确认并不是出一个顶点就确认一个,而是有一定的延迟性,所以包含非法交易的节点及其所有后代节点都会被拒绝。而其中躺枪的合法交易将会被打包到下一个顶点,被重新投票。
与算法匹配的节点质押模型
我们都知道Avalanche用的也是PoS的方式来让节点参与安全维护,但是我们也看到了Avalanche的机制是随机抽样询问,而不是全部节点询问。这就提出一个问题,不同质押数量的节点在这个机制里会有什么样的不同。Avalanche的答案很简单:
节点质押的数量越多,其被随机选中当做被询问的对象的可能性就越高。被选中的越多,回应的越快,又是良性节点,就会获得丰厚的奖励。
除了节点质押和委托质押都是有锁定时间这一点外(节点1~2年,委托2周~1年),Avax还规定了节点接受的委托质押数量不能超过自己质押数量的倍数,同时还规定了一个上限。不过,我们都知道,治理嘛,参数当然是随时可以调整的。所以具体的数值我们也就不说了。
整体架构
整体架构这块其实不用我多说,大家应该得挺多的。其结构主要是官方推出的三个子网。结构图大家也见过很多次了,我就简单贴一下:
这里需要说明的是有几点:
1. Snowman是在Avalanche consensus基础上为智能合约进行过优化的链,本身的共识还是Avalanche consensus protocol。所以并没有单独说明。
2. 可以说说子网subnet,也叫专用节点验证网络:
- Avalanche最近在强推子网。其最关键的一点就是关于高度可定制以及安全性的问题。一个节点可以担任多个子网的节点,自由选择,同时子网也可以设立自己的门槛,例如硬件要求,质押数量等。但是,无论如何,子网节点必须也是主网的节点。同时Avalanche推荐第三方子网的gas fee和官方官方gas fee一样,都是固定值或者是0。
- 子网同时也是Avalanche无限拓展性的重要因素。因为每个节点都可以参与多个子网。只要节点自己的硬件条件没有问题,则整个网络的速度会随着子网的增加,例如一个节点支持一个子网1000TPS的速度,他支持三个子网的话,整个网络就变成了3000的TPS。同时,因为成为子网节点的前提必须是主网节点,理论上说,子网越多,avalanche越安全,而主网节点越多,能直接为子网服务的节点也就越多,减少了子网门槛,双方互相促进,形成一个正向循环。
- 子网之间的资产理想条件下可以无缝快速转移,但是因为目前的第三方子网太少,所以具体情况还要观察。同时各个子网如何设计自己的代币经济激励节点来参与也是需要研究的事情。
- 有人会说这样是不是就能说子网是不是都是共享安全性?个人认为这种说法是有问题的。因为虽然节点可以共享,但是每个子网具体有哪些节点,每个子网自己的规则都是不同的,比如恶意节点是slash? 还是只是退回撤掉节点资格(Avalanche主网是后者)?这都是问题。但是这并不是说子网的安全性完全没有保障。这里面牵扯到诸多博弈,例如如果一个子网的规则是节点资格被撤销影响该节点在其他子网里的功能,那么节点在作恶的时候就要考虑很多因素了。更别说,成为节点还得KYC/AML
- 目前主要流量都在C链,defi和NFT都离不开他。不过看这三个官方子网的关系,还是得结合生态来看。所以我们来直接看下Avalanche的生态。
生态现状
这个其实没啥好说的,各种数据网站上都有,我这边就直接贴一下defilima的数据。
基本数据
截止到4月11日,Avalanche有186个项目。而根据deflima, 现在AVALANCHE的TVL是14.88 b(大约以太坊的十分之一), 比其最高峰时期23.88b下降不少。而且可以直观的看到,目前整个生态最重要的应用是Aave。其实这不难理解,,我们都知道一条公链里最重要的基础设施就是defi基础施设,dex ,借贷,收益聚合器等。而以太坊上的老牌项目本身的体量已经很大,市场教育也做的较为出色,尤其是老牌项目基本都是DeFi项目,既然本身已经是市场龙头,为什么不直接利用他,这样的成本可是比自己从头搭建这些基础施设要小的多。
所以不止是Aave,整个Avalanche里体量排行在前的项目都是我们较为熟悉的DeFi,或者是老DeFi的分叉,还有就是上面说的收益类产品。当然这个图里的项目很多不止在Avalanche里,但是哪怕如此,点开每个项目里的TVL分布,依旧是这个排名。
我们可以看到,目前Avalanche上交易量排名前十位的基本都是P2E的东西。
Avalanche的未来?
看完基本的数据,我们现在可以思考一个问题:如果Avalanche只是和其他公链一样,没有自己的生态特色,那么如何才能持续的发展自己呢?尤其是目前这些项目都还是用的C链,并没有用到自己特色的subnet,那么Avalanche是否可以利用自己的subnet这个特色去做些什么呢?
为了解决这个问题,我们需要先考虑下一条公链想要一直保持竞争力,应该做什么?这个答案说起来很简单:
“招商引资,吸引人流,吸引外部资金”。换成我们区块链的话就是,“吸引资金,拉高TVL,增强整体生态的流动性”。传统思路是引入更多DeFi项目,但是现在的defi用户都很聪明,这样吸引的资金和人都较为短期(吃完开局红利就撤走,TVL降速较快, 这点可以从Avalanche的TVL变化里可以看出来),而新人想要加入DeFi的门槛并不低, 比如计划LP 损益, 计算staking风险和收益等。而普通的PFP NFT,第一对于项目方运营要求高,第二是哪怕真有什么优秀的PFP项目出来,其带来的流动性又不如DeFi。加上现在绝大多数的PFP并不能需要其特色的subtnet功能(以太坊以及其他链或者Avalanche本身的c链就足够满足PFP的要求)。
这时候我们就可以看到Game-fi就是一个非常好的切入点。现在的绝大多数GAME-FI本质上是DeFi,通过游戏化的交互,完成LP提供,stake(购买游戏NFT,道具等)过程。既能有较好的流动性,又能有一个合理的“理由”锁定资金。而且,通过子网和Game-fi的结合,能形成一个双赢的局面:
- 对于现在的Game-fi来说。无论可玩性好与坏,游戏的成分有多少,其链上交互对比其他应用来说都不是一个量级的。尤其是最近出现的一些有传统游戏影子的game-fi,其对于公链性能的要求很高。而Avalanche这种1~2秒就可以最终性确认并且还能定制VM的公链就是理想的选择。尤其是如何提现体现
- Avalanche subnet的优势 Game-fi相对而言就是试错成本最小的一种形式。
- 更何况,现在有一些霸王级Game-fi,比如DeFi Kingdom, 本身的体量就可以顶的上小型公链。其本身的交互需求也能顶得上一些小公链。同时,如何更好的利用自己这庞大的体量也是困扰他们的问题。这时候Avalanche的subnet出现了。任何人都可以创建自己的“区块链”并且兼容EVM,移植成本很低。一旦这样做,自己Game-fi里的代币本身就成了一种底层资产(交互费用直接用自己的代币就可以),让自己代币的价值捕获能力超越游戏本身。其Game-fi本身也有了变成生态/xverse的可能性,尤其是理论上subnet之间的资产可以无缝转移,这代表通过subnet建立的xverse的互操作性远远比其他区块链上的项目要高,最终形成一个独立而又互通的生态,构筑自己的竞争壁垒。
- 我想Avlanche本身也是这么考虑的,比如其在3月8号推出的Avalanche multiverse (提供当时大约2.9亿刀的AVAX(400w个)的奖励激励子网的增长),而3月上线的第一个subnet就是dfk,同时获得了1500w的Avalanche multiverse资助。上线后,DFK确实把自己的JEWEL变成了subnet的手续费,同时发行了新的代币,CRYSTAL作为游戏内的通用资产。最近也有消息说,螃蟹也准备上Avalanche去搞一搞了,所以我们可以拭目以待,看看最后Avalanche会变成什么样。
- 还有一点很重要,即使子网用的代币不是AVAX,但是因为子网的节点必须同时也是主网节点,代币节点必须购买AVAX,随着子网增多,节点也越来越多,配合上AVAX的mint/burn机制,其AVAX代币本身的价值捕获不会衰减很多。
可以看到,Avalanche要想保持长久的竞争力,就要合理的发挥自己子网的优势,是否会形成不同于其他链独树一帜的x-verse chain,我们可以拭目以待。
对比Polkadot和Cosmos
简单对比下三者网络本身的特点:
关于Cosmos和Polkadot的详细对比,我在最近的文章中已经讲过了,详细内容可以点击《异构双王》这篇文章看看。
而Avalanche的设计范式是一种更加贴合区块链原生的东西。确保自由的同时,还强调互操作性,而且其子网和主网的关系注定它的扩展性和效率不会随着体量增大而衰减的很快,比起一些公链,其提升效率的方案是确实可行的。
总结
今天的总结比较简单。Avalanche继承了比特币概率最终性确认的机制,但是又从底层设计上加入了自己的特色,尤其是子网的引入增添了它的“自下而上“的特点。这种气质更加贴合我对复杂系统的看法:我们始终处在一个复杂系统里,而一个复杂系统势必是由下而上形成的。
但是,这并不是说什么样的应用都适合有自己的子网,只是Avalanche给了你更多的选择罢了。如果能发挥自己subnet的优势,我个人相信Avalanche会发展出一些很好玩的东西。