当前位置: 首页 > 编程日记 > 正文

如何扩大以太坊的规模:分片简介(How to Scale Ethereum: Sharding Explained)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

分片是提高区块链效率的一个主要流派。下面简单通俗的解释一下分片算法。

以太猫(Cryptokitties)堵塞了以太坊网络好几天,以太坊--世界上最大的,公开的区块链目前是无法扩容的,也众所周知。解决方案是两方面的:第一种是通过把某些交易下链并降低和这些交易交互的频率来扩容。这个称之为下链方案(off-chain solutions), 也被称为2层扩容(layer-2 scaling). 另外一方面,是修改协议的整体设计来修复区块链所面对的基本性问题。很不幸的,很多协议开发员都被巨大的困难吓倒了。

174032_r4xE_2981977.png

为了解决扩容问题,大致有3个提案:

  • 扩大块的大小
  • 让用户使用别的代币
  • 分片(Sharding)

分片(Sharding)

EVM上的交易不是并行的,上面的每个交易从全局上看起来是顺序执行的。扩容问题必须处理好区块链里的3个特性。一个流行的说法是,区块链最多能具有这3个特性中的2个:

  • 去中心化(Decentralization)
  • 扩容(Scalabiltity)
  • 安全(Security)

如果我们现在具有扩容性和安全性,这就意味着我们的区块链是中心化的而且会有更好的吞吐率。很可惜,现在以太坊具有去中心化特性和安全性.

分片的方案是把整个网络的状态分成一系列的叫Shard的分区,每个分区里都有自己独立的状态和交易历史。在这个系统里, 特定的节点只处理特定分区里的交易, 总体上来说,所有分区处理的吞吐率要远远高于单个分区处理所有的工作。

143422_g5tb_2981977.png

Terminology

我们先来熟悉一下分片的词汇:

  • 状态(State): 描述一个系统在任意时间点的状态。在以太坊中,包括当前余额,智能合约代码和特定时间点的Nonce。 每个交易可以改变状态成为一个全新的状态
  • 交易(Transaction): 用户触发的操作,该操作会影响系统的状态
  • 默克尔树(Merkle Tree): a data structure that can store a large amount of data via cryptographic hashes. Merkle trees make it easy to check whether a piece of data is part of the structure in a very short amount of time and computational effort.
  • 收据(Receipt): 尚未存到系统状态的交易的副产品。该交易被存在默克尔树中,所以对于节点来说,可以很容易验证。在以太坊中的智能合约的日志被作为收据存到默克尔树中.

Shard

133933_JgZW_2981977.png

Level1是交易组。每个Shard都有自己的交易组。交易组被分为交易组头和交易组体(transaction group header and the transaction group body).

Transaction Group Header

头被分为清晰的左边部分和右边部分.

左边部分:

  • Shard ID: 交易组所属的Shard ID
  • Pre-state root: 分片的当前的状态(所有交易应用前).
  • Post state root:分片的当前的状态(所有交易应用后).
  • Receipt root: 所有交易应用后的receipt root.

右边部分:

右边部分是所有被随机选出的验证者,来验证该Shard中所有的交易.

Transaction Group Body

包含Shard里所有交易的ID.

Level One的特性

  • 每一个交易都指定它所属的Shard ID.
  • 一个交易属于一个特定的Shard,意味着交易发生在两个账户之间,而这两个账户都是这个Shard上的账户
  • 交易组包含的交易都属于哪个特定的Shard,而且是唯一的.
  • 指定pre 和 post state root.

首先,在一个特定的分片上,我们会有一些被称为校勘者的节点。 每个分片都会生成一个校勘。校勘是一个特殊的数据结构包含关于该分片的重要信息。

这些校勘(collations)集合就像关于一个特定分片的状态和交易的迷你描述。每个校勘集合有一个头,包含如下信息:

  • 校勘者相关的分片的信息 -- Shard ID
  • 分片的当前的状态(所有交易应用前)-- Pre-State
  • 分片的当前的状态(所有交易应用后)-- Post-State
  • 所有校勘者里的三分之二的数字签名,来保证一个校勘是合法的

