DEV Community

JaydenINWEB3
JaydenINWEB3

Posted on

Swarm网络的激励措施

Swarm 网络由许多独立的节点组成,运行实现 Swarm 协议的软件。重要的是要意识到,即使节点运行相同的协议,网络的紧急行为也不能仅由协议来保证;由于节点是自主的,因此它们基本上可以 “自由” 地以任何他们想要的方式对 Peer 节点的传入消息做出反应。然而,有可能使节点以有利于网络所需的紧急行为的方式做出反应,同时使以有害的方式行事的成本高昂。从广义上讲,这是在 Swarm 中实现的,方法是将价值从使用网络资源的节点(网络用户)转移到提供网络资源的节点(网络提供者)。

1.1共享带宽
1.1.1 服务和中继的激励措施
块的检索最终是由访问内容的人发起的,因此与此检索相关的所有费用都应由他们承担。虽然当今天的 Web “免费”的时,付费检索听起来可能不是一个流行的想法,但当前 Web 的许多问题都源于消费者无法直接与内容发布者分担托管和分发的成本。原则上,块的检索可以被视为一个功能单元,其中存储者充当服务提供商,请求者充当使用者。提供者提供服务。

1.1 激励设计
块的检索可以被视为一个功能单元,其中 Storer 充当服务提供商,请求者充当 Consumer 的 Consumer,作为回报,Consumer 应该提供补偿。这种直接交易通常需要交易者彼此认识,因此如果我们要保持下载的匿名要求,我们必须以一种新颖的方式概念化补偿。

当我们使用转发 Kademlia 时,块检索包含转发节点执行的一系列中继操作。由于这些是独立的参与者,因此已经有必要激励独立接力的每一次行为。重要的是,如果只有中继的实例很重要,那么 Transactors 仅限于连接的 Peer 节点,而不管会计和补偿的细节如何。鉴于 Peer 节点的集合在会话之间形成了一个准永久的集合,我们能够在重复交易的背景下构建交互。这样的设置总是会为相关方创造额外的激励,让他们表现得友好。优先考虑显示无污染历史记录的同行是合理的。此外,由于连接的对等节点的集合在网络大小上是对数的,因此与对等节点重复交互可能需要的任何簿记或区块链合约都保持可管理性,从而提供可扩展的解决方案,总的来说,我们可以说,与可管理的 Peer 节点保持平衡,以及请求发起的模糊性是节点连接受限的真正原因,即它们选择更精简的 Kademlia bin。

如果接受检索请求已经构成了转发节点的收入,即在交付响应之前触发了将下游对等节点归还的会计事件,那么它会产生不转发请求的不正当激励。根据成功检索来调节请求收入的履行是自然的解决方案:只有当请求的 chunk 被传递回其请求者时,才会触发会计事件。

但是,如果请求没有成本,那么就有可能为不存在的块(随机地址)发送许多非法请求。这很容易通过对那些为不存在的 chunk 发送过多请求的 peer 节点施加制裁来缓解。

一旦节点发起(启动或转发)请求,如果该块在定义的生存时间 (TTL) 内交付,则它承诺为该块付费,因此在以下情况下,永远不会有动力阻止及时交付。

如果该数据块在定义的生存时间 (TTL) 内交付,则它承诺为该数据块付费,该数据块被传回。这个承诺还阻止了节点轻率地为一个 chunk 请求太多的 Peer 节点,因为如果多个 Peer 节点响应 delivery,则必须向每个 Peer 节点付款。

1.1.2 块检索的定价协议
接下来,我们介绍节点用来传达其在 Swarm 网络中交付 chunk 的价格的协议。在此协议之上,希望在服务质量和价格方面与其他节点在市场上竞争的节点可以实施策略。

该协议的主要优点是它允许价格发现机制仅基于本地决策,这是必不可少的,原因如下:(1) 带宽成本在全球范围内并不均匀:允许节点通过价格来表达其成本结构,将实现价格和质量的竞争, 最终使最终用户受益。(2) 由于使用或连接的波动,对带宽资源的需求不断变化。(3) 能够直接对变化做出反应创造了一个自我调节的系统。

实际上,如果没有这种可能性,节点运营商可能会决定在成本上升时关闭他们的节点,或者相反,当成本或需求减少时,最终用户可能会在很长一段时间内多付钱,并且节点没有竞争压力来相应地降低价格。

