作者:Sergio Demian Lerner

来源:https://medium.com/iovlabs-innovation-stories/modern-merge-mining-f294e45101a0

比特币社区之所以欢迎比特币侧链,是因为它们提升了比特币的效用,并且还有许多潜力。RSK 侧链有意设计成提供与比特币社区兼容的激励。它使用基于 “合并挖矿(merge-mining)” 的共识协议,激励了比特币友、比特币钱包,尤其是比特币矿工的参与。合并挖矿是一种复用一条链上的工作量证明来保护另一条链的技术。它工作的方式很简单:矿工把另一条链的新区块的哈希值加入到比特币区块中,然后开始挖矿(找出匹配比特币网络的难度要求的工作量证明)。不过,如果在挖矿过程中他们找到了一个符合被合并挖矿的链的难度要求的比特币区块,那这个区块的区块头就会成为被合并挖矿的块的有效工作量证明,而这个比特币区块头和被合并挖矿的块都会发送到被合并挖矿的网络中、加入到这个网络的链上。合并挖矿使得侧链的区块生产速度比主链更快,所以有几方面的好处,比如:降低奖励发放的波动性、提供更快的交易确认。在当前所有使用合并挖矿的生态系统,都有一条链是所谓的 “主链(primary chain)”,即在其区块头中以区块头哈希值体现工作量证明的链;其它的则是所谓的 “次级链(secondary blockchains)”,其区块是链接到主链区块的。在挖掘主链区块时复用工作量证明的唯一要求是其与次级链区块的链接是明确的,以防止同样数量的工作量被用来为同一链上的两个不同区块提供工作量证明。

合并挖矿的历史几乎跟比特币同样悠久:密码学货币 “域名币(namecoin)” 就在 2011 年跟比特币开始了合并挖矿,以获得更强的安全性。后来也有别的链因循这一道路。合并挖矿的共识协议已经得到了正式的分析批评。不过,大多数研究者和用户关于合并挖矿的推理都基于由域名币引入的过时的共识模型。RSK 是一个由比特币合并挖矿保护的智能合约平台,其启动刺激了更安全的合并挖矿协议的研究。结果是新一波的合并挖矿的理论研究和实现成果出现,而它们现在已经成了理解这项技术的潜力的基础知识。这些新的模式也证否了对合并挖矿安全性的一些常见误解。举个例子,人们通常认为,即使在合并挖矿的算力比较低或其区块奖励比较低的情况下,一个合并挖矿的侧链也无法抵御多重支付攻击(double-spend)。下文就是我们对合并挖矿如何实现安全性的讨论。

域名币的合并挖矿设计

域名币与比特币合并挖矿的方式很简单。在区块奖励交易(generation transaction)的 coinbase 字段的末尾,矿工写入 4 个字节,表示后面跟着一个 AuxPow 记录。这些 4 字节数据我们叫 “魔法字节(magic bytes)”,是用来方便发现 AuxPow 记录的。然后,在 AuxPoW 记录中,矿工存储着一个默克尔树的根哈希值,而默克尔树包含的是被合并挖矿的不同区块链的区块哈希值;然后是 treesize 字段,表明默克尔树种被合并挖矿的区块(链)数量;还有 treeNonce 字段,本意是为了避免链 id 的混淆,但这个设计失败了,所以这个值是不用的。下图就展示了 4 条合并挖矿的链的 4 个区块(W、X、Y、Z)与比特币区块在数据上的关联:

img

- 域名币的合并挖矿设计 -

这使得域名币节点可以验证一个域名币区块的工作量证明:域名币区块内必须包含一个默克尔路径(来证明比特币交易树中有 Coinbase 交易)、这笔 coinbase 交易本身,以及证明该域名币区块的哈希值存在于 AuxPoW 树中的默克尔路径。出了 AuxPow 数据结构的设计,还有一个底层的域名币共识模式,它只验证比特币区块头的工作量证明,忽略所有其它字段。

主链的区别

