拓冰建站拓冰建站
首页 / 资讯中心 / 正文

构建可扩展的按需不可信熵交付架构:原理、安全与工程实践

1. 项目缘起为什么我们需要一个“不可信”的熵源在分布式系统、区块链应用和密码学协议里随机数或者说“熵”的地位有点像现实世界里的空气和水——平时感觉不到它的存在一旦出了问题整个系统可能瞬间崩溃。一个经典的场景是智能合约里的抽奖或者游戏如果随机数可以被预测或者被操纵那么所谓的“公平”就无从谈起攻击者可以轻易地拿走所有奖金。传统的解决方案比如依赖单个可信的第三方预言机来提供随机数听起来简单但本质上是在用一个中心化的单点故障去解决一个去中心化系统的信任问题。这就像把全家的钥匙都交给一个你并不完全信任的邻居保管。一旦这个“邻居”作恶或者被攻击后果不堪设想。因此业界一直在探索如何构建一个可扩展的、按需的、且不依赖单一可信实体的熵交付架构。这正是标题中“A Scalable Architecture for On-Demand, Untrusted Delivery of Entropy”所瞄准的核心问题。这里的“不可信”Untrusted不是指这个系统本身是恶意的而是指在设计上我们不预先假设系统中任何一个或一组参与者是绝对可信的。系统的安全性不依赖于任何参与者的“人品”而是依赖于密码学和经济激励机制的巧妙设计。即使部分参与者串通作恶整个系统依然能够输出不可预测、不可篡改的随机数。这比找一个“圣人”来当裁判要可靠得多。“按需”On-Demand则体现了实用性。很多应用比如一个NFT的随机铸造并不是每时每刻都需要随机数而是在特定的区块高度或交易被触发时才需要。一个高效的架构应该能够响应这些离散的、突发的请求而不是持续地、浪费资源地生成随机数流。“可扩展”Scalable意味着这个架构要能支撑起未来海量的DApp和链上活动。当成千上万个智能合约同时请求随机数时系统不能因为拥堵而延迟或失败其性能和成本应该能够平滑地应对增长。所以这个标题背后其实是一套应对去中心化世界核心挑战——如何安全、公平、高效地生成并分发“运气”——的系统性工程方案。接下来我们就拆开看看这样一个理想的架构可能由哪些部分组成以及它们是如何协同工作的。2. 架构基石理解“熵”的来源与聚合机制要构建一个不可信的熵交付系统第一步是解决“熵从哪里来”。我们不能依赖单一来源那就要汇集多方来源。常见的思路是采用“提交-揭示”协议并结合门限签名或可验证随机函数等密码学原语。2.1 多节点熵源提交从混沌到承诺想象一下我们要在一个分散的委员会里共同决定一个随机数。一个朴素的方法是让每个成员当场报一个数然后加起来。但这样最后一个报数的人看到了前面所有人的数字他就可以操控最终结果。为了解决这个问题“提交-揭示”协议应运而生。第一阶段提交Commit在这个阶段系统中的每个参与者或称为“预言机节点”、“熵提供者”独立地生成自己的随机数种子seed_i。但是他们并不直接公开这个种子而是先计算该种子的哈希值commitment_i H(seed_i)并将这个哈希值即“承诺”广播到网络中。哈希函数的单向性保证了其他人无法从commitment_i反推出seed_i。这就好比每个人把自己的数字写在一张纸上然后当众把纸锁进一个只有自己知道密码的保险箱里再把保险箱展示给大家看。大家看到了保险箱承诺但不知道里面的数字种子是什么。第二阶段揭示Reveal当所有参与者都提交了承诺之后进入揭示阶段。此时每个参与者必须公开自己之前生成的原始种子seed_i。其他节点可以验证H(seed_i)是否等于之前广播的commitment_i。如果有人无法提供匹配的种子或者提供的种子与承诺不符他就会被视为恶意节点受到惩罚比如没收质押的保证金。这个两步流程的关键在于在提交阶段由于种子是保密的没有任何参与者知道别人的数字因此谁也无法在知晓全局信息的情况下操控最终结果。到了揭示阶段虽然种子都公开了但为时已晚因为承诺已经不可更改地记录在链上任何对种子的修改都会导致验证失败。2.2 熵的聚合与最终输出不可预测性的诞生当所有诚实的参与者的种子都被揭示后系统需要将这些分散的熵源聚合起来生成一个唯一的、全局的随机数。最简单的聚合方式是将所有种子拼接起来然后计算一个哈希值final_randomness H(seed_1 || seed_2 || ... || seed_n)这里||表示拼接。哈希函数H确保了即使只有一个参与者的种子是真正随机的且未被他人知晓最终的输出final_randomness对于所有人来说也是完全不可预测的。因为哈希函数具有“雪崩效应”输入的任何微小变化都会导致输出面目全非。然而简单的拼接和哈希存在一个潜在问题最终输出的随机数长度固定且可能受到最后一个揭示的种子的过度影响尽管在密码学上影响被哈希扩散了。更高级的方案会使用门限BLS签名。在这种方案中每个参与者不是提交一个随机数种子而是使用自己的私钥对某个固定的消息例如当前区块高度或请求ID生成一个签名碎片。当收集到超过预设门限如2/3的签名碎片时就可以聚合出一个完整的BLS签名。这个聚合后的签名本身就是一个高度不可预测的随机数。为什么选择BLS签名BLS签名具有可聚合的特性多个签名可以合并成一个短签名且验证效率高。更重要的是聚合后的签名与聚合顺序无关并且任何少于门限数量的参与者都无法伪造出有效的完整签名。这既保证了安全性又将最终的随机数压缩成了一个简洁的形式通常是一个椭圆曲线上的点或其哈希值非常适合在区块链上存储和验证。无论采用哈希聚合还是签名聚合其核心思想都是一致的将多个可能部分可信甚至不可信的熵源通过密码学协议融合成一个整体可信、不可预测的最终输出。系统的安全性建立在“只要有一定数量的参与者是诚实的”这一假设上这比“必须有一个绝对可信的中央机构”要现实和健壮得多。3. 核心组件拆解一个可扩展按需系统的蓝图有了熵生成的基本原理我们需要一套完整的系统架构来支撑“可扩展”和“按需”的需求。这个架构通常包含以下几个关键角色和流程。3.1 角色定义谁在系统中做什么用户/智能合约Consumer随机数的最终使用者。它发起一个随机数请求通常附带一个请求ID和回调函数。例如一个抽奖合约会调用预言机系统的请求接口。熵源节点Provider/Operator负责参与“提交-揭示”协议生成并提交随机数种子的实体。它们需要质押保证金以证明自己的可靠性如果作恶如不揭示或提交错误数据则会受到罚没。聚合器/协调者Aggregator/Coordinator这是一个可选但常见的角色用于提升效率。它负责接收用户请求组织熵源节点进行提交-揭示流程收集所有揭示的种子或签名碎片执行聚合计算最后将最终随机数交付给用户合约。协调者本身可以是轮值的节点也可以是一个简单的智能合约。仲裁合约Adjudication Contract部署在区块链上的核心智能合约。它定义了整个协议的规则如何注册节点、如何处理请求、如何验证提交和揭示、如何计算最终结果、如何执行奖惩。它是整个系统不可篡改的“宪法”。3.2. 工作流程一次完整的按需熵交付让我们跟随一个用户请求走一遍系统的生命周期步骤1请求提交用户智能合约调用仲裁合约的requestRandomness方法传入一个唯一的request_id通常由用户合约地址和某个序列号生成和一个callback函数地址。这个调用会触发一个区块链事件。步骤2任务协调与承诺收集聚合器或所有熵源节点监听到这个事件。聚合器向所有活跃的熵源节点广播任务开始的通知指定request_id和提交截止时间。每个熵源节点在本地生成随机种子和对应的承诺并将承诺发送到仲裁合约或给聚合器由聚合器批量提交。仲裁合约记录下每个节点的承诺。步骤3揭示与聚合承诺期结束后进入揭示期。熵源节点必须在此期间内提交其原始种子。仲裁合约会逐一验证种子与承诺是否匹配。当收到足够数量达到安全门限的有效揭示后仲裁合约在链上执行聚合计算。这一步至关重要最终随机数是在链上公开透明的环境中生成的任何人都能验证计算过程确保了结果的公信力。步骤4结果回调仲裁合约计算出最终随机数final_randomness后自动调用用户合约当初指定的callback函数并将request_id和final_randomness作为参数传入。用户合约在回调函数中收到随机数并执行其核心业务逻辑如开奖。这个流程完美体现了“按需”整个复杂的密码学协议只在用户需要时才被触发和执行。也体现了“不可信”用户不需要信任聚合器或任何一个节点只需要信任部署在链上的、公开可验证的仲裁合约代码。3.3. 可扩展性设计应对海量请求的挑战当请求量激增时上述基础流程可能会遇到瓶颈链上合约处理每个请求的提交、验证、聚合和回调会消耗大量Gas且受限于区块处理速度。为了做到可扩展架构上需要做分层和优化请求批处理Batching聚合器可以将短时间内收到的多个用户请求打包成一个“批次”来处理。所有请求共享同一轮提交-揭示流程。最终生成一个主随机数然后通过某种可验证的方式如final_randomness_i H(final_randomness_batch || request_id_i)为每个请求衍生出专属的、互不关联的子随机数。这极大地降低了链上操作的频率和成本。链下计算链上验证乐观验证将耗时的聚合计算如BLS签名聚合放在链下由聚合器完成然后聚合器将最终结果和一份简洁的证明如零知识证明提交上链。链上合约只需要快速验证证明的正确性而不必重复整个计算过程。这类似于Rollup的思路能极大提升吞吐量。层级化熵源网络可以设计一个主网络和多个子网络。主网络由大量高质押的节点组成负责以较低的频率如每100个区块生成一个“熵信标”。子网络则可以基于这个信标以更快的速度为特定应用或侧链提供随机数服务。这样将全局共识的压力分散了。4. 安全模型与攻击抵御为什么这个架构是健壮的任何去中心化系统的设计都必须明确其安全假设并分析其可能遭受的攻击。这个“不可信交付熵”的架构其安全性建立在以下模型之上安全假设我们假设在N个熵源节点中至多有f个是恶意的可以串通且满足 N 3f 1对于拜占庭容错。也就是说诚实的节点必须超过2/3。在这个假设下我们来审视几种常见攻击手段预测攻击攻击者试图在最终随机数生成前预测其值。在标准的提交-揭示协议中只要有一个诚实节点在提交阶段没有泄露其种子最终的哈希值就是不可预测的。因为攻击者无法获得完整的输入信息。在门限签名方案中攻击者需要收集到超过门限的签名碎片才能提前计算出签名这在诚实节点占多数的情况下是不可能的。操纵攻击攻击者一个或多个恶意节点试图操控最终结果对自己有利。在揭示阶段拒绝揭示如果一个恶意节点在提交后拒绝揭示会导致本轮无法完成。应对措施是仲裁合约设有超时机制并对未按时揭示的节点进行严厉的罚没Slashing使其蒙受经济损失。只要诚实的节点数量足够完成门限要求系统就可以忽略这些“缺席者”继续运行。在提交阶段根据他人承诺调整自己的种子这是提交-揭示协议要解决的核心问题。因为承诺是哈希值恶意节点无法从他人的承诺中推断出种子因此他无法做出有针对性的选择。他随机提交的种子对最终结果的影响是哈希函数决定的他无法控制。女巫攻击攻击者伪装成大量节点试图控制网络。通过要求每个节点质押高额保证金经济门槛和可能的工作量证明计算门槛可以极大提高女巫攻击的成本。延迟攻击攻击者虽然不能改变结果但可以通过网络延迟、扣块等方式试图让某些参与者特别是用户更晚地收到结果从而获得信息优势。这需要通过精密的超时机制和网络层优化来缓解。例如将揭示期设置得足够长并奖励快速响应的节点。共谋与贿赂攻击这是更复杂的攻击。攻击者可能贿赂一部分熵源节点让它们在揭示后立即私下把种子透露给攻击者这样攻击者就能比公众更早一点计算出最终随机数。虽然这个时间窗口极短从最后一个种子揭示到结果上链但在某些高频金融场景下可能有用。对抗这种攻击需要引入“承诺延迟揭示”或“可验证延迟函数”等更复杂的密码学组件人为地增加从种子揭示到结果可用的时间使得任何提前知晓信息的人都无法利用这个时间差。实操心得安全与效率的永恒权衡在设计这类系统时我最大的体会是安全参数如节点数量、门限值、质押量、超时时间的设定是一场精密的权衡。节点数量越多、质押越高越安全但共识效率越低、成本越高。揭示期越长抗延迟攻击能力越强但用户体验越差。在实际项目中我们需要根据应用场景的价值和风险承受能力来校准这些参数。例如一个NFT小游戏的随机数生成其安全参数可以比一个承载数十亿美金资产的DeFi协议要宽松得多。没有“最好”的配置只有“最适合”当前场景的配置。5. 与现有方案的对比从Chainlink VRF到Drand理解了这套架构蓝图后我们看看现实中两个著名的落地项目是如何实现这些思想的。Chainlink VRFChainlink的可验证随机函数是当前智能合约领域应用最广泛的链上随机数方案之一。其工作流程与我们描述的架构高度吻合用户合约发起请求并支付LINK。Chainlink预言机网络中的节点VRF服务提供者监听到请求。节点在链下生成随机数和一份可验证的证明基于其预注册的公钥。节点将随机数和证明提交回链上的VRF协调合约。VRF协调合约在链上验证证明的有效性。验证通过后将随机数传递给用户合约。它的核心特点是“可验证性”用户合约或任何人都可以用节点的公钥在链上验证这个随机数确实是由该节点根据既定规则输入包括种子、区块哈希等正确生成的且未被篡改。它实现了“不可信交付”因为安全性依赖于密码学验证而非对节点的信任。Chainlink通过其庞大的去中心化预言机网络和声誉系统来保障节点服务的可用性和抗女巫攻击能力。DrandDrand是一个专注于生成公共随机信标的网络被Filecoin、以太坊2.0等众多项目用作熵源。它的设计更加简洁和专用Drand由一组分布式的、已知身份的节点组成一个委员会。这些节点运行一个持续性的门限BLS签名协议。每隔一个固定的时间间隔如30秒网络就会产生一个随机信标一个BLS签名。这个信标是公开可获取且可验证的。Drand的特点是“持续性”和“公共品”。它不是按需的而是像心跳一样持续产生随机数流。任何需要随机数的应用都可以免费或低成本地获取这个公共信标并基于它衍生自己的随机数例如H(beacon || application_specific_seed)。它的“不可信”来自于门限签名机制只要委员会中诚实的节点超过门限输出的信标就是安全的。Drand牺牲了按需的灵活性换来了极高的效率和稳定性非常适合作为底层基础设施。对比与选型如果你需要为特定的、离散的链上事件如一次NFT铸造、一次游戏对战结算获取随机数Chainlink VRF这种按需模型更合适。你为每次请求付费随机数与你的请求ID强绑定确保唯一性和不可复用性。如果你需要的是一个高可用、低成本、持续不断的公共随机源用来作为你自己随机数协议的种子或者为整个链提供熵那么接入Drand这样的公共信标是更好的选择。很多较新的区块链或L2会内置一个类似Drand的随机信标服务。6. 实战考量集成与应用中的陷阱理论很美好但当你真正要把这样一个系统集成到你的DApp中时会遇到一系列工程上的挑战。6.1. 用户合约的异步回调模式这是新手最容易踩坑的地方。在传统的编程中你调用一个函数会同步得到返回值。但在区块链与预言机交互中请求随机数是异步的。// 错误示范试图同步获取随机数 function doLottery() public { uint256 randomness oracle.getRandomNumber(); // 假设这是同步调用实际上不存在 uint256 winnerIndex randomness % participants.length; // ... 分发奖金 }正确的模式是“请求-回调”// 正确示范异步请求与回调 function startLottery() public { bytes32 requestId oracle.requestRandomness(...); // 记录这个requestId和当前彩票的状态 pendingLotteries[requestId] Lottery(...); } // 这是预言机系统会调用的函数 function fulfillRandomness(bytes32 requestId, uint256 randomness) external override { // 1. 验证调用者必须是可信的预言机合约 require(msg.sender address(oracle), Only oracle can fulfill); // 2. 根据requestId找回对应的彩票数据 Lottery storage lottery pendingLotteries[requestId]; // 3. 使用randomness进行开奖逻辑 uint256 winnerIndex randomness % lottery.participants.length; // ... 分发奖金 // 4. 清理状态 delete pendingLotteries[requestId]; }你必须妥善管理requestId到你的业务状态的映射并确保回调函数有足够的Gas限制来完成你的业务逻辑。一个常见的错误是回调函数逻辑太复杂导致Gas耗尽随机数送达了但业务执行失败。6.2. 随机数的“新鲜度”与熵源选择你得到的随机数“质量”如何这取决于熵源的强度。仅使用链上数据如blockhash这是最不安全但最简单的方法。矿工/验证者在一定程度上可以影响未来几个区块的blockhash因此不适合高价值场景。使用预言机网络如VRF安全性高但需要支付费用且有异步延迟。混合方案一个健壮的做法是使用多个熵源进行混合。例如finalSeed keccak256(abi.encodePacked(vrfRandomness, blockhash(block.number - 1), msg.sender))。这样即使某一个熵源失效或被操纵只要其他一个是安全的最终结果依然是安全的。这类似于“不要把所有鸡蛋放在一个篮子里”。6.3. 测试与验证如何模拟一个去中心化的预言机在开发测试环境中你不可能部署一套完整的、多节点的预言机网络。你需要对集成逻辑进行充分测试。使用Mock模拟合约部署一个模拟的预言机合约它不执行复杂的提交-揭示协议而是允许你作为测试者直接指定一个“随机数”并触发回调函数。这用于测试你的业务合约的回调逻辑是否正确。// 一个简单的Mock预言机 contract MockOracle { function requestRandomness() external returns (bytes32) { bytes32 requestId generateId(); // 立刻“假装”完成用于测试回调流程 // 注意真实环境不会这样 IConsumer(msg.sender).fulfillRandomness(requestId, 12345); return requestId; } }使用测试网的预言机服务大多数预言机项目如Chainlink都在测试网如Goerli、Sepolia提供了可供测试的水龙头和节点。你可以使用测试网LINK来真实地体验从请求到回调的完整流程虽然需要等待几个区块确认但这是最贴近生产环境的测试。验证随机数的可验证性如果你使用的是像VRF这样提供证明的方案在测试中你应该编写额外的测试用例验证当提供一个错误的证明时你的合约是否会正确地拒绝它。这能确保你的合约没有错误地降低安全标准。构建一个可扩展、按需、不可信的熵交付架构是去中心化应用走向成熟的关键基础设施之一。它用密码学和经济激励的巧思替代了对中心化权威的依赖。从理解基础的提交-揭示协议到设计分层可扩展的系统组件再到深入安全模型抵御各种攻击最后落地到具体的集成与测试每一步都需要严谨的工程实践。这个领域仍在快速发展例如将零知识证明用于更高效的验证或者探索完全无需许可的熵源网络。但万变不离其宗其核心始终围绕着如何在一个互不信任的环境中协同生产出所有人都可以信赖的“随机性”。作为开发者理解这些原理不仅能帮助你更好地使用现有服务更能让你在设计和审计依赖随机数的系统时拥有更深刻的洞察力和风险意识。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门