带宽是一种带有“即时满足”的服务,因此立即确认和核算其成本是合理的。由于很难想象带宽的整体供需存在任何外部性或非线性,因此,一种同时提供 (1) 高效和即时信令和 (2) 具有最小交换和发现成本的竞争性选择的定价机制最有可能适应导致全球最优资源分配的策略。

为了促进这一点,我们引入了一个协议消息,可以将这些价格传达给上游 Peer 节点。我们可以将此消息概念化为对请求的替代响应。节点维护与每个邻近顺序的每个对等节点关联的价格。因此,当他们发出检索请求时,他们已经知道只要下游对等节点在生存时间 (Time-to-live) 期内成功交付有效块,他们就知道他们承诺支付的价格。然而,将价格信号仅限于响应是没有意义的:如果出于任何原因,对等方决定更改价格,即使有响应请求,交换这些信息也符合双方的利益。为了防止 DoS 攻击,通过向上游对等节点发送价格变动消息来防止 DoS 攻击,价格消息的速率是有限的。行为良好且价格具有竞争力的节点受到同行的青睐;如果一个节点的价格设置得太高,或者它们的价格比网络中的其他节点波动性高得多,那么 Peer 节点将不太愿意向他们请求区块。

为了简单起见,我们假设默认价格为零,对应于免费服务(利他策略)。

如果一个 chunk 的价格在所有范围内都是相同的,那么除了缓存 chunk 并通过转售来赚取收入之外,没有真正的动力让节点转发请求。此选项很难证明新块的合理性,特别是如果它们位于不太可能请求的节点的浅邻近顺序中。更重要的是,如果 chunk 的定价在邻近订单之间是统一的,那么串通节点可以产生与它们发送的一样多的 chunk 流量和 Pocket,这几乎是一种免费的 DoS 攻击

为了缓解这种攻击,请求者为块支付的价格需要严格高于 storer 节点在请求者路由到 storer 时获得的补偿。我们需要建立一个奖励转发节点的定价方案,因此,这需要实施基于节点邻近性的差价定价。如果 Delivery 价格随着节点离 chunk 越来越远而较低,那么请求总是可以以这种方式发送,因为转发器会将差价收入囊中,从而获利。这意味着,如果 Peer 节点离 chunk 地址较远,则有效的差分方案将收敛到一种定价模型,在该模型中,交付成本更高,即Chunk Deliveries 的奖励是 Proximity 的递减函数。由于交付路径和社区内的竞争压力,我们预计节点应用于下游价格的差价将收敛到转发实例的边际成本。下游价格由节点的 bin 密度决定。假设 cardinality 为 2 的 balanced bin,节点可以保证在一跃点中将邻近顺序增加 n。同时,这也意味着他们可以将成本分摊到 n 个邻近的箱子上,从而压低整体价格。

同业之间的价格统一:以一个节点 A 为例,该节点需要转发对属于 A 的 PO bin n 的 chunk 的请求。请注意,在 bins n + 1 , n + 2 , … 中 A 的所有其他对等节点,就像 A 一样,在其 PO n 中也有块。如果这些 Peer 节点中的任何一个,比如 B,接近订单 n 的价格比 A 便宜,那么 A 可以降低其 PO bin n 的价格,将所有增加的流量转发给 B,并且仍然将差价收入囊中,参见图 3.4。请注意,这对网络来说并不理想,因为它会在路由中引入虚假跃点,即在不增加接近度的情况下进行中继。

同样,较浅 bin 中 A 的对等体在各自的 bin 中价格低于 A,例如,bin n 中的 B − 1 比 bin n 中的 A 便宜,那么 A 总是可以将任何请求转发给 B 并将差价收入囊中。

现在,我们假设所有对等节点都有随着 PO 降低而单调递减的价格表。此外,假设较浅的 bin 对小于 n 的 bin 具有更高的价格,并且高于 n 的 bin 中所有较深的对等项对 n 的价格相同。设 B、C、D 和 E 是 bin n 中密集平衡的对等体。A 希望将 chunk 转发给 Peer 节点,以便D 和 E 是 bin n 密集平衡 PO 中的 peer,其目标地址增加了 3。如果 Peer 节点 B 和 C 试图串通对 A 并提高转发 chunk 到 bin n + 3 的价格,他们仍然受到 D 和 E 在 PO bin n + 2 上的价格的约束。特别是,如果它们低于 n + 3 的 B 和 C。这种价格差异为节点提供了套利机会;转发到最便宜的 Peer 节点的策略会将流量从昂贵的 Peer 节点引导出去,并增加更便宜的 Peer 节点的流量。因此,价格将进行调整。