从博弈论的角度看,没有什么所谓的 “主链”。我们将 “主链” 和所有被合并挖矿的 “次级链” 区分开来,只是因为所有的次级链区块都需要一个额外的默克尔证明来支持工作量证明的验证。实际上,一个合并挖矿的区块链可以从多个主链上获得工作量证明,RSK 就是如此。虽然大部分 RSK 的算力是从比特币矿工处来的,但有时候也会有少部分的算力来自 Bitcoin Cash。这是没法避免的,因为从 RSK 共识的角度看,比特币和 Bitcoin Cash 区块是没有区别的。“主链”这个概念只有语法上的意义。在 2011 年至 2013 年期间,许多发表在 bitcointalck.org 论坛上帖子,都提议使用硬分叉将比特币的工作量证明抽象出来放到一个独立的 “master” 区块头链上,并让所有的合并挖矿区块链的区块(也包括比特币自身的)从这个 master 区块头链上作为默克尔树的一部分推导出来。同样的,之前没有人考虑过的事实是,master 区块头根本不需要是一个链的一部分。区块头只能指定一个链区块和 nonce 的默克尔树根,虽然一个时间戳字段可以提升所有合并挖矿链的安全性(我们后面会看到)。这个虚拟的结构如下图所示,其中 X 和 Y 指的是其它一些合并挖矿的链:

img

- 一种没有 “主链” 的合并挖矿设计 -

如果这种数据被接受了,那就根本没有什么 “主链” 了。在我们分析矿工使用同样的工作量证明来保护超过一条区块链时,我们必须把所有被保护的链都当成次级链,或者说,我们可以统一称之为合并挖矿链。为了分析合并挖矿的激励机制,我们应该考虑 SHA256D (实际使用的工作量证明函数)矿工而不仅仅是比特币矿工。我们必须分析所有合并挖矿的区块链,以及这些区块链提供给矿工的激励。SHA256D 矿工关心比特币和 RSK ,是共享激励和共享社区的结果,而不是相反。

跨链的密码经济学共识规则

域名币公式模型未考虑的其中一种可能性,就是基于从其它被合并挖矿的区块链的区块头(或者区块体)中抽取出的数据,添加一个合并挖矿的区块链共识规则。由此,一条链就可以影响另一条链上的事情,也能从另一条链上发生的事情中受益。在实施这样的规则时,我们把第一条区块链叫做 “源链(source chain)”,把这里的规则叫做 “源密码经济学规则(source cryptoeconomic rule)”,相应地,就有一个 “目标链(target blockchain)” 和一个 “目标共识规则(target cryptoeconomic rule)”。举个例子,设想一条合并挖矿的链 X,分享了比特币 90% 的算力,而这个被合并挖矿的链要求比特币区块必须向前一个比特币区块创建的一个随机输出地址支付 0.1 BTC,就像抽彩一样。下图就显示了相关区块链的一种可能的状态:

img

- 一种给比特币协议带来负面影响的密码经济学跨链规则 -

在这个图中,链 X 的 27 号区块选择了放弃其合并挖矿的比特币区块,来逃避支付彩头。而比特币 102 号区块的最终矿工选择了不合并挖矿链 X,因此也不支付彩头。

这是一个源规则与主链的自然经济激励高度冲突的例子:新规则可能导致比特币矿工排除所有手续费抵御 10k 聪/kb 的交易。他们可能会用一笔左手倒右手、输出尽可能多的自我支付交易来填充剩余的区块空间。一个看似无害的规则也会导致一个有意外影响的目标规则。比特币社区必须仔细分析所有的跨链共识规则,因为源规则是在其它链上定义的。

RSK 的时间戳链接型共识规则

RSK 很快将激活一个强大的跨链共识规则,并且它对诚实比特币矿工的激励是中性的。Iris 网络升级加入了一个规则,要求 RSK 区块的时间戳不能离比特币的时间戳太远,这样 RSK 区块才是有效的。这个源规则提升了 RSK 的安全性,并创建了一个密码经济学目标规则、激励提高比特币时间戳的准确性。不过,RSK 没有因此上海比特币。比特币协议不需要准确的时间同步,RSK 也避免了引入一个新的要求,因为 RSK 和比特币的时间戳之间允许有差值,而这个差值的上限是非常宽松的。

一个警惕的社区

一个跨链的源规则总是内在的明确的,而目标规则总是外在的隐式的。两者都有密码经济学效果,因为矿工若想验证源规则或者说避免合并挖矿不遵守源规则,矿工总是可以发布关于目标区块链区块的不实消息,但这些操作在另外的区块链上都要承担代价:无法获得区块奖励。我们倾向于将它概括为 “密码经济选规则” 而不仅仅是 “挖矿奖励”。它们之间有细微的区别。如果大部分矿工都为了一个外部的激励而修改了生成区块模板的代码,而这项外部激励时公平地提供给所有矿工的、并且是实质性的,那它的实践效果就跟密码货币的共识代码包含了这项激励作为明确规则、为符合这个规则的矿工提供额外的手续费没有区别。

