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

学习视频来自:北京大学计算机系肖臻区块链学习视频
关于比特币部分的介绍可以看这篇文章
比特币部分01-13

文章目录

    • 14 ETH 以太坊概述
    • 15 ETH账户
    • 16 ETH状态树
    • 17 ETH交易数和收据树
    • 18 ETH GHOST

14 ETH 以太坊概述

这节课对以太坊做了概述性的介绍,重点讲述以太坊相比于比特币的重大改进,例如基于ghost协议的共识机制、工作量证明中使用的mining puzzle的设计、智能合约(smart contract)的概念和内涵等。

14.1 BTC与ETH
BTC和ETH为最主要的两种加密货币,BTC称为区块链1.0,以太坊称为区块链2.0。之前文章中提出了比特币设计中存在某些不足,以太坊便对其进行了改进。比特币和以太坊主要区别有以下几点:

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

14.2智能合约
首先,讨论去中心化货币。货币本身由政府发行,政府公信力为其背书,BTC通过技术手段取代了政府的职能。
现实生活中,我们经常提到“契约”或“合约”。合约的有效性也是需要政府进行维护的,如果产生 纠纷需要针对合法性合同进行判决。ETH的设计目的就是,通过技术手段来实现取代政府对于合约的职能。
那么,去中心化的合约有什么好处?
若合同签署方并非一个国家,没有统一的司法部门(如:众筹)。如果可以编写无法修改的合约,所有人只能按照相关参与方执行,无法违约。

15 ETH账户

本讲介绍以太坊的设计理念、对比了以太坊中account-based ledger与比特币中transaction-based ledger两种方案的优缺点以及由此带来的对double spending等安全攻击的解决方案

15.1 BTC与ETH账户交易

BTC系统是基于交易的账本,系统中并未显示记录账户有多少钱,只能通过UTXO进行推算。优点是隐私保护比较好 。但弊端是使用起来较为别扭,与我们日常生活出入很大。

A转给B钱的时候,需要说明币的来源。实际中只需要存钱说明来源,花钱则不用。此外,账户中的钱在花的时候,必须一次性全部花出去。

如图,B收到A的10个BTC,他想要给C3个BTC,如果按照1中方式,其余7个比特币会以交易费的形式给挖出区块的矿工。
因此,为了避免这种情况,便吸引采用2中方式,将3个BTC转给C,将剩余7个BTC转到自己的另一账户D上面。
【转载+整理】区块链学习笔记-北大肖臻老师课后笔记(14-26)——ETH篇_第1张图片

Ethereum 采用的是账户模式,每个地址类似一个银行账户,转入转出记录都在同一个账户上,使用独特的参数Nonce来标记交易的先后顺序,系统中显示记录每个账户以太币的数量,转账是否合法只需要查看转账者账户中以太币是否足够即可,同时也不需要每次全部转账。以太坊基于账户的模式,天然地防范了双花攻击。然而,以太坊发这种模式也存在缺点,这种模式存在重放攻击的缺陷。A向B转账,过一段时间,B将A的交易重新发布,从而导致A账户被扣钱两次。

重放攻击(replay attack)应该如何避免?
答:给账户交易添加计数器记录该账户交易过多少次,转账时候将转账次数计入交易的内容中。系统中全节点维护账户余额和该计数器的交易数(nonce),因为有A的签名,收款方无法篡改nonce值,从而防止本地篡改余额或进行重放攻击。
【转载+整理】区块链学习笔记-北大肖臻老师课后笔记(14-26)——ETH篇_第2张图片

试问:如果有人篡改怎么余额怎么办?比特币每一笔交易都需要说明来源所以无法伪造,以太坊不需要说明来源,如何防范这个问题?
答:每个用户的余额是系统中全节点需要保存维护的状态,下节课将会讲状态树,状态里保存的一个重要的域也就是balance你的余额,这个余额是没有办法篡改的,除非所有全节点都认为你的余额发生了变化

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

外部账户:类似于BTC系统中公私钥对。存在账户余额balance和计数器nonce
合约账户:并非通过公私钥对控制。(不能主动发起交易,只能接收到外部账户调用后才能发起交易或调用其他合约账户)其除了balance和nonce之外还有code(代码)、storage(相关状态-存储)

合约账户如何调用?
答: 创建合约的时候会返回一个地址,知道这个地址就可以调用合约。调用过程中,代码不变但状态会发生改变

15.2 UTXO与账户模型比较
建议看看这篇文章,写的很清晰比特币和以太坊技术原理对比之账户模型
UTXO模型前面已经讲过第五章有介绍
账户模型:

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

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

UTXO优点

  • 私密性比较强,理论上可以为每一笔输出设置一个地址。
  • 无需维护余额等状态值。
  • UTXO是独立数据记录,可以通过并行极大的提升区块链交易验证速度。
  • 无需关心事务问题,只需要关心输出脚本即可。
  • UTXO无法分割,每次交易都需要多个输出,分别为支出与找零。

