区块链复习

考试重点

在这里插入图片描述
第二、七章:问答题

第三章 :区块链底层原理

  • 区块链的头、区块链的体、区块链头里面的参数区块 里面的数据结构
  • 比特币,交易机制、账户机制

第四章:椭圆曲线加密算法

  • 考基本的概念
  • 不考计算、证明
    第五章:共识算法
  • 分布式系统:两个定量FLP和CAP
  • 共识算法
  • 私有链Raft

第六章:以太坊

  • 里面的结构、共识算法不考

在这里插入图片描述


  • 真实随机数的采集和获取,通过硬件的数据采集而得到的,例如CPU的温度,分子振动碰撞的次数。所以真实随机数的成本很高

在这里插入图片描述

  • 256位的哈希值,很难破解

哈希碰撞

在这里插入图片描述

  • 强哈希函数能保证免受攻击,通过哈希值偷换哈希值映射的数据

哈希函数的应用

  • 产生单向口令
  • 入侵检测和病毒检测
  • 构建伪随机数
    在这里插入图片描述

哈希算法

衡量哈希函数的好坏:抗碰撞性

  • MD系列:消息摘要算法,通过MD5码来实现消息队列(不可修改)

MD5:在MD4的基础上增加了“安全-带子”概念,其方式为求余、取余、调整长度、与链接变量进行循环计算

  • 碰撞算法复杂度:最少通过多少次计算产生哈希碰撞
  • 雪崩效应:明文有微小的区别会导致哈希值非常明显的区别

对称加密

加密和解密的过程时一样的

M:明文
C:密文
Key:密钥

密钥配送问题:加密者要向接收者传送密钥,这就必须建立信道,可靠的信道,如果信道不安全,密钥就可以在交换中被窃取

  • 开放的互联网中,信道是不安全的

密钥解决方法

在这里插入图片描述
密钥交换:

在这里插入图片描述
过程:

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

公开密钥: PUblic Key 可以公开
私有密钥:private key 不可以公开

私钥(先产生)和公钥是通过算法得到的一个密钥对

  • 公钥和私钥一一对应的,不能单独生成
  • 私钥可以到处公钥,公钥不能导出私钥

无密钥传输是可能的

在这里插入图片描述

在这里插入图片描述

  • 关键点:钥匙对之间存在联系,私钥 - > 公钥,私钥决定公钥

独特的陷门函数–单向计算

在这里插入图片描述

  • 两类主流算法思想
    在这里插入图片描述

在这里插入图片描述

b = a k b = {a^k} b=ak m o d mod mod p p p
在这里插入图片描述

在这里插入图片描述

椭圆曲线加密算法

在这里插入图片描述

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

  • 判别式:
    4 a 2 + 27 b 2 ! = 0 4a^2+27b^2 != 0 4a2+27b2!=0

在这里插入图片描述

在这里插入图片描述

  • 椭圆曲线的判定:曲线上每一个点都必须是光滑的(连续且可导)


在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

有限域
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 推到有限域
    在这里插入图片描述
  • 椭圆曲线在有限域中,会变成离散的点
    在这里插入图片描述
  • 这个例子是不关于x轴对称的, 而是y= C(常数)对称
  • 两点相同,两点不同

在这里插入图片描述
P(3,10) Q(9,7)
在这里插入图片描述

  • [0,23] 是有限域,所有的结果都要位于有限域内!
  • 上述过程有点问题,结果是对的
    在这里插入图片描述

在这里插入图片描述

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

  • 双方选定同一个椭圆曲线

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

数字签名

两种方式:

  1. 签名者用私钥对明文进行加密
  2. 签名者用私钥对明文的哈希加密
    在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述


国密算法

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


第一章

区块链的定义:是一种分布式共享公共账本技术

  • 狭义:区块链是一种按照时间的顺序依次形成的链式数据结构,并以密码学方法保证数据块不可篡改不可伪造
  • 广义:利用块链式数据结构来验证与存储数据,利用分布式节点共识算法来生成和更新数据,利用密码学方式保证数据传输和访问安全,利用自动化脚本代码组成的智能合约来编程和操作数据的一种全新的分布式基础架构与计算范式。

交易:记录一笔资产的转移过程
区块:记录 一段时间内全局最新交易的数据块
区块链:通过共识算法,确定全局认可的区块,把区块按时序串接在一起,形成全局公开账簿

特点去中心化、透明性、开放性、自治性、防篡改、防丢失

区块链的本质:一种去中心化的状态机,状态机属于分布式系统的一种,这种状态机模式的特点是所有的机器做同一组操作,有一定的冗余性,要去维护系统的一致性,且状态机首要保证的不是效率而是一致性

哈希算法:数据摘要或散列算法,原理:将一段信息映射成一个固定长度的二进制(哈希值)

  • 哈希碰撞:两个哈希值相同,那么输入的两个值可能相同也可能不同,如果两个值不同的情况称之为 “碰撞” 。

第二章

比特币

比特币系统:由用户、交易和矿工组成。

  • 用户 :用户通过密钥控制钱包
  • 交易:每一笔交易都会被广播到整个比特币网络
  • 矿工:通过竞争计算生成每个节点达成共识的区块链,包含了比特币网络发生的所有交易

比特币:一种点对点的电子现金系统 。其实就是中本聪发行的一个软件

中本聪规定的机制:总量恒定,永不增发,大约每10分钟出一个区块。区块包括新币的发行,新币逐渐被挖出。