需要强调的是,合并挖矿并不是创造能够影响比特币矿工的密码经济规则的必要条件(侧链也不是!)。你可以在任何支持智能合约的区块链上创建一项贿赂,来激励比特币矿工接受某种软分叉。以太坊合约就可以做到这一点,只要有一个富状态的比特币区块中继帮助的话,比如一度活跃的 btcrelay 和当前热门的 tBTC 中继。这种可能性已经以 “跨链贿赂” 为名被指出和明确探讨了,在多篇论文中都有介绍。这些攻击只需要一个图灵完备的智能合约平台。而比特币社区用来防止针对比特币矿工的恶意激励的强大力量,叫做 “用户自主激活的软分叉(UASF)”。UASF 可以拒绝跟随恶意外部共识规则的区块。比特币社区认识到 UASF 威胁的力量是在 2017 年:现在,尝试恶意软分叉比特币的矿工会担心报复。

比特币友需要对来自其它区块链的比特币矿工实质激励保持极端警惕。

保护合并挖矿的实质激励

即使在域名币只拥有少量的比特币算力时,域名币也能来自比特币矿工的 51% 攻击,理由有很多。首先,人们不会认为域名币是在跟比特币竞争。bitcointalk.org 最老的用户之一在 2011 年描述域名币时,以下列方式为合并挖矿辩护:

“域名币有一些独特性,因为它已经建立起来了、具有了一些价值、提供了一些有用的非竞争性功能,并且有很好的流动性。这些都是那些 ‘骗局币’ 不具有的。

—— DeathAndTaxes, https://bitcointalk.org/index.php?topic=47898.0

不与比特币竞争,是域名币不会被比特币矿工和比特币社区攻击的主要原因。反面教材确实也有:竞争性的区块链 CoiledCoin 在 2012 年被 Eligius 矿池肆无忌惮地攻击

还有两项激励保护了比特币挖矿和合并挖矿,但在工作量证明的语境下很少被讨论:

  • 工作量证明可能会激励 “暗箭攻击者”,但不会激励所有类型的恶意方
  • 工作量证明提供了攻击的预警

解释一下上面链接的这份论文,暗箭攻击者的特点在于,他们可能会在任何方面尝试欺诈、偏离协议的规范,但不希望被抓到这样做。如果有很高的几率被抓住把柄,他们就不会这样做。虽然暗箭攻击者可以被认为是理性的行动者,但对理性行为的分析都局限在短期结果上,而畏惧报复的反向激励很少被考虑。不过,但凡有比特币矿池或者比特币矿工是恶意的,TA 都会是暗箭攻击者,而不会放明枪,因为矿池运营者的身份在生态系统中是公开的,而他们也可以被跟踪和起诉、他们在交易所中的账户也可能被冻结。挖矿活动需要很宽敞的空间、消费大量的电力,所以运营了大型矿场的矿工很难对权威机构隐藏自己的真实身份。匿名获得 51% 攻击算力的难度对比特币有利。

第二项很少被考虑的因素是攻击预警:要么攻击者需要一次性获得足够多的 ASIC 算力来打败所有其它算力(在 ASIC 产能受限的今天,是不可能得)、要么攻击者必须购买、重定向或控制 51% 得现有算力,并让他们挖掘一个隐藏的重组链。这些活动都会立即被比特币社区注意到,而他们可以做一些预防措施,比如提高交易确认的区块数量、联系掉线的矿池以发现算力丢失的原因。因此,任何多重花费大笔资金的尝试都会在攻击成熟之前被发现。这是一种强大的威慑,而且只能由工作量证明来提供,权益证明共识系统就没有具有。

不过,我们将在后续的章节中看到,有一些新的合并挖矿的变体,可以提供针对长程重组的链重组保护,将侧链的安全性提升到与比特币的安全性齐平。

分叉感知型合并挖矿

