区块链复习

文章目录

1. 比特币

主要关注 密码学,数据结构,共识机制;
其他的生态方面的涉及不多

1.1 区块链介绍

区块链是载体/平台,比特币是产品
比特币:一种建立在计算机技术,密码学及经济学基础上的货币形式。(加密数字货币)
区块链的定义:按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构。

  • 区块链是一个分布式的账本数据库,网络中的每个节点都有一本完整的账本。
  • 无法篡改
  • 去中心化,降低成本,提高效率。

区块链特性:

  • 匿名性
  • 一致性
  • 分布式
  • 不可篡改性

区块链的分类:

  • 公有链:
    • 链上的节点向全世界每一个人开放,任何人都可以在自己设备上运行公共节点,验证区块链中的交易,参与到共识的过程中,确认当前加入链上的区块以及当前区块链的状态。任何用户都可以向链上发起交易,查看链上的任意数据。是一种完全去中心化的机制的区块链。
    • 比较有名的公链是比特币,以太坊。
  • 私有链:
    • 私链中对链上的读写权限由单一的组织来控制,可选择性地开放给特定群体,去中心化程度低,交易速度快。常用于一些私人企业的数据管理,审计中。
  • 联盟链:
    • 联盟链由一些特定机构作为节点参与到区块链的共识机制中,用户对链上数据的读写权限由这些节点控制。用于机构之间的合作场景中。

1.2 比特币密码学

1.2.1 密码学基础
  • 对称加密:使用相同的密钥加密大量数据
  • 非对称加密:采用不同的密钥加密少量数据用于交换对成密钥,用于签名验签。

比特币只采用了两种最简单的密码学技术:哈希与数字签名。

  • 哈希:表示大量数据的唯一摘要值。原数据的少量改动会在哈希值中产生不可预知的大量更改,可以作为数据的验证凭证。(HASH可以保证数据的完整性,正确性。)
  • 数字签名:信息的发送者(掌握私钥)能产生的别人无法伪造的一段数字串,且可以通过其发布出去的公钥验证是由他发送的。(数字签名:所有者确权)
1.2.2 哈希函数 HASH FUNCTION

定义:HASH函数是将任意长度的消息映射成一个较短的定长输出信息的函数。
如下形式:h=H(M),M是变长的消息,h是定长的Hash值。
目的:为文件,消息或其他的分组数据产生”数字指纹“

密码学哈希函数,特性:

  • 输入可以为任意大小的string
  • 输出固定大小(长度),e.g.:256 bit-long
  • 有效计算:特定的输入字符串,合理时间内输出-----O(n)复杂度

为了达到密码学安全,还需如下特性:

  • 碰撞阻力(collision-resistance):如果无法找到两个值,x与y,x!= y,而H(x)=H(y),那么称哈希函数H具有碰撞阻力。(MD5无法防止碰撞,不适合用于安全认证)
  • 隐秘性(hiding):称哈希函数H具有隐蔽性,如果:当其输入r选自一个符合高阶最小熵的概率分布,在给定H(r||x)时,来确定x是不可行的。
    + 保证:如果仅仅知道哈希函数的输出y=H(x),则没有可行的办法算出输入值x
  • 谜题友好(puzzle-friendliness):如果对于任意n位输出值y,假定k选自高阶最小熵发呢不,如果无法找到一个可行的方法,在比2^n小很多的时间内找到x,保证H(k||x)=y成立,那么我们称哈希函数H为谜题友好。

1.2 比特币密码学基础

比特币没有账户,但用户有”钱包<public key, secret key>,非对称加密
加密货币不加密,私钥公钥的作用:

  • 签名Sign(message, sk) = Signature
  • 验证verify(message, Signature, pk) = True/ False
1.2.1 数字签名方案
  • 由三个算法组成:

    • (sk, pk) := generateKeys(keysize)
      • 把keysize作为输入,来产生一对公钥和私钥
      • 私钥sk被安全保存,并用来签名
      • 公钥pk是人人都可以找到的,拿到它用来验证你的签名。
    • sig := sign(sk, msg) 签名过程
      • 把一段消息message和私钥sk作为输入。输出是签名sig
    • isValid := verify(pk, message, sig), 验证过程
      • 通过把一段消息和签名消息与公钥作为输入
      • 如果返回是真,证明签名属实;否则,证明签名的消息为假。
    • 实践中:
      • 对要签名的信息大小有限制,所以使用Hash函数,因为哈希函数的输出是定长的。
  • 在比特币中"公钥即身份":

    • Bitcoin用户自己开账户------<pk,sk>
    • 其他用户看到一个签名,并被一个pk验证了:pk就可以代表一个人的身份。
    • 比特币中用户的身份:地址 := Hash(pk || x)
  • 比特币可以提供去中心化身份管理

    • 随时定制新的随即身份: new<pk , sk> = generateKeys(keysize)
    • 具有匿名性:一个人可以有多个<pk, sk>,随便使用哪一个身份转账

