区块链分片:《Monoxide: Scale Out Blockchain with Asynchronous Consensus Zones》论文翻译个人笔记

区块链分片:《Monoxide: Scale Out Blockchain with Asynchronous Consensus Zones》论文翻译个人笔记

日期:2019年2月26-28日

摘要

加密货币为匿名在线支付提供了一个很有前途的基础设施。然而,低吞吐量严重阻碍了加密货币系统的可伸缩性和可用性,以满足不断增加的用户和交易数量。 实现可伸缩性的另一个障碍是每个节点都需要复制整个网络的通信、存储和状态表示。
在本文中,我们介绍了异步共识区,它可以在不影响去中心化或安全性的情况下线性扩展区块链系统。我们通过运行称为 aszones 的单链共识系统的多个独立和并行实例来实现这一点。共识在每个区域内以最少的通信独立发生,从而划分整个网络的工作负载并确保随着网络的增长每个节点的负担适中。我们提出最终原子性来确保跨区域的事务原子性,从而在没有两阶段提交协议开销的情况下实现事务的高效完成。此外,我们提出了 Chu-ko-nu 挖矿以确保每个区域的有效挖矿能力与整个网络处于同一水平,从而使对任何单个区域的攻击与对全网的攻击一样困难。我们的实验结果显示了我们工作的有效性:在包括全球 1,200 台虚拟机以支持 48,000 个节点的测试平台上,我们的系统通过比特币和以太坊网络提供 1,000 倍的吞吐量和 2,000 倍的容量。

一、引言

自2008年点对点电子现金系统 [37] 发布以来,去中心化共识系统不断扩大其社区,并对我们的社会产生更大的影响。 然而,以每秒交易量 (TPS) 衡量的低交易确认吞吐量已经大大阻碍了此类系统的可用性,因为用户和交易量增加。 除了网络延迟之外,吞吐量问题的根本原因是区块创建的顺序性。 在区块链中,区块是按顺序创建的,中间有足够的传播时间,无论有多少完整节点和矿工参与网络,都会产生固定的低 TPS。

此外,当每个全节点都需要复制整个网络的通信、存储和状态表示时,共识系统无法横向扩展,这就是比特币和以太坊的情况。即使实现了高吞吐量,需要快速通信、足够存储和足够计算能力的工作负载很快就会为全节点参与设置高障碍,这反过来又极大地阻碍了实践中的去中心化。因此,一个可扩展的区块链系统需要考虑其共识协议的可扩展性以及用于状态表示的通信、存储、计算和内存的资源使用,同时保持去中心化和安全性。此前,以太坊社区已经研究了区块链系统中的分片 [39](更多讨论见第 8 节)。所提出方法的动机与本文中讨论的许多考虑因素相呼应,这些考虑因素包括重复的工作负载、低进入门槛、高效跨分片交易处理的重要性以及稀释采矿能力的安全问题。

需要可扩展的区块链系统,以便可以支持互联网规模的未来应用程序。VisaNet 支付和清关 [46] 平均需要大约 4k TPS。 2017年支付宝移动支付峰值流量[3]超过256kTPS。区块链上 DApp 的快速增长 [44] 也显示出对具有高吞吐量和大容量的可扩展区块链系统的巨大需求,以支持游戏和去中心化交易。这些要求激励着我们的工作。

异步共识区是本文的主要思想,旨在在不削弱去中心化或安全性的情况下设计一个可扩展的区块链系统。 我们通过在多个独立和并行实例或共识区中划分和处理工作负载来扩展区块链系统。 整个网络的状态是按区域划分的,每个区域负责自己的一块。 核心数据结构,例如区块和交易,是特定于区域的,并且仅在它们自己的区域内复制和存储。 挖矿竞争、链增长和交易确认在每个区域单独异步进行。

共识区域通过使存储量、计算能力和状态表示内存与区域总数成正比来展示容量的自然线性可扩展性。 设计这样的区块链系统有两个主要挑战:(1)在处理跨区域交易时应以可扩展的方式确保高吞吐量; (2) 由于个别区域链的独立增长,诚实的采矿能力被稀释,因此应加强安全性。

跨区域原子性对于区块链系统的正确性和健壮性至关重要。在共识区域中,交易可能涉及不同区域的多方。由于这些方的状态更新在不同区域独立发生,因此具有挑战性。有效处理此类情况是吞吐量可扩展性和整个系统性能的关键。我们提出了最终原子性来确保跨区域的事务原子性。使用这种技术,所有操作都将完成并最终实现正确的结束状态,而不是像两阶段提交协议 [27] 那样序列化事务。最终的原子性允许以异步和无锁的方式相互离开事务,以保持区域并发和充分利用。最终的原子性将跨区域事务分解为多个步骤(中继事务),每个步骤都涉及单个区域。这些步骤由矿工跨区域中继和执行。我们的系统不保证矿工处理所有中继交易,就像比特币或以太坊不保证交易处理一样。相反,每个区域的矿工都被激励通过处理中继交易并最终确保原子性来完成每一步。

增大有效挖矿算力以加强共识区域的安全性。区块链系统依靠大部分挖矿能力来超越攻击者。但是,当挖矿算力分布到不同区域时,攻击者可以将挖矿算力聚集到单个区域,并且很容易超过该区域内的 51% 阈值。为了解决这个问题,我们提出了 Chu-ko-nu挖矿来确保每个区域的安全。通过 Chu-ko-nu 挖矿,矿工可以通过解决一个工作量证明难题在不同区域创建多个区块。这极大地放大了诚实矿工的有效采矿能力,他们在区域之间平均分配了采矿能力。另一方面,这种放大不适用于攻击者,因为放大的挖矿算力被迫平均分配到多个区域,而不能集中到单个区域。这样,每个区域的有效算力将与全网物理总算力处于同一水平,这使得攻击单个区域与攻击整个网络一样困难。

本文的贡献包括以下几点:

  1. 一种横向扩展的区块链系统,将用于状态表示的通信、计算、存储和内存工作负载划分为独立和并行区域。 随着网络的增长,我们的系统将单个完整节点的负担保持在较低水平。
  2. 一种用于有效处理跨区域事务的最终原子性技术,可确保异步工作的区域的正确性和稳健性。
  3. Chu-ko-nu 挖矿,一种新颖的工作量证明方案,可防止在挖矿能力分散到多个区域时降低攻击门槛。