我们有超级节点,把从所有的分片中把所有的校勘(Collations),打包到一个块中并加入以太坊的公链中。超级节点的职责是处理所有校勘中的交易并且通过收集所有的校勘头来保持所有分片中状态的一致性。

在这个新区块链中,满足以下条件,一个块是合法的:

  • 在所有校勘中的交易是合法的
  • 交易前,校勘的状态和当前校勘的状态是一致的
  • 交易后,校勘的状态和校勘头指定的状态是一致的
  • 校勘集合获得了三分之二的校勘者的签名

134952_EhvJ_2981977.png

Level Two的特性:

  • Level two 像一个简单的区块, 只接受交易组,不接受单个交易.
  • 交易组在满足以下条件时才是合法的:
    • Pre-state root和全局状态里的Shard root一致.
    • 交易组里的签名都被验证为真.
  • 如果交易组计入,全局的state root就变成特定Shard ID里的post-state root .

140808_sg4s_2981977.png

每个交易的receipt通过交易组的默克尔根很容易访问到。在shard里的每个交易做下面两件事:

  • 改变它所在的shard的状态state
  • 生成一个receipt

有趣的是,所有的receipts被放到一个分布式的共享内存中,其他shard可以看但是不能修改。因而, 跨Shard通信可以以如下方式通过receipt发生:

140817_XhGO_2981977.png

实例

考虑一下一个交易是跨分区的情况。比如,如果我从一个在分区1的地址上送钱给一个在分区10上的地址。最重要的就是跨分区的通信能力。下面详细解释收据如何扮演角色,解决上面的问题。

Raul (地址在分区1上) 需要送100 ETH 给 Jim (地址在分区10)

  1. 一个交易就被送到分区1: 该交易从Raul的账户里减去100ETH并等待交易结束
  2. 对于没有反应到状态,但是已经在默克尔树中存在的交易,创建一个收据
  3. 一个交易被送到分区10,该交易包含默克尔收据作为交易数据。分区10检查该收据是否被使用。
  4. 分区10处理该交易并且给Jim的账户增加100ETH,并且保存从分区1来的收据被使用的事
  5. 分区10创建一个新的收据,可以为以后的交易所使用

有什么缺点呢?

分区区块链的一个最大的问题是:单个分区取代攻击。如果攻击者获得了在单个分区里多数校勘者的控制权,攻击者就可以产生一个恶意的分区,提交非法的校勘信息。我们如何解决这个问题?

The Ethereum Wiki’s Sharding FAQ 建议在每个分区上进行随机的抽样,这么做的目的是,这些验证者不能预先知道他们会验证哪个分区。 每个分区会有很多的校勘者,真正去校勘交易的校勘者会从那些集合里随机选出.

POS共识使这项工作更简单,因为它已经有一系列的全局的验证者集合。我们可以从中选取校勘者。我们必须保证随机性,以保证这个抽样是完全强制的而且不能被有问题的验证者所左右。

随机的抽样选择校勘者,可能会有一些延迟的问题。想象一下,当你运行一个已经同步完成的以太坊节点上的时候,过了一些块,你可能不得不重新同步。这个是可能的:当我们对验证者进行重新洗牌的时候。这个时候就必须下载一个新的分区当它被指定为校勘者。而这必然增加潜在的费用。

分区算法将位于协议层,对所有的开发程序员都是透明的。以太坊的状态系统看起来和现在一样,但是协议层会内置一个系统,去创建分区,跨区状态调整,去除过小的分区。。。 所有这些工作都是幕后进行,而对开发程序员继续在以太坊开发没有阻碍。

扩容之外:超级二次分区方案和不可思议的速度提高

以太坊可能采用一种超级二次分区方案(意味着在分区上建分区)。超级二次分区会给用户带来极大的利益,降低交易费用至几乎可以忽略不计,成为一个普通的基础设施。