高飞币:

  • 简单规则一:用户可以随时创建新币
  • 简单规则二:用户可将币转给其他人,必须通过密码程序完成。
  • 安全隐患:
    • double spending:一个人可以同时签署多分transfer
    • 用户可以无限制铸币

财奴币:

  • 解决了”双花问题“
  • 设计“仅增账本”:保证已经写入账本的数据都会被永久保留下来。

1.3 比特币的数据结构

高飞币使用"哈希指针"
财奴币使用的“仅增账本”

1.3.1 哈希指针
  • 正常指针:指示数据的位置 *ptr= &data
  • 哈希指针:不仅指示数据的位置,还可以验证数据是否有被篡改过。 *ptr = H(Data)
1.3.2 比特币的区块

在任何区块链中的第一个块都称为创世区块,创世区块是静态编码在客户端软件中的,不可被修改。

交易需要得到验证和执行才能够正式被区块链系统确认,如果每一个交易都要被单独确认将会带来巨大的开销,所以比特币系统中采用了批量确认交易的方法,形成区块。
区块:

  • 区块链系统理解为一个数字账本,那么一个区块便是账本上的一页。
  • 记录了相对独立的一批交易记录,并在对这些交易进行一次确认
  • 组成:
    • 区块头:包含了这个区块的所有信息
    • 区块体:存放交易等详细数据

区块头(block header):

  • 定义与作用:
    • 存放区块信息
    • 作为区块的摘要在网络间进行传输
  • 组成:
    • 区块版本 4B
    • 前一个区块的哈希 32B
    • 交易哈希:交易列表的哈希值 32B
    • 产生的时间 4B
    • 难度信息:区块产生的门槛难度 4B
    • Nonce值:用于动态调整以产生满足门槛条件的合法区块 4B

区块身:交易列表,组织成默克尔树形式。

1.3.3 交易
  • 账户
    • 账户是区块链系统中数字货币的所有者,也称为地址。
    • 账户之间的货币转移通过交易来实现,成为转账。
  • 账户系统的经典模型
    • UTXO(未花费的交易输出),应用于比特币
    • 账户状态转移,应用于以太坊
  • 账户余额:由UTXO计算得到。
  • 比特币的交易类似于借据交易
    • 在这个过程中,结局上的借款数额虽然是可以继续划分的,但是借据本身是一个不可划分的整体,而比特币的交易也是类似的,交易分为输入和输出两个部分
    • 交易的输入表示了交易的比特币从哪里来
    • 交易的输出标识了交易中的这些比特币在交易结束后往哪里去。
    • 交易中的比特币数额可以划分到很小的单位,但是交易的输入和输出本身都是单一的整体,不可划分。
  • 交易的过程:
    1. 假设现在Alice要想Bob进行转账一个BTC,那么她必须使用一个交易来完成这个转账的动作。
    2. 首先,Alice会将她所拥有的1个BTC放入到交易的输入中,再将这个交易的输出标记为Bob所有。
    3. 执行完这一交易后,Alice就失去了放入输入的这一个BTC的所有权 ,而Bob获得这个交易输出的BTC的所有权。
    4. 在这个过程中,比特币系统中的所有参与者共同充当了公证人的角色,而密码学的原理充当了原本借据上具有法律效力的印章和签名。
  • 交易可以有多个输出
  • 交易的输入不能凭空产生,必须引用和解锁一个已完成的其他交易的一个输出
  • 交易的组成:
    • 交易输入由两部分组成------使用到的前一个交易输出的引用和用于解锁这个输出的一个解锁脚本。
    • 其中对输出的引用通过交易的哈希值和输出在这个交易中的位置决定,而解锁脚本通常使用了用户的密钥生成,只有本人才能够使用解锁脚本。
UTXO模型
  • 在比特币中,还没有花费出去的交易才能够真正地反映出一个用户拥有的比特币,称之为未花费交易输出,简称为UTXO。
  • 可回溯的交易链条:我们可以对任意比特币不断回溯,直到最初产生比特币的起点。
1.3.4默克尔树

Merkle树是一种以哈希形式组织大量数据的方法,并用单个哈希表示该数据。

1.4 比特币的引擎----共识机制

1.4.1 共识

共识:指的是在不可信的节点之间对指定数据的最终状态达成一致的一种处理过程。
分布式共识:在多个节点之间获得一个共同的状态/值,尽管有些节点存在故障。