为了证明我们系统的有效性,我们在测试台上进行了一系列实验,该测试台包括全球 1,200 台虚拟机,其中包含来自以太坊网络的 ERC20 支付的历史数据。 在这些实验中,我们的系统在比特币和以太坊网络上提供了 1,000 倍的吞吐量和 2,000 倍的容量。

二、背景

我们现在提供这项工作的必要背景,包括区块链系统的细节和两种共识机制的高级比较,即工作量证明 (PoW) 和权益证明 (PoS)。 最后,我们讨论 UTXO 和账户/余额交易模型之间的差异。

2.1 区块链系统

比特币[37]和以太坊[6]等区块链系统包含许多计算节点,如矿工和完整节点。交易是状态的增量更新,由区块确认和承载。区块是由矿工创建的。区块的验证涉及一个数学难题(也称为工作量证明,PoW),它在请求端难度适中,但易于检查网络。矿工之间相互竞争,第一个解决难题的矿工将获得奖励和创建新区块的一次性特权。在创建下一个区块之前,新创建的区块必须在矿工和完整节点之间充分传播。由于网络延迟,其他矿工可能仍然在不同的区块上工作,并且在链上附加区块时将链分叉到不同的路径上。链的发散称为分叉,不在主链中的区块称为孤块。增大块大小(更高的传播延迟)或减小创建间隔可能会导致更多孤立块,甚至在极端情况下(例如孤立率> 50%)阻止系统收敛到单个最长链。我们将在第 8 节中详细讨论相关研究。

我们将影响区块链系统整体性能的其他方面与共识协议总结如下:

  1. 共识:共识协议所要求的块创建和确认的顺序性质是可伸缩性的主要挑战。这受到上面分析的吞吐量的限制。
  2. 通信:信息,包括未确认的交易和新创建的块,需要在所有矿工和全节点之间交换。它受本地带宽的约束。
  3. 存储:所有接受的链块需要被持久地存储在每个矿工和完整节点中。它们受本地磁盘空间的约束。
  4. 表示:整个网络的全局状态,例如每个地址的余额和智能合约状态由每个矿工和完整节点维护。 这些受主机内存大小的限制。

可扩展的区块链设计必须考虑到所有四个方面。

2.2 PoW和PoS

如上所述,包括比特币和以太坊在内的主要加密货币中的 PoW 要求矿工进行计算密集型验证,以保持对每个区块的共识。 它产生了巨大的电力消耗,但它为相应的加密货币设定了基本的现实世界价值。

相比之下,PoS 以确定性的方式选择块的创建者,这通常取决于节点的权益(财富)。 现有的 PoS 系统采用不同的方法来产生领导者选举的随机性,以确保去中心化和安全性 [22, 7, 45, 18]。 尽管本文使用了 PoW,但我们的技术与每个区域使用的实际共识机制是正交的。 有关 PoW 和 PoS 最新研究的详细讨论,请参阅第 8 节。

2.3 UTXO和账户/余额

加密货币中有两种主要类型的交易模型。其中一笔交易费用使用之前交易的输出并生成可以在未来交易中花费的新输出。在基于 UTXO 的系统中,一个用户或一个账户可能拥有多个 UTXO。当用户想要花钱时,她会使用一个或多个 UTXO 来支付费用,并且可能会作为新的 UTXO 获得一些变化。该模型被比特币和许多区块链系统使用 [11, 32, 23]。后者是账户/余额模型,类似于银行账户。在批准交易之前,银行需要检查账户余额是否可以支付费用。 该模型被以太坊使用,被认为在支持智能合约方面优于 UTXO[6]。

我们的系统使用帐户/余额模型,因为它的简单性,因为具有任意金额的事务可以用一个发送帐户和一个接收帐户执行(而不是两边有多个utxo)。此外,平衡可以扩展到更复杂的状态以支持可编程的应用逻辑。账户/余额模型提供的另一个重要好处是允许交易携带状态的增量更新,这与只能携带完整状态的 UTXO 交易相反。 这大大节省了非同质代币(例如以太坊的 ERC-721 代币)等应用的交易规模,其中状态是一组唯一标识符。

三、系统设计

在深入研究细节之前,让我们首先检查我们的系统的高级架构,用于处理涉及来自不同区域的两个用户的支付,即区域 A 和 B,如图 1 所示。在这种情况下,提款操作 ρ 仅 涉及A区的状态由A区的矿工处理。 如果账户余额满足本次提款操作的成本,则矿工会创建相应的区块t+1承载该交易(主动交易),并且只被追加 到A区的链上。之后,携带存款操作φ的中继交易在A区组成并转发到B区。 只涉及B区状态的存款操作φ总是可以执行的,无论B区目标账户的余额如何 .。一旦中继交易被 B 区的另一个矿工拿起,操作 φ 将被执行,结束支付交易的完成。
在这里插入图片描述图1:通过跨异步区域中继事务传递消息。

3.1 分区和命名

在我们的系统中,帐户或用户由其地址表示,即其公钥的固定大小的哈希值。 我们的系统以固定且确定性的方式将用户地址空间统一划分为 2^k
个区域:一个区域由其分片规模 k 和区域索引 s(s∈{0,1, . . , 2^k −1}) 标识。

给定分片比例 k,可以轻松推导出用户的区域索引,即通过计算其地址的前 k 位。发起交易的区域索引由付款人地址决定,中继交易的区域索引由收款人地址决定。 一个块用<s,k,h> 指定,h是它的链的高度。 分片规模k定义了区域的数量,进而决定了整个网络的吞吐量和能力。 为简单起见,以下讨论假设 k 是固定的。

在我们的系统中,全节点加入swarms以广播新交易并从其他全节点(包括矿工)接收块。 swarm 是一组参与相同数据集复制的节点。 在比特币或以太坊中,只有一个集群,每个完整节点都复制相同的数据集,包括所有区块和交易。 在我们的系统中,为了不同的目的建立了多个群体。 分布式哈希表 (DHT) 用于群寻址和对等发现。 详细信息在第 7 节中描述。

我们的系统有一个由所有完整节点组成的全局集群,用于复制所有区域的最小公共信息。 另一方面,大多数通信发生在特定区域的集群中,完整节点仅属于特定区域。 在每个swarm中,参与的全节点都是稀疏连接的,使用gossip协议来广播消息。 与区域类似,特定于区域的群也由区域索引 s 和分片规模 k 标识。

3.2 分开的区域内工作负载