在其他条件相同的情况下,这种价格套利策略将实现 (1) 整个网络中相同邻近订单的统一价格,(2) 价格随邻近节点线性下降 (3) 可以增加连接性并保持较低的价格。通过这种方式,激励措施的设计使对单个节点有益的策略也整齐地保持一致,以有利于整个系统的健康。

根据下游 peer 节点与 chunk 的接近程度收费具有重要的后果,即从向单个请求者进行非本地交付的单一行为中获得的净收入是 chunk 与节点本身和请求转发到的 peer 节点之间的接近程度之间的差异的单调递增函数。换句话说,我们在一个转发请求中可以覆盖的距离越远,我们赚的就越多。

这种激励措施符合下载者的利益,即在处理请求时节省跃点,从而降低延迟交付和减少带宽开销。该方案激励节点在其 Kademlia bin 中保持一组无间隙的平衡地址,即,节点最好保持密集的 Kademlia bin 而不是薄的 Kademlia bin。

能够维护更密集的 bin 的节点实际上与较薄的节点具有相同的成本,但节省跃点将改善延迟并提高对等节点的效率。这将导致 Peer 节点优先于具有相同价格的其他 Peer 节点。流量增加本质上也会导致带宽争用,最终导致价格上涨。请注意,这种套利在可供选择的 Peer 节点数量较多的浅 bin 中效率更高。这与责任区内的深箱截然相反。如果一个节点没有复制其邻域的 chunks,那么其中一些 chunk 将需要由更靠近地址但离节点更远的节点请求。这只有在亏损的情况下才有可能。

缓存和自动扩展:节点每次提供一个 chunk 时都会获得奖励,因此 chunk 的盈利能力与其受欢迎程度成正比:请求 chunk 的频率越高,相对于每个时间单位的固定存储成本,奖励就越高。当节点达到存储容量限制并需要决定删除哪些块时,寻求利润最大化的理性代理会选择删除盈利能力最低的块。一个合理的良好预测指标是上次请求的年龄。为了最大化可供选择的 chunk 集,节点对它们中继的 deliveries 以及它们同步的 chunk 进行机会性缓存。这导致流行的块得到更广泛的传播和更快的服务,将整个 Swarm 转变为一个自动扩展和自动平衡的内容分发网络。

非缓存节点:任何确保中继节点盈利的计划都会为仅转发非缓存节点进入网络创造积极的激励。此类节点本身对网络没有好处,因为它们会产生不必要的带宽开销。一方面,原则上,它们的存在可以减轻 storer 节点中继流量的负担,因此在浅 bin 中使用它们可能没有坏处。另一方面,更接近在邻域深度,他们的 Peer 节点会偏爱缓存 / 存储节点,因为至少对于他们假设的责任范围内的 chunk 来说,这是不利的。非缓存节点也有助于提高匿名性。

3.1.3 激励推送同步
push-sync协议确保上传到网络的 chunk 到达其指定地址。在下文中,我们将解释如何激励转发。

推送同步类似于检索协议,因为它们各自的消息交换序列执行相同的路由。push-sync 协议中 chunk 的交付类似于检索请求,相反,push-sync 中的 statement of custody receipt 类似于检索中的 chunk delivery 响应。

原则上,推送同步可以不留作明确的转发激励。由于检索协议,由于节点希望在其地址附近找到区块,因此 Swarm 的参与者至少没有动力帮助将上传的区块运送到目的地。但是,我们需要提供这样一种可能性,即通过比请求者更远的节点(轻节点或重试)上传 chunk。因此,如果推送同步是免费的,节点可能会产生大量浪费的带宽。

