Substrate Developer Hub

Substrate Developer Hub

  • 教程
  • 知识库
  • 进阶菜谱
  • API 文档
  • Languages icon简体中文
    • English
    • 协助翻译

›Runtime

开始

  • 总览
  • 安装
  • 在 Windows 系统开始
  • 词汇表

学习 Substrate

  • Extrinsics
  • 交易池
  • 账户摘要
  • 会话密钥
  • 交易权重
  • 链下功能

Runtime

  • Runtime 总览
  • Runtime 的基本类型
  • FRAME
  • Pallets
  • Runtime宏
  • Runtime 元数据
  • Runtime 存储
  • Runtime 来源
  • Runtime 执行流程
  • Runtime事件
  • Runtime 错误
  • 交易费用
  • 链下工作机
  • 调试
  • Runtime 测试
  • 链上随机生成
  • Runtime 升级

智能合约

  • 总览
  • ink! 智能合约
  • ink! 概念
  • ink! 开发
  • EVM 模块
  • ink! 常问问题

整合

  • Polkadot-JS
  • 客户端库
  • 链描述
  • Subkey 工具
  • 内存分析

进阶

  • SCALE 编解码器
  • 共识机制
  • 区块导入过程
  • 执行器
  • 密码学
  • 存储
  • SS58 地址格式

贡献

  • 协助翻译
Translate

链上随机生成

随机性在计算机科学及其他领域有许多应用, 例如在治理系统议员选举、统计或科学分析、加密计算以及游戏和赌博等场景下均发挥了重要的作用。 许多需要随机性的应用程序已经在区块链网络上找到实现方法。 本文介绍了如何在Substrate runtime中产生和使用随机性。

确定的随机性

在传统的非区块链计算中,需要随机性的应用程序可以选择使用从硬件得出的真实随机值,或者是选择具有一定确定性的伪随机值,但这种伪随机值可通过加密的方法使预测变得不可能。

在区块链上运行的应用会受到更严格的限制,因为网络中的所有管理者必须就任何链上值达成共识,包括注入的任何随机性数据。 因为这个限制,直接使用真正的随机性是不可能的。

幸运的是,诸如可验证随机函数 之类的加密基础类型的进步以及多方随机性计算的发展,使对随机性有需求的应用程序仍可在区块链中实现。

Substrate的Randomness Trait

Substrate提供了一种称为Randomness 的trait,该trait将生成随机性的逻辑与使用随机性的逻辑之间的接口生成编码。 此trait允许将两个逻辑段彼此独立开来编写。

使用随机性

开发人员在编写需要随机性pallet的时,不需要管随机性是如何提供的。 相反,pallet可以要求一个现实了指定trait的随机源。 Randomness Trait提供了两种获取随机性的方法。

第一种方法称为random_seed。 它不带任何参数,并返回原始的随机值。 在一个区块中多次调用此方法将每次都返回相同的值。 因此,我们不推荐直接使用此方法。

第二种方法称为random。 它使用一个字节数组作为上下文标识符,并返回该上下文唯一的结果,这个结果独立于随机源以外的其他上下文。

生成随机性

实现 Randomness trait的方法有很多,每种方法都代表了在性能、复杂度和安全性之间的不同权衡。 Substrate附带了两种随机性的实现方法,如果开发人员希望采取不同的权衡方式,他们可以提供自己的实现方法。

Substrate提供的第一个随机性实现是Randomness Collective Flip Pallet。 该pallet是基于大量硬抛币的实验原理, 它性能很好,但不是很安全。 所以仅适用于对使用随机性的pallet进行功能测试,而不适用于生产环境。

第二种随机性实现是BABE pallet,它使用了可验证的随机函数。 该pallet提供了适用生产环境的随机性,已经在Polkadot中应用。 但选择了此种随机源同时意味着相应的区块链底层需要采用Babe 共识系统。

安全属性

Randomness trait为Substrate runtime中的随机源提供了一层方便而有效的抽象, 但是该trait本身并不能提供任何安全保证。 Runtime开发人员必须确保所使用的随机源能满足所有使用随机性的pallet提出的安全要求。

下一步

进一步学习

  • https://en.wikipedia.org/wiki/Random_number_generation
  • https://en.wikipedia.org/wiki/Applications_of_randomness

例子

  • 探索有关随机性的代码示例。

参考文档

  • 在 Polkadot Wiki中阅读更多内容
  • 查看关于随机性 Trait的Rust文档。
← Runtime 测试Runtime 升级 →
  • 确定的随机性
  • Substrate的Randomness Trait
    • 使用随机性
    • 生成随机性
  • 安全属性
  • 下一步
    • 进一步学习
    • 例子
    • 参考文档
Substrate Developer Hub
开发者中心
教程知识库进阶菜谱API 文档
社区
社区主页通讯Substrate 技术聊天室Substrate 研讨会Stack Overflow推特聚会活动
更多
Substrate Builders 计划BlogSubstrate GitHub开发者中心 GitHub隐私政策使用条款Cookie 设置
Copyright © 2021 Parity Technologies