在域名币的公式模型中,一个合并挖矿链的区块哈希值是藏在一棵默克尔树中的(一开始叫 AuxPoW)。因此,观察比特币 AuxPoW 区块的永不并不知道其它链区块被合并挖矿了。他们也无法计算出有多少算力在合并挖矿某一条链。这种模型缺少一种比特币已经提供的重要属性,我称之为 “密码经济学合并挖矿数据可得性(CMMDA)”。CMMDA 让用户可以逐链检索出合并挖矿的信息,并确定矿工必须支付的一个基础成本(即使他们希望隐瞒)。为合并挖矿加入 CMMDA 是很简单的,但是,想要将最大数量的信息压缩在最小的空间中则并不简单。我们从最简单的方法开始:我们完全移除了 AuxPos 树,并平摊了区块哈希数据。最新的 coinbse 交易输出将在其脚本中包含一个 OP_RETURN 操作码,跟着的是一个区块哈希值的数组,每一个前面都有一个链识别符。下图就展示了这种新设计:

img

- 域名币的设计加上摊平的 AuxPow 树 -

这些组成合并挖矿信息的数据叫做 “合并挖矿标签”。为简化下列例子,我们同样假设比特币的难度不低于任何被合并挖矿的链的难度。通过观察这些标签,任何人都能计算出参与链 X 的合并挖矿的算力。他们也可以通过运行 X 的全节点来计算链 X 的诚实算力大小,这个大小不应该高于从比特币链上估计出来的大小。有了这些信息,他们就能计算出算力的差值,它是参与合并挖掘 X 的竞争性分叉的算力的密码经济学边界。所以,正在合并挖掘 X 的一个恶意分叉的具体的比特币区块将可以被识别出来,只需检查其合并挖矿标签,看是否有区块哈希值不属于 X 的诚实链,即可。我们管这叫链 X 的 “隐藏” 区块。

对于这里提出的数据结构,我们无法确定隐藏区块是否会链接到一个链上,或者他们会是不同父块的不同孤儿。它们甚至有可能是一些矿工添加的随机哈希值,就是为了迷惑链 X 的用户的。不过,我们可以假设最糟糕的情况,在隐藏区块的算力高于(或者接近)诚实链的算力时提醒社区注意。为什么不应等待到它严格高于诚实链算力的时候?因为通过 CMMDA 得来的证据时密码经济学的,这就意味着攻击者可能丢弃了一些比特币区块(当然损失了一些受益)来隐藏实际算力。不仅如此,出于同样的原因,对于我们探测出来的每一个隐藏区块,我们都可以为攻击 X 的成本确定一个下限。隐藏算力越高,执行多重花费攻击的额外成本就越低。

假设 X 和比特币有同样的区块难度,我们并不需要检查发布在比特币 coinbase 交易中的区块哈希值,因为我们知道,链 X 的诚实区块必定与比特币相联系,任何引用了链 X 的一条区块哈希值、但没有被链 X 的诚实部分引用回来的比特币区块,都必须被视为恶意的。因此,如果我们限制合并挖矿的总数,比如说 64 条,则我们可以保留 AuxPow 默克尔树,只需加入一个 64 位的位图(bitmap),用来表明哪一条链被挖掘了或者没被挖掘(位图中的相应比特的设定规则应该能得到被合并挖矿的链的共识规则的验证)。这个新设计如下图所示:

img

- AuxPow 树设计,加上额外的位图来指定被合并挖矿的区块链的识别符 -

CMMDA 的良好属性之一就是,任何同时运行比特币和 X 的节点的用户都能构建一个无状态的密码经济学(概率性)证据,证明 X 正在遭受攻击并在 X 网络中分发,而链 X 的节点就可以暂停确认交易并进入一个安全模式,来避免被多重支付,直到威胁小时。更正式地来说,这是牺牲了一部分的侧链活性(交易最终总能得到确认的属性)而极大地提升了可靠性(交易不会被多重花费的属性)。

不过,链 X 的一个隐藏区块的哈希值难以跟下列情形区分开来:

  • 矿工的节点与网络之间连接较慢,因此网络时延迫使矿工创造了大量的孤块
  • 矿工的节点未与诚实链的顶端正确同步,因此它从过去某个时间点开始一直在挖掘分叉
  • 矿工正在创建诚实链上的一个恶意并发分叉