分布式系统达到一致性的过程,应该满足:

  • 可终止性:一致性的结果在有限时间内能完成
  • 约同行:不同节点最终完成决策的结果是相同的。
  • 合法性:决策的结果必须是某个节点提出的提案

对应着三个分布式系统的要求:

  • 活性:系统的可用性
  • 安全性:任何给出的结果必定是达成共识的
  • 正确性:正确的共识结果
1.4.2 共识机制

共识机制:分布式系统中的大多数或全部节点所执行的来同意一个提议的状态或值的一组步骤。
共识机制的作用:

  • 在分布式系统中解决错误
  • 允许分布式系统达到最终的状态

共识机制的要求:

  • 一致性:诚实(好)的节点决定相同的值
  • 可结束性,活性:诚实的节点共识过程的执行是可终止的。
  • 有效性,正确性:被统一的值等于由至少一个诚实节点提出来的值。
  • 错误容忍:共识机制应该能够在出现故障或恶意节点时运行。
  • 节点的诚实性:在一个共识循环中,任何节点都不能多次做出决策
1.4.3 共识机制的类型

共识机制大致分为两种:

  • BFT-based(拜占庭错误容忍)
  • Leader Election-based共识机制 (选举)

BFT-based:

  • 没有算力密集操作
  • 依赖于一个简单的节点方案
  • 最后,当接收到一定数量的消息时就会达成协议

Leader Election-based:

  • 要求节点在领导人选举中竞争
  • 只有获胜的节点才能提出最终值
1.4.4 区块链的共识机制

是区块链的支柱,通过一个称为挖掘的可选过程提供分散控制。

不同区块链需要不同的共识机制:

  • 公有链
    • 几乎人人都可以参与,每个参与者都是匿名
    • 参与者之间不存在任何信任
    • 采用算力敏感的"挖矿"共识 作为奖励机制
  • 联盟链/私有链
    • 在一组已知的,已识别的,且经常经过审查的参与者中进行区块链的操作。
    • 节点具有一定的信任基础
    • 不需要算力敏感的共识机制,BFT类型的共识机制比较适合
1.4.5 为什么比特币需要共识
1.4.5.1 拜占庭将军问题与容错算法
1.4.5.2比特币为何需要共识机制

共识机制中常见的攻击:

  • 双花攻击:将导致每个节点记录的账本信息不一致
    • 对抗双花攻击:同等验证。
    • 提交者向其他用户提交一条交易信息,其他用户进行投票,当获得一定数目投票后,大家同意将交易信息进行保存。-----保证所有结点存储相同的交易账单。
  • 多重身份攻击/女巫攻击:多重身份意味着多重投票的权利。且比特币作为无中心登记的匿名服务,创建多重身份代价极低。
    • 可以实行多重身份,从而允许恶意者的双花行为
    • 对策:取代用身份投票的机制,采用资源成本进行投票,提高作恶代价。
1.4.5.3比特币的工作量证明机制是什么

比特币共识的思路:工作量证明(Proof of work):不容易完成,极易验证。
比特币的共识机制:基于“工作量证明”的挖矿
挖矿:是新块被加入到区块链中的过程。
通过消耗资源解决一个问题获得投票资格(即记账权),记账权必须通过花费计算资源来获得,比如说通过蛮力解决一个问题,通过记账奖励鼓励投入资源。请添加图片描述
请添加图片描述
POW难题设计必须满足以下条件:

  • 不容易完成(表明需要工作量)
  • 容易验证(其他节点可以快速确认确实付出了工作量)
  • 工作过程公平(任何节点没有完成工作的捷径)
  • 具有随机性(能力越强,只能保证率先完成概率越大)
    区块链的共识机制:一种多方协作机制,用于协调多参与方达成共同接受的唯一结果,且保证此过程难以被欺骗,且保持稳定运行。

1.5 挖矿与区块链分叉

1.5.1 挖矿背后的数学
1.5.1.1 挖矿的概率分析

全网miners的伯努利试验:是一个泊松过程。
当10分钟之后没有出块,全网所有矿工结点之后再经过多久可以出块?----还是10分钟.(保证了挖矿的公平性)
算力强的矿级和算力弱的矿机在每一次尝试解题的过程中,要具有相同的成功几率。

1.5.1.2 挖矿的难度设置

难度:是挖到一个新块的难度的一个测量。
难度越高暗示着将花费更多的算力来挖同样数量的区块-----使网络对抗攻击更安全。

难度的调整与检测到的挖矿算力相关。每隔2016个块将会调整一次,来强制2个连续块之间的平均时间保持在十分钟左右。
通过调整挖矿难度,使得出块时间相对稳定,让分叉攻击更难。

1.5.2 分叉
1.5.2.1 一般的分叉