如何开始

最初的实现不会导致硬分叉,而会是一个智能合约(Validator Manager Contract.  简称VMC)来管理所有的分片系统。这个 VMC 管理分片并且从全局的验证者集合中抽样选取校勘者(collators),负责解消所有分片状态之间的矛盾。Vitalik 提出了一个实现分片的文档: https://github.com/ethereum/sharding/blob/develop/docs/doc.md

资源:

  • Sharding FAQ:https://github.com/ethereum/wiki/wiki/Sharding-FAQ
  • Ethereum Sharding Technical Overview: https://medium.com/@icebearhww/ethereum-sharding-and-finality-65248951f649
  • Sharding Reference Doc: https://github.com/ethereum/sharding/blob/develop/docs/doc.md
  • https://blockgeeks.com/guides/blockchain-scalability/
  • https://github.com/xitu/gold-miner/blob/master/TODO/making-sense-of-ethereums-layer-2-scaling-solutions-state-channels-plasma-and-truebit.md

参考这篇文章

转载于:https://my.oschina.net/gavinzheng731/blog/1786309

相关文章:

Xdebug的安装-(无错可执行版)

xdebug是一个开源的php调试器,以php模块的形式加载并被使用。可以用来跟踪,调试和分析PHP程序的运行状况. 这里以PHP5.2.13为例, 1.下载php_xdebug-2.1.0-5.2.dll文件, http://www.xdebug.org/download.php 选择:PHP 5.2 VC6 TS (32 bit) 选择…

云游戏、VR、AI,云计算给元宇宙提供了哪些想象力?

2021 最火的新概念,莫过于元宇宙。2021 年 10 月 29 日,Facebook 宣布改名 Meta;2021 年 11 月 1 日,“元宇宙第一股” Roblox 经过短暂调整,宣布重新上线。接下来关于元宇宙的线下 / 线上讨论如火如荼,…

sys.check_constraints

每个用作 CHECK 约束(sys.objects.type C)的对象都在表中占一行。 SELECT name FROM sys.check_constraints-- equal to SELECT o.name FROM sys.sysobjects oJOIN sys.sysconstraints s ON o.parent_obj s.id WHERE o.xtype C GROUP BY o.…

什么是Bootstrap Aggregating

简介 Bootstrap Aggregating也叫作bagging,是一种机器学习领域用来做模型合并的一种算法。这种算法可以提高统计分类器和回归器的稳定性和准确度。同时也可以帮助模型避免过拟合。历史Bootstrap Aggregating最早在1994年由Leo Breiman提出,当时用来通过随…

柯南君:看大数据时代下的IT架构(5)消息队列之RabbitMQ--案例(Work Queues起航)...

二、Work Queues(using the Java Client) 走起 在第上一个教程中我们写程序从一个命名队列发送和接收消息。在这一次我们将创建一个工作队列,将用于分发耗时的任务在多个工作者(worker)之间。 背后的主要思想工作队列(又名:任务队列)是为了避…

图像分析用 OpenCV 与 Skimage,哪一个更好?

作者 | 小白来源 | 小白学视觉这两种算法在它们可以检测到的和不能检测到的方面都有其起伏。OpenCV 是用 C 在后端进行编程的,并作为一个机器学习包,来分析 Python 中的图像模式。Skimage 也称为 Scikit-Image ,是一个机器学习软件包&#xf…

NetBeans配置Xdebug

这篇文章已经更新,看 Windows环境配置xdebug调试PHP Windows环境 或者 NetBeans配置Xdebug 远程调试PHP Linux环境nebeans配置xdebug可以方便我们逐步的查看程序的运行情况对我们调试程序是非常有利的下面我就来介绍下配置的过程。先要安装xdebug,可以参…

[译] Don’t call me, I’ll call you:使用 Redux-Saga 管理 React 应用中的异步 action (上)...