前两种情形是很常见的(比如矿池故障),此时若冻结交易确认,会惩罚整个网络,是不可取的。RSK 采取的区分这两种情形的方法是为合并挖矿标签加入额外的信息。它添加了一个密码经济学指针,指向等距离以前的祖先块,因此通过观察两个合并挖矿标签,我们就能检测出它跟最近的分叉点距离多远,或者说能以很高的概率确定两个区块都属于同一个分叉。这种设计在 RSKIP110 里面有详述,而设计的原理在这里有述。RSK 社区也创建了一个分叉观测系统,叫 “Armadillo”。

当然,如果没有时间戳链接,Armadillo 也不会那么强大。时间戳链接是 RSK 的一项源共识规则,用来防止合并挖矿的矿工倒拨时间戳。如果大部分比特币矿工都想倒拨 RSK 区块的时间戳,他们也需要倒拨比特币区块的。因为比特币的时间戳共识规则(一个区块时间戳必须高于过去 11 个区块的时间戳中值),少量算力倒拨比特币时间的能力限制在最多一个小时(平均而言)。

我们可以将对中本聪共识的两种多重花费攻击分成两种类型:“确认后回滚(Revert After Coinfirmation,RAC)” 和 “确认中回滚(Revert During Coinfirmation,RDC)” 。第一种类型是在受害者接受一笔即将被多重花费的交易后开始的,而第二种是在交易的第一次花费被接受之前开始的。如果一场对 RSK 的 RAC 攻击是在时间戳链接共识规则激活后发起的,少数矿工无法倒拨区块时间戳,这就意味着攻击者唯一的选择就是在一个旧的区块后面创建一个分叉,但使用正确的时间戳,这就会创造一个创建戳上的断层。可以通过在 RSK 种添加一个共识规则来惩罚这种有大的时间戳间隔的分叉。一种可行的惩罚策略是构造一个从区块 PoW 到累计难度的转移函数,它会随着时间戳方差的增大而减小。不过,任何惩罚策略都只会提高攻击者最终逆转区块链、实现多重的算力门槛,而不可能完全杜绝多重支付。后面我们会看到,一种叫做 “Syncchain” 的新型侧链技术可以完全防止这种攻击。在下图中,每一个区块图标都代表着放在区块种的时间戳(不是它被挖出的时间):

img

- RAC 攻击的两种变种 -

从图中可以看出,橙色的区块是由攻击者创建的区块,而蓝色区块是剩余矿工创建的诚实区块。绿色区块也是诚实区块,但表示这时候受害者接受了即将被多重花费的交易的第一次花费(举个例子,交易所确认存入)。

如果矿工无法倒拨恶意分叉的 RSK 区块的时间戳,也无法容易地继续挖掘一个旧的分叉,那么多重花费攻击就必须在潜在的受害者等待第一次花费的确认的时候发生(也即是 “等待确认时回滚” 攻击)。下图就演示了 RDC 攻击。

img

- RDC 攻击 -

防止 RAC 的画出在于,RDC 可以被合并挖矿标签中的隐藏区块的显现所触发的警报吓阻。潜在的受害者可以收听这样的警报,并在得到支付时暂停确认,从而防止爽滑。在警报期间,节点可以进入安全模式:他们会继续接受和广播区块和交易,但他们会停止给用户和连入应用提供交易确认(即,通过节点 RPC 节后的通信会被暂停)。下图显示了 Armadillo 警报如何防止 RDC:

img

- 收到警报之后,节点进入安全模式,防止多重支付攻击 -

虽然这没有消除所有的链重组激励,但它防止了多重支付,消除了链重组的激励中最大的一个(与 MEV手续费钉死相关的链重组激励依然存在)。

我们创造了 “分叉感知型合并挖矿”,它结合了合并挖矿数据可得性、一种分叉检测系统、时间戳链接规则,以及节点在响应分叉警报时自动进入的、交易无法被确认的安全模式。不过,我们还可以做得更好,下面来了解下 “内部分叉感知型合并挖矿”。

内部分叉感知型合并挖矿

在一个无法为矿工提供足够价值的被合并挖矿链中,有些矿工会无视合并挖矿,仅仅挖掘主链。只挖掘主链的矿工,从被合并挖矿的链的角度来看,是中立的:他们根本不关心这边的共识规则,某种意义上,他们是在用自己的区块来确认合并挖矿的矿工链接的 最新合并挖矿区块,无论这些区块是诚实的还是恶意的。