假如全网同时有两个合法提案在网络中进行广播,收到的用户进行验证后,会基于用户认为的最长链基础上继续难题的计算。因此,系统
中可能出现链的分叉(Forking)
解决方案:比特币网络最长链机制。

1.5.2.2 硬软分叉

硬分叉:区块链产生永久性分歧,在新共识规则发布后,部分没有升级的节点无法验证已经升级的节点产生的区块,通常硬分叉就会产生。(规则改变:产生一个不同的分链)

软分叉:当新共识规则发布后,没有升级的节点会因为不知道新共识规则下而产生不合法的区块,就会产生临时性分叉。

1.5.2.3 恶意分叉

分叉攻击------最长链机制带来的副作用。(为了double spending发动51%攻击)

1.5.3 比特币安全机制的保障
1.5.3.1 挖矿的安全性分析
1.5.3.2 自私挖矿

自私挖矿:一个自私的矿工隐藏了他刚刚开采的新区块,并在这个隐藏的区块之后继续开采下一个区块。
这样就只有他自己直到新开采了一个块,而别人都在按照旧的前一个区块进行挖矿。一旦发布出去之后,大家都会在新区块后边平等地开始竞争。
危险是:不发布的快有可能被浪费掉,所以还u如赶紧发布出去获得当前的出块奖励。如果一个矿工他的算力超过全网的三分之一,他很可能为了更多的收益而选择私自挖矿。

1.5.3.3 分叉攻击分析

发动分叉攻击只有在算力超过半数以上才可能成功。

1.6 bitcoin 社区 与 奖励

1.6.1 比特币社区

比特币网络是一个点对点的网络。

节点的作用:

  • 验证新区块
  • 存储和保存区块的交易历史记录
  • 更新区块链中的其他节点以确保区块链上的所有节点都具有最新信息。

两种典型的节点:

  • full nodes(全节点)
    • 托管整个区块链历史记录的单个副本,包括交易,时间戳和所有创建的块。
    • 负责全部功能:钱包,矿工,全区块链存储和网络路由功能
    • 需要更先进的计算能力和能量
  • SPV(轻节点/简单付款验证节点)
    • 下载钱包并连接到完整节点,以进一步验证存储在区块链上的信息
    • 它们的大小要小得多,并且仅保存部分区块链历史的信息。
    • 仅执行钱包和网络路由功能。
    • SPV客户端只需要下载所有区块的区块头,并进行简单的定位和计算工作就可以给出验证结论
    • SPV nodes能够以较小的代价判断某个支付交易是否已经被验证过了,以及得到了多少算力保护
  • 矿工节点
    • 挖矿节点只负责创建要添加到区块链中的区块,他们不负责未来区块的维护或有效性。

挖矿节点与全节点的关键不同之处:

  • 矿工
    • 通常通过coinbase获得奖励
    • 不一定托管所有历史交易以识别新的交易的有效性
    • 一个急功近利的miner有可能为了竞争出块奖励而打包"空块"(不包含任何交易的block)
  • 全节点
    • 没有奖励
    • 是P2P网络的志愿者
    • 他们被激励去保存和进一步分散区块链。
    • 一个全节点不需要矿工的存在。

在这里插入图片描述
比特币社区:矿池:采矿过程消耗能源,矿工在购买所需的计算机电源时通常具有很高的启动成本。- 这导致了矿池的普及,其存在是为了汇集来自多个来源/用户的哈希率。
因为有矿池的存在,所以社区中的矿工们汇聚起较高的哈希率,更有可能挖到矿。

1.6.2 挖矿的激励与策略

矿工得出块奖励包含两部分:

  • 出块奖励blobk reward(6.25 bitcoin)
  • 交易手续费:所有在新提出的块的交易费用

挖矿的策略:

  • 打包哪些交易:矿工可以选择将哪些交易放进他的区块里,默认的规则是选择那些交易费用比较高的交易
  • 对哪一个区块进行挖矿运算:矿工可以选择在哪个区块上进行挖矿。默认的做法是在最长的那条区块链上继续挖下去
  • 如何在同一高度的多个区块中做选择: 如果两个不同的区块在同一时间被宣布发现,这就造成了一个区块的分叉,每个分叉的区块都是可以被延续下去的,因为它们都 符合最长区块链原则。矿工必须选择其中一个区块接龙下去。默认的做法是选择最先被监听到的那一个区块。
  • 什么时候宣布新的区块?矿工找到一个有效区块之后,他们要决定什么时候向比特币网络宣布这一个区块。 – 默认的做法是立刻宣布,但他们也可以选择等一下 —— 自私挖矿 or block withholding attack