账户模型优点

  • 可以快速获取账户的余额,而比特币需要将指定地址所拥有的所有UTXO中的未花费交易总值整合。
  • 节省空间,因为每笔交易只有一个输入一个输出。
  • 可以较容易的实现图灵完备的智能合约。

16 ETH状态树

这一节以及后面的17节以太坊的数据结构肖老师主要结合一些源码讲解,有点略难懂,这有一篇文章讲的还不错建议视频听不太懂的可以看看
以太坊数据结构篇

这节课深入讲解了以太坊中的数据结构Merkle Patricia Tree (MPT)。首先带领大家思考以太坊为什么不能直接照搬比特币中的数据结构?然后介绍以太坊中实际使用的状态树的数据结构及其具体的构建方式,同时带领大家思考一些设计上的问题,例如那为什么要把数据做序列化之后再保存在树里呢?为什么要维护账户的历史状态等。

以太坊的4棵树 状态树 交易树 收据树 账户存储树
太坊区块数据有三棵树,分别为状态树,交易树和收据树

账户存储树是保存与账户相关联数据的结构。该项只有合约账户才有,而在 EOA 中, storageRoot 留空、 codeHash
则是一串空字符串的哈希值


16.1 ETH状态树
在以太坊中,账户地址为160位,表示为40个16进制数额。状态包含了余额(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时候很大可能在Tree中间,发现其必须进行重构。所以Sorted Merkle Tree插入、删除(实际上可以不删除)的代价太大。

16.2 tree

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

Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树。
Trie树可以利用字符串的公共前缀来节约存储空间。如下图所示,该trie树用15个节点保存了5个字符串
【转载+整理】区块链学习笔记-北大肖臻老师课后笔记(14-26)——ETH篇_第3张图片

Trie树的基本性质:

  • 根节点不包含字符,除根节点以外每个节点只包含一个字符。
  • 从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串。
  • 每个节点的所有子节点包含的字符串不相同。

Trie树的优缺点:
缺点:

  1. 当 hash 函数很好时,Trie树的查找效率会低于哈希搜索。
  2. 空间消耗比较大

优点:

  1. 插入和查询的效率很高,都为O(m),其中 m 是待插入/查询的字符串的长度。
  2. Trie树中不同的关键字不会产生冲突。
  3. Trie树只有在允许一个关键字关联多个值的情况下才有类似hash碰撞发生。
  4. Trie树不用求 hash 值,对短字符串有更快的速度。通常,求hash值也是需要遍历字符串的。
  5. Trie树可以对关键字按字典序排序。

trie的缺点也很明显

trie的存储浪费。很多节点只存储一个key,但其“儿子”只有一个,过于浪费。因此,为了解决这一问题,我们引入Patricia tree/trie

16.3Patricia trie(Patricia tree)
Patricia trie就是进行了路径压缩的trie。如上图例子,进行路径压缩后如下图所示:
【转载+整理】区块链学习笔记-北大肖臻老师课后笔记(14-26)——ETH篇_第4张图片
需要注意的是,如果新插入单词,原本压缩的路径可能需要扩展开来。那么,需要考虑什么情况下路径压缩效果较好?树中插入的键值分布较为稀疏的情况下,可见路径压缩效果较好。
在以太坊系统中,160位的地址存在2^160 种,该数实际上已经非常大了,和账户数目相比,可以认为地址这一键值非常稀疏。

Patricia优缺点:

优点:Patricia Trie相比Trie优点明显,减少了空间的消耗。

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

因此,我们可以在以太坊账户管理种使用Patricia tree这一数据结构!但实际上,在以太坊种使用的并非简单的PT(Patricia
tree),而是MPT(Merkle Patricia tree)

16.4 MPT(Merkle Patricia tree)
Merkle Tree 和 Balance Tree:
区块链和链表的区别在于区块链使用哈希指针,链表使用普通指针。
同样,Merkle Tree 相比 Balance Tree,也是普通指针换成了哈希指针

以太坊系统中,将所有账户组织为一个经过路径压缩和排序的Merkle Tree,其根哈希值存储于block header中。BTC系统中只有一个交易组成的Merkle Tree,而以太坊中有三个(三棵树)。
也就是说,在以太坊的block header中,存在有三个根哈希值。

根哈希值的用处:

  1. 防止篡改。
  2. 提供Merkle proof,可以证明账户余额,轻节点可以进行验证。
  3. 证明某个发生了交易的账户是否存在

以太坊中针对MPT(Merkle Patricia tree)进行了修改,我们称其为MPT(Modified Patricia tree)
下图为以太坊中使用的MPT结构示意图。右上角表示四个账户(为直观,显示较少)和其状态(只显示账户余额)。(需要注意这里的指针都是哈希指针)
【转载+整理】区块链学习笔记-北大肖臻老师课后笔记(14-26)——ETH篇_第5张图片
每次发布新区块,状态树中部分节点状态会改变。但改变并非在原地修改,而是新建一些分支,保留原本状态。如下图中,仅仅有新发生改变的节点才需要修改,其他未修改节点直接指向前一个区块中的对应节点。
【转载+整理】区块链学习笔记-北大肖臻老师课后笔记(14-26)——ETH篇_第6张图片
所以,系统中全节点并非维护一棵MPT,而是每次发布新区块都要新建MPT。只不过大部分节点共享。

为什么要保存原本状态?为何不直接修改?
答:为了便于回滚。如下1中产生分叉,而后上面节点胜出,变为2中状态。那么,下面节点中状态的修改便需要进行回滚。因此,需要维护这些历史记录。
【转载+整理】区块链学习笔记-北大肖臻老师课后笔记(14-26)——ETH篇_第7张图片
16.5以太坊中的数据结构代码
1.block header 中的数据结构
【转载+整理】区块链学习笔记-北大肖臻老师课后笔记(14-26)——ETH篇_第8张图片
2.区块结构
【转载+整理】区块链学习笔记-北大肖臻老师课后笔记(14-26)——ETH篇_第9张图片
3.区块在网上真正发布时的信息
【转载+整理】区块链学习笔记-北大肖臻老师课后笔记(14-26)——ETH篇_第10张图片

状态树中保存Key-value对,key就是地址,而value状态通过RLP(Recursive Length
Prefix,一种进行序列化的方法)编码序列号之后再进行存储。

17 ETH交易数和收据树

17.1区块数据结构
以太坊的区块是由区块头、交易列表和叔区块三部分组成。其中区块头包含块区号、块哈希、父块哈希等信息,其中State Root、Transaction Root、Receipt Root分别代表了状态树、交易树和交易树的哈希。除了创世块外,每个块都有父块,用Parent Hash连成一条区块链。如下图:
【转载+整理】区块链学习笔记-北大肖臻老师课后笔记(14-26)——ETH篇_第11张图片

17.2 交易数 状态树和收据树
交易树和收据树都是M(Merkle)PT,而BTC中都采用普通的MT(Merkle Tree)。
对于交易树和收据树来说,一旦树已经建立,花多少时间来编辑这棵树并不重要,因为树一旦建立了,它就会永远存在并且不会改变。所以交易树和收据树采用Merkel树。
对于状态树,每个节点基本上包含了一个键值映射,其中的键是地址,而值包括账户的声明、余额、随机数nounce、代码以及每一个账户的存储。不同于交易历史记录,状态树需要经常地进行更新:账户余额和账户的随机数nonce经常会更变,更重要的是,新的账户会频繁地插入,存储的键也会经常被插入以及删除。我们需要这样的数据结构,它能在一次插入、更新、删除操作后快速计算到树根,而不需要重新计算整个树的Hash。Patricia树具有Trie树快速查找特点,并且比Trie树更加节省空间,所以以太坊中,对Merkel树改造成Merkel-Patrica(MPT)树。

以太坊有四种前缀树:
(1)状态树包括了从地址到账户状态之间的映射。状态树的根节点哈希值由区块保存(在 stateRoot
字段),它标示了区块创建时的当前状态。整个网络中只有一个状态树。 状态标识了以太坊这台分布式计算机的硬盘。它是从地址到账户状态的映射。
(2)交易树包含了一个区块中的所有交易信息。由区块头(在 transactionsRoot
区域)保存交易树的根节点哈希值。每个区块都有一棵交易树。 交易标示了系统中的状态转移。它可以是资金的转移、消息调用或是合约的部署。
(3)交易收据树包含了一个区块中所有交易的收据信息。同样由区块头(在 receiptsRoot
区域)保存交易收据树的根节点哈希值;每个区块都有对应的交易收据树。
(4)账户存储树保存了与某一智能合约相关的数据信息。由账户状态保存账户存储树的根节点哈希值(在 storageRoot
字段)每个账户都有一个账户存储树。 账户状态保存着每个以太坊账户的状态信息。账户状态同样保存着账户状态树的
storageRoot,后者包含了该账户的存储数据。

【转载+整理】区块链学习笔记-北大肖臻老师课后笔记(14-26)——ETH篇_第12张图片
MPT的好处是支持查找操作,通过键值沿着树进行查找即可。对于状态树,查找键值为账户地址;对于交易树和收据树,查找键值为交易在发布的区块中的序号。

交易树和收据树只将当前区块中的交易组织起来,而状态树将所有账户的状态都包含进去,无论这些账户是否与当前区块中交易有关系。
多个区块状态树共享节点,而交易树和收据树依照区块独立。

交易树和收据树的用途:

  1. 向轻节点提供Merkle Proof。
  2. 更加复杂的查找操作(例如:查找过去十天的交易;过去十天的众筹事件等)

18 ETH GHOST

你可能感兴趣的:(以太坊,区块链,eos,机器学习,编程语言)