一个完整的节点,或者一个矿工,将有一个随机初始化的持久标识符;它确定节点应该工作的特定区域。通过地址空间分区,区块链在每个区域内独立地建立。一个矿工只与同一区域的其他矿工在PoW上竞争,并确认来自自己区域的交易。完整节点将忽略接收到的不属于其区域的任何块或事务,尽管这些块或事务不太可能被接收。

因此,与交易验证和链形成相关的计算和存储在区域之间是独立和隔离的:(1)矿工只负责在其选择参与的区域内发生的交易,以及(2)任何完整的 节点只记录自己区域内用户余额的链。 随着整个网络的增长,将创建更多的区域,确保单个节点上的计算和存储负担始终处于合理水平。 一个完整节点在网络中加入和运行的低门槛对于保持区块链系统的去中心化和稳健性至关重要。

3.3 最小化跨区域开销

在区块链系统中,大多数通信用于复制未确认的交易和广播带有已确认交易的新区块。 在我们的系统中,这种通信仅在区域内的节点之间进行。 我们的系统在每个节点上维护一个分布式哈希表 (DHT)。 我们的系统在获取到未确认交易或转发区块的区域索引 s 后,根据本地 DHT 路由表选择与 s 具有相同区域索引的节点,并按照 gossip 协议将交易和区块发送给这些节点 [12] 用于比特币和以太坊。 这将隔离每个区域内的大多数通信。

对于跨区域交易,我们的系统仅将中继交易发送到目标区域而不是整个网络。 此外,除了实际确认的交易之外,链形成的最小化数据会在所有区域中复制。 我们将在下一节讨论这个问题。

四、高效跨区域原子性

我们将一个区块分为两部分:一个用于链形成和 PoW 验证的链块,以及一个承载实际确认交易的交易块如图 2 所示,一个链接块,例如 Θa,带有块元数据,包括一个 PoW 随机数、一个指向前驱块的指针、一个已确认交易列表的 Merkle 树 [34] 根等。此外,一个链块为该区块中所有发起交易发起的中继交易的列表提供了 Merkle 树根,用于验证其他区域的中继交易。 记录交易列表(与比特币和以太坊等现有系统中的相同)的交易块,例如 Φa由区域中的完整节点复制和存储。 与用于交易的数百千字节相比,链接块具有固定大小的数据结构,大约需要 100 字节,为通信和存储引入的开销可以忽略不计。
在这里插入图片描述图 2:链接块和交易块的数据结构。 出站中继交易源自已确认的交易,并与验证数据(hq等)一起转发

对于付款人a的提款操作ρ和收款人b的存款操作φ的主动交易,如果a和b属于同一区域,则可以立即在区域内处理。 当 a 和 b 来自不同的区域时,我们通过派生和转发携带存款操作到其目标区域的中继交易来引入双阶段交易处理机制。 图 2 说明了处理数据结构的跨区域支付过程。

在区域a进行事务验证和转发

  1. 当矿工构建一个新区块时,未确认的交易<ρ,a,φ,b>由付款人 a 的区域中的矿工获取。
  2. 如果a的余额不小于转账金额,则发起交易生效。 如果余额不足,交易将被标记为无效,并被完成嵌入到区块中。
  3. 否则,构建一个链块 Θa 和一个交易块 Φa。Φa 有一个经过验证的交易列表,包括从 a 到 b 的交易。
  4. 矿工处理特定于所有已确认交易列表的 PoW 难题。
  5. 在 PoW 难题解决后,链接块 Θa 立即在全局群中广播,交易块 Φa 在 a 的特定区域群中广播。
  6. 执行并结束区域内事务。
  7. 然后执行所有跨区域交易中的提款操作 ρ。
  8. 每个跨区交易派生出一个出站中继交易 ψ:=<φ,b,γ>,将发送到目的区,即收款人 b 的区 B。

区域b的中继交易处理

  1. 一个入站中继交易 ψ:=<φ,b,γ> 在构建新区块时被收款人 b 的区域中的矿工拾取。
  2. 矿工根据其原始区块 Θa 验证入站中继交易。 如果无效,请跳过此步骤。
  3. 矿工构建了一个新的链块 Θb 和一个新的交易块 Φb。Θb包括入站中继交易 <φ,b,γ>。
  4. 解决 PoW 难题后,区块 Φb 将在 b 的区域中广播。
  5. 执行存款操作 φ,结束交易 <ρ,a,φ,b>。

4.1 验证

4.1.1 交易验证

当 B 区的矿工收到 A 区的中继交易时,它需要验证该交易以避免来自恶意对等方的攻击。 如图 2 所示,一笔转发交易 ψ:=<φ,b,γ> 包含验证数据 γ,其中
在这里插入图片描述位置指针p表示在其原始块中出站中继交易列表中的位置,Merkle树路径{hq}是指从Merkle树根到其入口的路径上所有兄弟节点的哈希值; 和区域索引 s、分片比例 k 和高度 t 用于标识其原始块。

Merkle 树根将使用 Merkle 树路径 {hq} 和交易 <φ,b> 本身重新计算。 验证重新计算的 Merkle 树根是否与其原始块 Θa 中的根匹配,并且 Θa 在区域 A 的链上。请注意,与兄弟姐妹(左或右)的关系未编码在 {hq} 中,这是从 p 中推断出来的。

4.1.2 区块验证

在接收到矿工广播的区块(一对链块和交易块)时,全节点需要验证该块以防御恶意矿工。 在我们的系统中,一个完整的节点会验证三种类型的交易。 如图 2 所示,它们是:

  1. 在自己的区域内确认了主动交易。
  2. 先前从其他区域转发的入站中继事务。
  3. 发送到其他区域的出站中继事务。

为了节省全节点的存储空间,前两种类型的交易实际上是嵌入到交易块中的; 而出站中继交易则不是,因为它们可以从已确认的主动交易列表中推导出来。

确认的交易根据当前用户状态进行验证。 任何包含非法交易或不匹配的主动/中继交易对的区块都将被拒绝。 如第 4.1 节所述,入站中继交易根据其原始区块进行验证。 此过程还通过仔细检查所有出站中继交易列表的 Merkle 树根来检查是否所有出站中继交易都按预期创建。 假设出站中继交易是有序的,并且与确认的主动交易的顺序完全一致。 请注意,只有 Merkle 树根嵌入在链接块中,而不是出站中继交易本身。

4.2 最终原子性

