主页 > imtoken用什么id下载 > 【转载+整理】区块链学习笔记-北大肖震老师课后笔记(14-26)-ETH

【转载+整理】区块链学习笔记-北大肖震老师课后笔记(14-26)-ETH

imtoken用什么id下载 2023-02-22 05:23:52

学习视频来自:北京大学计算机系肖震,区块链学习视频

有关比特币的介绍,您可以阅读这篇文章

比特币第 01-13 部分

文章目录

14 ETH 以太坊概述

本课对以太坊进行了概述,重点介绍了以太坊相对于比特币的主要改进,例如基于幽灵协议的共识机制、工作量证明中使用的挖矿难题的设计以及智能合约(smart contract ) ) 概念和内涵等

14.1 比特币和以太坊

BTC和ETH是最重要的两种加密货币,BTC被称为区块链1.0,以太坊被称为区块链2.0。 前文指出比特币在设计上存在一些不足,以太坊对其进行了改进。 比特币和以太坊的主要区别如下:

以太坊的平均挖矿时间为 20 秒(最新),而比特币为 10 分钟。 更短的挖矿时间使得主链更容易分叉,并且需要更多的区块确认。 此交易被视为安全交易。 比特币系统建议超过 6 个区块确认的交易最终确认。 贸易。 以太坊无限量发行,挖矿产生新币的速度基本一致,硬分叉时偶有变化,而比特币每 4 年减半,比特币总量为 2100 万枚。 在工作量证明方面,采用了ethash算法,降低了专用ASIC挖矿的优势。 交易费用因计算复杂性、带宽使用和存储要求(在称为 gas 的系统中)而异,而比特币交易则按交易大小(以字节为单位)进行竞争。 以太坊 Gas 单位的价格可以在交易中指定。 这通常以 GWEI 为单位来衡量。 比特币交易的费用通常以每字节聪来衡量。 以太坊交易费用通常远低于比特币。 2017 年 12 月,以太坊交易费用中位数为 0.33 美元,比特币交易费用中位数为 23 美元。 以太坊使用一种账户系统(状态机),其中 wei 中的值从一个账户中扣除并记入另一个账户,而比特币的 utxo 系统更类似于花费现金并接收变化作为回报。 以太坊有叔块的概念,没有成为主链的区块有挖矿奖励。 相对而言,该系统比比特币系统更公平。 与以太坊最大的区别在于在编程上引入了图灵完备的智能合约功能。 虽然比特币也支持智能合约脚本的编写,但这个概念正是以太坊的精髓所在,这使得以太坊不仅是一个投资平台,还提供了一个去中心化的记账平台。

14.2 智能合约

首先,讨论去中心化货币。 货币本身是政府发行的,政府的公信力背书。 BTC通过技术手段取代了政府的职能。

在现实生活中,我们经常提到“契约”或“合同”。 合同的有效性也需要政府来维护。 如果发生纠纷,必须对合同的合法性作出判断。 ETH的设计目的是通过技术手段来替代政府合约的功能。

那么,去中心化合约有什么好处呢?

如果合同的签订方不是一个国家,则没有统一的司法部门(如:众筹)。 如果可以写一个不可修改的合约,大家只能按照相关的参与者来执行,不能违约。

15个ETH账户

本讲介绍了以太坊的设计理念,比较了以太坊中基于账户的账本和比特币中基于交易的账本的优缺点,以及由此产生的双花等安全攻击的解决方案

15.1 BTC和ETH账户交易

BTC系统是一个基于交易的账本。 系统不显示账户中记录了多少钱。 只能通过UTXO来估算。 优点是更好的隐私保护。 但缺点是使用起来比较别扭,和我们的日常生活有很大的不同。

A向B转账时,需要说明币种的来源。 实际操作中,只需要省钱说明出处,不需要花钱。 另外,账户里的钱花的时候,一定要一次性花完。

如图所示,B收到A的10个BTC,他要给C 3个BTC。 如果按照1中的方法,剩下的7个比特币将以交易手续费的形式分给挖出区块的矿工。

所以,为了避免这种情况,采用2的方式,转3个BTC给C,剩下的7个BTC转给自己的另一个账户D是有吸引力的。