这就意味着,如果没有对被合并挖矿的链的持续的隐藏攻击,中立矿工的区块会确认诚实矿工的合并挖矿链。这些中立的区块可以被合并挖矿的链挑拣出来,用作确认的算力,就像 RSK 中的叔块一样。这就意味着,一个被合并挖矿的链 X,即使只有主链 1% 的算力,也可以 “借用” 剩下的 99% 的算力,只要这些算力是中立的。链 X 的共识规则将接受中立区块作为确认,只要这些区块没有包含与 X 相关的合并挖矿标签。下图显示了当前的中立区块是如何被浪费掉的:

img

- 未串联起来的算力(标成黄色区块)可以跟诚实侧链分支关联起来 -

下图显示了当前的中立区块是如何分配给侧链分支、作为确认算力的:

img

- 中立区块(标成黄色的)可以被分配给诚实或恶意的分叉 -

为了证明一个区块 N 确认了合并挖矿的区块 B 而非其它区块,我们必须证明 N 是中立的,而 N 的父块要么也是中立的,要么关联到 B。证明一个区块是中立的,就要证明它不包含 B 所在的被合并挖矿的链的任何区块哈希值。我们管这叫 “链排外证明”。AuxPow 位图可以提供一种简单的方式来支持链排外证明。当一个侧链被排除在 AuxPow 之外时,图上相应的比特应该留空。结果是,在没有攻击的时候(大部分时候),一个次级链可以继承 100% 的比特币算力(实际上可以继承超过比特币的算力,因为它可以合并来自比特币和其它比特币分叉的算力!)。实现这种技术听起来很简单,但是魔鬼藏在细节中:在侧链区块的难度远低于主链难度时,必须采取一些预防措施,不能增加自私挖矿的动机。在 RSK 中,我们有一个完整的提案来实施内部分叉感知型合并挖矿,有一天也许能激活。

内部分叉感知型合并挖矿最有趣而且尚未被探究的一个特性,是它可以跟多个工作量证明区块链同步执行(即,奇数块接受比特币 PoW、偶数块接受 ZCash PoW)。如果工作量证明函数在同样的硬件上无法高效执行,那么最终的结果是侧链的热力学按雀形等于合并挖矿链的总和!

冷启动一条新的侧链

我们已经证明了,如果使用内部分叉感知型合并挖矿,一条侧链可以在合并挖矿算力很低的情况下冷启动。但我们也证明了,即使不倒拨时间戳,确认后回滚攻击依然能回滚一条侧链,只要攻击者的算力足够高。因此,要想冷启动一条新的侧链,我们提议使用 Syncchains。Syncchain 是一种新的比特币侧链,跟比特币是同步的,意思是,为了对侧链发动长程链重组,攻击者也需要重组比特币区块。合并挖矿的 Syncchain 相比于标准的合并挖矿侧链有一个很大的优势:他们天然地能够提供快速而且抗多重支付的联合锚定(peg-in)和退出(peg-out)机制。也可以先使用 Syncchain 模式来启动一条侧链,然后转入独立侧链模式,只需加入一个比特币中继服务,作为一个侧链智能合约就行。如果侧链已经有 BTC 中继了,反过来做会容易很多;可以转递比特币区块头和来自比特币区块链的比特币锚定交易到比特币中继智能合约中,作为共识的一部分(并禁用来自用户和合约对这些方法的调用)。

总结

在本文中,我们描述了域名币的合并挖矿设计,然后我们展示了一个更通用的设计来演示合并挖矿从数据结构和所用算法的角度看,可以是区块链中立的;但在经济意义上,它永远不可能是中立的:竞争性的区块链无法激励共享合并挖矿。我们也描述了一种强大的新型跨链共识规则,但它们应该被细致地斟酌,以免干扰比特币挖矿激励。我们描述了内部分叉感知型合并挖矿变种,让合并挖矿在只有少数算力参加是也非常安全。这这技术由多种互补性的侧链共识规则组成,包括区块时间戳的跨链规则。我们也演示了,Syncchain 协议可以被新的侧链开发者所用,以安全地冷启动一条新的合并挖矿侧链。

感谢 IOV Labs 的所有研究院,你们提供了富有价值的建议,提高了本文的质量。见:https://innovation.iovlabs.org/

(完)