涉及取款和存款操作的支付交易应该是原子的,以确保全局分类账的正确性。 在现有的区块链系统中,例如 RSCoin [11] 和 OmniLedger [23],两阶段提交(2PC)机制 [36] 的变体用于确保原子性,并具有已知的锁定/解锁开销。

在我们的系统中,对于跨区交易,我们允许先执行提款操作,与其他交易交错执行,然后再执行相应的存款操作。 实现的是,一旦确认提现操作,最终会执行存款操作。 我们称这种原子性为最终原子性。 我们乐观地假设,只要有行为良好的矿工想要赚取交易费用,中继交易进行的提款操作最终就会被选中。 我们的设计确保中继交易不会因费用分摊的充分激励而受到歧视。

理论上,可能存在行为不端的矿工在未确认任何交易的情况下创建空块,无论是正常交易还是中继交易。在这种情况下,吞吐量将受到损害,最终原子性将无法实现,直到一个行为良好的矿工最终获得了创建块的机会。在比特币和以太坊网络的历史中,创建空块是可能的,但很少[17,33]。

默认情况下,新导出的出站中继事务由在原始区域创建链块和事务块的矿工转发到它们的目的区域。一旦中继事务被复制到目的区域,它将永远不会在被矿工拾取之前过期,除非它的初始事务无效,例如,由于链分叉而成为孤立块(我们将在后面讨论这种情况)。如果中继事务被意外丢弃(这是极不可能的),它可以由起源区域中的任何完整节点基于其链上的起源块重新构建。重新启动重建的中继事务的复制不需要额外的验证或共识。

在现有的区块链系统中,一旦付款交易被打包在链上的区块中(首先确认),其收款人将可以看到付款交易。在添加 n-1 个连续块后(第 n 个确认,比特币中 n=6,以太坊中 n=12),它将被保护。相比之下,我们系统中的跨区域支付交易将对收款人可见,一旦其中继交易被转发到收款人的区域,并且其原始区块可用。有了最终的原子性,交易被认为是最终安全的,一旦它的主动交易得到 n 确认,并且中继交易得到第一次确认。由于这两个区域的矿工是独立工作的,所以主动交易的n-确认与中继交易的转发和首次确认是重叠的。因此,最终的原子性不会引入额外的延迟,这在我们 7.3 节的实验中也得到了证明。理论上,当中继交易等待太长时间无法被矿工接收时,可能会出现额外的延迟。这可能比对其主动交易的 n 次确认花费更长的时间。

4.3 分叉率

在工作量证明共识系统中,不同的矿工可以在同一高度创建两个甚至更多的区块,即分叉。 最终,在成功解决分叉后,其中只有一个块将被接受,其余的将作为孤块丢弃。 提出了最长链规则 [37] 来解决比特币中的分叉问题,并且以太坊中也采用了 GHOST 协议 [42]。 我们在共识区域使用 GHOST 协议,即使在分叉率很高的情况下也是可靠的。

在每个共识区域中,分叉率与以前的单链共识系统完全相同的方式独立执行。 块可以是以下三种状态之一:

  1. 可用的:没有分叉,或者该块在获胜路径上。
  2. 未解决:该区块位于一条相等的竞争路径上。
  3. 孤立的:区块正在丢失的路径上。

分叉率是一个连续的过程,因为需要创建和附加更多的块。以前可用的块可能最近变成孤立的或未解决的,反之亦然。

在最终原子性的情况下,一个区域中分叉率的结果可能会影响在另一个区域中转发和确认的中继事务的有效性。中继事务的验证依赖于与其起源块相关的证明。如果在分叉率后原始块不再可用,则证明将无效,从而使所有源自它的中继事务无效。

预确认
在其原始块处于可用状态之前,不会在新块创建中考虑未确认的中继事务。中继交易将保留在未确认的交易集中,无论其原始区块的有效性如何,并等待原始区块可用。

确认后
图 3 区域 A 所示,一个先前可用的区块最近成为未解决/孤立的,不幸的是,源自它的中继交易 x 已经被确认并嵌入到区域 B 的区块 b 中。在这种情况下,区块 b 将不会失效,并且只有中继交易 x 将失效。 同时,区域 b 中的账本状态需要通过执行自创世区块以来所有历史区块的所有交易来重建,跳过所有无效的中继交易,包括 x。在实践中,状态检查点可以加速状态重建,以便只重新执行最近块的操作。
在这里插入图片描述图3:中继事务在分叉后由于孤立的主动块而失效

后续交易无效
在中继交易 x 失效后,更糟糕的情况是后续确认的交易变得无效,因为它依赖于中继交易 x 更新的状态。 例如在图 3 中,中继交易 x 在区块 b 中存入了 u 个代币,余额变为 u0 + u。 最近,交易 y 在区块 c 中得到确认,并撤回了 v 个代币(u0 < v ≤ u0+u)。

如果中继交易 x 失效而交易 y 是跨区交易,则区块 c 将失效,之后的所有后续区块也将被丢弃。为了避免这种情况,矿工将通过延迟 λ 块的入站中继交易的执行来根据特殊状态验证候选交易。 因此,交易 y 在区块 d 之前不会被确认,这使得这种情况不太可能发生,因为区块 a 已经收到了至少 λ 个确认。

设最新的区块为 b,正常状态 S 是通过执行从创世区块到区块 b 的所有交易中的所有操作来构建的。 对于矿工来说,一个额外的状态 Sλ 是通过从创世块执行到块 b-λ 来构建的,然后执行除块 b-λ+1 到 b 的入站中继交易之外的所有操作。 在创建区块 b+1 时,未确认的跨区域交易必须针对状态 S 和 Sλ 进行验证才能被视为候选者。

五、每个区域的防御安全

早期矿工是个体,算力是碎片化的。 基于本地标识符的自愿区域分配的随机性是安全的,当任何矿工在任何区域都没有控制超过 50% 的挖矿算力时。 专业的挖矿设施将通过拥有大量的算力或聚合个体矿工的算力来逐步主导算力,从而提供稳定、频繁和分散的挖矿奖励[28]。 在我们有 n 个区域的系统中,合理的采矿设施将理想地将其总采矿能力分配到不同的区域,以最大化回报(偏向于采矿难度较低的区域)。 最终,这使得整个网络 H 的算力收敛到跨区域均匀分布。 因此,每个区域的挖矿算力将是 H/n。 当恶意挖矿设施将其所有的算力T集中在一个区域时,如果T>H/n×50%,则攻击将成功,当T>H/n×50%时,该值会低得令人无法接受。

