金大财富

以太坊原理介绍以太坊原理

Eric 0

大家好,如果您还对以太坊原理介绍不太了解,没有关系,今天就由本站为大家分享以太坊原理介绍的知识,包括以太坊 原理的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

本文目录

【深度知识】以太坊数据序列化RLP编码/解码原理以太坊stratum协议原理一文了解以太坊矿机及挖矿原理002:以太坊简介|《ETH原理与智能合约开发》笔记【深度知识】以太坊数据序列化RLP编码/解码原理RLP(RecursiveLengthPrefix),中文翻译过来叫递归长度前缀编码,它是以太坊序列化所采用的编码方式。RLP主要用于以太坊中数据的网络传输和持久化存储。

对象序列化方法有很多种,常见的像JSON编码,但是JSON有个明显的缺点:编码结果比较大。例如有如下的结构:

变量s序列化的结果是{"name":"icattlecoder","sex":"male"},字符串长度35,实际有效数据是icattlecoder和male,共计16个字节,我们可以看到JSON的序列化时引入了太多的冗余信息。假设以太坊采用JSON来序列化,那么本来50GB的区块链可能现在就要100GB,当然实际没这么简单。

所以,以太坊需要设计一种结果更小的编码方法。

RLP编码的定义只处理两类数据:一类是字符串(例如字节数组),一类是列表。字符串指的是一串二进制数据,列表是一个嵌套递归的结构,里面可以包含字符串和列表,例如["cat",["puppy","cow"],"horse",[[]],"pig",[""],"sheep"]就是一个复杂的列表。其他类型的数据需要转成以上的两类,转换的规则不是RLP编码定义的,可以根据自己的规则转换,例如struct可以转成列表,int可以转成二进制(属于字符串一类),以太坊中整数都以大端形式存储。

从RLP编码的名字可以看出它的特点:一个是递归,被编码的数据是递归的结构,编码算法也是递归进行处理的;二是长度前缀,也就是RLP编码都带有一个前缀,这个前缀是跟被编码数据的长度相关的,从下面的编码规则中可以看出这一点。

对于值在[0,127]之间的单个字节,其编码是其本身。

例1:a的编码是97。

如果byte数组长度l<=55,编码的结果是数组本身,再加上128+l作为前缀。

例2:空字符串编码是128,即128=128+0。

例3:abc编码结果是131979899,其中131=128+len("abc"),979899依次是abc。

如果数组长度大于55,编码结果第一个是183加数组长度的编码的长度,然后是数组长度的本身的编码,最后是byte数组的编码。

请把上面的规则多读几篇,特别是数组长度的编码的长度。

例4:编码下面这段字符串:

Thelengthofthissentenceismorethan55bytes,IknowitbecauseIpre-designedit

这段字符串共86个字节,而86的编码只需要一个字节,那就是它自己,因此,编码的结果如下:

184868410410132108101110103116104321111023211610410511532115101110116101110991013210511532109111114101321161049711032535332981211161011154432733210711011111932105116329810199971171151013273321121141014510010111510510311010110032105116

其中前三个字节的计算方式如下:

184=183+1,因为数组长度86编码后仅占用一个字节。

86即数组长度86

84是T的编码

例5:编码一个重复1024次"a"的字符串,其结果为:18540979797979797...。

1024按bigendian编码为0040,省略掉前面的零,长度为2,因此185=183+2。

规则1~3定义了byte数组的编码方案,下面介绍列表的编码规则。在此之前,我们先定义列表长度是指子列表编码后的长度之和。

如果列表长度小于55,编码结果第一位是192加列表长度的编码的长度,然后依次连接各子列表的编码。

注意规则4本身是递归定义的。

例6:["abc","def"]的编码结果是200131979899131100101102。

其中abc的编码为131979899,def的编码为131100101102。两个子字符串的编码后总长度是8,因此编码结果第一位计算得出:192+8=200。

如果列表长度超过55,编码结果第一位是247加列表长度的编码长度,然后是列表长度本身的编码,最后依次连接各子列表的编码。

规则5本身也是递归定义的,和规则3相似。

例7:

["Thelengthofthissentenceismorethan55bytes,","IknowitbecauseIpre-designedit"]

的编码结果是:

248881798410410132108101110103116104321111023211610410511532115101110116101110991013210511532109111114101321161049711032535332981211161011154432163733210711011111932105116329810199971171151013273321121141014510010111510510311010110032105116

其中前两个字节的计算方式如下:

248=247+1

88=86+2,在规则3的示例中,长度为86,而在此例中,由于有两个子字符串,每个子字符串本身的长度的编码各占1字节,因此总共占2字节。

第3个字节179依据规则2得出179=128+51