中本聪规定:

  • 最初每个区块的比特币奖励是50枚,每21w个区块减半一次,一直到2140年,所有比特币发行完备

第一个区块叫做创世区块,内容不可更改。

  • 一个比特币最多被分割成10的8次方份
  • 1 BTC = 1 比特币
  • cBTC 分比特币 ; 微,毫,以10的三次方类推
  • 1 0 − 8 10^{-8} 108是最小单位,Satoshi 聪
  • 比特币总共不能超过2100w亿聪

2100w怎么来的?

第一次奖励是21w,以21w*50为首项,公比为1/2的等比数列求和

最初产生一个区块的奖励是50枚,每10mins一个区块,每产生21w个区块,奖励减半。
210000 / 10 * 6 * 24 * 365 = 4 year ,即第一次达到21w个区块,奖励减半

直到奖励减少到 1 0 − 8 10^{-8} 108次方以下,无法再进行支付奖励,即单位已经无法用聪来支付了,此时区块数量约为2100w

比特币公钥

  • 私钥随机生成
  • 私钥使用Secp256k1非对称加密算法产生公钥
    • a=0 , b=7
  • 序列化:把变量从内存中变成可存储或传输的过程
  • base58编码

区块

区块定义:一种记录交易的数据结构和文件

比特币的区块高度:一个区块的高度是比特币诞生过后,第多少个区块,仗量某一个区块到第一个区块的距离
比特币区块从0开始计算,即创世区块为0 ,第50个区块的高度为49

  • 区块有两个标识符

    1. 区块头的哈希值:唯一、明确的标识一个区块
    2. 区块高度:区块高度不是唯一的标识符,单一的区块有一个明确固定的区块高度,但反之不成立,一个区块高度不只是代表一个单一的区块。两个或者两个以上的区块短时间内可能具有相同的区块高度,在区块链里争夺同一位置

    最长链原则有两个区块同时增长,相互竞争,最后只能留一个,即生长较快,长度较长的那个。

    • 两个矿工同时挖出区块,所以短时间内,可能具有相同高度
    • 叔块:一个节点可连接3个子块(以太坊中的概念),但最终没能连接上主链的块。

在这里插入图片描述

比特币的信息查询

  • 比特币由计算机计算产生,储存在P2P网络分布式数据库中
  • 比特币存在于整个网络中,网络由多个分布式计算机节点组成,每个节点的区块链数据保持一致
  • 比特币的每一个交易全网广播,公开透明,交易可见(交易不可伪造),用户不可见

与传统数据库“增删改查”的区别?

  • 只能执行查和增,只会增加不会减少

去中心化与分布式

  • 去中心化:一种分布式结构,整个网络由用户构成,没有中心结构,全体网民共同参与,权级平等
  • 但是节点间的功能和权限是不同的

与分布式的关系

  1. 去中心化是分布式的一种,分布式系统的概念更宽一些
    • 去中心化是分布式,分布式不是去中心化,是对的
  2. 去中心化系统可以有中心化应用,中心化系统也可以有去中心化应用
  3. 去中心化和分布式都不是区块链的创造,这两个概念在区块链诞生之前就有了

DAPP:新版本不认旧版本
比特币的2100万上限不是不能增加,只是大家的共识,如果修改会导致链的分叉

BIP治理结构

BIP:比特币改善建议 ,即一套开源软件协作治理模式

第三章 比特币区块结构

  • 区块链是由包含交易信息的区块,从后向前有序链接起来的数据结构(链栈)。

区块内部结构:

  1. 区块头
    • 哈希值:唯一值标识区块,且索引上一个区块(父区块),32Bit
    • 随机数:用来实现挖矿机制,块与块之间的分隔符,4Bit
    • 版本号:4Bit
    • 时间戳:4Bit
    • 难度系数:4Bit
    • 梅克尔树(一个哈希树)的根节点:链接梅克尔树,32Bit
    • 顺序为:版上默,时难随
    • 版上难是固定的,要更改hash值只能改默随时
  2. 区块体
    • 结构是哈希树
    • 叶子节点存储交易信息
    • 流程:密钥 -》输入 输出 -》密钥
  • 系统对每个区块头进行SHA256加密哈希,生成区块头部哈希

优点:串联的链式结构将连续不断发生的数据分成了一个一个的数据块,在下载同步这些数据的时候,可以并行地从各个节点来获得,无论数据先后,到达本地节点后再根据区块头哈希值链接起来

区块的哈希值不包含在区块的数据结构中,而只是在区块打包时只有区块头用于计算哈希


头哈希值的作用:防篡改

  • 当前区块头里包含父区块的哈希字段,所以当前区块的哈希值也受到该字段的影响
  • 如果父身份标识(哈希值)发生改变,会导致子节点身份标识跟着改变,子节点又会带着孙节点跟着变,以此类推,产生瀑布效应
  • 一个区块有很多代之后,这种瀑布效应将保证该区块不会被改变,因为要改变就要强制执行后续所有区块,计算量巨大,所以保证了区块链的安全性
  • 就是暴力连续修改,层层修改到创世区块,但是创世区块不可更改,因此篡改行为还是会被发现

比特币的哈希指针:

  • 每一个区块都有交易数据,以及一个指向上一个区块的哈希指针。所以每一个块不仅能够告诉我们前一个区块在哪,还包含该值的摘要,可以去验证这个值是否被篡改