为了解决这个问题,我们引入了一个 Chu-ko-nu 挖矿机制,该机制允许并鼓励矿工使用一个 PoW 解决方案在不同区域创建多个区块。 这保证了每个区的有效算力几乎等于全网物理总算力,当大多数矿工参与Chu-ko-nu挖矿时,每个区的攻击门槛提高了接近50%。 此外,Chu-ko-nu 挖矿可以通过提高区块创建的效率来节省解决 PoW 所消耗的能源。 与 PoW 机制本身一样,基于 Chu-ko-nu 挖矿的安全性是由激励驱动的。如果攻击者控制了全网50%以上的物理挖矿算力,就会被下架,PoW机制也是如此。 同时,防御是所有承认激励的矿工。

5.1 Chu-ko-nu挖矿

Chu-ko-nu 挖矿允许矿工使用单个 PoW 解决方案在不同区域同时创建多个区块,但每个区域不超过一个区块。 在这种情况下,图 4 中的批处理链接块将替换图 2 中所示的链接块,并在所有区域之间复制。 允许矿工根据其 IT 资源容量从区域索引 b 或所有区域 (n=2^k,b=0) 开始对 n 个区域进行 Chu-ko-nu 挖矿。
在这里插入图片描述图4:批量链接块和链接块的比较

矿工将对所有涉及的 n 个区域执行交易验证并收集 n 个链头 Ai,即图 4 中的 A 部分。 如果没有像比特币或以太坊那样的 Chu-ko-nu 挖矿,矿工需要找到 n 个 nonce ηi(i∈[0,n−1]) 每个满足:
在这里插入图片描述
其中 C 是批次的配置(图 4 中的 C 部分),h0 表示该批次中所有链接头列表上的 Merkle 树 ϒb 的根:
在这里插入图片描述
请注意,我们假设所有涉及的区域中的 PoW 目标都是相同的。 如果它们不在下一节中,我们将讨论该案例。

一旦找到 ηb,特定区域的批链块将被组合并发送到相应的区域。 如图 4 所示,对于每个区域,一个批链块携带一个链头 (A)、它的默克尔树路径 {hj}(B)、批配置 C 和找到的批 PoW 随机数 ηb, 这是用于重新计算公式 3 和验证 PoW 的最少信息。 我们的系统没有在 Merkle 树路径 {hj} 中明确记录与兄弟姐妹(左或右)的关系。 相反,关系是从批处理列表 (s-b) 中偏移量的位推断出来的。 通过这种方式,区域索引 s 与批次中的区块列表(等式 4)中的偏移量相耦合,这保证了矿工在批次中只能为每个涉及的区域创建一个区块。

在每个区域中,全节点以及矿工在接受新块时平等对待批链块和链块。 它们遵循第 4.3 节中描述的相同方法来检测和解决分叉。 一个区域的链允许在不同的块高度包含批链块和链块。

Chu-ko-nu 挖矿在实践中与合并挖矿 [4] 具有相似的精神,允许使用单个PoW 解决方案创建多个块。 合并挖矿是针对不同的动机和场景而设计的,这是为了保护小算力的区块链。Chu-ko-nu 采矿旨在通过放大的有效采矿能力来加强跨区域的采矿能力分配。Chu-ko-nu 挖矿是通过多条同等角色和同等算力的链来进行的,而不是一个母链和一个辅助链。 Chu-ko-nu 挖矿还对每个区域强制执行一个区块,这会导致不同的数据结构和实现。

5.2 区域独立验证

Chu-ko-nu 挖矿批量解决链头的 PoW,而带有解决的随机数的批量链块是特定于区域的并单独发送。 每个区域的批量链块将在每个区域中独立验证和接受。 一个区块可以被孤立甚至失效,但这不会影响其他区块的验证或接受。

独立验证还允许在一批中有效处理区域的混合 PoW 目标。 在这种情况下,批量链块的构造与第 5.1 节中描述的相同,但它允许每个链头中的 PoW 目标值不同。 同时,在探测批量 PoW 随机数 ηb 时,有可能实现了一些具有高 PoW 目标(更容易实现)的块,但其他块则没有。 无论其他区域的 PoW 目标未完成(因此不会被发送),这些已完成区域的批量链块将被组合并立即发送到它们的区域。 链头列表(等式 4)中已完成的块将被删除并替换为其连续的候选块。 批量 PoW随机数的探测将切换到公式 3 中更新 h0 的新谜题。 由于在不同区域找到满足的随机数的事件是独立且随机的,因此这种切换不会降低挖矿效率。

5.3 重新分配挖矿算力

本节解释了为什么Chu-ko-nu挖掘可以使对单个区域的攻击与对整个网络的攻击一样困难,可以将攻击栏设置为与比特币和以太坊相同的安全级别。

我们用哈希率来描述挖矿能力,它与产生新区块的速度成正比。 在一个有 2^k 个区域的网络中,让 mp 是参与 Chu-ko-nu 挖矿的矿工的总物理哈希率,md 是不参与挖矿的矿工(作为个体矿工)的总物理哈希率。 分布在每个区域的有效哈希率 ms 可以计算为
在这里插入图片描述如果恶意节点可以在任何区域获得> ms/2 的哈希率,则它可以控制该区域。 因此,每个区域的攻击条,可以计算为获得的恶意节点的哈希率除以网络中的总哈希率,为
在这里插入图片描述当挖掘设备占总哈希率的优势时,该算法收敛到50%。例如,如果在256区域的网络中,采矿设施贡献了99%的哈希率,那么一次成功的攻击需要网络中总物理哈希率的49.5%。当前情况(2018年9月)在比特币网络中,100%的哈希率是由采矿设施[5]贡献的。

为了使单个PoW解决方案的激励最大化,专业的采矿设施将参与所有区域,并希望从所有区域获得奖励。Chu-ko-nu采矿实际上增强了矿工的采矿能力,这与矿工参与的区域的数量相乘。扩大的采矿力量均匀地分布在所有涉及的区域。这种有效地扩大采矿能力的方法有助于诚实的矿工将采矿能力分配到所有区域,但并不适用于针对单个特定区域的攻击者。

5.4 可伸缩的挖矿系统