如何防范51%攻击:
6个确认机制:

  • 如果真有这样的51%攻击,建议是收款方等到全网的 6 个区块确认之后再交付商品,按照10分钟一个区块的速度,只需一个小时就可以保证你的钱是否基本肯定收到
  • 6个区块后再对全网进行篡改的难度很高
  • A tradeoff: 确认的块数不一定是6,可以为了更安全而采取更大的确认块
    数,但是需要等待的时间也越长

1.7 匿名监管网络

1.7.1 比特币网络

区块链建立在三项关键技术之上:密码学。P2P网络,博弈论。
P2P 网络结构:
结构化网络:

  • 结构化网络的主要优势:快速搜索特定的信息。
  • 结构化P2P网络通过分布式哈希表(DHT)克服了非结构化网络的局限性。

Distributed Hash Table (DHT)

  • DHT就是一种分布式的存储和寻址技术。
  • 通过DHT数据结构它把KEY 和 VALUE用某种方式对应起来。使用hash()函数把一个KEY值映射到一个index上:hash(KEY) = index。这样就可 以把一个KEY值同某个index对应起来。然后把与这个KEY值对应的 VALUE存储到index所标记的存储空间中。
  • 寻址过程:每次想要查找KEY所对应的VALUE值时,只需要做一次hash()运算就可以找到了。

比特币:非结构化点对点网络

  • DHT不适用于比特币:DHT要求所有节点都需要(或多或少)完整信息
  • 非结构化网络:围护结构没有开销
    • 不能保证flooding可以找到具有所需数据的对等体
    • flooding还会导致网络中出现大量流量,因此,此类网络通常具有非常差的搜索效率

在不靠谱的P2P网络上比特币节点的操作:

请添加图片描述
请添加图片描述

1.7.2 匿名

比特币账户的地址:公钥哈希值。
比特币使用匿名的原因:比特币是一个公链系统,一旦暴露身份,所有隐私不保。

1.7.3 监管

2. 以太坊(重头戏)

智能合约简介不用太仔细看,主要关注数据结构,跟比特币数据结构有什么不一样的
以太坊的状态树,用来干嘛的;交易树之类的;基本架构原理
以太坊的共识机制
跟比特币的nonce不一样,不一样的在哪里
以太坊的pow跟比特币的共识机制有什么不一样-----哈希算法不一致:具体什么不一样,具体怎么工作的!!!!必考

2.1 以太坊简介

比特币和以太坊是两种最主要的加密货币,比特币是区块链1.0,以太坊是区块链2.0

智能合约依赖于环境的可靠性

应用在区块链上的智能合约: 区块链是一种能使多方间达成状态一致的有效手段,那么将智能合约应用到区块链上就能使得智能合约具备更高的可靠性。

以太坊上的智能合约:以太坊在多个节点组成的点对点网络中,维护共同的区块链数据,通过区块链上的交易来进行智能合约的创建、调用、 结束等操作。由于多个节点所维护的区块链状态是一致的,因此,多个节点上所运行的智能合约的过程和结果也是一致的

以太坊是第一个支持智能合约的区块链系统,使用Ether作为加密数字货币。是生态社区最活跃的区块链系统。

2.2 以太坊区块数据结构

以太坊区块数据结构分为:区块头和区块体,打包一批执行后的交易。
区块头内容:

  • 记录以太坊状态的状态根
  • 交易列表,收据列表和叔块列表对应的哈希值
  • 最长不超过100KB的额外数据

区块体内容:

  • 交易组成的交易列表
  • 由交易执行信息组成的收据列表
  • 用于改进以太坊共识过程的叔块列表

2.3 以太坊的账户模型

账本状态在所有区块链节点分布式存储
地址的生成:对公要使用KECCAK256哈希算法,计算得到一个64位的16进制哈希值,截取这个哈希值的最后40位作为一个以太坊的地址。

账户结构:用户账户结构保存了用户地址对应账户的数据信息。包括:

  • 余额:记录了当前地址持有的以太币的数额,单位是Wei
  • Nonce:记录了这个地址创建以来累计发起的交易次数。

Nonce的作用:

  • 在以太坊的模型中,交易的合法性检验在于转账发起者的账户余额。
  • 如果没有其他手段来使得发起过的交易失效,那么这个交易将可以被无限次的重新发起而不需要发起者的同意,因为发起者的签名对于交易始终是有效的。

Nonce计数器:计算 交易的次数和序列

  • 只有账户的Nonce和交易的Nonce能够对应的情况下,交易才是合法的
  • 当一个交易执行完毕后,账户的Nonce值增加,原本执行完毕的交易中的Nonce值就无法与现在账户的Nonce值相匹配。
  • 修改相对应的Nonce值意味着原有的交易的签名失效,需要发起者的重新签名。