在这里插入图片描述

国内买比特币犯法吗_老师卖比特币犯法吗_买卖比特币犯法吗

以太坊采用账户模型。 每个地址都类似于一个银行帐户。 转账记录都在同一个账户上。 唯一参数 Nonce 用于标记交易的顺序。 系统显示并记录每个账户中的以太币数量。 ,转账是否合法只需要检查转账人账户中是否有足够的以太币,并不需要每次都转完所有的钱。 以太坊基于账户的模型天然地防止了双花攻击。 但是,以太坊开发的这种模式也有缺点。 这种模式存在重放攻击的缺陷。 A转账给B,过了一段时间,B重新发布了A的交易,导致A的账户被扣了两次。

应该如何避免重放攻击?

答:在账户交易中添加一个计数器,记录该账户交易了多少次。 转账时,转账次数将包含在交易内容中。 系统中的全节点维护账户余额和计数器的交易数(nonce)。 由于A的签名,收款人无法篡改nonce值,从而防止了本地篡改余额或重放攻击。

在这里插入图片描述

试问:如果有人篡改余额怎么办? 比特币中的每一笔交易都需要标明来源,以防伪造。 以太坊不需要标明来源。 如何防止这个问题?

答:每个用户的余额是系统中所有节点需要保存和维护的状态。 下一课会讲状态树。 状态中存储的一个重要字段是您的余额余额。 没有办法篡改这种平衡。 除非所有全节点都认为你的余额发生了变化

以太坊系统中有两类账户:外部账户和合约账户。

外部账户:类似于BTC系统中的公私钥对。 有账户余额balance和counter nonce

合约账户:不受公私钥对控制。 (不能主动发起交易,只能在接到外部账户调用后发起交易或调用其他合约账户)除了balance和nonce,还有code(代码)、storage(相关state-storage)

如何调用合约账户?

答:创建合约时,会返回一个地址,知道这个地址就可以调用合约了。调用过程中,代码不变,状态发生变化

15.2 UTXO 与账户模型的比较

推荐看一下这篇文章,很清楚比特币和以太坊的技术原理对比的账户模型

UTXO 模型在第 5 章中已经提到。

账户模型:

在以太坊账户中,我们维护以下状态:

nonce:外部账户为交易次数,合约账户为创建合约的序号。 balance:该地址的以太币余额。 storageRoot:账户存储内容组成的默克尔树根的哈希值。 codeHash:账户EVM码的哈希值。 合约账户是合约代码的哈希值,外部账户是空字符串的哈希值。

UTXO的优势

账户模型优势

16 ETH 状态树

本节和后面17节关于以太坊的数据结构肖老师主要讲解了一些源码,有点难懂。 这是一篇不错的文章。 我建议如果你看不懂视频,你可以看一下。

以太坊的数据结构

老师卖比特币犯法吗_国内买比特币犯法吗_买卖比特币犯法吗

本课程深入介绍了以太坊中的一种数据结构 Merkle Patricia Tree (MPT)。 首先带领大家思考为什么以太坊不能直接复制比特币中的数据结构? 然后介绍一下以太坊中实际使用的状态树的数据结构及其具体的构造方法,并带领大家思考一些设计问题,比如为什么要将数据序列化,然后存储在树中? 为什么要维护账户的历史状态等

以太坊的4棵树状态树交易树收据树账户存储树

以太坊区块数据中一共有三棵树,分别是状态树、交易树和收据树。

帐户存储树是一种保存与帐户关联的数据的结构。 此项仅适用于合约账户,在EOA中,storageRoot留空,codeHash

是一串空字符串的哈希值

.

16.1 ETH 状态树

在以太坊中,账户地址为 160 位,用 40 个十六进制数表示。 状态包括余额(balance)、交易数量(nonce),合约账户还包括代码(code)和存储(stroge)。

为什么以太坊不能直接复制比特币中的数据结构?

1、以太坊为什么不能效仿比特币的数据结构Merkle Tree?

答:比特币系统中没有账户概念。 交易由区块管理,一个区块最多包含4000笔左右的交易,所以Merkle Tree不会无限增长。 在ETH中,Merkle Tree是用来组织账户信息的,很明显它会越来越大。 在实践中,只有一小部分数据发生变化,每次重建 Merkle Tree 的代价很大。 所以不行吗?

