当前位置:首页 » 存储配置 » 以太坊数据存储

以太坊数据存储

发布时间: 2023-06-02 03:46:05

❶ 以太坊是什么以太坊与区块链有什么关系

以太坊是一个全新开放的区块链平台,它允许任何人在平台中建立和使用通过区块链技术运行的去中心化应用。就像比特币一样,以太坊不受任何人控制,也不归任何人所有——它是一个开放源代码项目,由全球范围内的很多人共同创建。

和比特币协议有所不同的是,以太坊的设计十分灵活,极具适应性。在以太坊平台上创立新的应用十分简便,任何人都可以安全地使用该平台上的应用。

以太坊是可编程的区块链。它并不是给用户一系列预先设定好的操作(例如比特币交易),而是允许用户按照自己的意愿创建复杂的操作。这样一来,它就可以作为多种类型去中心化区块链应用的平台,包括加密货币在内但并不仅限于此。

以太坊狭义上是指一系列定义去中心化应用平台的协议,它的核心是以太坊虚拟机(“EVM”),可以执行任意复杂算法的编码。在计算机科学术语中,以太坊是“图灵完备的”。开发者能够使用现有的JavaScript和Python等语言为模型的其他友好的编程语言,创建出在以太坊模拟机上运行的应用。

和其他区块链一样,以太坊也有一个点对点网络协议。以太坊区块链数据库由众多连接到网络的节点来维护和更新。每个网络节点都运行着以太坊模拟机并执行相同的指令。因此,人们有时形象地称以太坊为“世界电脑”。

这个贯穿整个以太坊网络的大规模并行运算并不是为了使运算更高效。实际上,这个过程使得在以太坊上的运算比在传统“电脑”上更慢更昂贵。然而,每个以太坊节点都运行着以太坊虚拟机是为了保持整个区块链的一致性。去中心化的一致使以太坊有极高的故障容错性,保证零停机,而且可以使存储在区块链上的数据保持永远不变且抗审查。

以太坊平台本身没有特点,没有价值性。和编程语言相似,它由企业家和开发者决定其用途。不过很明显,某些应用类型较之其他更能从以太坊的功能中获益。以太坊尤其适合那些在点与点之间自动进行直接交互或者跨网络促进小组协调活动的应用。

例如,协调点对点市场的应用,或是复杂财务合同的自动化。比特币使个体能够不借助金融机构、银行或政府等其他中介来进行货币交换。以太坊的影响可能更为深远。

理论上,任何复杂的金融活动或交易都能在以太坊上用编码自动且可靠地进行。除金融类应用外,任何对信任、安全和持久性要求较高的应用场景——比如资产注册、投票、管理和物联网——都会大规模地受到以太坊平台影响。

❷ 区块链中的数据存在哪里

简单回答:区块链的数据就是存在每一个节点中(可以是个人机,也可以是其他);区块链的确是一个公众可以修改的数据库,只不过你只能够使用你持有的秘.钥,修改你秘.钥相对的"账户"的数据。
不过,不同的区块链的数据存储方式与数量是不同的。已 BTC 为例,其数据是存在每一个节点中,目前 BTC 的节点数据大概是200多G,其增长速度是每个月10G左右,个人机问题不大的。
但是,数据量的确是越来越大了!至少很快个人笔记本就很难运行 BTC 全节点了。对于以太坊来说,记录了所有数据的存档节点应该有数 T 的存储量,这对于个人机来说是不可能运行的。

❸ 以太坊是一个什么样的东西怎么开发

以太坊是一种区块链的实现。在以太坊网络中,众多的节点彼此连接,构成了以太坊网络: 以太坊节点软件提供两个核心功能:数据存储、合约代码执行。在每个以太坊全节点中,都保存有完整的区块链数据。以太坊不仅将交易数据保存在链上,编译后 的合约代码同样也保存在链上。以太坊全节点中,同时还提供了一个虚拟机来执行合约代码。以太坊虚拟机 以太坊区块链不仅存储数据和代码,每个节点中还包含一个虚拟机(EVM:Ethereum Virtual Machine)来执行 合约代码 —— 听起来就像计算机操作系统。事实上,这一点是以太坊区别于比特币(Bitcoin)的最核心的一点:虚拟机的存在使区块链迈入了2.0 时代,也让区块链第一次成为应用开发者友好的平台。以上内容来自:以太坊DApp开发入门教程

❹ 【深度知识】以太坊数据序列化RLP编码/解码原理