Nonce的其他作用:

  • 控制账户发起的交易的顺序,从而实现一些相对复杂的功能。
  • 通过重复提交一个相同Nonce值的交易来使得一个已经提交但是尚未被确认的交易是不合法的,从而实现一定程度的撤销功能

以太坊有两种账户:

  • 外部账户:有账户余额,无代码,能触发交易,由私钥控制
  • 合约账户:有账户余额,有代码,能被触发执行智能合约代码,在智能合约创建后自动执行。

比特币的UTXO模型更有利于隐私保护,为什么以太坊还要使用账户模型呢?

  • 以太坊之所以要使用账户模型是为了支持智能合约,要求参与者要有稳定的身份。
  • 比如智能合约可以实现一些金融衍生品,利于参与者进行投资。

2.4 以太坊的状态树

以太坊的账户状态:

  • Nonce:累计发起的交易次数
  • Balance:账户余额
  • CodeHash:智能合约代码的哈希指
  • StorageRoot:合约存储树的根节点哈希值(维护智能合约状态)

合约存储树:

  • 合约账户下的存储也是一个映射表,它记录了从存储地址到存储值的一个映射关系
  • 在合约账户的数据结构中存储了这个映射表的哈希值,这个哈希值被称为存储根,它同样是由一颗MPT来维护和计算的。

以太坊状态如何维护?

Merkle Patricat Trie(MPT)
背景:如果把单词和箭头换成哈希值,然后计算每个中间节点的哈希值,便得到了MPT。
MPT的构造:

  • 按照所有数据的地址(或者键值)来构建一颗 压缩前缀树。
    • 由于地址是以16进制为编码的,我们使用0123456789abcdef作为每个编码的单元
  • 按照构建得到的压缩前缀树,从叶子节点开始,逐步计算每一额层的哈希值,并将其汇合到父亲节点中,与Merkle Tree的计算过程类似。

以太坊用来记录各个账号的状态的树,树的键是账户地址,值是账户的详细信息。
以太坊采用Modified Mekkle Patricia Trie,引入三种节点。

局部更新:只改变对应分支的状态。

当新区块形成时,区块链节点存储的是:

  • 生成的是一个新的状态树
  • 而不是修改原来的状态树
  • 其中大部分节点的内容是共享的。

目的是:有利于解决分叉时,对状态的回滚

  • 与比特币不同,比特币的转账可以简单地反向推算。
  • 而以太坊有智能合约,实现的功能功能很复杂,很难推算出之前的状态。所以为了回滚,必须保存之前的状态。

2.5 以太坊的交易树,收据树,Bloom Filter

收据:收据是对应交易的数据结构,代表了交易执行的一些中间状态的写入和交易的执行结果等信息。

收据的内容:

  • 以太坊的智能合约向虚拟机输出的一些执行日志
  • 智能合约运行的Gas信息
  • 单个交易执行完毕后以太坊的状态根
  • 一个交易创建智能合约的时候,如果执行成功会把新建合约的地址写到一个收据中。

交易树和收据树:

  • 与比特币中的 Merkle Tree 类似的,对于以太坊区块中的所有 交易 和 交易的收据,都可以使用 MPT 进行组织和证明
  • MPT 的构建不再是通过账户地址来进行,而是通过交易或者收据在区块中的序号来构建 MPT
  • 收据树和交易的信息一一对应。主要是考虑到智能合约的执行比较复杂,收据树可以有利于快速查询,证明交易结果。

为什么使用 MPT,而不是普通的 Merkle Tree?

  • 代码复用:以太坊其他数据结构都采用 MPT, 代码统一,利于管理
  • 查找效率高。

Bloom Filter
Bloom Filter (布隆过滤器)的用途

  • 以太坊中通过布隆过滤器对收据的日志进行索引。比如:
    • Client 找到过去十天和某个智能合约有关的交易
    • Client 找到过去十天当中符合某种类型的所有事件(e.g., 众筹事件 or 发行新币的事件)

● 优点

  • 布隆过滤器可以用于检索一个值是否在一个集合中。在容忍一定的误识别率的条件下,它有着远超过一般算法的空间效率和时间效率。

● 原理

  • 通过多个哈希函数将键值映射到位图之中,并在位图中合并集合中所有键值的映射结果。
  • 对于一个键值,如果经过同样的哈希函数映射之后,出现了在位图中没有出现的标记位,那么这个键值必定不存在于集合之中。

实例:在进行 哈希方式B 之后,若日志地址 Y 的哈希出现了新的标记位,那么日志地址Y必然不存在于原有四个日志地址之中

  • 性质:可以保证某个元素一定不在集合里,但不能保证元素一定在集合中。即会误报,但不会漏报。
  • 好处:client 可以快速过滤,迅速查找(说在的不一定在,但是说不在的必定不在)

