MOAC科普 | 实用去中心化的区块链随机数的实现

2023-12-01 08:58

本文主要是介绍MOAC科普 | 实用去中心化的区块链随机数的实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在区块链上,由于一切信息都是透明公开的,提供一个安全实用的随机数是一个非常困难的问题。但是随机数是很多应用的基础,比如游戏,博彩,流程控制等。因此,提供一个实用可靠的随机数是基于智能合约的应用的迫切需求。
传统的链上随机数有几种办法。
第一种是让可信第三方为合约提供随机数,这种情况通常是中心化的解决方案,通过一个可信的oracle来提供独立的随机数源。智能合约发送请求给独立于区块链系统之外的Oracle,当Oracle监听到链上相关请求后,生成随机数并调用回调函数将结果返回区块链。

这个方案的主要问题式是中心化的解决方案,与基于区块链的分布式精神相悖,另外还有其他的弱点,比如信息在p2p网络中传递过程中的延时问题,对于不同等级的应用需求没法提供差异化的服务等。
第二种是交互式的commit 和reveal。参与过程的多方预先commit一个随机数,然后将hash递交到区块链上。所有参与方都递交完毕后,各方reveal自己的随机数,通过将各自的随机数合并产生一个最终的随机数。这个过程能够保证随机数不被预先知道。但是这个过程有几个问题,第一是需要交互式的多次通讯,自动化实现起来非常困难。第二是如果某方在对自己结果不利的情况下,可以采用不reveal自己随机数来延迟随机数的流程。特别是在参与方比较多的情况下,正确处理好网络的延迟和故意的攻击比较困难。

第三种是采用链上的公开信息,比如使用区块的哈希值/时间戳/难度系数等作为随机数源。一般情况下,应用需要使用将来的某个区块的哈希值以保证在这个区块出来之前,准备操作已经固定且无法修改。这种方式是在实际中被采用最多的方法,但在实现的过程中有很多陷阱。而且,即使实现的过程完美无瑕,还是有个无法克服的漏洞是,产生区块的矿工,可以通过允许范围内的操作,来改变区块的哈希值,使得产生的随机数偏向矿工的选择。最简单的方式,是通过有选择性地打包交易,使得哈希值对自己有利。
第四种是从共识层,通过阈值签名的方式,使得每个共识节点递交各自对某个信息的签名片段,在足够多的签名片段收集到之后,任何一个共识节点都可以将签名片段合并成一个合法的可验证的签名。这个签名可以作为随机数源。

这个做法的好处是矿工没法对最终的签名进行可操作的修改。对于同一个信息message,不同的矿工签名组合出来的结果都是一致的。一旦message确定,签名也就确定了。Dfinity采用这个方式作为其共识协议的基础,同时提供可验证的随机数源。但是这里有个问题是在每一轮区块产生的过程中,每个节点需要广播自己的签名片段,这样使得每轮消息的传递是O(n2),类似于PBFT。这个问题会导致共识的节点数量的限制,以及可支撑的应用效率等。
【解决方案】
墨客子链采用阈值签名,提出一个O(n)信息复杂度的随机数实现方法。
首先,墨客子链是基于墨客多层结构的layer2区块链实现。子链的矿工是从海量的节点pool中随机选择的一部分来作为某个子链的共识节点。子链的出块顺序由子链的矿工通过Round Robin的方式依次出块。同时,子链会周期性地将子链状态的hash flush到主链上面,实现:1. 状态的finality。2. 剔除已证明的恶意节点。3. 随机retire一小部分节点,随机增加一些新节点。4. 实现子链与母链的跨链操作。
在提供随机数的子链实现中,每个子链的矿工通过VSS初始化操作实现私钥的可验证分发。然后,每个矿工递交一组阈值签名的签名片段,当足够多的签名收集到之后,即可完成阈值签名的合并,矿工可以产生区块,并以此签名作为智能合约的随机数源,处理智能合约中的相关交易。
流程如下:

  1. 初始化阶段,前每个节点依次产生区块,不需要包括合法的阈值签名。但是每个节点需要在合法的区块中包含当前节点对[ H(b), H(b+1), …, H(b+m-1)]的签名片段,b是当前的区块号。
  2. 过了m个区块后,正常出块开始,当前节点应该能够收到足够的签名片段(m个),并合成有效的阈值签名,由此,该节点可以产生一个合法的区块。这个区块中包括收集到的m个签名片段[H1(b), H2(b), …, Hj(b)],以及合成的阈值签名Sig_thres,交易集{TX},区块Sig_block,并公布自己的[ H(bi), H(bi+1), …, H(bi+m-1)]的签名片段
  3. 如果有Byzantine failure,当前节点没有收到足够的签名片段,该节点不产生区块,只广播自己当前的签名片段。
  4. 第三步可以持续多次up to m次
  5. 下一个节点如果收到足够多的签名片段,则可以产生区块,回到步骤