挖矿设施中的比特币或以太坊挖矿系统是一个分布式系统,由数百甚至数千个 PoW 挖矿单元组成,例如。 GPU 和专用集成电路 (ASIC) 只专注于哈希探测,以及一些从事实际交易验证和区块构建的 PC。

在我们的系统中,需要一个挖矿系统来监控多个区域。 网络中的分区方案自然为观察大量区域的采矿设施提供了可扩展的解决方案。 如图5所示,除了PoW挖矿单元集群之外,还有一个全节点集群,用于观察所有涉及的区域,独立发现新区块,验证交易,构建候选区块头Ai。 一旦 Ai 在任何区域 i 中更新,新的 Ai 将被发送到图 5 中的挖矿协调器。 挖矿协调器将重新计算区块头列表(等式 4)的默克尔树,更新后的默克尔树根 h0(等式 3)将是广播到所有 PoW 挖矿单元。 这种设计提供了一个示例,并展示了如何为专业采矿设施实施和操作可扩展的采矿系统。
在这里插入图片描述图5:挖掘系统的内部架构

六、讨论

6.1 单地址热点

单个地址可能涉及大量交易,例如大型加密货币交易所的存款地址。 在第 7 节描述的工作负载中,地址 0x3f5CE5FBFe3E9af3971dD833D26bA9b5C936f0bE 是币安(顶级加密货币交易所)的一个存款地址,是超过 2% 的总交易的收款人。 由于单个地址是我们分区方案中最好的单位,因此现在我们的系统无法将此类工作负载进一步划分为多个区域。

在实践中,这种“单地址热点”问题可以通过上层应用程序的协同设计轻松解决。例如,一个应用程序或一个用户可以在不同的区域分配多个存放地址,实现负载均衡。机构运营商公布存款地址列表,钱包应用程序自动选择一个随机地址,甚至在可用的情况下选择一个区域内地址进行硬币转账。因此,可以利用多个区域的事务吞吐量。

6.2 激励和费用

我们遵循比特币的激励模式,在每个区域用逐步下降的币来奖励矿工,最终得到固定的加密货币总供应量。交易费用是由发布交易的人设定的参数,通常是根据最近确认的交易的平均费用金额。理性的矿工根据交易费用对未确认的交易进行优先排序。

我们在跨区域交易中引入了费用分摊,激励矿工在交易处理的初始步骤和中继步骤上进行工作,使中继交易在类似水平上与交易费用具有同等优先级。对于简单的付款,交易费用可以平均分摊。对于具有可编程事务逻辑的复杂事务,事务拆分应该基于每个步骤的工作量评估,类似以太坊中的气体计算。

我们不会为传播跨区域交易引入额外的费用。乐观地说,我们希望这样的任务将由整个网络中的所有完整节点和矿工自愿完成,因为自愿传播的区域内交易在比特币和以太坊网络中工作得很好。使用跨区域事务创建块的成本比区域内事务高一些。我们建议跨区域的交易发布者设置两倍甚至三倍的交易费用。

我们鼓励Chu-ko-nu挖掘,为使用Chu-ko-nu生成的区块提供相等的币奖励。因此,在固定的实际采矿权条件下,Chu-ko-nu开采的利润与参与开采的地区数量成比例。专业作业的矿工在所有区域同时作业是合理的,这提高了网络的整体安全性。

我们没有延伸到生态系统的激励和经济学的定量分析,因为它超出了本文的范围。

6.3 支付之外的泛化

到目前为止,我们的讨论是基于取款-存款模式,这种模式很好地服务于以支付为中心的场景,例如比特币。我们还希望扩展模型,使之适用于复杂的事务逻辑,并超越以支付为中心的应用程序。为此,一个主要的挑战是正确地处理广义中继事务,并保证原子性。我们将取款-存款范式扩展为一个更通用的模型,该模型具有可编程的交易逻辑,详见附录。

提议的可编程交易逻辑支持加密货币的可编程发行和转移,以及用户定义的可替代和不可替代令牌,类似于以太坊上的ERC20/ERC721令牌。它还支持更复杂的应用程序,如域名注册系统。我们的方法要求跨区域的事务可以在单个区域中验证,并通过一步不可撤销中继事务完成,这并不支持多对多支付等应用程序。它可以扩展到可撤销中继事务和多步中继,我们将这些改进留给未来的工作。

七、实验结果

我们的系统是使用 C++ 实现的。 密码学是基于 Botan 密码学库 (v1.11)[30] 和英特尔 IPP 密码学库 (v7.1) [21] 实现的。 我们使用 RocksDB(v4.11)[16] 来存储存档块和交易。 我们实施 Mainline DHT [31] 用于 P2P 路由和群形成设施对等发现,用于全球群和每个区域群。

我们通过回放以太坊从开始到区块高度 5867279 的完整历史 ERC20 支付来评估提议的系统,其中包括 1650 万个唯一地址和 7580 万笔交易。 我们将系统部署在一个分布式环境中,该环境包括 1,200 个虚拟机,每个虚拟机具有 8 个内核和 32GB 内存。 这些机器均匀分布在 15 个可用区,用于测试现实世界中的跨国延迟。 在测试网络中,我们将端到端 peek 带宽限制为 30Mbps,测得的平均端到端延迟为 102.48 毫秒。 在每个区域中,我们为区块大小设置了 32KB 的限制,并将区块创建间隔设为 15 秒的目标,这为一对一的代币传输产生了大约 15.6 TPS。 每个区的平均孤儿率为8.3o/oo,与区数无关。 在这样的测试平台上,我们的系统支持 48,000 个区块链节点。

7.1 可伸缩性

我们首先评估我们在 3.1 节中引入的分区机制是否可以平衡区域之间的支付数量。 我们改变分片比例k以生成不同数量的区域,即分别将k设置为4、5、8并获得16、32、256个区域。 图 7 说明了每个区域中处理的事务是平衡的,具有不同的分片规模 k。 同时,存在单地址热点,可以进一步优化,如第 6.1 节所述。
在这里插入图片描述图7:跨区域的事务分布。

我们通过测量具有不同区域数量的系统的实际吞吐量来评估可扩展性。 当增加区域数量时,我们固定每个区域中的节点数量,即每个区域平均有 24 个节点和 12 个矿工。 从图6可以看出,随着Zone数量的增加,测得的TPS会向外扩展。系统表现出线性可扩展性,当有2,048个Zone时,TPS最高可达11,694.89 TPS。 唯一的例外是将区域数量从 1 增加到 2 时。 由于中继事务的开销,使用两个区域比使用一个区域的性能增益是 1.88 倍。
在这里插入图片描述图6:多个区域的线性扩展。

