以太坊下一个里程碑升级?V神详解EIP-4844究竟是什么

作者:Vitalik Buterin

以太坊创始人Vitalik Buterin近日针对与Proto-danksharding(又名 EIP-4844)最近回答了相关问题。Danksharding这种技术能给以太坊提出什么新的分片设计?

什么是 Danksharding?

Danksharding 是以太坊提出的新分片设计,与之前的设计相比,引入了一些显著的简化。

自2020年以来,所有最近的以太坊分片提案(包括 Danksharding 和以前一样Danksharding)以太坊以总结与大多数非以太坊分片提案的主要区别(Rollup)以太坊分片不会为交易提供更多的空间,而是为数据提供,以太坊协议本身也不会试图解释。验证 blob 只需检查 blob 是否可用,即是否可以从网络下载。这些 blob 中的数据空间预计将由第 2 层支持高吞吐量事务(Layer2)Rollup协议使用。

Danksharding 引进的主要创新是合并成本市场:不再有固定数量的分割,每个分割都有不同的块和不同的块提案,在 Danksharding 只有一个提议者选择所有的交易和数据进入槽.

为了避免这种设计对验证者提出高系统要求,我们引入了建议者/构建者分离 (PBS):一种特殊区块构造者的特殊参与者招标选择slot提议人只需选择出价最高的有效权利header只是。只有块构建者需要处理整个块(第三方分散预测协议也可用于分布式块构建者);所有其他验证者和用户都可以通过数据可用性采样非常有效地验证块(请记住,块的大部分只是数据)。

什么是 proto-danksharding(又名 EIP-4844)?

Proto-danksharding(又名 EIP-4844)以太坊改进建议(EIP),用于构成完整 Danksharding 规范的大部分逻辑和脚手架(如交易格式和验证规则),但没有实际实现任何片段proto-danksharding 在实现过程中,所有验证者和用户仍然必须直接验证完整数据的可用性。

proto-danksharding 引入的主要特点是新的交易类型,我们称之为 blob 交易blob 的交易与常规交易类似,不同之处在于它还携带称为 blob 额外数据。Blob 非常大(~125 kB),而且数量相似calldata便宜多了。EVM 执行不能访问 blob 数据; EVM 只能检查对 blob 的承诺。

因为验证人和客户端仍然需要下载完整的 blob 内容,所以 proto-danksharding 中的数据带宽目标为每个插槽 1 MB,而不是完整的 16 MB。然而,由于这些数据没有与现有以太坊交易 Gas 用量竞争,所以还是有很大的可扩展性好处的。

为什么要在每个人都必须下载的块中添加 1 ?MB 数据是可以的,而不是让 calldata 便宜 10 倍?

这与平均负载和最坏负载的区别有关。今天,我们遇到了大约90 的平均块kB 的情况,但理论上可能是最大块的大小(如果块中的所有 30M gas 均用于调用数据)约为 1.8 MB。过去以太坊网络处理的块接近最大值。但是,如果我们简单地把 calldata gas 成本降低了 10 倍,所以尽管平均块大小会增加到可接受的水平,但最坏的情况会变成 18 MB,这对以太坊网络来说太多了。

当前的 gas 定价方案不能将这两个因素分开:平均负载与最坏负载的比例取决于用户在 calldata 和其他资源一起花多少钱?gas 选择,这意味着 gas 价格必须根据最坏情况的可能性设定,导致平均负载不必要地低于系统可处理的负载。但是,如果我们改变 gas 定价可以更清楚地创建一个多维成本市场,我们可以避免平均负载/最坏负载不匹配,并包含接近我们可以安全处理的每个块的最大数据量。Proto-danksharding 和 EIP-4488 就是这样做的两个建议。

以太坊下一个里程碑升级?V神详解EIP-4844究竟是什么

proto-danksharding 与 EIP-4488 比较如何?

EIP-4488 是一种更早、更简单的尝试,可以解决相同平均情况/最坏负载不匹配的问题。EIP-4488 使用两个简单的规则来做到这一点:

Calldata gas 成本从每字节 16 gas 每字节 3 gas每个块 1 MB 限制加上 300 字节(理论最大值:~1.4 MB)