第55个字节163同样依据规则2得出163=128+35

例8:最后我们再来看个稍复杂点的例子以加深理解递归长度前缀,

["abc",["Thelengthofthissentenceismorethan55bytes,","IknowitbecauseIpre-designedit"]]

编码结果是:

24894131979899248881798410410132108101110103116104321111023211610410511532115101110116101110991013210511532109111114101321161049711032535332981211161011154432163733210711011111932105116329810199971171151013273321121141014510010111510510311010110032105116

列表第一项字符串abc根据规则2,编码结果为131979899,长度为4。

列表第二项也是一个列表项:

["Thelengthofthissentenceismorethan55bytes,","IknowitbecauseIpre-designedit"]

根据规则5,结果为

248881798410410132108101110103116104321111023211610410511532115101110116101110991013210511532109111114101321161049711032535332981211161011154432163733210711011111932105116329810199971171151013273321121141014510010111510510311010110032105116

长度为90,因此,整个列表的编码结果第二位是90+4=94,占用1个字节,第一位247+1=248

以上5条就是RPL的全部编码规则。

各语言在具体实现RLP编码时,首先需要将对像映射成byte数组或列表两种形式。以go语言编码struct为例,会将其映射为列表,例如Student这个对象处理成列表["icattlecoder","male"]

如果编码map类型,可以采用以下列表形式:

[["",""],["",""],["",""]]

解码时,首先根据编码结果第一个字节f的大小,执行以下的规则判断:

1.如果f∈[0,128),那么它是一个字节本身。

2.如果f∈[128,184),那么它是一个长度不超过55的byte数组,数组的长度为l=f-128

3.如果f∈[184,192),那么它是一个长度超过55的数组,长度本身的编码长度ll=f-183,然后从第二个字节开始读取长度为ll的bytes,按照BigEndian编码成整数l,l即为数组的长度。

4.如果f∈(192,247],那么它是一个编码后总长度不超过55的列表,列表长度为l=f-192。递归使用规则1~4进行解码。

5.如果f∈(247,256],那么它是编码后长度大于55的列表,其长度本身的编码长度ll=f-247,然后从第二个字节读取长度为ll的bytes,按BigEndian编码成整数l,l即为子列表长度。然后递归根据解码规则进行解码。

以上解释了什么叫递归长度前缀编码,这个名字本身很好的解释了编码规则。