7.2 开销

虽然系统的吞吐量随着区域的数量线性扩展,但跨区域中继事务实际上会带来开销,增加了事务的数量和要存储和复制的数据的总大小。图8显示了跨区域事务的百分比随着区域数量的增加而增加。在我们的实验中,当超过64个区域时,几乎所有的事务都将导致一个中继事务。这种放大至多使事务总数翻倍,而丝毫不会削弱吞吐量的可伸缩性。如图6所示,当区域超过64个时,吞吐量继续向外扩展。
在这里插入图片描述图8:跨区域事务的百分比,接近100%。几乎每一个原始交易都会产生一个中继交易。

图 9 说明了整个网络中数据复制和存储的放大大小。 首先,当增加区域数量时,几乎所有交易都会导致中继交易,即在这种情况下超过 64 个区域。 交易被放入原始区域的块和持久存储中; 和中继交易是目的地区域的交易,将交易块的大小加倍。 其次,与需要数百 KB 的区块中的交易相比,具有数十字节的链接区块的意义要小得多。 但是,由于链接块被复制到所有区域,因此它们在整个网络中的存储总大小将随着区域的数量而放大。 如图所示,它们的总大小被推到了几十 KB,有 2048 个区域,占交易大小的 6.2%,这在实践中是可以接受的。
在这里插入图片描述图9:整个网络中区块链数据的大小。

7.3 确认延迟

每个节点的平均连接数影响网络中的数据传播速度,进而影响区块链的确认延迟。图10显示了经过的时间和达到的节点数的累积分布函数。我们将每个节点的平均连接数配置为16、32、64、128,观察到最快的传播速度是128。在我们的实验中,每个完整节点平均连接68.5个节点。
在这里插入图片描述图10:事务(<1KB)传播速度,从每个节点到其他节点的平均连接数不同。这里显示的最快的传播是128连接,最慢的是8连接。介于两者之间的是64/32/16连接。

如第 4.2 节所述,当交易的块在网络中的节点之间复制时,首先确认交易; 在 n 个区块之后,交易是安全的。 比特币将 n 配置为 6,块生成间隔为 10 分钟,需要 1 小时来确保交易安全。 在我们的系统中,中继交易必须在原始交易达到 n 个确认之前在链上,因此没有额外的确认延迟。 图 11 显示了中继交易的第一次确认时间。 延迟在 13 到 21 秒的范围内,当区域数大于 30 时(几乎所有事务都有中继事务)。 由于我们配置了 15 秒的区块生成间隔,原始交易在 90 秒(n=6,与比特币相同)后得到保护,这足以覆盖中继交易的确认延迟。
在这里插入图片描述图11:事务首次确认的平均时间

7.4 吞吐量和孤块率

