文章探讨了在区块链上生成随机数的挑战,并介绍了三种主要的方法:提交揭示(Commit Reveal)、Chainlink VRF 和离线签名,分析了每种方法的优缺点和潜在的攻击向量。
随机数
在区块链上,随机性是棘手的,因为区块链是确定性的,而随机性需要非确定性(否则它会变得可预测)。本文假设用户对 solidity 有一定的了解,特别是对操作 block.number()
、block.hash()
以及数字签名的理解。
如果你使用 block.timestamp
或前一个 blockhash
这样的数据,那么某人可以利用智能合约预测交易是否会导致预期的结果。Capture the ether 有一系列黑客挑战考验你在这方面的能力。
如果你需要随机数,可以考虑一些设计模式。
尽管区块链交易在执行时是完全确定的,但无法预测未来。具体而言,未来的 blockhash
是无法预测的(有下文描述的警告)。
大致流程如下:一笔交易提交,将当前块 n 的 20 个区块后的 blockhash
设为随机数。由于你无法预测块 n + 2 的 blockhash
(其中 n 是当前块),因此 block n + 20
被视为随机。
你可以回溯 256 个区块以获取哈希函数,因此用户必须在块 n + 20 和 n + 276 之间启动车第二笔交易。第二笔交易就是揭示。当然,用户可以看到随机数是否对他们有利,因此应用必须配置成平衡用户的激励,让他们在有利时发送第二笔交易。
例如,如果 blockhash
是偶数,则公平的掷硬币会支付给用户。如果用户看到 blockhash
是奇数,他们就不会进行第二笔交易,但他们反正也不会赢得任何东西。要获胜,blockhash
必须是偶数,只有这样他们才会费心发送第二笔交易。
这个方案可能会被区块生产者篡改。尽管区块生产者无法强制生成一个确切的哈希值,但他们可以重排序交易,直到 blockhash
产生偶数(或其他对他们有利的数字)。
你可以通过让用户在块 n 提交一个秘密数的哈希来防御这种行为。在块 n + 20 时,用户揭示哈希的预影(pre-image),并将该预影与 blockhash
连接。将这两个值连接后进行哈希计算,得到的哈希作为随机数。
区块生产者无法知道哈希的预影,因此他们无法篡改它。但这仍然不是针对区块生产者的抗篡改方案。
如果区块生产者参与彩票,他们可能会提交一个已知的秘密数字,然后篡改 blockhash
,使最终结果对其有利。
目前以太坊已转向权益证明,这种攻击更难实行,因为恶意生产者必须在揭示的确切区块中成为区块生产者。
但如果你想防范恶意区块生产者,应该使用 chainlink VRF(下一章将描述)。
具备经济实力的攻击者如果有足够的动机,可以利用此方案。例如,我们在 blockhash
为偶数时支付给玩家。攻击者可以通过高 gas 交易淹没网络,以阻止在块 20 和 276 之间的揭示交易。请记住,如果回溯超过 256,则 blockhash
产生零。对攻击者而言,这将非常昂贵,但仍然是一种可能的攻击方式。
关于如何使用 Chainlink VRF(可验证随机函数)生成随机数,网上已有大量文章。它们的 文档 非常好,易于理解。以下是其运作原理的简要概述。
智能合约请求随机数调用 chainlink 智能合约,并支付一些 LINK 以覆盖费用。
Chainlink 将接受请求,并等待指定数量的区块,然后回调请求随机数的合约。Chainlink 生成随机数的算法是透明的,因此任何人都可以验证它是以公平的方式创建的。
Chainlink 不能在一次交易中完成此操作,否则恶意玩家可以在结果不满意时撤回交易。
由于可能发生链重组,应用指定回调应该在更远的未来进行,以适应高价值使用案例。
Chainlink 启动第二笔交易,因此这避免了用户授权第二笔交易的麻烦。然而,这种便利性也是有代价的,因为用户不仅必须支付 gas 费用,他们(或应用)还必须支付 LINK 代币以使用该服务。
我必须感谢与 gaspack.xyz 的对话,他们提出了这个想法的核心。
上述解决方案有一个明显的用户体验问题,即它们需要某种延迟,并可能需要两次交易。在区块链游戏中,玩家可能不喜欢这种延迟。
如何在不创建易受攻击的智能合约的情况下实现这一点?
一种半去中心化的获取随机数的方法是让离线随机数生成器创建 并加密签名 随机数、发送者和未来的块号。
这个随机数将与未来的 blockhash
连接,生成的字符串将被哈希。这产生了随机数。负责分配奖励的智能合约验证发送者和块号的签名。
即使离线随机数生成器的随机性不完美,或者稍微恶意,也无法预测未来的 blockhash
,也不知道它的随机数将与什么连接。由于签名仅在特定区块有效,玩家无法等待一个有利的区块再掷骰子。
这个方案可能存在以下三种弱点:
通过进一步去中心化随机数生成器,可以在一定程度上缓解这些缺点。例如,你可以使用比特币网络上的区块哈希作为随机数的来源。这将使如果发生可疑行为变得透明。
最初发表于 2022 年 12 月 2 日
- 原文链接: rareskills.io/post/gener...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!