
原文链接:https://officercia.mirror.xyz/vUsNhI6GZhXWabifqFZqNmB93Fr0zsfIpCKBZEeEB7E
本文作者:Officer's Blog;编译:Cointime Freya
简介
对于这个月无休止的黑客攻击,你可能会疑惑,为什么它们会发生得如此频繁?
难道审计公司的工作能力真的变差了吗?
在我们看来,情况并非如此;但是这个问题的确相当棘手。不过在某些方面,你可以降低项目的风险!
我们相信,没有人会怀疑安全集成的基础是编写代码的特殊方法。因此,本文将仅关注那些从一开始就有助于确保代码安全可靠的方面。
因此,你即将看到的不是一篇经典的文章,而是一篇系统化的知识(SoK),在这篇文章中,我将参考相关作者以及 pessimistic.io审计员的论点,进行系统的撰写。
在这篇文章中,我们还将回顾最新的Chainlink VRF V2的背景,并将其与早期的V1迭代进行比较。
一、Chainlink:深入

Chainlink是一个去中心化的oracle网络,将外部数据源、API和支付系统与基于区块链的智能合约联系起来。简而言之,它使智能合约与链下资源交互成为可能,为创造新的去中心化应用程序(dApp)铺平道路。
2017年,Sergey Nazarov与steve Ellis等区块链和密码学专家首次公布了他们的新项目——ChainLink。
为了解决当前区块链网络的缺点,并促进创建更复杂的dApp,该团队创建了Chainlink。
区块链oracle故障
维基百科将oracle定义为提供明智和有洞察力的建议或预言的人或事物。这个词被认为与希腊文化有关,指的是祭司或同类人员作为对询问的回应而给出的神圣启示。
区块链oracle被定义为一个外部数据代理,观察现实世界的事件,并将它们报告给区块链以供智能合约使用。使用去中心化的数据oracle是Chainlink的显着特征之一!
这个话题相当棘手,因为基于区块链的oracle非常不同,并且在Web3行业中用于完全不同的目的,例如,遵守制裁筛选或发布货币对价格的最新信息。
但是,总的来说,区块链oracle是一个综合系统,它收集链下数据,验证数据,并将其发送到区块链智能合约。
看看这个奇妙的方案就知道了:

Chainlink依赖于一个由独立节点管理的去中心化的oracle网络,使得oracle值得信赖、安全且不受操纵。
Chainlink的另一个重要方面是支持广泛的数据源、API和支付系统。智能合约可以使用Chainlink访问各种来源的数据,包括社交媒体平台、天气数据和金融市场。
此外,Chainlink使智能合约能够与外部的API和支付系统进行通信,从而促进了复杂和尖端的dApp的创建!
无论你的合约需要体育比赛结果、最新天气还是任何其他公开可用的数据,Chainlink合约库都会为我们提供这些数据所需的工具。甚至可以连接你的特斯拉汽车!
二、Chainlink VRF:深入

为了让大家对我们今天的主题——熵(entropy)有一个正确的认识,让我们来研究一下它是什么!
entropy与随机性
首先,你应该始终牢记以下几点:
在网络安全中,entropy是衡量数据生成函数的随机性或多样性的指标。全熵(full entropy)数据是完全随机的,找不到任何规律。低熵(low entropy)数据提供了预测即将产生的价值的能力或可能性。
知道了这一点,我们现在就可以理解Chainlink思维的范式,在这个范式中,他们既是零熵(zero entropy)的超级准确数据的提供者(通过他们的oracle),又是通过Chainlink VRF的高熵(high entropy)数据的提供者。
重要的是,自然熵(natural entropy)也可以成为一个可靠的保护来源。
low entropy如何导致重大经济损失
在严重依赖entropy的区块链中,适当的随机性尤为重要。为了更好地理解随机性如何影响安全性和区块链,可以创建一个“vanity””地址——无论你选择什么网络:比特币或EVM兼容的区块链。
你可以在以太坊上使用Profanity2(它是安全的)来达到这个目的,但不要忘记发生在Profanity1身上的故事。
如果前面的例子很难理解,那么没有人能够理解下面的例子。
请查看CatPaper和Catropy的文档:

随机性与Web3的结合
这可能看起来是微不足道的,但对于依赖不可预测结果的任务(例如共识机制)来说尤为重要!
许多区块链游戏和不可替代代币(NFT)dApp还需要一个防篡改和可验证的随机数生成源,以实现空投、彩票或赌博开发等高级功能。
不过,在现实中,这对我们意味着什么?
如果种子是伪随机的,那就意味着它是100%确定的,这意味着稀有的NFT收藏艺术品可以提前建立(在它们被创造出来之前),并投机mint!
但是,我们可以从哪里获得这种high entropy的随机性数据?我们如何保护数据并保持其可靠性?实际上只有几种安全的方法可以实现这一点:
- 我们可以使用来自API的数据,并使用我们前面描述的Chainlink Oracle将它们连接到智能合约。
- 使用现成的解决方案,即Chainlink VRF,它被认为是最可靠的解决方案!
- 要求用户“添加/赠送”一些随机性——类似于KZG仪式或SSH | 图像
基于链上的“随机性”(基于gas成本、区块哈希等)是不可靠的,它可以被绕过(例如,可以购买特定的NFT)。
Chainlink VRF

