惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cisco Talos Blog
Cisco Talos Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
博客园 - Franky
Hugging Face - Blog
Hugging Face - Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
博客园 - 司徒正美
N
News and Events Feed by Topic
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
WordPress大学
WordPress大学
博客园 - 三生石上(FineUI控件)
Help Net Security
Help Net Security
N
News and Events Feed by Topic
O
OpenAI News
L
LangChain Blog
F
Full Disclosure
A
About on SuperTechFans
The GitHub Blog
The GitHub Blog
GbyAI
GbyAI
Cloudbric
Cloudbric
W
WeLiveSecurity
Application and Cybersecurity Blog
Application and Cybersecurity Blog
罗磊的独立博客
Attack and Defense Labs
Attack and Defense Labs
PCI Perspectives
PCI Perspectives
TaoSecurity Blog
TaoSecurity Blog
AI
AI
有赞技术团队
有赞技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell
C
CXSECURITY Database RSS Feed - CXSecurity.com
C
Cisco Blogs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Apple Machine Learning Research
Apple Machine Learning Research
C
CERT Recently Published Vulnerability Notes
T
The Exploit Database - CXSecurity.com
T
Threatpost
P
Palo Alto Networks Blog
G
GRAHAM CLULEY
Last Week in AI
Last Week in AI
雷峰网
雷峰网
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
C
Cyber Attacks, Cyber Crime and Cyber Security
博客园 - 聂微东
P
Proofpoint News Feed
Latest news
Latest news
S
SegmentFault 最新的问题
J
Java Code Geeks
T
Threat Research - Cisco Blogs
H
Help Net Security
P
Privacy International News Feed

smallyu的博客

为什么买的加密货币一定要去中心化 RISC-V 虚拟机无法代替 EVM 虚拟机 Polkadot 的 Existential Deposit 机制错在哪里 利息,套利,交易策略,金融市场 LayerZero 从来不挑战比特币的地位 默认参数引起的以太坊节点运行错误 硬件钱包与资产安全 预测市场比币圈更赌场 为什么去中心化的跨链桥不可能实现 我对于 AI 时代的答案 不要投资任何隐私币 区块链技术世界的三大真理 以太坊 AA 钱包的致命问题是什么 基于 AI 语义执行的 MCP 区块链的设计 一个集成 Geth 和 CometBFT 的兼容层 我的加密货币定投策略(二) DeFi 基础: 理解 AMM 定价机制 Go 语言 GMP 调度器的原理是什么 Web3 项目分析计划 对 Psyche Network 项目的分析 continuation 教程: 理解 CPS 如何开发一个比特币符文(Runes)协议 比特币脚本开发教程 我从王垠的计算机科学视频班学到了什么 区块链技术面试题(2025年版) Rust 语言容易让新手困惑的一个“过度优化” Solana 智能合约开发教程 (1) 尝试开发一个最小 EVM 虚拟机 基于 ZK 的链上身份系统设计 一个 Web3 打赏系统的设计 鼓吹 Cursor 的人技术能力都差 关于 Code Review 的礼节 假如启动一个新的以太坊 PoS 网络 发行加密货币的最好方式 所有 BFT 共识的区块链都是中心化的 对 2025 年区块链行业的预测 Restaking 项目的经济难题 如何看懂任意区块链项目的技术架构 为什么不要做以太坊的二次开发 为什么不要做智能合约开发和 DeFi 开发 我的加密货币定投策略(一) PoS 类型的区块链如何处理分叉 Ethereum Casper 为什么需要 EIP-7251 区块链中的 PBFT 不需要第二次投票 开发者的思维方式 发币的核心要点 炒币投资的小 tips 为什么说 PoW 比 PoS 更加去中心化 牛市对普通人来说意味着什么 如何健康地远程工作 为什么比特币不用概率加密函数 程序员的 “服从权威” 心理 区块链技术面试题 如何区分公有链和联盟链 对 Layer 2 项目创业想法的回复 对区块链共识机制的理解 Pebbling Game 鹅卵石游戏 PDP 文件证明的局限性 不要小瞧 ChatGPT 为什么炒币不是一个好主意 为什么以太坊的私钥计算不可逆 关于以太坊的私钥碰撞 “猜均值的2/3” dApp 游戏设计 Proof of Storage/Space/Replication 的区别 Proofs of Retrievability 文件证明的含义 对 S-PDP 文件证明的示例和解释 我的加密货币交易机器人 对区块链行业的见闻 随机确认块的共识机制 VRF + BFT 共识引起交易失败的问题 为什么要重视编程思想 对 Web 3.0 的理解 GitBook 好用吗? 一种区块链节点存储扩容的方式 一种基于“自我中心主义”的共识机制 链表常见算法题及解析 基于 Multi-Linked List 的区块链设想 理解哈希函数与序列化 联盟链比公有链差在哪儿 在 Dijkstra 算法中保存路径 为什么数字货币使用区块链是政治问题 区块链:下一代数字身份认证体系的基石 网页技术能实现 3D 建模吗? 给区块链一个定义 从 Erlang 开始了解 Actor 模型 一种侧边导航栏的交互方式 Rust 的 ownership 是什么? Haskell 中的 Monad 是什么? 浅析 Libra 背后的区块链技术 对区块链的理性认识 Rust 基础语法概述 基于 Java 的爬虫框架 WebCollector Kotlin:简化版的 Scala JavaScript 有关联数组吗? 主流编程语言的异常处理机制 Go 语言基本语法 Scala 语法基础 用 Scala 改写 Java 浅度实践 Python 获取海贼王更新信息 HTML5 音乐可视化
一种在区块链上生成随机数的机制
2023-02-22 · via smallyu的博客