硬限制是最简单的方法,以确保平均负导致最坏负荷增加的最简单方法。降低天然气成本将大大增加总结的使用,并可能将平均块的大小增加到数百 KB,但硬限制将直接阻止 10 MB 单块最坏情况的可能性。事实上,在最坏情况下,块的大小会比现在小(1.4 MB 对 1.8 MB)。

Proto-danksharding 相反,它创建了一种可以固定大小的单独事务类型 blob 保存更便宜的数据,并限制每个块能包含多少 blob。这些 blob 无法从 EVM 访问(只有对 blob 承诺), blob 由共识层(信标链)而不是执行层存储。

EIP-4488 和 proto-danksharding 之间的主要实际区别在于 EIP-4488 试图最小化今天所需的变化,而 proto-danksharding 今天发生了很多变化,所以未来升级到完全分割需要很少的变化。虽然实现全分割(使用数据可用性采样等)是一项复杂的任务proto-danksharding 仍然是一项复杂的任务,但这种复杂性包含在共识层中。一旦 proto-danksharding 推出,执行层客户端团队,rollup开发人员和用户不需要做进一步的工作来完成向全分片的过渡。

请注意,两者之间的选择不是非此即彼的:我们可以尽快实施 EIP-4488,然后在半年后使用 proto-danksharding 跟进它。

proto-danksharding 实现了完整 danksharding 需要实现哪些部分?

引用 EIP-4844:

此 EIP 已完成的工作包括: ・一种新的交易类型,其格式与全片中需要存在的完全相同。・全分片所需的所有执行层逻辑。・全分片所需的所有执行/共识交叉验证逻辑。・BeaconBlock 采样验证和数据可用性blob 层间分离。・完全分片所需的大部分 BeaconBlock 逻辑。・blob 自调独立 gasprice。要完成完全分片的工作包括: ・共识层中 blob_kzgs 允许 的低度扩展2D 采样。・实际实现数据可用性采样,・ PBS(提议者/构建者分离)避免要求单个验证者在插槽中处理 32 MB 的数据。・每个验证人的托管证书或类似协议中的要求,以验证每个块中分片数据的具体部分。

请注意,所有剩余的工作都是共识变更,不需要执行客户团队、用户或Rollup任何额外的开发人员工作。

这些非常大的块会增加磁盘空间的需求怎么办?

EIP-4488 和 proto-danksharding 每个插槽(12 秒)长期最大使用量约为 1 MB。这相当于每年 2.5 TB,远高于以太坊今天所需的增长率。

在 EIP-4488 需要历史记录到期方案才能解决这个问题(EIP-4444),不再需要客户端存储超过一定时间段的历史记录(已提出从 1个月到 1年的持续时间)。

在 proto-danksharding 无论是否实施EIP-4444,在一段时间(如 30 天)后,共识层可以实现单独的逻辑自动删除 blob 数据。但无论采用何种短期数据扩展解决方案,都强烈建议尽快实施 EIP-4444。

这两种策略都将共识客户端的额外磁盘负载限制在最多几百 GB。从长远来看,采用一些历史过期机制本质上是强制性的:完整的片段每年会增加40 左右TB 的历史 blob 数据,所以用户实际上只能存储一小部分。因此,值得尽快设定期望。

如果数据在 30 天后被删除,用户将如何访问旧 Blob?

以太坊共识协议的目的不是为了确保所有历史数据的永久存储。相反,目的是提供一个高度安全的实时公告板,并为其他分散协议留出更长的存储空间。公告板的存在是为了确保在公告板上发布的数据足够长,以便任何想要数据或备份数据的用户都有足够的时间获取数据并导入其他应用程序或协议。

一般来说,长期存储历史很容易。尽管每年 2.5 TB 对常规节点的要求太大,但对专用用户来说很容易管理:你可以每 一次TB 以20美元左右的价格购买非常大的硬盘驱动器,完全可以满足业余爱好者的需求N/2-of-N 历史存储对信任模型有不同的共识1-of-N 信任模型:您只需要其中一个数据存储器是诚实的。因此,每个历史数据只需要存储数百次,而不是数千个正在进行实时共识验证的完整节点。

一些储存完整历史记录并使其易于访问的实用方法包括:

特定于应用程序的协议(例如Rollup)可能要求其节点存储与其应用程序相关的历史记录部分。丢失的历史数据对协议没有风险,只会对单个应用程序造成风险,因此应用程序承担存储与自己相关的数据的负担是有意义的。在 BitTorrent 存储历史数据,例如。每天自动生成和分发一个 7 GB 文件,包括来自块的 blob 数据。以太坊门户网络(目前正在开发中)可以轻松扩展到存储历史。区块浏览器,API 提供商和其他数据服务可能会存储完整的历史记录。个人爱好者和从事数据分析的学者可能会存储完整的历史记录。在后一种情况下,将历史存储在当地为它们提供了重要的价值,因为它使容易直接计算它们。TheGraph 和其他第三方索引协议可储完整的历史记录。

存储在更高层次的历史(如每年 500 TB)接下来,一些数据被遗忘的风险会变得更高(此外,数据可用性验证系统会变得更加紧张)。这可能是区块链可扩展性的真正极限。然而,目前提出的所有参数都远非此。

blob 数据的格式是什么,它是如何提交的?

一个 blob 是一含 4096 字段元素的向量,范围内的数字:

0 <= x < 52435875175126190479447740508185965837690552500527637822603658699938581184513

blob 在数学上被认为是指具有上述模数的有限域上的次数 < 4096 多项式,其中 blob 中位置 i 场地的场地元素是在 wi 评估。w 是满足 w=1 的常数。

对 blob 的承诺是 KZG 承诺多项式哈希。然而,从实现的角度来看,关注多项式数学细节并不重要。相反,只有一个椭圆曲线点的向量(基于拉格朗日的可信设置), KZG 对 blob 承诺只是线性组合    EIP-4844 的代码:

def blob_to_kzg(blob: Vector[BLSFieldElement,4096]) -> KZGCommitment: computed_kzg = bls.Z1 for value,point_kzg in zip(tx.blob,KZG_SETUP_LAGRANGE): assert value < BLS_MODULUS computed_kzg = bls.add( computed_kzg,bls.multiply(point_kzg,value) ) return computed_kzg

BLS_MODULUS 是上述模数, KZG_SETUP_LAGRANGE 是基于拉格朗日的可信设置的椭圆曲线点的向量。对于实现者来说,简单地将其视为黑盒特殊哈希函数是合理的。

为何使用 KZG 哈希不直接使用 KZG?

EIP-4844 没使用 KZG 直接表示 blob,但使用版本化哈希:单 0x01 字节(表示这个版本)后跟 KZG 的 SHA256 哈希最后 31 字节。

这样做是为了 EVM 兼容性和未来兼容性:KZG 承诺是 48 字节, EVM如果我们从 开始, 32 字节值更自然地使用KZG 切换到其它东西(比如量子抗性),KZG承诺可以继续为 32 字节。

proto-danksharding 介绍的两个预编译是什么?

Proto-danksharding 介绍了两种预编译:blob 验证预编译和评估预编译。

Blob 验证预编译是不言而喻的:它将哈希和 版本化Blob 作为输入,验证提供的版本化散列实际上是 Blob 哈希的有效版本化。本预编译旨在供应Optimistic Rollup使用。引用 EIP-4844:

Optimistic Rollup只需要在提交欺诈证明时实际提供基础数据。欺诈证明提交功能将要求欺诈 blob 的全部内容作为 calldata 部分提交。它将使用 blob 验证功能根据之前提交的版本化哈希验证数据,然后像今天一样验证数据。

评估预编译将版本化哈希,x 坐标、y 坐标及证明(blob 的 KZG 承诺和 KZG 评估证书)作为输入。检查 是验证证书P(x) = y,其中 P 是由具有给定版本化哈希的 blob 表示多项式。此预编译旨在提供 ZK Rollup使用。引用 EIP-4844:

ZK rollup 将为其交易或状态增量数据提供两个承诺:blob 中的KZG和使用 ZK rollup 内部使用的任何证明系统的一些承诺。他们将使用等价协议的承诺证明和评估预编译来证明 kzg(协议确保指向可用数据)和 ZK rollup 自己的承诺引用相同的数据。

请注意,大部分都是主要的Optimistic Rollup设计采用多轮防欺诈方案,最后一轮只需少量数据。因此,可以想象,Optimistic Rollup也可以使用点评估预编译而不是 blob 验证预编译,而且这样做会更便宜。

KZG 可信设置是什么?

看:

https://vitalik.ca/general/2022/03/14/trustedsetup.html对 powers-of-tau 可信设置如何工作的一般描述