自然分叉:

  • 虽然每个区块只有一个父区块,但是可以暂时拥有多个子区块,每一个子区块都将同一区块作为其父区块,并且在父区块的哈希值字段中哈希值相同
  • 区块链的分叉:一个区块出现多个子区块的情况
  • 这种分叉是一个暂时的状态,只有当多个不同区块几乎同时被不同的矿工发现时才会发生。此时,同一时间段内全网不止一个节点能挖矿成功,可能会有多个节点在网络中广播它们各自打包好的临时区块**(都是合法的)**

  • 容量:区块头80个字节,每个交易平均250个字节,每个区块大小均为1M
  • 每个区块大小均为1M是制约系统效率关键因素,即每个区块最多记录4194笔交易

隔离见证:签名信息占用了大量的字节空间,隔离见证就把这种签名信息隔离出来

  • 用软分叉来实现隔离见证

解决容量问题:

  1. 扩容:对矿工有利,会出现分叉
  2. 二层网络:主侧链结构,边建主链边建侧链(闪电网络)

交易数量

  • TPS:系统的吞吐量,即每秒系统处理的交易数量
  • TPS = 并发数/平均响应时间

例子:平均每10分钟产生一个新区块,即每10分钟记录4194笔交易,每秒最多7笔,4190/10*60s

TPS每秒并发太低,容易造成网络拥堵严重,从而使得区块链在高价值高并发业务领域无法落地

  • 不可能三角:去中心化、安全性、性能 ,三者不可兼得

区块内部结构

魔法数

  • 每个块总是以魔法数开始
  • 互联网上有很多块链,如何判断一个区块属于哪一条链?用魔法数来判断属于哪条特定链
  • 即,块和块之间的分隔符

版本号

  • 标识当前软件及协议的相关版本信息
  • 以0x开头的16进制数据

父区块哈希值

  • 引用父区块的头哈希值,通过这个值每个区块才会首尾相连组成了区块链,对区块链安全性起到至关重要的作用,防篡改

梅克尔树的根值

  • 由区块主体中所有交易的哈希值再逐级两两哈希计算出来的一个数值,主要用于检验一笔交易是否在这个区块中存在
  • 作用:大大减少了数据的传输量以及复杂度,只需验证传输后的新区块的树根值与保存的是否一致就行,不一致可以逐层验证,找到不同步的数据

时间戳

  • 记录该区块产生的时间,精确到秒。
  • 因为比特币是分布式网络,没有固定的去中心化时间服务器,每个节点获取的时间戳可能都不一样,因此要求:
    1. 新区块的时间戳要大于之前11个区块的平均时间戳
    2. 不超过自己节点的当前时间两小时(自己CPU时间+2小时),用的1970年1/1日000ms的总秒数,即,Unix时间
    3. 时间戳记录在每个区块头上,记账节点在产块时会写入一个时间值,不求精确(一定范围内即可)

难度值

  • 该区块头计算哈希的难度目标,根据这个控制生成工作量所需要的计算力
  • Bits字段越小,target_hash越小,难度越大
  • Difficult = Difficult_1_Hash(挖矿难度为1时的目标哈希值) / target_Hash
  • 和区块的高度有关,每隔2016个区块难度变化

难度重定/调整:

  • 难度值决定了节点大约需要经过多少次哈希运算才能产生一个合法的区块

为什么要调整?

  • 区块10分钟1个,全网的算力不同,但新区块的产生速度不能慢,所有难度值必须根据全网算力的变化来就行调整

如何进行难度调整?

  • 难度的调整是每个完整节点中独立自主自动发生的。
  • 每2016个区块,所有节点都会按照统一的公式自动调整难度

公式:

  • 新难度值 = 当前难度值 x ( 20160分钟 / 最近的2016个区块的实际出块时间 )
  • 它是一个比值,根据实际时长和期望时长的比值做相应调整(均衡思想)

恶意节点修改自己的区块的难度值,会怎样?

  • 不好改,修改本地参数及代码,别人不认可,计算成功后进行广播,验证不通过

随机数

当前区块POW要求从0开始的随机数,0~ 2 32 2^{32} 232

  • Nonce:是Number once 或 Number used once缩写,只被使用一次的任意或非重复的随机数值
  • 随着挖矿难度的增加,随机数即使将32位(0- 2 32 2^{32} 232)全部遍历,也可能满足不了挖矿的目标值,只能修改其他参数重新开始

什么是合适的随机数?

对区块头的6个参数取哈希值,如果这个值小于系统给的目标哈希值,就算找到了合适的

哈希值

Hash = SHA256(SHA256(version+pre_Hash+merkle_root+time+difficult+nonce))

  • 其中只有nonce是不是固定的,其他都是固定的
  • 要想改变nonce值尝试暴力计算
  • 之后再转码,如果有必要,将十六进制的大小端颠倒顺序,如果实际计算的哈希值< 目标哈希值 ,则验证成功,,挖矿成功

工作量证明

区块头包含某一个随机数,使得区块的随机散列值出现了所需的0的个数

  • 随机数的位数是固定的,大小通过比0的个数,挖出来的哈希值前面的0多,就小;比如 :0123 > 00056

  • 这串随机数字是一个答案,而这个答案对于每个区块不是唯一的

  1. 有效的随机数有多个,只需找到一个有效的随机数就行,区块链优先奖励找到合适nonce值的
  2. 这个随机数很难获得
  3. 其他区块很难获得
  4. 节点通过反复尝试来找到这个随机数,这样就构建了一个工作量证明机制
  • 也就是POW机制的特点,过程辛苦,验证快速

