一、Arweave 关键技术
1.1数据结构:Blockweave 区块纺
区块坊中包括区块哈希列表和钱包列表。拥有区块哈希列表使旧区块可以被请求/验证,拥有钱包列表可以验证新交易,而无需处理钱包上一次交易所在的区块。区块哈希列表和钱包列表由矿工保持更新,并在挖矿和验证新区块时通过网络进行同步。这减少了矿工进入网络的障碍:存在空间、算力、时间,使得区块纺能够拓展到任何单个矿工都无力提供的容量。
纺式结构: Arweave的数据结构并不是严格的单链列表而是复杂一点的图结构,结构中每个区块一共与三个区块相关,当前块的前一个和后一个块以及随机的指向一个之前的块称为回忆区块(recall block/recall chunk),由此构成区块纺。回忆区块是根据前一个块的哈希和高度确定的,密码学原理保证了回忆区块在选定时既有确定又不可预测。
图2:"链"和"纺"数据结构
上图为传统区块链数据结构,下图为区块纺数据结构。
**节点要求:**不需要矿工存储所有先前的块。处理新块和新交易所需的所有数据都存在于每个块的状态中,矿工加入网络只需要保存新块及其回忆区块。在Arweave网络中不存在存在全节点和轻节点概念,只有或多或少的下载了区块坊的客户端。使用Arweave完全同步既不是风险也不是义务,而是矿工获得更多奖励的可选升级途径。
**内容存储:**区块纺中的区块直接存储了数据信息,可以从Arweave区块浏览器直接看到存储内容而不是一串代码。
优势:
Blockweave实际上是分片的,性能可扩展性极强,与其他存储链相比,Arweave可以将TPS提高很多倍,并显著降低长期存储成本
- 分片:将区块链网络划分成若干个子网络(或称分片,shard),每一个子网络都会包含一部分节点,网络中的资料储存与交易,会被随机分配到各个分片中做处理。如此一来,每个节点只需要处理一小部份的工作,且不同分片上的交易可以并行处理,网络的交易速度便能因此获得提升。
- Blockweave纺状数据结构的设计,矿工无需复制全部数据,降低了门槛,直接存储数据也更方便用户读取。
1.2 共识机制:SPoRA 简洁随机访问证明
PoA=PoW+访问证明:访问证明(PoA)作为工作证明(PoW)的增强版,将整个回忆块数据都包含在哈希运算的输入中,结果作为工作量证明的输入。PoA采用概率和激励驱动的方法来最大化网络中任何数据的冗余副本数量,推动矿工在网络中制作尽量多的数据冗余副本
PoA鼓励了存储:因为矿工需要访问区块纺历史上的随机块才能开采新块并获得挖矿奖励,因此PoA鼓励了矿工存储回忆块(保证历史区块的多点备份)
PoA鼓励矿工更愿意存储“稀有区块”:当稀有区块被选定为回忆块时,拥有它的矿工能在更小竞争的情况下竞猜PoW谜题,争夺相同级别的奖励。(稀有区块是指容易副本较少的区块)
- 矿工出块概率 = 拥有随机回忆区块概率 * 第一个找到Hash的概率
- PoA算法允许通过调节难度来调解网络中的出块速度。难度越大,计算周期越久,出块速度就越慢。如果网络中区块的生成速率超过目标频率,则未来用于区块生成的PoA谜题的难度就会增加。反之亦然
PoA存在的问题:缺乏对快速检索数据的激励、耗能
缺乏对快速检索数据的激励:PoA只能保证永久存储,不能保证访问速度。在数据检索方面没有竞争优势的情况下,矿工们找到一个机会,可以通过使用远程存储池中获益,而不是维护单独的、去中心化的节点。但是这会由于距离等因素降低网络访问速度
耗能:PoA作为PoW机制的一种升级,要求区块包含对网络上过去数据的引用结合的共识机制,因此也会出现证明工作量而产生大量消耗能源问题
SPoRA:2021年2月24日在区块高度为633720处,Arweave的共识机制完成了从PoW(PoA)到SPoRA的升级。此次升级首先是挖矿盈利能力与数据访问速度保持一致,其次减少了维护网络所需的能源
根据blockweave对节点的要求,开采或验证新块,节点必须存有该块的回忆块。证明矿工能够访问回忆块是构造新块工作的一部分(另一方面,验证次证明是验证新区块工作的一部分)。因此,Arweave采用访问证明(Proof of Access)作为共识机制,后来采用PoA的改进版SPoRA(Succint proofs of Random Access)机制
SPoRA相较于PoA的改进:通过SPoRA保证数据永久存储、均衡出块、高速访问以及去中心化
-
挖矿盈利能力与数据访问速度保持一致:SPoRA降低了之前矿工出块概率的权重,加入了对数据访问速度的考量。SPoRA通过抑制CPU之间的资源池创建了一个更加去中心化和高效的区块编织,让矿工专注于维护本地硬件和节点,实现地理位置多样化以及去中心化,以此来激励矿工更高效、更迅速地复制数据。(保存数据的维护成本由用户的存储费用提供)
-
减少维护网络所需的能源:SPoRA的架构需要更少的能源来维护,不仅可以降低矿工的开销,而且可以使整个系统更清洁、更高效。此外,在Arweave SPoRA网络上挖掘所消耗的能源用于数据存储和检索。实现了资源支出和效用之间的结合。(通过存储和检索数据挖矿)
SPoRA简洁随机访问证明:
https://arweave.medium.com/the-arweave-network-is-now-running-succinct-random-proofs-of-access-spora-e2732cbcbb46
二、Arweave 协议机制
2.1 调节区块生成速率
为了调节网络中的区块生成速率,访问证明(PoA)算法允许可变的难度设置。具有较高难度PoA挑战需要更长时间来计算。 “ 难度”是一个网络统计信息,包含在每个模块中。 而难度取决于网络中区块的生成速率,超过目标速率会增加,低于目标速率会降低。通过这种方式,去中心化网络中的矿工网络能够调节区块生成速率,而与网络中节点的数量以及可用于解决PoA谜题的算力和存储空间无关。
2.2 矿工利益主导策略
节点在挖矿方面的主导策略是能最大化挖矿收益。而每个区块挖矿奖励很大程度上不在矿工的控制范围之内,因此收益策略就变成了如何成为第一个挖到新区块,并要抢在其他节点在相同高度开采到新区块之前。节点可以参与开采区块的概率等于节点存储了新区块的回忆块的概率,实质就是上就是节点存储的块占总区块的比例。也可以理解为节点第一个开采到区块的概率是该节点的哈希能力相对于所有其他也拥有回忆块的节点的总哈希算力比值。
公式2:首个挖到新区块的概率
P(has recall block) = 本地保存的区块数量 / 区块高度
P(finds hash first) = 本地哈希算力 / 全网哈希算力
2.3 开采和传播新区块
自适应互动激励代理(AIIA)元博弈中的社交等级将直接影响节点接收新区块和交易的延迟,甚至是否能收到它们。社交等级低的节点往往会比其他节点更晚接收信息,并且可能接不到所有信息。最终,低社交等级的节点有被网络完全排斥的风险。如果节点未接收到区块和交易信息,就无法有效地挖矿。因此,合理的对等评分是Arweave挖矿的基本前提条件。
图6:挖矿的条件
**块构建过程 :**挖矿节点有两个交易池——等待池和开采池。当新交易到达时,将由节点验证并使用节点的内容策略进行扫描。一旦该节点有较大的把握认为其他节点也已接收到该交易,则把交易从等待池移至开采池。一旦节点开采了一个区块并被网络接受,该区块内的交易将从开采池中删除。在协议层面,分叉恢复可能导致交易从被放弃的区块重新进入开采池。 新块的区块数据段(BDS)是以下各项的哈希:
- 上一块的独立哈希。
- 回忆块的全部内容。
- 候选区块的交易和其他元数据。
在Arweave的工作量证明中,BDS充当了“谜题”。 下图显示了前一个块的信息、回忆块和交易信息如何并入BDS和新的候选块。 新块包含重建BDS和验证工作量证明所需的所有信息,除了回忆块是节点必须已经保有的。
图7:从前一块、回忆块和交易构建新块
生成新的候选块有五个步骤:
- 第一步——组装相关元数据 :每个节点都在其状态(或等效地,在当前块中)中保有当前块哈希表(BHL)和当前区块高度,当前块的独立哈希值模除当前区块高度得到回忆块的高度。
公式3:回忆块的高度计算公式
此高度将在(0-当前块高度)范围内。这排除了当前块充当回忆块的可能性。因此,回忆块必然是区块纺历史上的一个区块,并且始终需要两个不同的区块才能开采新区块,矿工们无法提前预测需要哪个回忆块才能开采下一个块,而矿工参与某一轮次访问证明(PoA)哈希竞猜的概率,等于它保存的区块历史的比例。
-
第二步——获取和维护交易集: 节点在开采新块时,必须从被验证的交易中根据策略选择打包。当交易第一次到达节点时,经过单独验证后再其转移进等待池。在适当的等待时间之后,等待池中交易的一个子集(可能是全集)被选进开采池,在这里把这些交易作为一组进行验证。组中的所有交易都必须能在当前的网络状态和钱包列表上正常执行。
-
第三步——生成块数据段: 回忆块(包括其中的交易及数据)被包含进新的块数据段(BDS)中。因此,要使用正确的回忆块生成BDS,从而通过验证。这构成了矿工在PoW挑战阶段可以访问到回忆块的证明。
-
第四步——找到有效的Nonce: 矿工还必须尝试找一个Nonce随机数,以产生满足难度要求的的新块哈希,找到的Nonce被包括进新块数据结构作为工作量证明(Arweave协议中使用的挖矿算法是RandomX)。
-
**第五步——散播候选块:**区块被打包并按照排名的优先级散播给对等方,节点的候选块先于其他候选块被网络接受则获得开采奖励。
激励: 节点开采一个新区块获得的总奖励包括立即获得的交易费奖励、增发奖励还可能有一小笔存储基金。大部分交易费不会直接给矿工而是进入存储基金。奖励不是通过特殊交易支付给矿工,而是直接扣减存储基金并更新钱包列表。更新的存储基金和钱包列表会被集成进新的BDS和新区块。
推论: 网络对新区块的接受事实上也是对奖励的接受。对矿工的报酬是特定分叉状态的一部分。如果在分叉恢复期间某些区块被拒绝,则这些区块的挖矿奖励也将失效。
2.4 接收、验证和传播交易区块
在操作过程中,节点会从数据分发网络中的其他矿工或专用对等节点 (区块纺浏览器节点)接收到区块。接收节点需要尽快验证并接受该块,以便跟上网络共识并继续有效地挖矿。及时区块散播是避免分叉的一部分,节点必须确保其接受的块也被其对等节点接受。
至关重要的是,为了使向其他对等节点散播区块之前的区块初步验证速度快(增加区块共识时间,也就增加了分叉风险。),区块影中的工作证明可以独立于其他块进行验证。这避免了从区块影构造出完整区块并校验BSD的必要性,否则这会成为一个拒绝服务攻击漏洞。在将接收到的块散播给对等方之前,必须进行以下步骤的初步验证:
- 确保区块影结构格式正确;
- 确认该块是否已被处理(通过检查其BDS);
- 确保该块中引用的每个交易的完整副本都存在于本地交易池中;
- 验证传入块的BDS和Nonce组合是否满足网络当前的难度要求;
- 验证传入块的时间戳是在前一个块的可接受边界内(时间只允许增加);
如果初步验证通过,从区块影生成出完整区块,并且将区块影在核心验证步骤之前进行散播。 接下来在该块被本地节点接受之前,必须先执行核心验证步骤:
- 从该区块生成BDS,与区块影提供的BDS进行校验;
- 给定新块交易和时间戳,验证新块中包含的区块纺元数据(例如钱包列表、块哈希列表、区块纺尺寸等)是上一个块提供的元数据的合法更新。
2.5 接收和响应请求
节点在挖矿的各个阶段都需要向对等方请求信息,包括第一次加入网络与对等方同步, 以及需要访问回忆块以验证新块时。为了高效地分配稀缺的出口带宽,节点根据对等方它们响应请求的速度等对其进行排名。通过AIIA元博弈对节点进行激励,以迅速准确地响应信息请求,从而从网络对等节点取得好的排名。除挖矿节点外,网络的其他用户也发送信息请求,包括但不限于对交易数据的请求。这些请求不一定会影响节点的AIIA评分,但是在没有特殊努力的前提下,无法把它们与对等节点的请求区分开来。
2.6 抗分叉和恢复
分叉会给单个节点和整个网络带来风险。理想行为首先包括避免分叉,还有尽快恢复到最佳分叉。 网络中出现分支的潜在原因之一是传播延迟。在Arweave中AIIA元博弈代理鼓励通过野火机制即时传播,因此节点被鼓励在最小验证成功完成后尽快散播区块和交易。
节点将对数据执行严格的“边缘”验证,以保护网络免受攻击,然后传播这些数据。节点被激励在此阶段完成一些验证,因为传播无效数据可能会对排名产生负面影响。类似地,节点被激励快速开采区块,以最大化获得挖矿奖励的可能性,还要尽快传播第一个有效的新候选块,如果节点接受一个新块,则它希望其他节点也接受该同块。
但是分叉是不可避免的,并且当发生时,节点必须能够有效地评估它是否在主分叉上。如果不是,则需要立即恢复到主分叉。Arweave分叉选择规则类似于传统的区块链协议。 每个块都包含一个“积累难度”字段,该字段代表区块纺进入特定分支直到该块之前的工作量。节点可以立即将自己的当前块与收到的块进行比较,以评估收到的块:
- 有效可接受则传播;
- 无效或者陈旧,应予以忽略;
- 分叉选择的证据,发生在收到的块具比节点的当前块有更大的累积难度,而且收到的块并不是当前块的后代。
当发现一个更优分叉块,节点请求得到从分叉点之后的全部块。逐一对它们进行验证 (参见图6)。 在图6中,下面一条线的当前区块高度是39,当前块的累积难度为421。它接收的块高度为41,累积难度为529。接收的块能通过验证,可能预示着存在优选分叉。节点从新的高度41块开始上溯(从每个块依次获取“前一块”字段),直到到达自身历史记录中的一个块(即在节点自己的块哈希列表中)。在图中,在高度38处发现了分叉点(步骤1、2和3)。 这条新线成为节点的优选分叉,并采用累积难度为529的块作为当前块(步骤4)。 现在高度39累积难度421的块无效,如果该块中的交易不在优选分叉的三个最新块之中 ,则丢弃。
图8:具有累计难度的分叉
当节点收到比其已知的前一块还要晚两个或更多的新候选块时,意味着网络中存在分叉。该节点必须立即采取行动,通过评估分叉的积累难度,确认分叉中哪一个已经被最多的对等方接受。每个块数据结构中提供的“累积难度”,是封装在区块纺分叉中的访问证明工作量的代理表示。在分叉中,优先选择产生了较高累积难度的路径。
当收到有更高累积难度的新块,节点将把新块作为首选分支,并通过分叉的区块哈希列表追溯到与其自身历史的分叉点。一旦分叉点这个共同块被找到,便会评估验证分叉所需的交易和区块。如果发现分叉中从分叉点到接收块的全部块都是合法的,并且当验证结束时它仍然是具有最大累积难度的分叉,则节点的上下文将切换到此分叉。
2.7 去中心化策略
通过三个相关但不同的机制来实现矿工对系统中内容的提出意见:
- 对内容进入区块纺中进行民主投票的过程;
- 每个节点选择在其计算机上存储什么内容的能力;
- 网关节点过滤用户所访问的区块纺数据的能力;
节点通过内容策略表达对内容的偏好。内容策略是可以在交易上执行的任意计算,以决定交易是否为本地节点所接受。在Arweave中支持子字符串匹配和交易数据哈希匹配两种形式的内容策略。其他协议实现可以利用它们自己的内容策略机制。
投票阶段:当交易被分发到网络,每个节点根据自己的内容策略对其进行扫描。如果交易包含内容策略禁止的内容,则该交易不会被接受到该节点的交易池中,也不会散播给其他对等方。 当收到的新区块包含存疑交易会被直接丢弃,如果其他节点未丢弃则会出现分叉。在分叉过程中,拒绝与接受交易的节点“竞争”产生下一个区块,直到新区块产生并确认,另一个派的节点将分叉恢复,然后从临时内存中删除有问题的交易。通过这种方式让网络保持共识,
存储阶段:在节点投票接受数据进入网络之后,区块纺的访问证明机制中内嵌了数据存储的激励。 当新的参与者加入网络,他们会扫描并下载符合其内容策略的交易,回避他们不希望存储的交易。 当节点操作员更改内容策略,他们可以重新扫描本地存储,删除违反新策略的内容。
激励:激励措施迫使矿工在过度宽松和过度拒绝之间取得平衡。去中心化内容策略机制产生了两个互补的激励:
- 激励不要过度狂热地拒绝太多交易,这会减少挖矿奖励;
- 激励拒绝被网络大多数节点拒绝的交易,因为包含这些交易的候选区块会被网络其余部分忽略。
折中:去中心化内容策略机制会导致交易的结算时间增加了一个区块周期。交易被打包进区块,并不意味着该交易将被整个网络接受。因为最终一致共识机制,这个额外的区块确认期不会显著地改变系统的用户体验。 如果内容策略导致当前回忆块的副本数太少,节点还可以选择丢弃网络的最后区块并重新开采它,以重新决定回忆块。重新开采区块的超时时间并不在协议级别强制决定。然而越多算力被应用开采先前的块,头块被重采的可能性就越高。
网关:网关也将这种内容策略机制应用于索引已经存储在网络中的数据。网关仅索引遵循其自己的内容策略的内容。因此用户可以通过选择不同内容策略的网关,决定他们看到什么类型的网络内容。 此外,这些机制解决了应用开发者从其平台中删除或审查内容的问题。尽管用户可以选择自己看到的内容,但他们不能强行禁止其他人查看区块纺上的内容,因为每个人都可以平等选择网关(对应内容策略)来查看区块纺。