第三章 :区块链底层原理
第四章:椭圆曲线加密算法
第六章:以太坊
衡量哈希函数的好坏:抗碰撞性
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
两种方式:
区块链的定义:是一种分布式共享公共账本技术
交易:记录一笔资产的转移过程
区块:记录 一段时间内全局最新交易的数据块
区块链:通过共识算法,确定全局认可的区块,把区块按时序串接在一起,形成全局公开账簿
特点:去中心化、透明性、开放性、自治性、防篡改、防丢失
区块链的本质:一种去中心化的状态机,状态机属于分布式系统的一种,这种状态机模式的特点是所有的机器做同一组操作,有一定的冗余性,要去维护系统的一致性,且状态机首要保证的不是效率而是一致性!
哈希算法:数据摘要或散列算法,原理:将一段信息映射成一个固定长度的二进制(哈希值)
比特币系统:由用户、交易和矿工组成。
比特币:一种点对点的电子现金系统 。其实就是中本聪发行的一个软件
中本聪规定的机制:总量恒定,永不增发,大约每10分钟出一个区块。区块包括新币的发行,新币逐渐被挖出。
中本聪规定:
第一个区块叫做创世区块,内容不可更改。
2100w怎么来的?
第一次奖励是21w,以21w*50为首项,公比为1/2的等比数列求和
最初产生一个区块的奖励是50枚,每10mins一个区块,每产生21w个区块,奖励减半。
210000 / 10 * 6 * 24 * 365 = 4 year ,即第一次达到21w个区块,奖励减半
…
直到奖励减少到 1 0 − 8 10^{-8} 10−8次方以下,无法再进行支付奖励,即单位已经无法用聪来支付了,此时区块数量约为2100w
Secp256k1
非对称加密算法产生公钥
区块定义:一种记录交易的数据结构和文件
比特币的区块高度:一个区块的高度是比特币诞生过后,第多少个区块,仗量某一个区块到第一个区块的距离
比特币区块从0开始计算,即创世区块为0
,第50个区块的高度为49
区块有两个标识符
最长链原则:有两个区块同时增长,相互竞争,最后只能留一个,即生长较快,长度较长的那个。
与传统数据库“增删改查”的区别?
与分布式的关系
DAPP:新版本不认旧版本
比特币的2100万上限不是不能增加,只是大家的共识,如果修改会导致链的分叉
BIP:比特币改善建议 ,即一套开源软件协作治理模式
区块内部结构:
优点:串联的链式结构将连续不断发生的数据分成了一个一个的数据块,在下载同步这些数据的时候,可以并行地从各个节点来获得,无论数据先后,到达本地节点后再根据区块头哈希值链接起来
区块的哈希值不包含在区块的数据结构中,而只是在区块打包时只有区块头用于计算哈希
比特币的哈希指针:
暂时
拥有多个子区块,每一个子区块都将同一区块作为其父区块,并且在父区块的哈希值字段中哈希值相同隔离见证:签名信息占用了大量的字节空间,隔离见证就把这种签名信息隔离出来
解决容量问题:
例子:平均每10分钟产生一个新区块,即每10分钟记录4194笔交易,每秒最多7笔,4190/10*60s
TPS每秒并发太低,容易造成网络拥堵严重,从而使得区块链在高价值高并发业务领域无法落地
难度重定/调整:
为什么要调整?
如何进行难度调整?
公式:
新难度值 = 当前难度值 x ( 20160分钟 / 最近的2016个区块的实际出块时间 )
恶意节点修改自己的区块的难度值,会怎样?
当前区块POW要求从0开始的随机数,0~ 2 32 2^{32} 232
只被使用一次的任意或非重复的随机数值
什么是合适的随机数?
对区块头的6个参数取哈希值,如果这个值小于系统给的目标哈希值,就算找到了合适的
Hash = SHA256(SHA256(version+pre_Hash+merkle_root+time+difficult+nonce))
区块头包含某一个随机数,使得区块的随机散列值出现了所需的0的个数
随机数的位数是固定的,大小通过比0的个数,挖出来的哈希值前面的0多,就小;比如 :0123 > 00056
这串随机数字是一个答案,而这个答案对于每个区块不是唯一的
比特币体系的设计要求:
比特币体系倾向于认为:
工作量证明机制的本质:
大多数的决定,也就是最长链,因为最长链代表了最大的工作量
如果大多数的CPU为诚实的节点控制,那么诚实的链条将以最快的速度延长,并超越其他的竞争链条
Bits字段和目标哈希值之间的关系:
根据难度的计算公式,目标哈希值确定,Bits值越小,难度越高,需要计算力越大
当前区块加入区块链后,所有矿工立即开始下一个区块的生成工作
竞争输了,就这样放弃了?是不是有点可惜?
1.因为挖矿过程的无记忆性,无论是在新发布的区块上挖,还是自己组装新的区块,成功的概率是一样的
2. 大家一起挖,所有团队人员按提供算力的多少进行分配的
定义:
交易以什么样的数据格式/数据结构存储呢?
具体hash过程:Merkle树将相邻的两个交易数据的哈希值组成一个字符串,再对这个字符串进行哈希,得到上层父节点的哈希值
注意:两两哈希,自底向上
特点是两两配对,那交易个数是奇数咋办?
简洁的成员证明
只需要记住树根,之后需要展示这个区块和通向树根沿途的所有数据块,就可以暂时忽略树的其他部分,沿途的数据块就足以让我们验证到树根
如果树上有n个节点,那么就只有log(n)个块需要被展示,每一个步骤都只需要计算下一级的哈希,所以只需要log(n)次计算 ,时间复杂度为O( log(n) )
如何获取验证路径?
SPV再进行验证
1.同步区块链,确定是最长的一条
2.先拿到merkle tree 去区块链中查找,确保该merkle root path hash 在链条中
3.利用拿到的验证路径,再进行一次merkle校验,确保路径合法
比特币区块链除了支付系统,还可以作为存证系统
意味着:
课后思考:
一般不会
记账的形式:采用工作量证明机制 – 矿工通过竞争哈希计算的方式,争夺记账权力
类比理解:
平均每10分钟发布一道数学题,比赛看谁算的快,在每一轮的竞争中,谁最先计算出非唯一的正确答案,谁就获得了本轮的记账权力。他记录的本页账单,大家都要以此为准,紧接着,大家在这一页账单的基础上,争夺下一页账单的记账权
工作量证明机制就是一个共识机制,解决了去中心化体系下谁来记账的问题
奖励:
如何交易:
一位所有者A利用他的私钥对前一次交易T1和下一位的所有者B的地址签属一个随机散列的数字签名,A将此数据签名作为交易单T2,并将交易单T2全网广播,电子货币就发给了下一位所有者
数字签名:发起方对前一次交易数据和接收方数据公钥连接起来对其求hash值x,再利用自己的私钥进行加密,得到数字签名
验证:
双花:指攻击者几乎同时将同一笔钱用作不同交易或者抹掉自己曾经发给别人的钱的记录
如何解决双花问题?
双重支付的难度:
如果只有一个币,发起一笔交易转给别人3个币,不被认同,无法确认
如果只有一个币,同时发起三笔转账1个币,只有一笔会成功
UTXO就是btc的交易转移路径,包含交易输入和交易输出
UTXO不可分割
缺少状态:花费完 和 未花费完
基于账户模型的余额在花费过程中,可以按任意值存储,取决于表示的最小精度
比特币节点功能:
P2P:点对点的网络架构,每一个节点都是单独的个体,既是共享资源的提供者,又是资源的获取者,处于平等的低位
优点:去中心化、健壮性、可扩展性、隐私保护、负载均衡
P2P网络传播算法:Gossip协议
Gossip协议是一个通信协议,一种传播消息的方式
基本思想:一个节点想分享一些信息给网络中的其他节点。于是,它周期性的随机选择一些节点,并把信息传递给这些节点。这些收到信息的节点接下来会做同样的事情,把这些信息传递给其他的一些随机选择的节点,一般信息会周期性的传递给N个目标节点,而不是一个
两种广播:
1.交易广播:将每一笔区块链的发起交易向全网广播
2.区块构造广播:矿工竞争构造区块的结果广播,一旦挖矿成功,结果广播,其他矿工验证
两种节点:
普通全节点:只有链和路由
Bitcoin Core 全节点:钱包、链、路由、矿工
维护节点需要成本,全节点需要加载全部历史数据,要消耗大量的硬盘空间、点、时间、精力…
验证交易: 余额够不够、是否存在双花、判断签名、脚本能否通过,验证通过即广播
验证支付:查询该交易是否被验证,是否有效,是否上链,被确认多少次
验证区块:难度值是否正确、头哈希是否满足、时间戳、Merkle树根
比特币账本有正本和副本
公共账本在哪里?
正本只存在于各个副本之间,整个社区网络是平等的、去中心化的、谁也不能说自己的账本是正本。
如何找公共账本的正本?
对副本进行抽样,统计意义上的公共部分
哈希算法:把任意长度的输入做复杂变换之后,输出固定长度的输出
注意点:
对称加密就是加密的钥匙和解密的钥匙一样才能解开
如何解决密钥配送问题?
两种方法加密:
分布式系统需要考虑的问题:
分布式共识算法解决在此情况下对某个提案,大家达成一致意见的过程
分布式系统一致性的问题:
数据有多个副本,网络出现问题,有的副本写入成功、部分副本写入失败,导致副本数据不一致,造成事实上的数据不一致
原因:节点运行速度不同、节点宕机、网络延迟故障、节点作恶
例题:节点A、B、C的x值都为6,现在用户甲通过节点A发起交易:X+3 ,而同时用户乙也通过节点C发起交易:X*2
处理一致性问题的方法:
大部分算法都是保证一致性和正确性的前提下,牺牲活性
共识机制解决的区块链中的问题:
公链:pow、pos、dpos、ripple
联盟链:pbft、dbft
私链:paxos、raft
共识算法分三类:
强一致性非拜占庭将军问题(可信任环境,即无恶意节点无错误):
强一致性拜占庭将军问题(非可信环境):
非强一致性非BFT算法(POW、POS)
定义:在多线程异步通信系统中,即使只有一个进程不可靠,那么就不存在协议或算法能保证有限时间内使所有进程达到一致
异步通信:对进程处理速度和发送消息的延迟不作任何要求
严格证明了:没有任何共识算法可以在完全异步的分布式系统下确保达成全局共识
弱化可用性:必须保证数据一致性
例如:ATM机,电子支付…
弱化分区容错性:一般是大规模的服务,因为必须保证系统的正常运转
弱可用性:数据更新后,能容忍后续的访问只能访问到部分或者全部访问不到,过一段时间才能全部访问到
共识机制要解决的核心问题:
一个可靠的计算机系统需要能够处理一个或者多个系统组件的失效。拜占庭容错协议必须要处理这些失效而且这些协议还要满足所要解决的问题的规范
拜占庭将军问题的结论:
如果在每个将军只传输口头消息的情况下,只有忠诚的将军数量多于2/3,拜占庭将军问题才有解,才能保证忠诚的将军达成一致的行动。
N >= 3F+1
两阶段提交:
外部角色:客户端Client,相当于用户
三种核心角色 :Proposer提议者 ,Acceptor决策者 ,Leaner决策学习者
一个节点或者进程可能同时充当多种角色,一个进程可能是Proposer又是Acceptor,还是Learner
具体作用:
准备阶段
提议阶段
Paxos算法能保证故障节点不超过1/2个节点故障的情况下保证共识的安全性
满足FLP , CAP不行
Paxos复杂… 后续,Raft - Chubby - Zookeeper
领导选举、日志复制、安全性三部分
基于Leader的算法,算法逻辑简单,但当Leader发生变换时,系统可能处于不一致的状态
一致性协议:要求客户端的请求在每个服务节点上都按照一个确定的顺序执行,即如何达成共识
核心理论:n >= 3f+1
, n是系统中服务的总节点数,f是故障数
两类服务器节点:主节点(一个)和从节点:
5个阶段:请求 - 序号分配 - 相互交互 - 序号确认 - 响应
客户端收到 f+1 个确认节点中,肯定有1个是诚实节点,只要有一个诚实的确认消息,则交易成功。因为1个诚实的消息必须是2f+1个节点都commit成功了,才能有个1个最终确认的消息的。
女巫攻击:一个恶意用户用各种方法伪造多个账户来进行共识过程
非强一致性、最终一致性、概率算法
POS根据节点在网络里持有数字货币的数量和时间来竞争记账
实际hash、目标hash与币龄的关系
hash(block_header) <= baseset*coinage
无利害关系 & 长程攻击问题
两种节点:追踪节点
或 验证节点
比特币区块链技术便是一种追求“去中心化”与“安全”的技术组合。
追求“安全”与“去中心化”则无法达到“可扩展性”。
它的每一个节点都下载和储存所有的数据包,使得网络可以民主自治,但也同时带来了巨大的储存空间损耗和校验成本。比特币每秒只能处理7笔交易,这是远远无法承载全球货币支付场景需求的。
由于比特币的发展,1M的区块大小已经不够用了,社区中矿工与开发团队之间就这个问题产生了分歧,矿工的扩展区块大小到8M的计划,实际上是选取了“安全”与“可扩展性”而部分放弃了“去中心化”,因为对节点的运算能力有更高的要求。
以太坊的区块分片化存储的方案便是一种追求“可扩展性”与“去中心化”的技术组合。
追求“可扩展性”与“去中心化”则需要牺牲“安全”。
以太坊的分片其实相当于同构的半独立的多链,世界状态是共享的,但是交易历史是分开的。多链也就是选取了“去中心化”与“可扩展性”而部分牺牲了“安全”,因为算力分散了。
以超级账本为代表的联盟链的区块链方案是一种追求“可拓展性”与安全的技术组合。
追求“可扩展性”与“安全”则需要牺牲“去中心化”。
在超级账本区块链技术中,达成共识的节点由联盟链中的成员组成。这大大减少了节点了数量,加快了网络的吞吐量(即可拓展性)。
再比如,当前比较火热的EOS,公链,竞选的21个超级节点,其实也是对“去中心化”的牺牲。
比特币具有缺陷: —> 以太坊
以太坊定义:一个开源的有智能合约功能的、能运行图灵完备编程语言的公共社区区块链平台,称为世界计算机。
通过其专用加密货币以太币通过去中心化的虚拟机来处理点对点合约,建立抽象的内置有图灵完备编程语言的区块链
以太坊能够在以太坊虚拟机中运行存储程序,同时向内存读写,使其成为图灵完备系统。
以太坊特点:
判断是否图灵完备
),理论上可无限循环本质:基于交易的状态机。区块链中每个区块生成一种状态。
不采用最长链原则,采用最重子树来决定主链