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

相关文章

Go语言使用sync.Mutex实现资源加锁

《Go语言使用sync.Mutex实现资源加锁》数据共享是一把双刃剑,Go语言为我们提供了sync.Mutex,一种最基础也是最常用的加锁方式,用于保证在任意时刻只有一个goroutine能访问共享... 目录一、什么是 Mutex二、为什么需要加锁三、实战案例:并发安全的计数器1. 未加锁示例(存在竞态)

基于Redisson实现分布式系统下的接口限流

《基于Redisson实现分布式系统下的接口限流》在高并发场景下,接口限流是保障系统稳定性的重要手段,本文将介绍利用Redisson结合Redis实现分布式环境下的接口限流,具有一定的参考价值,感兴趣... 目录分布式限流的核心挑战基于 Redisson 的分布式限流设计思路实现步骤引入依赖定义限流注解实现

SpringBoot实现虚拟线程的方案

《SpringBoot实现虚拟线程的方案》Java19引入虚拟线程,本文就来介绍一下SpringBoot实现虚拟线程的方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录什么是虚拟线程虚拟线程和普通线程的区别SpringBoot使用虚拟线程配置@Async性能对比H

基于Python实现进阶版PDF合并/拆分工具

《基于Python实现进阶版PDF合并/拆分工具》在数字化时代,PDF文件已成为日常工作和学习中不可或缺的一部分,本文将详细介绍一款简单易用的PDF工具,帮助用户轻松完成PDF文件的合并与拆分操作... 目录工具概述环境准备界面说明合并PDF文件拆分PDF文件高级技巧常见问题完整源代码总结在数字化时代,PD

Python实现Word转PDF全攻略(从入门到实战)

《Python实现Word转PDF全攻略(从入门到实战)》在数字化办公场景中,Word文档的跨平台兼容性始终是个难题,而PDF格式凭借所见即所得的特性,已成为文档分发和归档的标准格式,下面小编就来和大... 目录一、为什么需要python处理Word转PDF?二、主流转换方案对比三、五套实战方案详解方案1:

SpringBoot集成EasyExcel实现百万级别的数据导入导出实践指南

《SpringBoot集成EasyExcel实现百万级别的数据导入导出实践指南》本文将基于开源项目springboot-easyexcel-batch进行解析与扩展,手把手教大家如何在SpringBo... 目录项目结构概览核心依赖百万级导出实战场景核心代码效果百万级导入实战场景监听器和Service(核心

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析

基于Python Playwright进行前端性能测试的脚本实现

《基于PythonPlaywright进行前端性能测试的脚本实现》在当今Web应用开发中,性能优化是提升用户体验的关键因素之一,本文将介绍如何使用Playwright构建一个自动化性能测试工具,希望... 目录引言工具概述整体架构核心实现解析1. 浏览器初始化2. 性能数据收集3. 资源分析4. 关键性能指

使用Redis快速实现共享Session登录的详细步骤

《使用Redis快速实现共享Session登录的详细步骤》在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于... 目录前言实现原理:步骤:使用Redis实现共享Session登录1. 引入Redis依赖2. 配置R

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1