比特币体系的设计要求:

  • 区块应该由哪些最诚实、最勤劳的节点产生,因而引入工作量证明机制

比特币体系倾向于认为:

  • 一个节点在提供信息之前付出了巨大的工作量,那么他可能是诚实的概率比较高(但检查是必需的)

工作量证明机制的本质:

  • “一CPU一票”,由算力来决定

大多数的决定,也就是最长链,因为最长链代表了最大的工作量

如果大多数的CPU为诚实的节点控制,那么诚实的链条将以最快的速度延长,并超越其他的竞争链条

  • 如果想要修改已存在的区块,攻击者必须重新完成该区块的工作量+该区块以后的所有的区块的工作量,并且最终要赶上和超越最诚实的节点

区块头中参数的连接方式

  1. 六个参数,以十六进制的小端结尾方式连接在一起
  • 什么是大端小端方式?
    • 小端方式:低位优先储存,低位字节放在内存的低地址处,高位字节放在高地址处,从左到右(低地址到高地址),从低到高
    • 大端方式:高位优先存储,低位字节放在内存的高地址处,高位字节放在低地址处,从左到右(高地址到低地址),从高到低

Bits字段

  • Bits存储难度目标的十六进制数值
  • Bits字段标识了当前区块头Hash之后要小于等于哈希目标值(target_hash),即Bits通过运算得到target_Hash
  • Bits是使得整个网络的计算力大致每10分钟产生一个区块所需要的难度
  • 区块头SHA256的结果是256位,而bits只有32位

Bits字段和目标哈希值之间的关系:

  • 高度277316区块为例
    • Bits值为0x1903a30c 这个值是系数/指数格式
    • 前两位十六进制数为幂:0x19
    • 接下来的6位数为系数:0x03a30c
    • 计算公式: t a r g e t H a s h = 系数 ∗ 25 6 幂 − 3 targetHash = 系数*256^{幂-3} targetHash=系数2563; 十六进制数字前面都得带0x**
    • target_hash = 03 a 30 c ∗ 25 6 ( 0 x 19 − 3 ) 03a30c*256^{(0x19-3)} 03a30c256(0x193)

根据难度的计算公式,目标哈希值确定,Bits值越小,难度越高,需要计算力越大

区块形成过程

当前区块加入区块链后,所有矿工立即开始下一个区块的生成工作

  1. 把本地内存中的交易信息记录到区块主体中
  2. 在区块主体中生成此区块的所有交易信息的Merkle树,树根存在区块头中
  3. 把上一个刚刚生成的区块的区块头的数据通过SHA256算法生成一个哈希值填入到当前区块的父哈希值中
  4. 当前时间保存在时间戳字段中
  5. 难度值字段会根据之前一段时间的平均生成时间进行调整以应对整个网络不断变化的整体计算总量
    • 如果计算总量增长了,则系统调高计算的难度值,使得预期完成下一个区块的时间依然在一定时间内
  • 在挖矿过程中,发现别的节点新发布了一个区块,应该停止挖矿,重新从UTXO中取出一系列合法交易组成候选区块,在刚发布这个区块后面开始挖矿
    • 因为一方面这个区块的交易可能和刚刚在挖矿的那个区块有了重复
    • 另一本质的原因是候选区块的块头有指向前一个区块的哈希指针。最新的区块已经变了,这个哈希指针要跟着变

竞争输了,就这样放弃了?是不是有点可惜?

  • 不可惜,这是公平竞争

1.因为挖矿过程的无记忆性,无论是在新发布的区块上挖,还是自己组装新的区块,成功的概率是一样的
2. 大家一起挖,所有团队人员按提供算力的多少进行分配的


区块体

定义:

  • 主要包含当前区块所记录的交易数和当前区块经过验证的、区块创建过程中生成的所有交易记录的详情
  • 交易详情:就是比特币系统的记账本
    • 每一笔交易都会永久的计入数据块中,而且任何人都可查询,其中的第一笔交易就是为了让矿工获得特殊奖励的特殊交易(无奖励发起人) ,就是coinbase交易 / 铸币交易 / 币基交易
    • 收币人地址:就是矿工自己的地址
    • 静态奖励:就是这笔费用,block reward
    • 动态奖励:交易池中交易的小费

交易以什么样的数据格式/数据结构存储呢?

  • Merkle树会对每笔交易进行数字签名,可以保证每笔交易都不可伪造,且没有重复交易(也就是产生唯一哈希值)
  • 所有的交易将通过Merkle树的Hash过程产生一个唯一的Merkle根值计入区块头

具体hash过程:Merkle树将相邻的两个交易数据的哈希值组成一个字符串,再对这个字符串进行哈希,得到上层父节点的哈希值

注意:两两哈希,自底向上

Merkle树

  1. 利用哈希指针建立的数据结构,是一类二叉树
  2. 假设有多个包含着交易数据的块,这些块就是数的叶子节点,将这些块分为两个一组,对于每一个组建立一个包含两个哈希指针的数据结构,然后再指向上一级叶子节点。递归,直到根节点
  3. 叶子节点的哈希值是交易数据的哈希值
  4. 非叶子节点的哈希值是路径哈希值