2.6 以太坊基本架构及原理------状态模型

  • 在账户模型中,用户的余额通过地址上的账户数据来表示,具体为账户数据结构中的一个余额的数值
  • 在转账交易的过程中,通过转账预先定义好的语义,在发起者的账户中减去交易中定义好的转账金额,在接受者的账户中增加相应的金额
  • 可以把账户的余额泛化成一种账户的状态,而把转账交易当作是改变状态的一个方法

状态转移:由交易来驱动的状态机

  • 在区块N执行前状态为S,经过区块N的交易进行状态转换后,转换为状态 S’,再经过区块N+1的转换后,转换为状态S’’。

智能合约:作用于该状态机转换的代码。
以太坊虚拟机:执行状态转换代码的虚拟机

以太坊基本结构及原理----共识问题:

  • 相比比特币的UTXO模型,状态转换模型虽然使得智能合约的各种变量存储、传参等变得更加灵活,但也带来了多方共识上的困难,如发生分叉时的处理
  • 在以太坊的状态转换模型中,如果发生分叉,需要回到分叉前的状态,重新验证另一条分支上的区块
  • 以太坊状态的存储采用了状态树结构,其根哈希记录在区块头中,记为 stateRoot,从而使得状态能够在全网得到共识确认,并在分叉时能够快速回滚。
    请添加图片描述
    交易执行概述:
  1. 每个节点独立维护数据
  2. 节点独立地在EVM中执行合约
  3. 将执行结果写回区块链数据
  4. 节点之间执行共识机制,达成共识。
实例:交易执行具体过程
1. 每个节点独立维护数据,这些节点可以是张三、李四、赵四、影院主管等人
2. “张三买电影票”的交易在所有节点中被独立验证
3. 以太坊虚拟机的执行结果将以某种方式写回到区块链数据中,比如张三的余额、影院的余票等。每个区块中会保留一段摘要,这段摘要为执行完区块中交易 后以太坊状态的 stateRoot,任一子状态的不同都将导致 stateRoot 的不同
4. 如果张三控制的节点受到非法攻击或篡改,则执行结果及区块链数据将与网络中其他节点(如李四、赵四、影院的节点)不符,无法参与到网络的下一步共识中

2.7 以太坊交易

在以太坊中,交易承载了账户转账和合约创建,调用合约等功能。
TX数据的内容大体可以分成三个部分:基本的交易驱动智能合约交易的签名

  1. 基本交易内容:
  • from:交易发送者的地址。发送者地址可以通过合约的签名信息<r, s, v>计算得到,实现上交易的数据结构中并不会存储发送者地址
  • to:交易接收者的地址。在进行转账时是接受转账金额的地址,在创建合约时设置为0x0000…000,在调用合约时则是合约的地址
  • value:交易的金额,单位是Wei。Wei是以太币最小单位,我们常说的1个以太币是单位Ether,1 Ether =10^18 Wei
  1. 驱动智能合约
  • input data:交易附带数据,传递创建合约的代码和构造函数,或调用合约的函数及参数
  • nonce:交易发送者累计发出的交易数量,用于区分一个账户的不同交易及顺序
  • gasPrice:发送者支付给矿工的gas的价格,用于实现从Gas到以太坊货币单位的转换,从而计算使用的Gas的总价格
  • gasLimit:该交易允许消耗的最大的gas,用于解决智能合约不能停机的问题
  1. 交易内容:
  • hash:由以上字段生成的哈希值,也作为交易的id
  • r,s,v:用于ECDSA验证的参数,由发送者的私钥对交易的哈希做数字签名生成,用于确认转账的合法性。

以太坊交易的周期:发起,广播,打包与执行,验证与执行。
请添加图片描述
请添加图片描述
请添加图片描述

2.8 以太坊共识机制

以太坊采用的哈希算法:ethash算法,对内存有要求。
将来要过渡到POS(proof of stake)-----如何过渡

POS:权益证明
这种机制通过计算你持有的币数占总币数的百分比,包括你占有币数的时间来决定获得本次记账权利的概率。持有越多,获得记账权利概率越大。
优点:相比POW缩短了达成共识的时间,节省能源
缺点:容易分叉;易中心化(马太效应)

由于以太坊出块时间在15s左右,所以新的区块很大可能还没有扩散到整个区块链网络,导致以太坊的分叉是常态。
为了鼓励分叉的合并,以太坊引入Ghost协议。

叔父块

  • 以太坊定义了不在主链但被主链区块记录的满足难度的区块为叔块。
  • 在以太坊中叔父不是严格意义上的叔父,以太坊中规定在当前区块的7代以内有共同祖先的都可以认为是叔父块。