2.直接使用Merkle Tree,每次修改只需要修改一部分。 这可能吗?

答:不能。在实践中,Merkle Tree 并没有提供高效的搜索和更新解决方案。 此外,所有的账户都构建成一个大的Merkle Tree,必须对其进行排序,以保证所有节点的一致性和搜索速度。

3. 排序后,可以使用Sorted Merkle Tree吗?

答:不能。新添加的账户,由于其地址是随机的,插入Merkle Tree时很可能在树的中间,找到后必须重建。 因此,Sorted Merkle Tree 的插入和删除(实际上可能不删除)的成本太高了。

16.2 树

MPT实际上是三种数据结构的组合,分别是Trie树、Patricia Trie和Merkle树。

Trie 树,也称为词典树、单词搜索树或前缀树,是一种用于快速检索的多叉树结构。 例如,英文字母的字典树是26-tree,数字的字典树是10-tree。

Trie树可以使用字符串的公共前缀来节省存储空间。如下图所示,Trie树以15个节点保存了5个字符串

在这里插入图片描述

Trie树的基本性质:

Trie树的优缺点:

国内买比特币犯法吗_买卖比特币犯法吗_老师卖比特币犯法吗

缺点:

当hash函数好的时候,Trie树的查找效率会比hash查找低。空间消耗比较大

优势:

插入和查询的效率都很高,都是O(m),其中m是要插入/查询的字符串的长度。 Trie 中的不同键不会产生冲突。 Trie 树只允许在关键字与多个值相关联时发生哈希冲突。 Trie树不需要计算哈希值,对于短字符串速度更快。 通常,查找哈希值还需要遍历字符串。 Trie 树可以按照字典顺序对关键字进行排序。

trie的缺点也很明显

Trie 存储浪费。 很多节点只存储一个key,而他们的“儿子”却只有一个,太浪费了。 因此,为了解决这个问题,我们引入Patricia树/trie

16.3帕特里夏树(Patricia tree)

Patricia trie 是具有路径压缩的 trie。 如上例所示,进行路径压缩后,如下图所示:

在这里插入图片描述

需要注意的是,如果插入了一个新词,可能需要对原来的压缩路径进行扩展。 那么,应该在什么情况下路径压缩效果比较好呢? 当树中插入的键值分布比较稀疏时,可以看出路径压缩效果较好。

在以太坊系统中老师卖比特币犯法吗,有 2^160 种 160 位地址。 这个数字其实很大。 与账户数量相比,可以认为地址的键值非常稀疏。

帕特里夏的优点和缺点:

优点:Patricia Trie相对于Trie有明显优势,减少空间消耗。

缺点:随着后续节点的不断插入和删除,原有节点可能发生变化,可能不会改变或合并新的节点

因此,我们可以在以太坊账户管理中使用帕特里夏树数据结构! 但其实并不是简单的PT(Patricia

树),但 MPT(Merkle Patricia 树)

16.4 MPT(Merkle Patricia树)

默克尔树和平衡树:

区块链和链表的区别在于,区块链使用哈希指针,而链表使用普通指针。

同样,与Balance Tree相比,Merkle Tree也将普通指针替换为哈希指针

在以太坊系统中,所有的账户都组织成一棵经过压缩和路径排序的默克尔树,其根哈希值存储在区块头中。 BTC系统中只有一棵由交易组成的Merkle Tree老师卖比特币犯法吗,而以太坊中有三棵(三棵树)。

也就是说,在以太坊的区块头中,存在三个根哈希值。

老师卖比特币犯法吗_国内买比特币犯法吗_买卖比特币犯法吗

根哈希值的用处:

防篡改。 提供Merkle证明,可以证明账户余额,轻节点可以验证。证明有交易的账户存在

MPT(Merkle Patricia tree)在以太坊进行了修改,我们称之为MPT(Modified Patricia tree)

下图是以太坊中使用的 MPT 结构示意图。 右上角显示四个账户(为直观显示而少)及其状态(仅显示账户余额)。 (需要注意的是这里的指针都是hash指针)

在这里插入图片描述

