ELASTICO-A Secure Sharding Protocol For Open Blockchains
INTRO
在中本聪共识中,通过POW机制来公平的选举leader,不仅非常消耗power,并且拓展性也不好。现在比特币中是7 TPS,和其他的支付系统相比效率相差甚远。
当前的许多拜占庭共识协议,并不支持在一个开放的环境中使用,比如加密货币,主要有两方面的原因:
- 许多的算法都加上参与共识的节点都已经建立了身份认证,但是这个在一个开放系统中,比如比特币中是不存在的。所以比特币使用pow来竞争出块权。
- 拜占庭共识,比如PBFT需要二次方规模的消息传输规模,在有限的网络带宽下,限制了拓展性。因此最多支持几百个节点。
我们希望能够有随着节点规模增加,吞吐量线性增长的区块链协议
本文提出了 ELASTICO 分片协议,在一个有拜占庭节点的非许可链上进行拓展。将POW和拜占庭共识进行一个结合。
key idea: 将整个网络划分成更小的委员会,每个委员会处理不相交的交易集合。
我们要保证每个委员会的大小合理,以能够运行拜占庭共识协议。各个委员会并行共识多个交易集合。
本文是第一篇在非许可链上进行拜占庭容错,并执行分片的论文。
- 能容忍拜占庭节点的比例 f = 1/4
- 拓展能力和计算能力几乎程线性比例。委员会的数量和计算能力几乎成线性的拓展。
- 消息的复杂度是 O ( n c 3 ) O(nc^3) O(nc3)
PROBLEM & CHALLENGES
本文的算法并不能直接保证双花问题,而要对他进行额外的检查。
应对女巫攻击
在非许可链中,每个恶意节点都可以虚拟出许多节点,并进行女巫攻击。因此要限制能够建立合法身份的节点数。
在中本聪共识中,为了应对女巫攻击,采用pow来获取记账权。
均匀分配委员会
要保证委员会是均匀分配的,不会使得过多的恶意节点备份到同一个委员会中从而支配该委员会的共识结果。
我们要有极高的概率保证(当然不是100%)在每个委员会中,诚实节点占大多数。
容忍每个成员认为的委员会成员不一致
在每个委员会成员严重,委员会的成员可能都不一致,也就是view不同。这可能是因为网络延迟或者拜占庭节点作恶导致的。但是我们必须要容忍这种情况。
solution overview
将整个网络划分成许多的委员会,每个委员会并行共识一个交易的集合。
final committee 将所有交易的集合进行聚合,并广播给所有的节点。final committe进行聚合时,只需要将各个交易集合的摘要进行聚合就可以了。
最后 final commitee 会生成一组随机字符串,用于下一个epoch的生成身份部分。
final committee 可以有指定 id的普通committee来担任。
流程
每个epoch都需要进行下面的五步:
-
建立合法身份和形成委员会。
身份证明由 公钥、IP地址、POW的解构成。如果要建立身份,就需要提供pow的解,因此就会将网络中拥有身份的恶意节点数限制比例在f。
为了防止每一轮中恶意节点提前解出POW, 我们在pow中设立了随机数 epochRandomness。并且要求在上一轮结束的时候这个随机数才会被公布出来。
解POW问题就是解下面的问题:

将结果O取后 s 位得到的值 id,就表明了此节点被分配到那个åcommittee中了。
既然这个分配过程是随机的,那么该如何保证分到每committee中的作恶节点不超过 1/3呢?
我们假设 n’个 节点获得了身份,其中诚实节点比例小于 2/3的概率为:

给定一个安全性参数 λ \lambda λ , 我们可以计算一个 n 0 n_0 n0 , P r [ X ≤ 2 n ′ / 3 ] ≤ 2 − λ , ∀ n ′ ≥ n 0 Pr[X\leq2n'/3] \leq 2^{-\lambda}, \forall n'\geq n_0 Pr[X≤2n′/3]≤2−λ,∀n′≥n0
-
得知委员会中其他成员。
如果一个节点获得了合法身份,也知道他在那个委员会中了,该如何得知委员会中其他成员呢?
最朴素的方法就是将自己的身份和委员会信息进行广播。但是这样消息的复杂度又达到了 O ( n 2 ) O(n^2) O(n2) .
我们首先建立一个最初的委员会作为目录。
在步骤1中,如果一个节点取得了身份,但是目前网络中获取身份的节点还不足 c个,就将自己的身份广播,并加入目录。
当有目录已经建成了,新的建立身份的节点就将自己的身份发送给目录。
由于每个节点都会将自己最先看到的c个节点当场目录,因此每个节点收到的委员会成员可能会有差异。
但是,我们可以证明在同一个委员会中:- 所有的诚实节点都是互相可见的
- 委员会中总的节点数不会超过 3/2c,存在差异的成员不会超过 c/2 个
如果一个目录节点,即将知道一个委员会的c个成员时,这时网络中的算力至多产生 c/2 个恶意节点身份。目录节点将这 c/2个恶意节点的身份分发给这个委员会的成员,造成每个委员会成员所取得的成员不一致。
但是这时,整个普通委员会中的作恶节点数量依旧不会超过 1/3,可以运行
这种方式通信复杂度只有 O ( n 2 ) O(n^2) O(n2)

- 委员会内部进行共识
在委员会内部进行共识,可以运行普通的BFT协议。将少有 c / 2 + 1 c/2+1 c/2+1 个节点签名的分片结果提交给 final committee
这保证了至少有一个诚实节点承认了交易集合。
提交给final comittee 的内容可能只是交易集合的 默克尔根
- final committee 广播
final committee中的节点将所有committee的结果聚合一个最终的结果,并进行共识。接着将共识的结果广播给所有的节点。
final committee 聚合和共识的内容,可能只是一个委员会共识结果的摘要,这样就将共识和数据传输过程分离。
这里的f=1/4是为了保证每个committee的规模不太大,理论上f只要小于 1/3就能满足PBFT的运行条件。但是这样就会导致每个committee的规模太大,丧失并行性。
-
final committee 计算一组随机字符串
第一阶段: final committee的各个节点生成一组随机字符串,并将 哈希发送到comittee中进行共识,从而 committee 对一组随机字符串的一组hash S \mathbb{S} S达成共识,并随着上一阶段进行广播。
第二阶段:每个final committee 中的成员将自己的随机字符串进行广播。
每个节点收到至多 3c/2 个随机字符串,至少 2c/3 个随机字符串。节点会自动忽略和 S \mathbb{S} S 中不相符的随机字符串。
因为每个节点收到的一组字符串都不相同,每个节点都取其中的 c/2+1 个随机字符串进行或运算,作为自己计算 pow的nonce。 c/2+1 就可以保证,至少一个随机字符串来自诚实节点,这就可以保证 nonce的随机性。
如何避免双花
因为每个交易都有 input 和 output,只要保证相同 input的交易在一个分片中达成共识,就可以对双花进行检查。
因此可以让每个 committee 专门负责一部分范围的 input。
因为要对交易进行检查,每个节点需要维护一个 UTXO的数据库,因此需要将其他节点的共识结果下载下来,更新本地的UTXO 数据库。
如果不需要其他节点的数据,则不需要将本地共识的数据进行广播,在这种应用中 ELASTICO 会更有优势。
相关文章:
ELASTICO-A Secure Sharding Protocol For Open Blockchains
INTRO 在中本聪共识中,通过POW机制来公平的选举leader,不仅非常消耗power,并且拓展性也不好。现在比特币中是7 TPS,和其他的支付系统相比效率相差甚远。 当前的许多拜占庭共识协议,并不支持在一个开放的环境中使用&a…...
【数据结构】Map和Set
⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:浅谈数据结构 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 Map、Set 1. 搜索树1.1 概念1.2 性能…...
Python Flask
Python Flask是一个轻量级的web开发框架,用于快速地构建web应用程序。以下是Python Flask的基本使用步骤: 安装Flask:使用pip安装Flask包。在命令行中输入以下命令: pip install flask创建Flask对象:在Python文件中&am…...
时序预测 | Python实现ARIMA-LSTM差分自回归移动平均模型结合长短期记忆神经网络时间序列预测
时序预测 | Python实现ARIMA-LSTM差分自回归移动平均模型结合长短期记忆神经网络时间序列预测 目录 时序预测 | Python实现ARIMA-LSTM差分自回归移动平均模型结合长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 | Python实现ARIM…...
Redis快速上手篇八(redission完善分布式锁)
Redisson Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务,其中就包含了各种分布式锁的实现。简单说就是redis在分布式系统上工…...
Dataset文件下载以及使用,以nuswide为例
文章目录 文件夹结构如何使用继承torch.utils.data.Dataset构建新的class构建新的Dataloader 数据集要求以文章 multi-label learning from single positive label为例; 文件夹结构 我是这么放置的,其中含有obs的文件是通过运行文件夹preproc下的genera…...
ZYNQ连载02-开发环境
ZYNQ连载02-开发环境 1. 官方文档 ZYNQ开发使用的软件为Vivado/Vitis/PetaLinux,软件体积比较大,硬盘保留100G以上的空间,赛灵思提供详细的文档,链接如下: ZYNQ文档 2. Vivido和Vitis安装 赛灵思统一安装程序 3. PetaLinux安装…...
前端 :用HTML和css制作一个小米官网的静态页面
1.HTML: <body><div id "content"><div id "box"><div id "top"><div id "top-left"><span id "logo">MI</span><span id "text-logo">小米账…...
modelsim仿真报错:vlog-2388 ‘scl‘ already declared in this scope
问题背景: 1、使用vivado直接仿真的时候没有报错。 2、在vivado中调用modelsim的时候报错。 报错的代码: module iic_write(input clk,input rst,output scl,input en,inout sda);reg scl;……报错的意思是scl已经声明过了,mode…...
C#中通过BeginInvoke()和EndInvoke()来实现异步
.NET Framework允许异步调用任何方法。定义与需要调用的方法具有相同签名的委托;公共语言运行库将自动为该委托定义具有适当签名的 BeginInvoke 和 EndInvoke 方法。以下介绍C#中,通过BeginInvoke()和EndInvoke()来实现异步。 1、异步编程 调用BeginInv…...
github中.gitignore不起作用啦
文章目录 前言两种方法解决清除本地缓存设置不需要 额外注意 前言 提示:人不是靠讲话来生活。每个人都应该靠行动。而行动,是需要时间来证明的。 --《自在独行》 两种方法解决 清除本地缓存 (.gitignore中已经表标明忽略的文件目录下的文件了…...
同步网盘推荐及挑选指南:便捷、安全、适用的选择
同步网盘是最近热门的文件协同工具之一,因其使用的便捷性受到了诸多用户的青睐。如今网盘市场产品众多,有什么好用的同步网盘?如何挑选同步网盘?是许多需求者关心的问题。 如何挑选同步网盘?在同步网盘挑选过程中要从…...
Java中的QName
javax.xml.namespace.QName代表XML规范中一个限定性名称(qualified name),它包含一个命名空间地址(Namespace URI)、一个本地部分、和一个前缀。QName可以用在xml的元素和属性中。 前缀提供了命名空间地址的前缀&#…...
汇编语言-div指令溢出问题
汇编语言-div指令溢出问题 8086CPU中被除数保存在ax(16位)或ax和dx(32位)中,如果被除数为16位,进行除法运算时al保存商,ah保存余数。如果被除数为32位时,进行除法运算时,ax保存商,d…...
koa搭建服务器(一)
最近有个需求需要使用到koa搭建服务器并编写接口对数据库进行增删改查,因此写一篇博客记录这段时间的收获。 一、新建koa项目 (一)安装koa及其相关依赖 npm i koa npm i koa-router// 中间件,用于匹配路由 npm i koa-bodyparse…...
qt-C++笔记之在两个标签页中按行读取两个不同的文件并且滚动条自适应滚动范围高度
qt-C笔记之在两个标签页中按行读取两个不同的文件并且滚动条自适应滚动范围高度 code review! 文章目录 qt-C笔记之在两个标签页中按行读取两个不同的文件并且滚动条自适应滚动范围高度1.运行2.文件结构3.main.cc4.main.pro5.a.txt6.b.txt7.上述代码中QVBoxLayout,…...
github搜索技巧探索
毕设涉及到推荐系统,那么就用搜索推荐系统相关资料来探索一下GitHub的搜搜技巧 文章目录 1. 基础搜索2. 限定在特定仓库搜索3. 按照语言搜索4. 按照star数量搜索5. 搜索特定用户/组织的仓库6. 查找特定文件或路径7. 按时间搜索8. 搜索不包含某个词的仓库9. 搜索特定…...
[ACTF2020 新生赛]Include
【解题思路】 1.打开链接 发现好东西,进一步分析。 2.分析页面 发现网页得到一个GET请求-->?fileflag.php 可以推断,要解答该题目需要获取 flag.php 的源代码. 将flag.php文件进行base64编码(将网页源代码转换为Base64编码ÿ…...
Go 实现插入排序算法及优化
插入排序 插入排序是一种简单的排序算法,以数组为例,我们可以把数组看成是多个数组组成。插入排序的基本思想是往前面已排好序的数组中插入一个元素,组成一个新的数组,此数组依然有序。光看文字可能不理解,让我们看看…...
LuatOS-SOC接口文档(air780E)--max30102 - 心率模块
max30102.init(i2c_id,int)# 初始化MAX30102传感器 参数 传入值类型 解释 int 传感器所在的i2c总线id,默认为0 int int引脚 返回值 返回值类型 解释 bool 成功返回true, 否则返回nil或者false 例子 if max30102.init(0,pin.PC05) thenlog.info("max30102&q…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