仅要求为下游 Peer 节点的 push-sync 交付付费,这将使转发器能够与 Storer 节点就 chunk 的交付进行讨价还价。拥有一个 chunk 对于潜在的 storer 节点来说很有价值,因为还有一个存储奖励系统。基于此,理论上,forwarder 节点可以持有该 chunk,除非 storer 节点支付的费用略高于拥有该 chunk 的价值,考虑到应得的潜在利润到存储激励。特别是,由于来自上传者的路由上的转发器并不多,因此存储奖励机制产生的任何利润都可能被这些转发节点捕获。

相反,在推送同步中,通过将保管声明收据设为付费消息,角色会切换。转发器节点不再处于讨价还价的位置。为了理解原因,让我们考虑这样一个场景:转发节点试图保留一个块,以协商将其推送到 Storer 节点的价格。在这种情况下,上传者将无法在预期时间范围内收到保管声明收据。因此,上传者将假定尝试失败,并通过其他路由重新上传数据块。现在,突然之间,原始转发节点被迫与另一个转发节点竞争,以获得其带宽成本的补偿。由于所有转发节点都知道这种动态,因此紧急行为将产生一系列 Peer 节点,这些 Peer 节点愿意将 chunk 转发到 storer 节点,以获得相对较小的补偿和产生的带宽成本。这消除了原始转发节点首先尝试与 storer 节点讨价还价的需要:相反,他们只需返回托管收据声明即可立即产生少量利润。

该方案突出了为什么两种协议的激励措施依赖于相同的前提:同质商品(保管收据)有许多卖家(货运代理),而只有一个买家(上传者)。因此,服务的价格(将 chunk 交付给 storer)由路由上每个节点的转发边际成本之和决定。同时,storer 节点可以从存储补偿计划中捕获所有利润。

通过这种方式,我们可以确保 (1) 存储者实际使用收据进行响应,并且 (2) 有办法检测超时或未经请求的收据响应以防止 DoS。

与检索协议类似,此方案中的定价预计会根据不同的距离而有所不同。此外,由于网络中节点的成本会波动(取决于容量利用率和节点效率),因此定价也会随着时间的推移而变化。鉴于补偿是在会计过程中为一个块和一条较短的消息(检索请求和托管收据)计算的,我们可以有把握地得出结论,两种协议的转发价格结构是相同的。因此,转发的统一定价方案可以应用于这两种协议。推送同步与检索协议的区别在于,与将块传回并且可以验证其完整性的检索不同,推送同步中的记帐事件是可以欺骗的监管声明。由于转发激励,节点可能会受到激励,通过发布监管声明来拒绝转发并冒充存储节点。这使得通过替代路由查询 (检索) 块是可取的。如果此类检索尝试失败,则可能需要尝试通过替代路由推送同步 chunk。

1.2.1

Trónetal. (2016) 引入了一种称为 swap 的点对点会计协议。Swap 是一种以牙还牙的会计方案,可以扩展微交易。该计划允许直接连接的对等节点交换付款或付款承诺。该系统的关键特征通过首字母缩略词 SWAP 的不同助记词分辨率有趣地捕获:

Swarm 计费协议:

Swarm 用于保存带宽互惠共享记录的方案。

允许服务交换:使用自动付款结算

超过付款阈值时发送支票。将豁免作为付款发送未,兑现支票的价值可以免除债务。

服务换服务:

swap 允许在连接的 Peer 节点之间进行服务交换。当消费量相等且随时间变化较小时,无需任何付款即可考虑双向服务。数据中继就是这种服务的一个例子,这使得 Swap 非常适合。

数据中继是此类服务的一个示例,用于在内容交付或网状网络中实施带宽激励。

付款结算

在服务消费存在较大差异或不相等的情况下,天平最终将显著向一个对等节点倾斜。在这种情况下,负债方向债权人付款,以将名义余额恢复为零。这个过程是自动的,并证明了自动支付的掉期作为结算(余额)的概念是合理的。这些付款可以采用承诺的形式,而不是即时交易的形式。

付款最低限额

为了量化什么是“显着倾斜”,交换协议要求 Peer 节点在握手时公布支付阈值:当他们对 Peer 节点的相对债务超过此阈值时,他们会向 Peer 节点发送包含付款的消息。当债务达到此水平时,任何节点发送消息都是合理的,因为还有设置断开连接阈值。任何对等体都可以自由设置 disconnect threshold (断开连接阈值),但建议选择一个考虑到两个对等体之间会计余额通常差异的值。这可以通过考虑付款阈值和断开连接阈值之间的差异来完成。

