其他分享
首页 > 其他分享> > 北京大学肖臻老师《区块链技术与应用》公开课02

北京大学肖臻老师《区块链技术与应用》公开课02

作者:互联网

14-ETH-以太坊概述


  1. 数据结构和数学机制
  2. 挖矿算法:POW, POS
  3. 智能合约

15-ETH-账户


账户模式

16-ETH-数据结构


目标:

实现账户地址到账户状态的映射
a d d r e s s → s t a t e address \to state address→state
​ add:160bits 表示为40个16进制数

​ 状态:外部账户和合约账户的状态

数据结构(MPT)

长度都是40,分支最大为16

tree:字典树

  1. trie中每个节点的分支数目取决于Key值中每个元素的取值范围
  2. trie查找效率取决于key的长度。
  3. 理论上哈希会出现碰撞,而trie上面不会发生碰撞。不同地址肯定就不会碰撞
  4. 给定输入,无论如何顺序插入,构造的trie都是一样的。
  5. 更新操作的局部性好

Patricia trie(Patricia tree)

MPT

Merkle Patricia tree

Modified MPT

以太坊采用的数据结构
在这里插入图片描述

每次产生一个新的区块,新建一个MPT,但新MPT只会新增修改内容,其余部分以及原来内容都保留,然后引用未修改部分。

在这里插入图片描述


Block Header

在这里插入图片描述

Gaslimit:区块中所有交易能够消耗的汽油上限

类比比特币对一个区块大小1M的限制


区块结构

在这里插入图片描述

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


17-ETH-交易树和收据树


18-ETH-GHOST协议


出块时间10几秒,出块时间过高带来了一些问题。


19-ETH-挖矿算法


莱特币挖矿算法基本思想

  1. 设置一个很大的数组,按照顺序填充伪随机数。

    因为哈希函数的输出我们并不能提前预料,所以看上去就像是一大堆随机的数据,因此称其为“伪随机数”。

    Seed为种子节点,通过Seed进行一些运算获得第一个数,之后每个数字都是通过前一个位置的值取哈希得到的。
    可以看到,这样的数组中取值存在前后依赖关系

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zhP2KNcK-1623678078250)(Untitled.assets/20200228171425644.png)]

  2. 在需要求解Puzzle的时候,按照伪随机顺序,从数组中读取一些数,每次读取位置与前一个数相关。例如:第一次,从A位置读取其中数据,根据A中数据计算获得下一次读取位置B;第二次,从B位置读取其中数据,根据B中数据计算获得下一次读取位置C;

    在这里插入图片描述


以太坊

以太坊伪代码

  1. 生成cache

在这里插入图片描述

  1. 通过cache生成1G的大数据集

    基本思想,按照伪随机顺序读取cache中256个数

在这里插入图片描述

在这里插入图片描述

  1. 矿工挖矿,轻节点验证

    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

20-ETH-难度调整


前文中介绍了比特币难度调整是每隔2016个区块调整难度,从而达到维持出块时间10min的目标。而以太坊则与之不同,每个区块都有可能会进行难度调整。以太坊难度调整较为复杂,存在多个版本,网络上存在诸多不一致,这里遵循以代码逻辑为准的原则,从代码中查看以太坊难度调整算法。

以太坊难度调整

在这里插入图片描述

在这里插入图片描述

出块间隔除9,然后向下取整

难度炸弹

从旁观者角度来看,挖矿消耗了大量电力、资金等,如果转入放弃挖矿,必然是一件好事。但从矿工的角度,花费了很大精力投入成本购买设备,突然被告知“不挖矿了”,这必然是一件很难接受的事情。而以太坊本身为一个分布式系统,其转入POS必须经过系统中大多数矿工认可才行,如果届时矿工联合起来转入POS,那么这一设计初衷就成了一江流水。
因此,以太坊在设计之初便添加了难度炸弹,迫使矿工转入POS。那么 如何促使矿工自愿升级软件,而非坚持POS呢?

在这里插入图片描述

在上面难度炸弹的公式中,有人应该注意到了第二项中的fake block number,该数仅仅为对当前区块编号减去了三百万,也就是相当于将区块编号回退了三百万个。那么,在前三百万个区块的时候,这个fake block number就是负数吗?
答案是否定的。实际上,在以太坊最初的设计中,并没有第二个公式。也就是说,最初就是简单地直接用区块编号除以100000。而在转入权益证明时间节点一再推迟后,以太坊系统采取了将区块编号回退三百万个区块的方法来降低挖矿难度,当然,为了保持公平,也将出块奖励从5个以太币减少到了3个以太币,这也是fake block number这一项出现的原因。

以太坊发展

在这里插入图片描述

具体代码实现

  1. 难度计算公式
    bigTime为当前区块时间戳,bigParentTime为当前区块的父区块时间戳。

在这里插入图片描述

  1. 基础部分计算

    在这里插入图片描述

  2. 难度炸弹计算

    在这里插入图片描述

    为什么不是减去3000000,而是2999999?
    因为这里判断的父区块号,而公式中是根据当前区块来算的。


21-ETH-权益证明


以太坊拟采用的权益证明

以太坊中,准备采用的权益证明协议为Casper the Friendly Finality Gadget(FFG),该协议在过渡阶段是要和POW结合使用的。

22-ETH-智能合约


智能合约:运行在区块链系统上的一段代码,代码逻辑定义了合约内容。智能合约编写代码为Solidity,其语法与JavaScript很接近。

先执行合约还是先挖矿:先执行,不执行怎么得到块头里的根哈希值。

没有挖到矿:无任何收益,但不验证本地三颗树无法更新,以后无法挖矿,



在这里插入图片描述


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HG3gpRsu-1623678248779)(22-ETH-智能合约.assets/image-20210614143727073.png)]


image-20210614110707924

第一版问题:transer报错的话,所有人的交易就全回滚,没有人能够收到钱。

比如返回给合约账户,但其没有定义fallback函数,就会回滚

image-20210614112906644

问题:重入攻击

解决方法:先清零,后转账。你调用合约的时候,对面合约有可能返回来调用你的合约并修改状态

image-20210614164522054

还有一种修改方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BsQgNxdR-1623678248781)(22-ETH-智能合约.assets/image-20210614165130307.png)]


img
在这里插入图片描述

在这里插入图片描述

和call()调用基本一致,区别在于其并不会切入被调用合约的上下文中。

在这里插入图片描述

23-ETH-TheDAO


比特币实现了去中心化的货币,以太坊实现了去中心化的合约

DAO: Decentralized Autonomous Organization 去中心化自治组织

24-ETH-反思


智能合约的反思

25-ETH-美链


运算溢出,导致amount很小,这样账户自己只减了很少的币,却给其他人转了很多币,相当于凭空产生了很多币

在这里插入图片描述

26-总结


标签:02,区块,以太,公开课,调用,智能,哈希,肖臻,合约
来源: https://blog.csdn.net/qq_20493631/article/details/117913224