作用:

  • 在尽可能减少两个相邻区块产生时间的条件下,尽量收缩和统一整个区块链的主链,同时通过叔父块的奖励来维护矿工的积极性。

叔父块的特点:

  • 某个区块最多只能接纳2个叔父块,也可以不接纳任何叔父块
  • 叔父块必须是区块的前2层~前7层的祖先的直接子块
  • 被接纳过的叔父块不能再重复接纳了
  • 接纳了n个叔父块的区块,可以获得出块奖励的 n*1/32
  • 被引用了的叔父块,随着距离越远,得到的奖励递减1/8

叔父块中的交易不会被执行,只检查这个叔父是不是符合挖矿难度要求的合法区块。

2.9 以太坊挖矿难度调整

每个新区块的难度都是在父区块难度的基础上进行调整的

在这里插入图片描述

3. 比特币与以太坊的区别(主要关注)

比特币:
主要关注 密码学,数据结构,共识机制;
其他的生态方面的涉及不多

以太坊
智能合约简介不用太仔细看,主要关注数据结构,跟比特币数据结构有什么不一样的
以太坊的状态树,用来干嘛的;交易树之类的;基本架构原理
以太坊的共识机制
跟比特币的nonce不一样,不一样的在哪里
以太坊的pow跟比特币的共识机制有什么不一样-----哈希算法不一致:具体什么不一样,具体怎么工作的!!!!必考

比特币与以太坊在数据结构方面有什么不同

比特币:
区块头(block header):

  • 定义与作用:
    • 存放区块信息
    • 作为区块的摘要在网络间进行传输
  • 组成:
    • 区块版本 4B
    • 前一个区块的哈希 32B
    • 交易哈希:交易列表的哈希值 32B
    • 产生的时间 4B
    • 难度信息:区块产生的门槛难度 4B
    • Nonce值:用于动态调整以产生满足门槛条件的合法区块 4B

区块身:交易列表,组织成默克尔树形式。

以太坊:
区块头内容:

  • 记录以太坊状态的状态根
  • 交易列表,收据列表和叔块列表对应的哈希值
  • 最长不超过100KB的额外数据

区块体内容:

  • 交易组成的交易列表
  • 由交易执行信息组成的收据列表
  • 用于改进以太坊共识过程的叔块列表

比特币的共识机制,以太坊的共识机制,二者有什么不同

比特币的共识机制:基于“工作量证明”的挖矿
通过消耗资源解决一个问题获得投票资格(即记账权),记账权必须通过花费计算资源来获得,比如说通过蛮力解决一个问题,通过记账奖励鼓励投入资源。
比特币使用的hash算法是:SHA256算法
具体挖矿过程:参与者综合上个区块的 Hash 值,上一个区块生成之后的新的验证过的交易内容的Markle Root值,加上猜测的一个随机数Nonce, 再加上时间,一起打包到一个候选新区块,让新区块的 Hash值小于比特币网络中给定的一个数。
挖矿成功:SHA(Markle Root+ 上一个区块Hash值+时间+Nonce)<target

以太坊的共识机制也是基于POW。使用的是ethash算法,对内存有要求,抑制硬件挖矿
以太坊将来的共识机制:POS(权益证明):持有越多,获得记账权利概率越大
优点:缩短了达成共识的时间
缺点:容易分叉,易中心化
所以为了鼓励合并,加入了ghost协议,定义了叔父块,尽量收缩和统一整个区块链的主链。

以太坊的状态树

以太坊的交易树,收据树

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

以太坊,比特币基本架构原理

比特币的基本架构及原理----UTXO

以太坊的基本架构及原理-----状态转换模型

比特币和以太坊的nonce有什么区别

比特币的nonce:在挖矿时用于动态调整以产生满足门槛条件的合法区块。
以太坊的nonce:累计发起的交易次数
Nonce计数器:计算 交易的次数和序列

只有账户的Nonce和交易的Nonce能够对应的情况下,交易才是合法的
当一个交易执行完毕后,账户的Nonce值增加,原本执行完毕的交易中的Nonce值就无法与现在账户的Nonce值相匹配。
修改相对应的Nonce值意味着原有的交易的签名失效,需要发起者的重新签名。
Nonce的其他作用:

控制账户发起的交易的顺序,从而实现一些相对复杂的功能。
通过重复提交一个相同Nonce值的交易来使得一个已经提交但是尚未被确认的交易是不合法的,从而实现一定程度的撤销功能。

以太坊的pow与比特币的共识机制有什么不一样,哈希算法不一样,具体是怎么工作的

おすすめ

転載: blog.csdn.net/m0_50488845/article/details/122392988