原子数

发送支票和更新接收方的余额如果不大幅增加复杂性,就不能成为原子操作。例如,客户端可能会在接收和处理消息之间崩溃,因此即使发送返回没有错误,发送对等方也无法确定已收到付款,这可能会导致双方的会计差异。由两个阈值之间的差异 (DisconnectThreshold − PaymentThreshold) 表示的容忍度可以防止这种情况,即如果此类崩溃的发生频率不高,并且两个对等体发生的概率大致相等,则产生的微小差异将被过滤掉。这种机制可以保护节点免受制裁。

3.2.2 支票作为链下支付承诺
在区块链网络中进行直接链上支付的主要挑战之一是与每个参与节点处理每笔交易相关的高交易成本。然而,可以在不将此付款显示在链上的情况下创建付款。此类支付称为第二层支付策略。其中一种策略是推迟付款并批量处理。为了换取降低成本,受益人必须愿意承担更高的结算失败风险。我们认为,在 Swarm 的带宽激励的情况下,这是完全可以接受的,因为 Peer 节点将进行重复交易。

支票簿合同

Trón et al. (2016) 引入了一种称为支票簿合约的简单智能合约,它允许受益人确定付款时间。该合约充当钱包,可以处理其所有者签发的支票。与传统金融交易类似,发卡行签署一张支票,指定收款人、日期和金额,并将其提供给收款人,以表示承诺稍后付款。智能合约扮演着银行的角色。当收款人希望获得付款时,他们通过将支票提交给智能合约来 “兑现支票”。合同在验证支票上指定的签名、日期和金额后,将金额转入受益人的账户(见图 3.8)。类似于将支票带到银行兑现的人,任何人都可以在交易中将数字支票发送到所有者的支票簿账户,从而发起转账。

swap 协议指定当超过付款阈值时,债权人对等方将发送支票。此类支票可以通过将其发送到发行人的支票簿合同来立即兑现。或者,也可以持有支票,这实际上是一种信用贷款形式,使各方能够节省交易成本。

存入支票簿的金额(全球余额)作为支票的抵押品,并汇集所有未付支票的受益人。在这种最简单的形式中,支票簿提供与真实世界支票相同的保证:无。由于资金可以随时自由地从支票簿钱包中转出,因此永远无法保证兑现时的偿付能力:如果支票簿的余额的金额少于已提交的支票中指定的金额,支票将退回。这是交易成本和结算失败风险之间的权衡。

虽然严格来说,没有对偿付能力的保证,也没有明确的破产惩罚措施,但支票跳票可能会对发行人的声誉产生负面影响,因为支票簿合同记录了此类事件。在重复交易的情况下交换支票的前提下,同行将避免签发超出其余额的支票。换句话说,一个节点在对等节点中保持良好声誉的利益是维持其偿付能力的充分激励。

双倍兑现

由于这些数字支票是文件,因此可以复制,因此采取措施防止同一张支票多次兑现至关重要。通过为给特定受益人的每张支票分配一个序列号,合同将在支票兑现时存储该序列号来防止这种“双重兑现”。然后,支票簿合同可以依靠序列号来确保支票兑现,可以通过为每张给特定受益人的支票分配一个序列号来防止,当支票按顺序兑现时,合同将存储该序列号,因此每个受益人只需要存储一个序列号。或者,为了处理对同一受益人的重复付款,支票可以包含曾经记入该受益人的累积总金额。合同会保留每个受益人兑现的总金额记录,当提交新支票时,合同会将支票上的金额与存储的总金额进行比较。金额等于或小于存储总额的支票将被忽略,而总额较高的支票将导致差额转给受益人。

这个简单的技巧还可以批量兑现支票,因为只需要处理最近的“最后一张支票”,从而显着降低交易成本。

无以太币兑现

并非 Swarm 中的所有 Peer 节点都拥有支付兑现支票的交易费用所需的以太币。支票簿允许第三方兑现支票。交易的发送者将获得所执行服务的奖励。

1.2.3 豁免
如果掉期通道中的不平衡是由于高方差而不是不平等的消费,那么在积累了一段时间的支票之后,通道余额开始向相反的方向倾斜。通常,现在由另一方向其对等方签发支票,导致双方累积未兑现的支票。为了进一步节省交易成本,能够将这些支票相互抵消可能是可取的。这样的过程是可能的,但它需要在支票簿合同中进行某些重要的更改。特别是,兑现支票不能再是即时的,必须产生安全延迟,这是其他支付渠道实施(Poon 和 Dryja 2015、Ferrante 2017、McDonald 2017、Tremback 和Hess 2015)中熟悉的概念。