一种在区块链上生成随机数的机制

2023-02-22

区块链本身不允许存在随机数,因为全部节点都需要同步计算结果,如果每次运行的结果不一样,整个网络就会混乱。也就是说,在区块链上,如果有一个函数的作用是生成随机数,这个函数需要符合两点要求:1. 返回值是不可预测的;2. 返回值是确定的。

这两点要求似乎相悖,但目前已经有解决方案了,Chainlink 的预言机提供了使用 VRF 来生成随机数的方法。由于 VRF 的特性,正好适合在区块链的场景中生成随机数。

不过现在要讨论的是另一个问题:矿工作恶。可以参考一下这篇文章的内容:How Not To Run A Blockchain Lottery

假如在区块链上运行一个彩票游戏,而矿工也参与了彩票下注,由于彩票中奖后会获得巨额奖励,只要巨额奖励超过矿工的挖矿所得,矿工就有足够的动机作恶。作恶的方式是,因为一笔交易的执行结果是确定的,而矿工会先知道结果,如果交易结果对自己不利,矿工可以拒绝出块。对于矿工来说,在经济上不一定划算,但是这种情况的存在,不但给彩票游戏增加了不公平的性质,还给了矿工作恶的权利。矿工也有被贿赂的可能性,如果矿工集体作恶,网络就乱套了。

面对这样的情况,我们需要一种方式来生成随机数,要求矿工不能知道这个数字是什么。等区块确认上链后,随机的数字才被公开。

有什么是真正的随机、难以预测呢?未来,未来无法预测。

我们可以尝试使用这样的方式:随机数用本次交易块高度 +2 个块的块哈希作为随机数种子。

比如发起一笔交易,要生成一个随机数,现在的块高度是 1,这笔交易提交后,得到的随机数是 null,真正的随机数将会在块高度达到 3 时才真正显示。因为这个随机数使用 3 的块哈希作为随机数的种子,在块高度达到 3 之前是不可能有人知道,这个数字将会是什么。

在彩票的场景中,抽奖结果在块高度为 1 是已经确定了,用户在块高度为 1 的交易中已经参与了抽奖,只是块高度为 3 时才公布抽奖结果。这样几乎能避免矿工作恶的问题,因为在块高度为 1 时,矿工也不知道结果是什么,在块高度为 3 时,参与抽奖的顺序和结果已经确定了。

那矿工在块高度 3 的时候,不还是可以拒绝出块吗?直接拒绝 1 块或者拒绝 3 块没有差别啊?

这里就需要区分两个情况:

  • 在块高度 1 发起的请求,在块高度 3、4、5 去查,得到的都是以块高度 3 的块哈希为种子,计算出的随机数
  • 在块高度 1 发起的请求,以块高度 3 的块哈希作为种子;在块高度 2 发起的请求,以块高度 4 的块哈希作为种子

要想达到完全随机的效果,应该使用第二种方式。

那问题又来了,当前块高度是不断变化的,这个随机值不就成变量了吗?用户在块高度是 3 的时候生成随机数,然后想知道这个随机数具体是多少,结果永远没办法得到这个值,因为等块高度是 5 的时候才真正产生这个数,而块高度是 5 的时候去查询,要等到块高度 7……

这里还需要区分两个概念:生成随机数和查询随机数。上面两种情况都是按照查询随机数的机制来描述的。

按照生成随机数的机制来设定,使用第二种方式是必须的,不然随机数就成常量了。那查询呢?不能否认的事实是,只要用户能查到的结果,矿工一定能查到,而且会提前知道。问题回到了一开始的困局,似乎无解了。

不对不对。

为什么要设定为使用块高度 +2,而不是 +1 块高度的块哈希呢?是为了避免矿工提前知道结果,如果是 +1,矿工挖出 1 个块就能知道结果,如果是 +2,矿工一般很难领先网络 2 个块。

所以更好的做法,是在块高度 1 发出生成随机数的请求,然后将块高度 2 和块高度 3 的块哈希,作为随机数种子。在这种情况下,矿工手里的第 3 个块会对随机数产生一定影响,但又不是决定性的影响,有可能第 2 个块就已经确定矿工与中奖无缘了,矿工将没有必要在第 3 个块上进行违规操作。

那如果第 3 个块也能很大程度决定随机数的内容呢?矿工仍然可以拒绝出块。

从这个角度来看,延后的块数越多,矿工的影响力越小。假如随机数由 +10 个块的块哈希决定,前 9 个块已经让所有矿工都出局了,矿工就不作恶了。

还有其他更好的方案吗?好像没有。假如将 +2 个块的块哈希作为对称加密的私钥,在 +2 块产生前随机值已经产生但是无法被解码,问题在于,合约也无法提前把 +2 块作为密钥对随机值进行加密。

只能降低矿工的影响力了。

未来无法预测,但当未来来临的时候,总有人能先知先觉。