验证随机函数——使用一组Chainlink节点提供加密安全的随机性:它们将数据输入智能合约,同时通过这些节点的委员会维持经典的共识机制。
通过为智能合约提供随机数生成(RNG),Chainlink VRF帮助开发者通过在基于区块链的应用程序中使用随机结果来改善互动。
Chainlink的验证随机函数(VRF)依赖于去中心化的oracle网络(DON),通过提供经过验证的链下数据来增强现有的区块链。
此外,Chainlink VRF的防篡改随机性不能被任何节点运营商、用户甚至攻击者操纵,因为DON中的每个oracle都有一个相关的私钥/公钥对,其中,私钥在链下维护,而公钥则在网络上发布。
综上所述,Chainlink VRF主要用于:
- NFT和其他基于区块链的游戏;
- 生成艺术;
- 随机分配责任和资产;
- 选择关于共识程序的代表性样本。例如,VRF被用于多种第一层区块链的共识方式,包括 Algorand、Cardano、Internet Computer、Polkadot开发!
它使智能合约能够在不影响安全性或可用性的情况下访问随机性。Chainlink VRF遵循请求与接收数据的循环,其工作方式是:我们在一个交易中向oracle发送请求,而oracle在另一个交易中回应请求的数据。
对于每个请求,Chainlink VRF都会生成一个或多个随机值,以及这些值是如何确定的加密证明。
这种加密证明(就像整个Chainlink生态系统一样)是去中心化的,这意味着中心化的节点不能破坏任何信息。
理想情况下,智能合约应该只在消费了该随机性的加密证明后,才消费随机数字。 提供一个证明很重要,即向社区保证抽奖结果是真实的!
三、Chainlink VRF安全集成提示:
遵循下面的提示可以显著提高项目集成的安全性:
- 使用requesttid将随机请求按顺序匹配。
- 选择一个安全的区块确认时间,这将因区块链而异。理论上来说,可能会发生以下攻击:矿工/验证者注意到Chainlink发送了随机性→他们不喜欢这个随机性(不)→他们改变区块链,使原来的随机性请求进入另一个区块(或该区块的blockHash变得不同)。正因为如此,现在的随机性不同了(不能让它成为所需的随机性,他们可以直接重新roll随机性)。同样值得注意的是,确认区块越大,理论上可能的攻击就越困难。
- 不要重新要求随机性。假设合约中存在逻辑,允许你重新roll随机性,以防Chainlink在N块后没有响应。问题在于,如果存在这样的逻辑,Chainlink Oracle (VRF服务提供商,生成随机数的人)可能会滥用它,不响应请求并重新roll一个新的随机数。而且,如果fulfillRandomWords调用了其他地址(例如,通过safeTransferFrom的回调),那么用户也可以重新roll它,使之在合约中进行还原。
- 不能还原fulfillRandomWords函数。如果你的fulfillRandomWords() 实现恢复,VRF服务将不会第二次调用它。请确保你的合约逻辑不会还原。在前面的检查中,这方面被描述为具有重新请求逻辑,用户可以重新roll随机性。
- 使用Chainlink VRF的合约必须继承来自底层的VRFConsume类(用于订阅的 VRFConsumerBaseV2,用于直接资助的VRFv2WrapperConsumer)。有一个内置的检查,即rawFulfillRandomWords是由Chainlink合约调用的。
- 发出随机请求后,请勿接受出价/质押/输入。理论上来说,当交易出现在mempool中且随机性已知时,Chainlink的交易可以被前置运行,
- fulfillRandomWords不应该消耗太多的gas, requestRandomWords中指定的gas可能不够,并且这个随机请求将会丢失。
V1与V2
文档和开发人员资源:
- Chainlink VRF V1介绍
- VRF V2公告和介绍
- 从VRF V1迁移
- 从LearnWeb3DAO制作的这个很棒的repo中了解更多关于如何使用和测试它的信息!
Tl;dr为V2的独特功能:
- V2 新增订阅模式;
- V2 比 V1(IMO)更易于配置;
- V2 具有更高的gas限制。VRF V1有200k的gas限制;V2有2m gas限制);
- V2 的gas使用量较少(仅限订阅模式);
- 在V2中,确认块是可配置的。
Chainlink VRF相关攻击
1. 取决于状态的随机性:
原始合约:
polygonscan.com/address/0x8d528e98a69fe27b11bb02ac264516c4818c3942#code



简化:
在这个例子中,随机性取决于状态变量(tokensRemaining),这意味着当其他用户调用completeMint时,用户的随机性会发生变化;因此,用户可以等到随机性有利的时候,再提交completeMint交易。


2. 重新roll的随机性:
原始合约:
polygonscan.com/address/0xa7d50ee3d7485288107664cf758e877a0d351725
在这个例子中,用户可以将智能合约作为NFT的接收者,并且在onERC721Received中,如果代币dna不利,就会恢复交易。由于随机性重试逻辑,用户可以不断重新roll随机性,直到获得所需的dna。

3. EVILink Chainlink Oracle的操作:
这表明,恶意矿工仍有很小的机会篡改Chainlink的VRF解决方案所提供的随机性!
*本文由CoinTime整理编译,转载请注明来源。
所有评论