https://github.com/ETHereum/research/blob/master/trusted_setup/trusted_setup.py实现所有重要的可信设置相关计算示例

特别是在我们的例子中,目前的计划是并行运行四个大小(n1=4096,n2=16),(n1=8192,n2=16),(n1=16834,n2=16)和(n1=32768,n2=16)仪式(有不同的秘密)。理论上只需要第一个,但通过允许我们增加 ,我们可以操作更多更大的尺寸blob 为了提高未来的适用性。我们不能只有一个更大的设置,因为我们希望对可以有效提交的多项式次数有一个硬限制,这相当于 blob 大小。

从 可能的实用方法Filecoin 设置开始,然后运行仪式来扩展它。许多人将参与各种实现,包括浏览器的实现。

我们不能在没有可信设置的情况下使用其他承诺方案吗?

不幸的是,使用 KZG 以外的任何东西(如 IPA 或 SHA256)分片路线图会变得更加困难。有几个原因:

非算术承诺(如哈希函数)与数据可用性采样不兼容,所以如果我们使用这种方案,无论如何我们都必须将其转换为 KZG。IPA 可能与数据可用性采样兼容,但它会导致更复杂的方案具有更弱的属性(例如,自我修复和分布式块构建变得更加困难)哈希和 IPA 不兼容评估预编译的廉价实现。因此,基于哈希或 IPA 的实现将无法有效地使 ZK Rollup或支持多轮Optimistic Rollup廉价欺诈证明。

因此,不幸的是,使用除 KZG 以外任何东西的功能损失和复杂性都比 大得多KZG 本身的风险。此外,任何和 KZG 相关风险包括:一个KZG 故障只会影响Rollup其他依赖 blob 数据的应用程序不会影响系统的其他部分。

KZG复杂和新有多复杂?

KZG 承诺是在 2010 年的一篇论文中介绍的,自 2019 年以来已广泛应用于 PLONK类型的 ZK-SNARK 协议。KZG 承诺的基础数学是椭圆曲线运算和配对基础数学上相对简单的算术。

使用的特定曲线是 BLS12-381,它是由 Barreto-Lynn-Scott 发明于2002年。椭圆曲线配对验证 KZG 承诺所需要的是非常复杂的数学,但它们是在 1940年代发明的,自 1990年代以来应用于密码学。到 2001年,提出了许多配对加密算法。

从实现复杂性的角度来看,KZG 并不比 IPA 更难实现:计算承诺函数(见上文)和 IPA 的情况完全相同,但使用了一组不同的椭圆曲线点常数。由于它涉及配对评估,因此点验证预编译更为复杂,但数学和 EIP-2537(BLS12-381 预编译)实现中已完成的部分相同,与 非常相似bn128 配对预编译(请参考:优化 Python 实现)。因此,实现 KZG 验证不需要复杂的新工作

proto-danksharding 实现的不同软件部分是什么?

有四个主要组成部分:

1. 执行层共识发生变化(详见 EIP):

包含 blob 新交易类型输出当前交易中的第 i 个 blob 哈希的操作码版本化Blob 验证预编译点评估预编译