RLP(Recursive Length Prefix),中文翻译过来叫递归长度前缀编码,它是以太坊序列化所采用的编码方式。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编码结果是131 97 98 99,其中131=128+len("abc"),97 98 99依次是a b c。

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

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

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

The length of this sentence is more than 55 bytes, I know it because I pre-designed it
这段字符串共86个字节,而86的编码只需要一个字节,那就是它自己,因此,编码的结果如下:

184 86 84 104 101 32 108 101 110 103 116 104 32 111 102 32 116 104 105 115 32 115 101 110 116 101 110 99 101 32 105 115 32 109 111 114 101 32 116 104 97 110 32 53 53 32 98 121 116 101 115 44 32 73 32 107 110 111 119 32 105 116 32 98 101 99 97 117 115 101 32 73 32 112 114 101 45 100 101 115 105 103 110 101 100 32 105 116
其中前三个字节的计算方式如下:

184 = 183 + 1,因为数组长度86编码后仅占用一个字节。
86即数组长度86
84是T的编码
例5:编码一个重复1024次"a"的字符串,其结果为:185 4 0 97 97 97 97 97 97 ...。
1024按 big endian编码为004 0,省略掉前面的零,长度为2,因此185 = 183 + 2。

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

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

注意规则4本身是递归定义的。
例6:["abc", "def"]的编码结果是200 131 97 98 99 131 100 101 102。
其中abc的编码为131 97 98 99,def的编码为131 100 101 102。两个子字符串的编码后总长度是8,因此编码结果第一位计算得出:192 + 8 = 200。

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

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

例7:

["The length of this sentence is more than 55 bytes, ", "I know it because I pre-designed it"]
的编码结果是:

248 88 179 84 104 101 32 108 101 110 103 116 104 32 111 102 32 116 104 105 115 32 115 101 110 116 101 110 99 101 32 105 115 32 109 111 114 101 32 116 104 97 110 32 53 53 32 98 121 116 101 115 44 32 163 73 32 107 110 111 119 32 105 116 32 98 101 99 97 117 115 101 32 73 32 112 114 101 45 100 101 115 105 103 110 101 100 32 105 116
其中前两个字节的计算方式如下:

248 = 247 +1
88 = 86 + 2,在规则3的示例中,长度为86,而在此例中,由于有两个子字符串,每个子字符串本身的长度的编码各占1字节,因此总共占2字节。
第3个字节179依据规则2得出179 = 128 + 51
第55个字节163同样依据规则2得出163 = 128 + 35

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

["abc",["The length of this sentence is more than 55 bytes, ", "I know it because I pre-designed it"]]
编码结果是:

248 94 131 97 98 99 248 88 179 84 104 101 32 108 101 110 103 116 104 32 111 102 32 116 104 105 115 32 115 101 110 116 101 110 99 101 32 105 115 32 109 111 114 101 32 116 104 97 110 32 53 53 32 98 121 116 101 115 44 32 163 73 32 107 110 111 119 32 105 116 32 98 101 99 97 117 115 101 32 73 32 112 114 101 45 100 101 115 105 103 110 101 100 32 105 116
列表第一项字符串abc根据规则2,编码结果为131 97 98 99,长度为4。
列表第二项也是一个列表项:

["The length of this sentence is more than 55 bytes, ", "I know it because I pre-designed it"]
根据规则5,结果为

248 88 179 84 104 101 32 108 101 110 103 116 104 32 111 102 32 116 104 105 115 32 115 101 110 116 101 110 99 101 32 105 115 32 109 111 114 101 32 116 104 97 110 32 53 53 32 98 121 116 101 115 44 32 163 73 32 107 110 111 119 32 105 116 32 98 101 99 97 117 115 101 32 73 32 112 114 101 45 100 101 115 105 103 110 101 100 32 105 116
长度为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 )

热点内容
原神游戏服务器ip 发布:2025-02-06 17:54:23 浏览:810
如何查笔记本电脑的真正配置 发布:2025-02-06 17:48:07 浏览:79
存储器存在地址 发布:2025-02-06 17:47:28 浏览:537
phpsocket教程 发布:2025-02-06 17:42:13 浏览:423
mysql解压缩版安装 发布:2025-02-06 17:26:33 浏览:179
phpgd图片 发布:2025-02-06 17:24:34 浏览:206
php代码整理 发布:2025-02-06 17:24:31 浏览:477
java可执行文件 发布:2025-02-06 17:18:59 浏览:249
卫士相当于现在什么配置 发布:2025-02-06 17:05:04 浏览:409
项目编译慢 发布:2025-02-06 16:53:48 浏览:382