(1)以太坊源码学习—RLP编码(https://segmentfault.com/a/1190000011763339)

(2)简单分析RLP编码原理

(https://blog.csdn.net/itchosen/article/details/78183991)

以太坊stratum协议原理参照比特币的stratum协议和NiceHash的stratum协议规范编写了一版以太坊版本的stratum协议说明.

stratum协议是目前最常用的矿机和矿池之间的TCP通讯协议。

以太坊是一个去中心化的网络架构,通过安装Mist客户端的节点来转发新交易和新区块。而矿机、矿池也同时形成了另一个网络,我们称之为矿工网络。

矿工网络分成矿机、矿池、钱包等几个主要部分,有时矿池软件与钱包安装在一起,可合称为矿池。

矿机与矿池软件之间的通讯协议是stratum,而矿池软件与钱包之间的通讯是bitcoinrpc接口。

stratum是JSON为数据格式.

矿机启动,首先以mining.subscribe方法向矿池连接,用来订阅工作。

矿池以mining.notify返回订阅号、ExtraNonce1和ExtraNonce2_size。

Client:

Server:

其中:

ae6812eb4cd7735a302a8a9dd95cf71f是订阅号;

080c是extranonce,Extranonce可能最大3字节;

矿机以mining.authorize方法,用某个帐号和密码登录到矿池,密码可空,矿池返回true登录成功。该方法必须是在初始化连接之后马上进行,否则矿机得不到矿池任务。

Client:

Server:

难度调整由矿池下发给矿机,以mining.set_difficulty方法调整难度,params中是难度值。

Server:

矿机会在下一个任务时采用新难度,矿池有时会马上下发一个新任务并且把清理任务设为true,以便矿机马上以新难度工作。

该命令由矿池定期发给矿机,当矿机以mining.subscribe方法登记后,矿池应该马上以mining.notify返回该任务。

Server:

任务ID:bf0488aa;

seedhash:abad8f99f3918bf903c6a909d9bbc0fdfa5a2f4b9cb1196175ec825c6610126c。每一个任务都发送一个seedhash来支持尽可能多的矿池,这可能会很快地在货币之间交换。

headerhash:645cf20198c2f3861e947d4f67e3ab63b7b2e24dcc9095bd9123e7b33371f6cc。

booleancleanjobs:true。如果设为true,那么矿工需要清理任务队列,并立即开始从事新提供的任务,因为所有旧的任务分享都将导致陈旧的分享错误。如果是false则等当前任务结束才开始新任务。

矿工使用seedhash识别DAG,然后带着headerhash,extranonce和自己的minernonce寻找低于目标的share(这是由提供的难度而产生的)。

矿机找到合法share时,就以”mining.submit“方法向矿池提交任务。矿池返回true即提交成功,如果失败则error中有具体原因。

Client:

任务ID:bf0488aa

minernonce:6a909d9bbc0f。注意minernonce是6个字节,因为提供的extranonce是2个字节。如果矿池提供3字节的extranonce,那么minernonce必须是5字节

Server:

一般的矿机与矿池通讯过程就如下所示:

一文了解以太坊矿机及挖矿原理在以前的文章中,我们分别了解了比特币挖矿和以太坊挖矿的区别。本文重点介绍以太坊挖矿及矿机部分。

以太坊是一个开源的有智能合约功能的公共区块链平台,通过其专用加密货币ETH提供去中心化的以太虚拟机来处理点对点合约。目前ETH的挖矿主要是通过显卡矿机,所谓显卡矿机,其实就是类似家用台式机,只不过每台机器里面有6-10张显卡,并且没有显示器(如图)。

图:显卡矿机

之所以以太坊没有发展出类似于BTC一样的ASIC矿机,主要是由于ETH的特殊挖矿机制决定的。

在ETH挖矿过程中,会产生一个DAG文件,该文件需要一直被调用,因此必须有专门的存储空间放置。这个对于存储空间的硬性需求会导致即使生产出来了ASIC芯片,也并不能大幅度降低单位算力的成本。简单来说,就是性价比很差。

以太坊的DAG大小自2016年6月份引入Dagger-Hashimoto算法时的1GB开始,以每年约520MB的速度增大到了现在的3.7G,预计2020年底以太坊的DAG大小将增加至4G。届时,显存小于4G的显卡都将被陆续淘汰。

还需要介绍一点的是,由于显卡矿机的体积通常是比特币矿机的2-4倍,而消耗的电力却只有比特币矿机的1/2甚至更低,这就导致一般人不愿意修建专门的显卡矿机矿场(因为矿场主要赚取的是电费差价,同样面积的场地,可以放置的显卡数量少,消耗的电量更少)。即使有少量的显卡矿场,收取的电费成本通常也比比特币矿机矿场的高。

002:以太坊简介|《ETH原理与智能合约开发》笔记待字闺中开发了一门区块链方面的课程:《深入浅出ETH原理与智能合约开发》,马良老师讲授。此文集记录我的学习笔记。

课程共8节课。其中,前四课讲ETH原理,后四课讲智能合约。

第一课分为四部分:

这篇文章是第一部分的学习笔记:以太坊简介。

以太坊是目前公认的区块链2.0,相比于区块链1.0(比特币),其最大的特点是引入了智能合约,从而从单一的数字加密Token技术转化为一个区块链分布式应用的平台。以太坊本身不包含任何具体的应用,它主要是提供基础平台和工具,使得开发者可以在其基础之上开发出各种各样的应用。可以说,以太坊有着巨大的潜力,它最终可能会发展出分布式、自动化、自组织的最高形态。

第一,我们可以通过学习以太坊的技术,领会区块链技术发展的脉络,改进的思路/路径,从而紧跟区块链技术发展的前沿,预测下一步的趋势。

第二,DAPP(分布式应用)生态系统目前的发展也是蒸蒸日上,蓬勃发展,据不完全统计,现在有数百种应用之多,显而易见的,对于开发人员的需求也是水涨船高,需要大量的开发人员。目前非常有名的应用有加密猫、各类侧链应用、ERC20Token如币安币火币等等。

2013年,创始人VitalikButerin针对比特币存在的一些问题以及局限性,提出把“智能合约”构想应用于区块链领域,希望打造一个基于区块链的多方计算的智能化通用平台,并通过比特币融资进行开发。

2014年,以太坊基金会在瑞士成立,管理并运营整个项目。

前5大矿池占83%的算力,很集中。

目前大约有16000个全节点,其中,美国5461(34%),中国1839(11.5%),俄罗斯963(6%),德国920(5.7%),加拿大875(5.45%)。全节点每天都有动态变化。分布情况也反映出各个国家的参与热度。

好了,文章到这里就结束啦,如果本次分享的以太坊原理介绍和以太坊 原理问题对您有所帮助,还望关注下本站哦!

以太坊怎么买跌?选择Bitget交易所

什么是USDT?选择Bitget平台交易怎么样

普维币如何参与?Bitget交易所行不行

以太坊购买流程,以太坊历史价格走势图

相关内容