图12中,我们还评估了不同块大小和块创建间隔下系统的TPS和孤儿率。在这些实验中,我们将区域的数量固定为256个。正如预期的那样,增加块大小或减少块创建间隔在我们的系统中产生了几乎线性的TPS,因为我们的系统对每个区域中本共识实例的实际配置是中立的。但是,较大的块大小或较小的块创建间隔会导致较高的孤立率,从而导致块的浪费。这种行为与现有的区块链系统匹配得很好。在典型的情况下,我们配置一个合理的块大小和一个块创建间隔,例如,32 KB和15秒,以满足高TPS和低孤儿率。
在这里插入图片描述图12:不同块大小(上)和不同块创建间隔(下)的TPS和孤儿率(# zone = 256)

八、相关工作

许多研究工作已投入到改进 PoW 系统上。 GHOST 协议 [42] 选择子树中包含最多块的块作为主链,而不是最长的分支,以防止在分叉处进行自私挖矿的攻击。 Bitcoin-NG [15] 在每个 epoch 中选择一个领导者,并允许领导者发布多个区块,从而提高吞吐量。 SPECTER [41] 和 PHANTOM [43] 通过将基于链的结构替换为基于有向无环图 (DAG) 的结构并将来自不同分支的块合并到分类帐中,从而提高了比特币的吞吐量。 SPECTER 提供 DAG 块之间的偏序,而 PHANTOM 可以保持全序。 Conflux [29] 是另一个基于 DAG 的协议。它通过引入父边和参考边并结合ghost进行主链选择,在DAG上构建一致的交易总顺序。它允许主链之外的块能够为整体吞吐量做出贡献。这些提议可以通过消除自私挖矿来增强比特币的安全性,并通过将来自不同分支的区块合并到主链来提高吞吐量。然而,如第 1 节所述,这些单链系统的性能与全节点的可用网络带宽有关。因此,它们无法扩展到数千个节点。此外,由于这些系统中需要复制和处理分叉块,因此不清楚全节点如何大规模解决和解决内存和存储的容量问题。

PoS 系统以大多数股权份额达成共识。 Ouroboros [22] 是一个具有增强持久性和活性的 PoS 系统。它使用抛硬币协议来产生领导者选举的随机性。然而,它无法避免有针对性的攻击 [18],假设大多数领导者在一个时期内是廉洁的。 Tendermint [26] 和 Casper the Friendly Finality Gadget [7] 采用拜占庭容错(BFT)协议来选择委员会,达成共识,并容忍多达三分之一的恶意节点。然而,这些提案中使用的实用 BFT (PBFT) 协议 [8, 40] 具有显着的通信成本,并且只能扩展到数十个计算节点。此外,在任何人都可以参与的公共区块链上,PBFT 存在安全问题。 PBFT 的免许可特性使区块链面临 Sybil 攻击 [13] 的风险,攻击者可以在其中创建任意数量的假名。而且,由于缺乏可公开验证和公正的随机性,一旦对手能够预测他们的身份,当选委员会就会面临被针对性攻击的风险。

最近的工作 [1] 讨论了 BFT 协议和区块链共识之间的关系,并重点介绍了如何为区块链优化 BFT。 Zyzzyva [25] 使用推测来简化 BFT 状态机复制,并且可以显着降低复制开销。 SBFT [19] 是区块链的可扩展、信任和去中心化的基础设施。它可以处理数百个活动副本并支持以太坊的智能合约。 HoneyBadgerBFT [35] 提出了一种原子广播协议来优化 BFT 的通信复杂度,使异步 BFT 能够支持数百个节点。 ByzCoin [24] 利用集体签名并优化基于 BFT 的区块链的交易承诺。 RandHound 和 RandHerd [45] 提供了公共可验证、不可预测和无偏见的随机性。 Algorand [18] 在异步轮次中增长区块链。在一轮中,每个节点计算一个可验证的随机函数来确定它是否是委员会成员。一旦验证者发送消息以通过投票证明其成员资格,Algorand 会立即替换参与者。它可以避免女巫攻击和针对性攻击。但是,据报道这些提议存在安全问题或性能问题。例如,Algorand 在可变随机函数 (VRF) 调用的随机性中容易出现偏差 [20],而 ByzCoin 可能无法就委员会选举达成一致,如混合共识系统 [38] 中所述。

许多分布式系统,例如 Google Spanner [9] 和 Slicer [2],使用分片协议进行横向扩展;而这些解决方案是中心化的,不能直接在去中心化的区块链系统中使用。 Elastico [32] 是一种去中心化的分片协议。在每个共识时期,参与者可以解决一个 PoW 难题以加入共识委员会。每个分片的委员会运行 PBFT 以就一组交易达成一致,并将该协议发送给最终委员会。最终委员会根据收到的协议生成最终值,并向网络广播。首先,Elastico 不确保跨分片的事务原子性。其次,为了限制运行PBFT的开销,它只支持少数委员会,导致失败概率很高[23]。第三,虽然每个委员会都可以在自己的分片中验证交易,但 Elastico 仍然将所有块广播到所有节点,并要求它们存储整个分类帐。这将导致全节点的容量问题不可避免。 OmniLedger[23] 是一个基于分片协议的分布式账本,试图解决 Elastico 中的问题。OmniLedger 使用 RandHoundm [45] 来保证领导人选举的抗偏差性和公共可验证性,并引入了两阶段原子提交协议 Atomix 来保证跨分片交易的原子性。它只需要验证器存储每个分片的参考点,而不是完整的交易历史,使全节点更具可持续性。以太坊社区还引入了信标链 [14] 来支持分片协议。信标链为选择每个分片上的验证者委员会提供分布式伪随机性。由于伪随机性随机性容易受到偏见的影响,基于分片协议的区块链不应假设可信的随机性信标。最近的一项研究 RapidChain [47] 进一步优化了这些分片协议。它对拜占庭式错误具有弹性,从高达 1/4 的比例(例如在 OmniLedger 中)到 1/3 的参与者比例。它还通过块流水线提高吞吐量,并确保新参与者加入网络的设置的稳健性。与这些系统相比,我们的工作提出了最终原子性,以确保跨区域事务的原子性,而无需锁定/解锁开销。最重要的是,分区到多个区域/分片的区块链系统暴露了一个严重的安全问题,这些问题在这些现有的提案中都没有解决。通过分区,诚实的大多数采矿权或股权份额或随机选择的委员会被分散到单独的区域/分片中。这显着减少了每个区域/分片上诚实多数的大小,从而显着降低了特定区域/分片上的攻击条。因此,我们引入了 Chu-ko-nu 挖矿来保证分区后的安全性,使攻击任何特定区域就像攻击整个网络一样困难。

综上所述,现有的针对单链和非分片解决方案的提案[42、41、43、15、29、24、18]受网络带宽限制,无法横向扩展; 而分片系统要么不支持完全分片 [32],要么可能会在分片后降低攻击门槛 [23, 47]。 据我们所知,Monoxide 是唯一一个可扩展的区块链系统,它实现了共识协议的完全分片以及可扩展性的资源使用,保留了 PoW 的去中心化保证,并保持了与比特币和以太坊相同的安全级别。

九、总结

我们提出了一个基于区块链机制的可扩展的去中心化共识系统。 在不削弱去中心化和安全性的情况下,我们的技术通过划分区块链系统所有关键组件的工作负载(包括交易广播、挖矿竞争、链存储、交易执行和状态表示)来提供线性扩展。 我们保留了区块链系统的简单性,并通过复制相等和异步区域来放大其容量,这些区域以最少的协调独立工作,并行。 此外,Chu-ko-nu 挖矿和最终原子性是我们系统提出的关键贡献,确保具有数千个独立区域的系统的效率和安全性。 在我们的实验中,我们证明我们的系统比比特币和以太坊提供 1,000 倍的吞吐量和 2,000 倍的容量。

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是基于Arduino使用MQ-5和MQ-9检测一氧化碳和甲烷浓度,并在检测到高浓度时触发声光报警和继电器吸合,并通过HC-05蓝牙传输浓度数据的示例代码: ``` // 定义MQ-5和MQ-9引脚 int mq5Pin = A0; int mq9Pin = A1; int buzzerPin = 2; int ledPin = 3; int relayPin = 4; // 定义HC-05蓝牙模块 #include <SoftwareSerial.h> SoftwareSerial BTSerial(10, 11); // RX, TX void setup() { pinMode(mq5Pin, INPUT); pinMode(mq9Pin, INPUT); pinMode(buzzerPin, OUTPUT); pinMode(ledPin, OUTPUT); pinMode(relayPin, OUTPUT); // 初始化蓝牙模块 BTSerial.begin(9600); } void loop() { // 读取MQ-5和MQ-9传感器的模拟值 int mq5Value = analogRead(mq5Pin); int mq9Value = analogRead(mq9Pin); // 计算甲烷和一氧化碳浓度(ppm) float methanePPM = mq5Value / 10.0; float coPPM = mq9Value / 10.0; // 发送浓度数据到手机APP BTSerial.print("Methane (ppm): "); BTSerial.println(methanePPM); BTSerial.print("Carbon monoxide (ppm): "); BTSerial.println(coPPM); // 判断是否触发声光报警和继电器吸合 if (coPPM >= 50 || methanePPM >= 400) { digitalWrite(buzzerPin, HIGH); digitalWrite(ledPin, HIGH); } if (coPPM >= 200 || methanePPM >= 800) { digitalWrite(relayPin, HIGH); } else { digitalWrite(buzzerPin, LOW); digitalWrite(ledPin, LOW); digitalWrite(relayPin, LOW); } // 延迟一段时间后再次检测 delay(1000); } ``` 请注意,此代码仅供参考,您需要根据自己的具体硬件配置和需求进行修改和调整。另外,由于涉及到生命安全等重要问题,建议在使用时务必遵循相关安全规范和标准。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值