原文地址:Don’t call me, I’ll call you: Side effects management with Redux-Saga (Part 1)原文作者:David Dvora译文出自:掘金翻译计划本文永久链接:github.com/xitu/gold-m…译者:jonjia校对者:smile…

CentOS下安装NetBeans集成开发环境

下载NetBeans以netbeans-7.0beta2-ml-javaee-linux.sh为例#sh netbeans-7.0beta2-ml-javaee-linux.sh之后进入安装界面(接下来和windows下几乎一样不在举例) 前提是要安装了Java 主要不要在本地远程用SecureCRT输入命令啊,要在Linux下用终端输…

我的Android进阶之旅------Android嵌入图像InsetDrawable的用法

面试题:为一个充满整个屏幕的LinearLayout布局指定背景图,是否可以让背景图不充满屏幕?请用代码描述实现过程。 解决此题,可以使用嵌入(Inset)图像资源来指定图像,然后像使用普通图像资源一样使用嵌入图像资源。 语法如…

沉痛悼念游戏开发大神毛星云

惟愿所有的“爆料”都是造谣,惟愿我们能够一起去创造并让大家都能玩到蕴藏着中国上下五千年本土文化的优质游戏大作,惟愿我们能等到你的好消息......让人难过的是,据银柿财经报道,针对近日“网传腾讯天美员工离世”的消息&#xf…

April Fools Contest 2018

这个比赛不正经,但是我可以一本正经的写代码啊 A. Quirky Quantifierstime limit per test2 secondsmemory limit per test64 megabytesinputstandard inputoutputstandard outputInputThe input contains a single integer a (10 ≤ a ≤ 999). OutputOutput 0…

如何查找僵尸进程并Kill之,杀不掉的要查看父进程并杀之

用ps和grep命令寻找僵尸进程#ps -A -ostat,ppid,pid,cmd | grep -e ^[Zz]命令注解:-A 参数列出所有进程-o 自定义输出字段 我们设定显示字段为 stat(状态), ppid(进程父id), pid(进程id),cmd(命…

PHP计划任务:如何使用Linux的Crontab执行PHP脚本(转)

我们的PHP程序有时候需要定时执行,我们可以使用ignore_user_abort函数或是在页面放置js让用户帮我们实现。但这两种方法都不太可靠,不稳定。我们可以借助Linux的Crontab工具来稳定可靠地触发PHP执行任务。下面介绍Crontab的两种方法。一、在Crontab中使用…

OpenAI 开放 GPT-3 微调功能,让开发者笑开了花

出品 | AI科技大本营(ID:rgznai100) 近日,OpenAI宣布,允许用户创建自定义版的 GPT-3。 OpenAI 表示,开发人员可以使用微调来创建针对其应用程序和服务中的特定内容量身定制的 GPT-3 模型,从而在任务和工作…

PHP----------php封装的一些简单实用的方法汇总