让我们想象一个类似于支票退还给发行人的系统。假设对等节点A向B签发了支票,并且余额恢复为零。后来,天平向倾斜,但A到B的支票尚未兑现。在传统金融世界中,B可以简单地将最后一张支票退还给A,也可以证明可以销毁它。在我们的例子中,事情并不那么简单:我们需要一些其他机制,让B 承诺不兑现那张特定的支票。这种承诺可以采取多种形式:它可以通过签署一条消息来实现,允许 A签发累积总额低于以前的新“最后一张支票”,或者 B可以为 A 的支票薄签发一种“负数”支票,有效地抵消金额,就像支付了相同金额的支票一样。

这些实现的共同特点是不允许即时兑现支票簿中的支票。收到支票兑现请求后,合同必须等待允许另一方提交有关已取消支票或减少总额的潜在缺失信息。为了使用单一支票簿进行(半)双向付款,我们引入了以下修改:

从用户 A 到用户B的所有支票都必须包含序列号。-A向 B签发的每张新支票的序列号必须高于前一张。-4的支票簿合同记录了 B 兑现的最后一张支票的序列号。- 在兑现延迟期间,任何序列号较高的有效支票将取代之前提交的任何支票,无论其面值如何。一任何提交的支票如果减少之前提交的支票的支付,则只有在受益人签名的情况下才有效。有了这些规则,就很容易看出支票取消是如何运作的。让我们考虑用户A签发支票 c的场景。.c与累计总数 t…tto 用户 B。假设 B 兑现的最后一张支票是 c。支票簿合同记录了 B。

已收到 TI 的付款,并且兑现的最后一张支票的序列号为 i。

让我们进一步假设天平开始向 A 倾斜,倾斜了一定程度的 。如果 B 已经兑现了支票 cn,那么 B将需要以 B的支票簿作为来源签发自己的支票,并指定A 为受益人。然而,由于支票 ci +1…cn 仍未兑现,B可以改为向A发送一张支票,支票簿为 A的来源,B 为受益人,序列号为 n +1,累计总额tn+1= tn -x。根据上述规则,A 将接受此款项作为 B 支付的金额 x的等值款项。在这种情况下,B没有向 A 发送支票,而是放弃了他们之前的部分权利。这证明了 SWAP 作为发送豁免作为付款的概念是合理的。

此过程可以重复多次,直到将累积总数带回ti。此时,所有未偿还的债务实际上都已被取消,任何进一步的付款必须以 B支票薄中向 A的适当支票的形式支付。

1.2.4 零现金输入
掉期会计也可以以单向方式工作。当一方以零流动资金进入系统(新人)但与有资金的对等方(内部人)建立联系时,新人可以开始提供服务(并且不使用任何服务)以赚取正的掉期余额。

如果内部人士有支票簿,他们只需用支票支付新移民即可。但是,这有一个警告:新移民将能够通过所提供的服务赚取支票,但无法兑现支票。兑现支票需要将交易发送到区块链,因此需要 gas,除非节点可以说服其对等节点之一代表其执行交易。为了实现这一点,节点能够在他们想要发送的结构上签字,然后通过预处理步骤来扩展 Swap 合约,该步会触发对新来者的付款,包括交易的 gas 成本以及交易发送者的服务费。新移民支票任何内部人士都可以兑现交易的 gas 成本加上交易发送者的服务费。此功能证明了 SWAP 的概念是合理的,即 start without a penny, send with a peer.

在没有启动资金的情况下赚取少量资金的可能性至关重要,因为它为新用户提供了一种无需购买代币即可访问 Swarm 的方法。这种好处通常延伸到以太坊生态系统:使用 Swarm,任何人都可以赚取少量资金来开始支付汽油来为他们的dapp 提供动力,而无需在入门前经历痛苦的获取代币过程。
————————————————

                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
Enter fullscreen mode Exit fullscreen mode

原文链接:https://blog.csdn.net/weixin_44559820/article/details/143858293

Top comments (0)