特点是两两配对,那交易个数是奇数咋办?

  • 系统对最后一个交易进行复制

Merkle树的作用

  1. 只需记住树的开头的哈希指针,就有能力去管理任意一点的哈希指针,能判断确保数据有没有被篡改过
  2. 只要保存好顶端的数据,任何试图修改任意数据的行为都将会被检查到
  3. 因为哈希指针的存在,如果一个区块中的任何一个交易数据被篡改,那么其哈希值必然会发生变化,这样可以被上层的哈希指针检测出来(密码哈希函数的碰撞阻力
  4. 验证时,只需验证根节点的值是否一致
    • 一致,数据安全完整
    • 不一致,逐层级往下找不一致的数据,然后重新同步
隶属证明:

简洁的成员证明

只需要记住树根,之后需要展示这个区块和通向树根沿途的所有数据块,就可以暂时忽略树的其他部分,沿途的数据块就足以让我们验证到树根

  • 也就是只需要验证一条路径,从交易数据到树根

如果树上有n个节点,那么就只有log(n)个块需要被展示,每一个步骤都只需要计算下一级的哈希,所以只需要log(n)次计算 ,时间复杂度为O( log(n) )


SPV简化支付验证

  • SPV拿到一个交易信息之后,并不能确定这个交易是否合法,因此要对这个交易的输入进行验证。但是只有单方面的交易信息,所以需要SPV拿着这个交易信息向网络发起查询请求,这个请求称为Merkle block message
  • 完整的区块链的客户端收到查询请求后,利用单个的交易信息去查询验证路径并返回给SPV,SPV拿到验证路径后再检验一次

如何获取验证路径?

  1. 从区块链查交易,找到包含该交易的区块
  2. 检查该区块是否是整个网络中最长链条里面的
  3. 取出所有交易生成的merkle tree ,利用get Proof 方法得到验证路径
  4. 返回请求源

SPV再进行验证

1.同步区块链,确定是最长的一条
2.先拿到merkle tree 去区块链中查找,确保该merkle root path hash 在链条中
3.利用拿到的验证路径,再进行一次merkle校验,确保路径合法

  • 为啥再验证一次?
    • 确保响应方发送的验证路径的有效性

比特币意义

比特币区块链除了支付系统,还可以作为存证系统

意味着:

  1. 区块上链的时间不会早于记录的事件发生时间
  2. 某项事实记录在某区块产生之前已经发生
  3. 该记录不会被修改

课后思考:

  • 当矿工挖矿成功时,别的矿工能不能偷取其nonce值,自己冒领coinbase奖励?

一般不会

  1. 考虑矿池:矿工只知道nonce,但不知道题,只有矿池主知道题,所有偷不了
  2. 不考虑矿地:A和B同时挖,但是A的nonce可能不满足B的答案,也有可能满足,这时候A挖出来没有及时地上链,有可能被偷

比特币的交易机制

记账的形式:采用工作量证明机制 – 矿工通过竞争哈希计算的方式,争夺记账权力

类比理解:

平均每10分钟发布一道数学题,比赛看谁算的快,在每一轮的竞争中,谁最先计算出非唯一的正确答案,谁就获得了本轮的记账权力。他记录的本页账单,大家都要以此为准,紧接着,大家在这一页账单的基础上,争夺下一页账单的记账权

  • 矿工自己发布数学题,自己从交易池中拿出来把交易头拼起来计算哈希值
  • 每个矿工计算的数学题都不一样,因为拿出的交易不同
  • 一个矿池的矿工解决的是一个问题

工作量证明机制就是一个共识机制,解决了去中心化体系下谁来记账的问题

竞争的奖励

  • 比特币的发行和记账绑定在一起
  • 记账着每获得一次记账权,就会获得系统产生的新的比特币作为奖励,算的最快的计算机会获得一定数量的比特币

奖励:

  • 奖励就是一条交易事务包含在区块的交易中,相当于系统给矿工转账了一笔比特币,即coinbase交易

交易确认

  • 除了转账交易就cionbase交易,没有销毁机制,除非个人主动销毁,或者人去世了私钥丢失 或 电脑格式化

如何交易:

一位所有者A利用他的私钥对前一次交易T1和下一位的所有者B的地址签属一个随机散列的数字签名,A将此数据签名作为交易单T2,并将交易单T2全网广播,电子货币就发给了下一位所有者

数字签名:发起方对前一次交易数据和接收方数据公钥连接起来对其求hash值x,再利用自己的私钥进行加密,得到数字签名

验证:

  1. 利用交易T2中的交易的发起方A的公钥对签名进行解密,得到数x
  2. T1交易数据和B的公钥连接起来,用同样的Hash算法计算Hash值y
  3. 若x == y, 交易确实由A发起,目的地确实是B,A确实把交易T1中的货币发给B

双重支付 – 双花

双花:指攻击者几乎同时将同一笔钱用作不同交易或者抹掉自己曾经发给别人的钱的记录

如何解决双花问题?

  1. 每次的交易都向整个网络做广播
  2. 在P2P网络中最早打上时间戳,并挖矿成功的那个交易被认定为是成功的交易
  3. 等待多次确认

双重支付的难度:

  • 自己成为最长链
  • 10分钟之内连续创造6个合法区块,需要巨大的算力

如果只有一个币,发起一笔交易转给别人3个币,不被认同,无法确认
如果只有一个币,同时发起三笔转账1个币,只有一笔会成功


UXTO模型和Account模型

UTXO

UTXO就是btc的交易转移路径,包含交易输入和交易输出

价值盲点

UTXO不可分割
缺少状态:花费完 和 未花费完

基于账户模型的余额在花费过程中,可以按任意值存储,取决于表示的最小精度

  • UTXO脚本不能提供非常精细的金额控制,UTXO必须全部移动
  • 如果要满足一个目标值金额,对组合UTXO算法要求比较高,一方面尽可能的精确,一方面输入输出尽可能的小

比特币节点网络

比特币节点功能:

  1. 钱包转账
  2. 完整区块链
  3. 矿工挖矿
  4. 路由功能(必须)

全节点

  • 一直在线,维护完整的区块链信息,维护UTXO集合
  • 监听交易信息;监听别的矿工挖出来的区块
  • 挖矿

轻节点

  • 只需下载区块头,使用区块头做工作量证明,不需要下载交易信息
  • 不是一直在线,无法验证交易的合法性和正确性
  • 可以验证挖矿的难度
  • 只能检测哪个是最长链

P2P网络架构

P2P:点对点的网络架构,每一个节点都是单独的个体,既是共享资源的提供者,又是资源的获取者,处于平等的低位

优点:去中心化、健壮性、可扩展性、隐私保护、负载均衡

P2P网络传播算法:Gossip协议

Gossip协议是一个通信协议,一种传播消息的方式

基本思想:一个节点想分享一些信息给网络中的其他节点。于是,它周期性的随机选择一些节点,并把信息传递给这些节点。这些收到信息的节点接下来会做同样的事情,把这些信息传递给其他的一些随机选择的节点,一般信息会周期性的传递给N个目标节点,而不是一个

  • 广播并非所有节点均接收到该数据,仅大部分接收到即可

两种广播:
1.交易广播:将每一笔区块链的发起交易向全网广播
2.区块构造广播:矿工竞争构造区块的结果广播,一旦挖矿成功,结果广播,其他矿工验证


节点分类

两种节点:

  1. 普通全节点:只有链和路由

    • 只要下载了完整的区块链数据,就是一个全节点
    • 只要全节点才能自己去验证交易
  2. Bitcoin Core 全节点:钱包、链、路由、矿工

    • 首先是全节点,然后基于比特币协议实现

维护节点需要成本,全节点需要加载全部历史数据,要消耗大量的硬盘空间、点、时间、精力…

  1. SPV钱包节点
    • 只关心和自己钱包中地址相关部分交易,不会下载全部区块链,也称为轻节点
    • 安装在移动设备上
    • 只能检测到那个是最长链,不知道哪个是最长合法链
  2. 独立挖矿节点
    • 挖矿节点主要工作是挖矿,独立的,不加入矿池的节点要需要下载完整的区块链
    • 独立挖矿节点也是全节点

验证分类

验证交易: 余额够不够、是否存在双花、判断签名、脚本能否通过,验证通过即广播

验证支付:查询该交易是否被验证,是否有效,是否上链,被确认多少次

验证区块:难度值是否正确、头哈希是否满足、时间戳、Merkle树根


存储机制

比特币账本有正本和副本

  • 比特币网络社区共同维护公共账本
  • 每一个网络节点,不管是全节点还是轻节点,都只有公共账本的副本

公共账本在哪里?

正本只存在于各个副本之间,整个社区网络是平等的、去中心化的、谁也不能说自己的账本是正本。

如何找公共账本的正本?

对副本进行抽样,统计意义上的公共部分


哈希算法

哈希算法:把任意长度的输入做复杂变换之后,输出固定长度的输出

  • 输出称为输入的哈希值,而相应的变换方法称为哈希算法(哈希函数)

注意点:

  1. 输入可以是任意长的字符串、数据、任何文件,称为消息
  2. 输出长度和输入无关,称为消息摘要、指纹
  3. 哈希这种转换是一种压缩映射,即散列值的空间通常远小于输入的空间

对称加密算法

对称加密就是加密的钥匙和解密的钥匙一样才能解开

  • 缺点是密钥配送问题
    • 接收者必须事先得到密钥,那么就得传输密钥给接收者,如果在传输过程中密钥被截取,后续就毫无秘密了。

如何解决密钥配送问题?

  1. 事先共享密钥
  2. 密钥分配中心
  3. 密钥交换
  4. 公钥密码

非对称加密算法的流程(图)

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

在这里插入图片描述

  • 关键点:钥匙对之间存在联系,私钥 - > 公钥,私钥决定公钥

RSA算法

两种方法加密:

  1. 大质数因子分解问题
  2. 离散对数问题
    在这里插入图片描述
    RSA的问题:
    1.数据量大,1024比特长度以上的密钥
    2.计算速度慢,不适合长内容加密

共识算法

分布式系统需要考虑的问题:

  1. 节点不可靠:出错,崩溃,宕机…
  2. 网络不可靠: 消息延迟、丢失

分布式共识算法解决在此情况下对某个提案,大家达成一致意见的过程

分布式系统一致性的问题:

数据有多个副本,网络出现问题,有的副本写入成功、部分副本写入失败,导致副本数据不一致,造成事实上的数据不一致

原因:节点运行速度不同、节点宕机、网络延迟故障、节点作恶


例题:节点A、B、C的x值都为6,现在用户甲通过节点A发起交易:X+3 ,而同时用户乙也通过节点C发起交易:X*2

  1. A先收到用户甲的请求,后收到用户乙的请求,执行(6+3)x 2 = 18
  2. C先收到用户乙的请求,后收到用户甲的请求,执行6x2 +3 = 15
  3. B的网络出现问题,两笔交易请求都未收到,两个计算都不进行 ,还是6

处理一致性问题的方法:

  • 两段式提交
  • 三段式提交
  • 令牌环
  • 时间戳

大部分算法都是保证一致性和正确性的前提下,牺牲活性

  • 区块链共识算法的特点:各节点平等、少数服从多数

共识机制解决的区块链中的问题:

  1. 谁来记账(创建区块)
  2. 如何维护全网数据的一致性
  • 一致性:所有诚实节点保存的区块链的前缀部分完全相同
  • 有效性:某个诚实节点发布的信息终将被其他所有节点记录在自己的区块中

共识算法的分类

公链:pow、pos、dpos、ripple
联盟链:pbft、dbft
私链:paxos、raft

共识算法分三类:

  • 强一致性非拜占庭将军问题(可信任环境,即无恶意节点无错误):

    • Paxos,raft
    • 容忍不超过1/2的节点出错
  • 强一致性拜占庭将军问题(非可信环境):

    • BFT算法(PBFT)
  • 非强一致性非BFT算法(POW、POS)

    • 容忍不能超过1/3的节点出错

FLP定理

定义:在多线程异步通信系统中,即使只有一个进程不可靠,那么就不存在协议或算法能保证有限时间内使所有进程达到一致

异步通信:对进程处理速度和发送消息的延迟不作任何要求

  • 没有时钟、不能时间同步、允许延迟、超时

严格证明了:没有任何共识算法可以在完全异步的分布式系统下确保达成全局共识


CAP定理

  1. 一致性Consistency:分布式的所有节点在同一时间数据完全一致
  2. 可用性Availability:在有限时间内,任何非失败节点都能做出回应,即每个操作都能在一定时间内返回结果
  3. 分区容错性:因网络故障系统可能发生的分区,即节点之间的通信不可保障,无法互相通信。即使在分区故障导致出现通信故障和而延迟的情况下,系统依然能继续工作。
CP

弱化可用性:必须保证数据一致性
例如:ATM机,电子支付…

CA

弱化分区容错性:一般是大规模的服务,因为必须保证系统的正常运转

AP

弱可用性:数据更新后,能容忍后续的访问只能访问到部分或者全部访问不到,过一段时间才能全部访问到


拜占庭将军问题

  • 实际上是少数节点作恶下的共识问题

共识机制要解决的核心问题:

一个可靠的计算机系统需要能够处理一个或者多个系统组件的失效。拜占庭容错协议必须要处理这些失效而且这些协议还要满足所要解决的问题的规范

拜占庭将军问题的结论

如果在每个将军只传输口头消息的情况下,只有忠诚的将军数量多于2/3,拜占庭将军问题才有解,才能保证忠诚的将军达成一致的行动。

  • N >= 3F+1

Paxos算法

两阶段提交:

  1. 多个提案者先要争取到提案Proposal的权利(得到大多数接收者的支持)
  2. 成功的提案者发送提案给所有人进行确认,得到大部分人确认的提案成为批准的提案
  • 外部角色客户端Client,相当于用户

  • 三种核心角色 :Proposer提议者 ,Acceptor决策者 ,Leaner决策学习者

  • 一个节点或者进程可能同时充当多种角色,一个进程可能是Proposer又是Acceptor,还是Learner


具体作用:

  1. 提案者:接受Client提议,向集群提出提议,并在冲突发生时,起到冲突调节的作用,向议员,替民众发声
  2. 决策者:提议的投票者和接收者,只有在达成共识时,提议才会被最终接受,像国会
  3. 决策学习者:提议接受者,对集群系统一致性没有影响,像记录员
  4. Leader:一个特殊的Proposer,在所有提议者中选出一个领导,由该领导来主导提议的发送、投票和最后选择

过程

  1. 准备阶段

    • prepare: proposer生成一个全局唯一的提案编号N,然后向所有Acceptor发送编号为N的Prepare请求
    • promise:如果一个Acceptor收到一个编号为N的Prepare请求,且N大于该Acceptor的所有请求的编号,那么该Acceptor就会将其已经接受过的编号最大的提案作为响应反馈给Proposer,同时Acceptor承诺不再接受任何编号小于N的提案
  2. 提议阶段

    • Accept:如果Proposer收到半数以上Acceptor对其发出的编号为N的Prepare请求的响应,那么它就会收到一个针对 [N,V] 提案的Accept请求给半数以上的Acceptor。V就是收到的响应中编号最大的提案value
    • Accepted: 如果Acceptor收到一个针对编号为N的提案的Accept请求,只要该Acceptor没有对编号大于N的Prepare请求做出过响应,Acceptor接受该提案

请添加图片描述

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

请添加图片描述

  • Paxos算法能保证故障节点不超过1/2个节点故障的情况下保证共识的安全性

  • 满足FLP , CAP不行

  • Paxos复杂… 后续,Raft - Chubby - Zookeeper

Raft

  • Raft协议不能容忍拜占庭问题,在非拜占庭错误情况下,可以保证网络丢包、延迟、分区、冗余情况下保证操作的正确性

领导选举、日志复制、安全性三部分

  • 各个节点在任意时间段内只能处于三种角色状态中的一种:领导者、候选者、跟随者
  • Leader:负责响应所有的客户端的请求和日志复制
  • Follower:被动的响应Leader和Candidates的请求
  • Candidates: 用来选举新的Leader,处于Follower和Leader的中间暂时状态
  • 正常情况下系统中只有一个Leader,剩下都是Follower

基于Leader的算法,算法逻辑简单,但当Leader发生变换时,系统可能处于不一致的状态

角色状态转换

  1. 所有节点初始状态都是Follower角色
  2. 计时器超时且没有收到Leader的请求消息后,则转换为Candidates
  3. Candidtas 尝试选举Leader, 如果超时,重新选举
  4. 如果Leader收到更高的任期号,针对产生了新的Leader,则转换为Follower
  5. Candidates发现有或选举出leader,转Follower

请添加图片描述

请添加图片描述

  • 日志复制:用于保证节点的一致性所作的操作是为了保证一致性与高可用性

PBFT-实用拜占庭容错系统

  • 确定性算法,状态机系统,共同维护一个状态。

一致性协议:要求客户端的请求在每个服务节点上都按照一个确定的顺序执行,即如何达成共识

核心理论:n >= 3f+1 , n是系统中服务的总节点数,f是故障数

两类服务器节点:主节点(一个)和从节点:

5个阶段:请求 - 序号分配 - 相互交互 - 序号确认 - 响应

客户端收到 f+1 个确认节点中,肯定有1个是诚实节点,只要有一个诚实的确认消息,则交易成功。因为1个诚实的消息必须是2f+1个节点都commit成功了,才能有个1个最终确认的消息的。

  • 视图更改协议重新选举主节点

女巫攻击:一个恶意用户用各种方法伪造多个账户来进行共识过程

POW共识算法

非强一致性、最终一致性、概率算法

  • 采用POW的工作量证明机制事实上解决了拜占庭将军问题
  • 主要特点:计算的不对称性
  • 通过复杂计算自我验证合法性 、 验证成功后通知其他节点 、 其他节点确认即可
  • 不适合私有链和联盟链,企业和个人必须确定交易正确不能依靠概率

POS

POS根据节点在网络里持有数字货币的数量和时间来竞争记账

  • POS会根据持有财产的数量和时间分配相应的利息 币龄 = 持有时间 * 持有数量

实际hash、目标hash与币龄的关系
hash(block_header) <= baseset*coinage

无利害关系 & 长程攻击问题

Ripple共识算法

两种节点:追踪节点验证节点


不可能三角

  • 去中心化
  • 安全
  • 可扩展性
  1. 比特币区块链技术

比特币区块链技术便是一种追求“去中心化”与“安全”的技术组合。

追求“安全”与“去中心化”则无法达到“可扩展性”

它的每一个节点都下载和储存所有的数据包,使得网络可以民主自治,但也同时带来了巨大的储存空间损耗和校验成本。比特币每秒只能处理7笔交易,这是远远无法承载全球货币支付场景需求的。
由于比特币的发展,1M的区块大小已经不够用了,社区中矿工与开发团队之间就这个问题产生了分歧,矿工的扩展区块大小到8M的计划,实际上是选取了“安全”与“可扩展性”而部分放弃了“去中心化”,因为对节点的运算能力有更高的要求。

  1. 以太坊区块链技术

以太坊的区块分片化存储的方案便是一种追求“可扩展性”与“去中心化”的技术组合。

追求“可扩展性”与“去中心化”则需要牺牲“安全”。

以太坊的分片其实相当于同构的半独立的多链,世界状态是共享的,但是交易历史是分开的。多链也就是选取了“去中心化”与“可扩展性”而部分牺牲了“安全”,因为算力分散了。

  1. 超级账本区块链技术 | EOS 区块链技术

以超级账本为代表的联盟链的区块链方案是一种追求“可拓展性”与安全的技术组合。

追求“可扩展性”与“安全”则需要牺牲“去中心化”。

在超级账本区块链技术中,达成共识的节点由联盟链中的成员组成。这大大减少了节点了数量,加快了网络的吞吐量(即可拓展性)。
再比如,当前比较火热的EOS,公链,竞选的21个超级节点,其实也是对“去中心化”的牺牲。

以太坊

比特币具有缺陷: —> 以太坊

  • 缺失图灵完备 :不支持查询语句
  • 价值盲点:UTXO不可分割
  • 缺失状态:UTXO只能是已花费或未花费

以太坊定义:一个开源的有智能合约功能的、能运行图灵完备编程语言的公共社区区块链平台,称为世界计算机。

通过其专用加密货币以太币通过去中心化的虚拟机来处理点对点合约,建立抽象的内置有图灵完备编程语言的区块链

  • 以太坊能够在以太坊虚拟机中运行存储程序,同时向内存读写,使其成为图灵完备系统。

  • 以太坊特点:

    • 分层设计
    • 图灵完备:以太坊中支持循环语句(判断是否图灵完备),理论上可无限循环
    • 持久化存储
  • 本质:基于交易的状态机。区块链中每个区块生成一种状态

    • 每产生一个区块,以太坊中的状态就会转换到下一个状态,通过状态转换使得运行以太坊中的所有节点保持数据的一致性

奖励机制

  • 基于GHOST协议
  • 区块奖励+叔块奖励+叔块引用奖励
  • 分叉时,不采用最长链原则,采用最重子树来决定主链
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值