这样,能够保证某个区块的阈值签名是对当前区块号的集合签名。这个签名是可以验证的,但是不能被预先知道,也不可以被矿工的操作修改。而且,这个出块过程中的信息量是O(n)。
另外,当子链的刷新周期到时,子链的节点数量将变化,恶意的节点被剔除,同时有一定几率的新旧节点变化。新节点的VSS过程可以在刷新周期前完成。这样可以保证刷新周期之后,新的一批节点可以马上进入持续的出块过程,使得整个流程不受中断。
此外,墨客子链的实现使得在智能合约中可以直接调用这个阈值签名作为随机数源,来处理应用的逻辑。而且,这个阈值签名是和区块号绑定的,可以大大简化智能合约对相应逻辑的处理。
墨客科技(MOAC BlockChain Tech)已经实现了这个随机数子链,命名为RandDrop (这个是暨ProcWind,FileStorm之后墨客的第三个子链实现)。目前在测试网进行测试。很快可以提供给各游戏和应用厂商进行测试。
总结一下,墨客随机数子链RandDrop的优点:
解决了现有智能合约获得可靠的随机数的困境,随机数由子链的共识节点通过阈值签名的方式获得,安全性高。随机数完全不受单个矿工的影响。
拜占庭节点的存在可以延迟某个区块的产生,但是不会影响随机数的结果。
第一个线性消息复杂度的随机数方案,能够支持更多的共识节点,适用性更强。
简化的流程设计,使得智能合约中能够直接调用获得当前区块的随机数。

这篇关于MOAC科普 | 实用去中心化的区块链随机数的实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/440528

相关文章

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel

基于Java实现回调监听工具类

《基于Java实现回调监听工具类》这篇文章主要为大家详细介绍了如何基于Java实现一个回调监听工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录监听接口类 Listenable实际用法打印结果首先,会用到 函数式接口 Consumer, 通过这个可以解耦回调方法,下面先写一个

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Qt中QGroupBox控件的实现

《Qt中QGroupBox控件的实现》QGroupBox是Qt框架中一个非常有用的控件,它主要用于组织和管理一组相关的控件,本文主要介绍了Qt中QGroupBox控件的实现,具有一定的参考价值,感兴趣... 目录引言一、基本属性二、常用方法2.1 构造函数 2.2 设置标题2.3 设置复选框模式2.4 是否

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法

《springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法》:本文主要介绍springboot整合阿里云百炼DeepSeek实现sse流式打印,本文给大家介绍的非常详细,对大... 目录1.开通阿里云百炼,获取到key2.新建SpringBoot项目3.工具类4.启动类5.测试类6.测

pytorch自动求梯度autograd的实现

《pytorch自动求梯度autograd的实现》autograd是一个自动微分引擎,它可以自动计算张量的梯度,本文主要介绍了pytorch自动求梯度autograd的实现,具有一定的参考价值,感兴趣... autograd是pytorch构建神经网络的核心。在 PyTorch 中,结合以下代码例子,当你

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各