2.共识层共识变更(请参考 repo 本文件夹:

BeaconBlockBody 中的 blob KZG 列表“sidecar机制,包括完整的 blob 内容来自 BeaconBlock 的单独对象一起传递执行层中的 blob 版本化哈希和共识层 blob KZG 交叉检查

3.内存池

BlobTransactionNetworkWrapper(参见 EIP 网络部分)更强的反 DoS 保护以补偿大的 blob 大小

4.区块构建逻辑

接受内存池的交易封装器,将交易放入 ExecutionPayload,将 KZG 放入信标块和sidecar主体应对二次元手续费市场

请注意,对于最小的实现,我们根本不需要内存池(我们可以依靠二级交易来捆绑市场),我们只需要一个客户端来实现块构建的逻辑。只有执行层和共识层的共识变化才需要进行广泛的共识测试,相对较轻。有可能在这样的最小实现和所有客户端之间支持块生产和内存池的完整部署。

proto-danksharding 多维成本市场是什么样的?

Proto-danksharding 引入多维 EIP-1559 成本市场有两种资源,gas 和 blob,有单独的浮动 gas 价格和单独限制。

换句话说,有两个变量和四个常量:

以太坊下一个里程碑升级?V神详解EIP-4844究竟是什么

blob 费用以 gas 收取,但它是可变量 gas,从长远来看,每个块的平均 都会进行调整blob 数量实际上等于目标数量。

二维性质意味着块构建者将面临一个更困难的问题:在他们用完交易或到达块之前,与其简单地接受最高优先级的交易gas他们必须同时避免两种不同的限制。

假设 gas 限制为 70,blob 限制为 40。mempool 有很多交易可以填满块,有两种类型(tx gas 包括 per-blob gas):

优先费 5 per gas,4 blobs,4 total gas优先费 3 per gas,1 blob,2 total gas

遵循幼稚降低优先费用算法的矿工将用第一种 10 笔交易(40 gas)填充整个块,获得 5 * 40 = 200 gas收入。因为这个 10 笔交易填满了 blob完全限制,他们不会包含更多的交易。但最好的策略是采用第一种 3 笔交易和第二种 28 笔交易。这为您提供了一个包含 40 blob 和 68 gas块, 5 * 12 3 * 56 = 收入228 。

以太坊下一个里程碑升级?V神详解EIP-4844究竟是什么

实施客户端是否需要实施复杂的多维背包问题算法来优化其块生产?不,有几个原因:

EIP-1559 确保大多数块不会达到任何限制,所以只有少数块实际上面临多维优化问题。通常,如果内存池没有足够的(足够的付费)交易达到任何限制,任何矿工都可以通过包括他们看到的每笔交易获得最佳收入。在实践中,相当简单的启发方法可以接近最佳。在类似的情况下,请参考 Ansgar 的 EIP-4488 分析以获取这些数据。多维定价甚至不是专业化带来的最大收入来源――MEV 是的。链条上通过专用算法 DEX 套利、清算、抢先 NFT 从销售中提取的特殊 MEV 收入占“可提取收入”(即优先费用)总额的很大一部分:专用 MEV 平均收入似乎约为 0.025 ETH每个块,总优先费用通常在每个块 0.1 ETH 左右。建议者/建造者的分离是围绕高度专业化的块生产设计的。PBS 将区块建设过程转化为拍卖,专业参与者可以竞标创建区块的特权。常规验证人只需接受最高出价。这是为了防止 MEV 驱动的规模经济扩散到验证者的集中,但它解决了所有可能使优化区块建设更加困难的问题。

由于这些原因,更复杂的成本市场动态不会大大增加集中或风险; 事实上,应用更广泛的原则实际上可以减少DoS攻击的风险!

指数型 EIP-1559 blob 如何运行成本调整机制?

今天的 EIP-1559 调整基本费用 b 以达到特定的目标gas使用水平 t,如下所示:

以太坊下一个里程碑升级?V神详解EIP-4844究竟是什么

其中 b(n) 是当前块的基本成本,b(n 1) 是下一块的基本费用,t 是目标,u 是使用的gas。

这种机制的一个大问题是它实际上没有针对性t。假设我们得到两个块,第一个 u=0,下一个 u=2t。我们得到:

以太坊下一个里程碑升级?V神详解EIP-4844究竟是什么

尽管平均使用量等于 t,但是基本费用下降了63/64basefee只有利用率略高于t只有在实践中, 显然比 高3%左右,尽管确切的数字取决于方差。

指数调整是一个更好的公式:

以太坊下一个里程碑升级?V神详解EIP-4844究竟是什么

exp(x) 是指数函数 e^x,其中 e≈2.71828。在 x 值小时,exp(x)≈1 x。然而,它与交易置换无关:多步调整

以太坊下一个里程碑升级?V神详解EIP-4844究竟是什么

取决于总和 u1 ... u/n,而不是分布。要了解原因,我们可以进行数学操作:

以太坊下一个里程碑升级?V神详解EIP-4844究竟是什么

因此,无论它们如何在不同的块之间分配,包含相同的交易都会导致相同的最终基本成本。

上面的最后一个公式也有一个自然的数学解释:术语 (u1 u2 ... u/n-nt) 可视为多余:实际使用总量gas总和计划使用gas差异。

当前基本费等于

以太坊下一个里程碑升级?V神详解EIP-4844究竟是什么

事实清楚地表明,如果超过 ,超出部分不能超过一个非常窄的范围8t?60,那么basefee变为 e^60,高得离谱,没人能付 。如果低于 0,资源基本免费,链条会被垃圾邮件发送到零以上。

调整机制完全按照这些术语:跟踪实际总计 (u1 u2 ... u/n) 并计算总目标 (nt),并将价格计算为不同的指数。我们不使用 ,以使计算更简单e^x,而是使用 2^x; 其实我们用了 2^x 近似值:EIP 中的 fake_exponential 函数。假指数几乎总是在实际值 0.3% 以内。

为们增加了一个额外的功能,以防止长时间不充分使用导致 2倍完整块,我们不会让多余块低于零actual_total 低于targeted_total,我们只需将actual_total 设置等于targeted_total。在极端情况下(blob gas 已经下降到零),这确实破坏了交易顺序的不变性,但安全性的增加使得这是一个可接受的折衷。还要注意这个多维市场的一个有趣结果:刚引入 proto-danksharding ,一开始可能只有很少的用户,所以一段时间 blob 的成本几乎肯定会非常便宜,即使是“常规的” 以太坊区块链活动仍然很昂贵。

作者认为这种成本调整机制比目前的方法好,所以最终 EIP-1559 成本市场的所有部分都应该转向使用。

请参考 更长更详细的解释Dankrad 的帖子。

fake_exponential 是怎么工作的?

为方便起见,这里是 fake_exponential 的代码:

def fake_exponential(numerator: int,denominator: int) -> int: cofactor = 2 ** (numerator // denominator) fractional = numerator % denominator return cofactor ( fractional * cofactor * 2 (fractional ** 2 * cofactor) // denominator ) // (denominator * 3)

这是用数学重新表达的核心机制,去掉了四舍五入:

以太坊下一个里程碑升级?V神详解EIP-4844究竟是什么

目标是将(QX)的许多实例拼接在一起,其中一个为每个 [2^k,2^(k 1)适当移动和放大 范围。Q(x) 本身是 0≤x≤1 的 2^x 近似值选择以下属性:

简单性(这是二次方程)左边缘的正确性 (Q(0)=2^0=1)右边缘的正确性 (Q(1)=2^1=2)平滑斜率(我们确保 Q’(1)=2?Q’因此 Q 每个位置 缩放副本在右边的斜率与下一个副本在左边的斜率相同)

最后三个要求给出三个未知系数的三个线性方程,上面给出的 Q(x) 给出了唯一的解决方案。

近似值出奇的好; 除最小输入外的所有输入,fake_exponential 给出的答案是 2^x 实际值的 0.3% 范围内:

以太坊下一个里程碑升级?V神详解EIP-4844究竟是什么

proto-danksharding 还在争论哪些问题?

注:这部分很容易过时。不要相信它会对任何特定的问题提出最新的想法。

所有主要的Optimistic Rollup它们都使用多轮证书,所以它们可以使用(便宜得多)来评估预编译而不是 blob 验证预编译。任何真正的需要 blob 验证的人可以自己实现: blob D 和版本化哈希 h 作为输入,选择 x=hash(D,h),使用重心评估计算 y=D(x) 并使用点评估预编译验证 h(x)=y。所以,我们真的需要 blob 验证预编译,还是可以直接删除,只用点评估?该链长期处理 1 MB 块的能力如何?如果风险太大,一开始是否应该降低目标 blob 数?blob 应该以 gas 还是 ETH(烧毁)定价?成本市场是否应进行其他调整?新的交易类型应视为 blob 还是 SSZ 对象,在后一种情况下会 ExecutionPayload 改为联合类型? (这是现在做更多工作和以后做更多工作的权衡)可信设置实现的确切细节(技术上超过 EIP 本身的范围,因为对于实现者来说,这种设置只是一个常数,但仍需完成)。

本文地址:https://www.xf112.com/post/5518.html
版权声明:本文为原创文章,版权归 OKEX 所有,欢迎分享本文,转载请保留出处!

点赞
分享:

PREVIOUS:ETC即将减产,生态薄弱困局仍是难解之谜
NEXT:Meebits交易额持续强势,WomenFromVenus24小时交易额涨幅超144倍

版权声明:
作者:matrixzzz
链接:http://www.mdcbiotech.com.cn/oyjys/256.html
来源:okex注册_欧易交易所app下载_okex交易所登录
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码