1、xml转换成array,格式不对的xml则返回false function xml_parser($str){ $xml_parser xml_parser_create(); if(!xml_parse($xml_parser,$str,true)){ xml_parser_free($xml_parser); return false; } else { …

PHP函数--var_dump

var_dump(PHP 3 > 3.0.5, PHP 4, PHP 5)var_dump -- 打印变量的相关信息描述void var_dump ( mixed expression [, mixed expression [, ...]] )此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构…

Mozilla公布WebVR API标准草案

随着信息技术的迅速发展,虚拟现实(Virtual Reality,VR)技术在近些年不断完善,其应用范围也变得十分广泛。为了搭建逼真的虚拟场景,VR技术一般都需要用到大量精美的图像和复杂的动作。因此,大部分…

不到 100 行 Python 代码教你做出精美炫酷的可视化大屏

作者 |俊欣来源 |关于数据分析与可视化“碳达峰、碳中和”是2021年政府在不断强调与非常重视的事儿,那什么是“碳达峰”、什么又是“碳中和”呢?这里小编来为大家科普一下,所谓的“碳达峰”指的是在某一时间点,二氧化碳的排放不再…

JavaScript实现冒泡排序

说明 对数组进行 冒泡排序 算是比较简单的,冒泡排序也是容易理解的一种排序算法了,在面试的时候,很可能就会问到。 实现原理 数组中有 n 个数,比较每相邻两个数,如果前者大于后者,就把两个数交换位置&#…

PHP--isset()和unset()函数的用法

isset(PHP 3, PHP 4, PHP 5 )isset -- 检测变量是否设置描述bool isset ( mixed var [, mixed var [, ...]])如果 var 存在则返回 TRUE,否则返回 FALSE。 如果已经使用 unset() 释放了一个变量之后,它将不再是 isset()。若使用 isset() 测试一个被设置成…

有关任意多条曲线的拟合度算法

为什么80%的码农都做不了架构师?>>> 在股市中,经常会遇到趋势的预判。所谓趋势,即相对而言的规律化的模式识别形态。形象来讲,就是个股的一段时间内的曲线分布状况。 那么,问题来了。 我们虽然可以在少量的…

从深度学习到深度森林方法(Python)

作者 |泳鱼来源 |算法进阶一、深度森林的介绍 目前深度神经网络(DNN)做得好的几乎都是涉及图像视频(CV)、自然语言处理(NLP)等的任务,都是典型的数值建模任务(在表格数据tabular dat…

LHC大神问的矩阵转置问题

数学中线性代数中提到的矩阵转置&#xff0c;其实在我们的业务场景中也有需要的地方&#xff0c;比如LHC大神问到的这个问题 那么如何进行行列转换呢&#xff1f; 代码如下&#xff1a; <?php$arrayarray(部门1>array(费用1>100,费用2>200,费用3>300),部门2>…

不同机器互相调用WebService或者HTTP一定要telnet 测试

ping的通不一定就telnet的通 一定要#telnet 目标机器IP 目标机器端口如果一直是 Trying 目标IP那么不通如果是 Trying 目标IP Connection to 目标IP 说明通的

亮相百度WAVE SUMMIT+2021,Intel OpenVINO带来新气象

北京时间12月12日&#xff0c;百度WAVE SUMMIT2021深度学习开发者峰会在上海举办。这场属于AI的科技盛会之上&#xff0c;英特尔OpenVINO联手百度PaddlePaddle为开发者带来了一系列的技术内容&#xff0c;为开源生态构建持续合作&#xff0c;为产业进步提供新的动力。 OpenVIN…

精品德国软件 UltraShredder 文件粉碎机

出自德国的文件粉碎机&#xff0c;整合了回收站的相关操作&#xff0c;特点是兼容性好&#xff0c;支持9X以上的Win全系列&#xff08;不包括64位系统哦&#xff09;。该软件绿色免费&#xff0c;建议收藏于U盘^_^ 它和偶之前汉化的加密软件Omziff一样&#xff0c;来自XTort&am…

JavaEE 银联支付之手机控件支付-消费类交易

0. workflow app端request->后台封装参数->后台进行签名->请求银联平台->解析响应->响应需求信息 复制代码1. acp_sdk.properties ##############SDK配置文件&#xff08;证书方式签名&#xff09;################ # 说明&#xff1a; # 1. 使用时请删除后缀的…

php singleton()

common.php <?phpclass CC{private static $ins;public static function singleton(){if (!isset(self::$ins)){$c __CLASS__;self::$ins new $c;}return self::$ins;}public function EventResult($Id){return $Id;}}?>index.php <html><head><title…

2015 Multi-University Training Contest 2 1002 Buildings

Buildings Problems Link: http://acm.hdu.edu.cn/showproblem.php?pid5301 Mean: n*m列的网格&#xff0c;删除一个格子x,y&#xff0c;用矩形来填充矩阵。且矩形至少有一边是在矩阵的边缘上。 要使最大矩形的面积最小&#xff0c;求满足条件的矩形填充方式中面积最大的…