每发布一个新的区块,状态树中某些节点的状态就会发生变化。 但是改变不是原地修改,而是创建一些分支,保持原来的状态。 如下图所示,只需要修改新变化的节点,其他未修改的节点直接指向上一个区块中对应的节点。

在这里插入图片描述

因此,系统中的全节点并不维护一个MPT,而是在每次发布新区块时创建一个新的MPT。 只是大多数节点共享。

为什么要保留原始状态? 为什么不直接修改呢?

A:为了方便回滚。 后面1发生fork,然后上层节点获胜,变成2中的状态,那么后面节点对状态的修改需要回滚。 因此,需要维护这些历史记录。

在这里插入图片描述

16.5 以太坊中的数据结构代码

1. 区块头中的数据结构

在这里插入图片描述

2. 块状结构

在这里插入图片描述

3. 区块真正上线时的信息

在这里插入图片描述

键值对保存在状态树中,键为地址,值状态通过RLP(Recursive Length

前缀,一种序列化方法)在存储序列号之前对其进行编码。

17 ETH 交易编号和收据树

17.1 块数据结构

买卖比特币犯法吗_老师卖比特币犯法吗_国内买比特币犯法吗

以太坊的区块由区块头、交易列表和叔块三部分组成。 区块头包含区块号、区块哈希、父区块哈希等信息,其中State Root、Transaction Root、Receipt Root分别代表状态树、交易树、交易树的哈希。 除创世块外,每个块都有一个父块,父块用于形成区块链。 如下所示:

在这里插入图片描述

17.2 交易号状态树和收据树

交易树和收据树都是M(Merkle)PT,而BTC中使用的是普通的MT(Merkle Tree)。

对于交易树和收据树,树一旦建好,花多少时间编辑树就无所谓了,因为树一旦建好,就永远存在,不会改变。 所以交易树和收据树使用默克尔树。

对于状态树,每个节点基本上包含一个键值映射,其中键是地址,值包括每个账户的账户的声明、余额、随机数、代码和存储。 与交易历史不同,状态树需要经常更新:账户余额和账户随机数经常变化,更重要的是,新账户经常被插入,存储的密钥经常被插入和删除。 我们需要这样一种数据结构,它可以在一次插入、更新、删除操作后快速计算到树的根节点,而不用重新计算整棵树的Hash。 Patricia 树具有 Trie 树的快速查找特性,并且比 Trie 树更节省空间,因此在以太坊中,Merkel 树被转化为 Merkel-Patrica (MPT) 树。

以太坊有四种前缀树:

(1) 状态树包括地址到账户状态的映射。 状态树根节点的哈希值由区块保存(在stateRoot

字段),指示块创建时的当前状态。 整个网络只有一棵状态树。 该状态标识分布式计算机以太坊的硬盘驱动器。 它是从地址到帐户状态的映射。

(2) 交易树包含了一个区块中的所有交易信息。 通过区块头(在 transactionsRoot

region)保存着交易树根节点的哈希值。 每个区块都有一个交易树。 交易标志着系统中的状态转换。 它可以是资金转移、消息调用或合约部署。

(3) 交易回执树包含了一个区块中所有交易的回执信息。 也通过区块头(在 receiptsRoot

area)保存交易回执树根节点的哈希值; 每个区块都有对应的交易收据树。

(4) 账户存储树存储与某个智能合约相关的数据信息。 账户存储树根节点的哈希值由账户状态保存(在storageRoot

字段)每个账户都有一个账户存储树。 账户状态保存着每个以太坊账户的状态信息。账户状态也保存着账户状态树

storageRoot,其中包含帐户的存储数据。

在这里插入图片描述

MPT的优点是支持查找操作,可以通过键值沿树查找。 对于状态树,查找键值为账户地址; 对于交易树和回执树,查找键值为交易在已发布区块中的序号。

交易树和回执树只组织当前区块中的交易,而状态树包括所有账户的状态,不管这些账户是否与当前区块中的交易相关。

多个区块状态树共享节点,而交易树和回执树按区块独立。

交易树和收据树的用途:

为轻节点提供默克尔证明。 更复杂的搜索操作(例如:查找近十天的交易;近十天的众筹事件等) 18 ETH GHOST