难度的调整
是在每个完整节点中独立自动发生的。每2016个区块,所有节点都会按统的公式自动调整难度,这个公式是由最新2016个区块的花要时长与期望时长(期望时长为20160分钟,即两周,是按每10分钟一个区块的产生速率计算出的总时长 )比较得出的,根据实际时长与期望时长的比值, 进行相应调整(或变难或变易)。即如果区块产生的速率比10分钟快则增加难度,比10分钟慢则降低难度公式总结为:
■新难度值=当前难度值x ( 20160分钟/最近的2016个区块的实际出块时间)
■next difficulty = previous difficulty* (2 weeks) /(time to mine last 2016 blocks)
■注: 2016数字,既不是1024,也不是2048,也不是2100
不可能三角:
最多只能满足其中两项:
去中心化、安全和高性能构成了区块链的“不可能三角”,在设计中无法将三个特性同时达成,只能符合其中两个。
去中心化是拥有大量参与区块生产和验证的节点,一般节点的数量越多,去中心化程度越高。
安全性是获得网络控制权需要花费的成本,通常在共识机制的设计中锚定现实世界的资产,例如工作量证明机制(PoW)锚定的是算力。
性能就是每秒处理交易的笔数(TPS)。造成区块链性能低下的主要原因是每笔交易都要在所有节点上达成一致。
比特币的区块形成过程
在当前区块加入区块链后,所有矿工就立即开始下一个区块的生成工作:
1. 把在本地内存中的交易信息记录到区块主体中
2. 在区块主体中生成此区块中所有交易信息的Merkle树,把Merkle树根的值保存在区块头中
3. 把上一个刚刚生成的区块的区块头的数据通过SHA256算法生成一 个哈希值填入到当前区块的父哈希值中
4.把当前时间保存在时间截字段中(版上默时难随)
5. 难度值字段会根据之前一 段时间区块的平均生成时间进行调整以应对整个网络不断变化的整体计算总量,如果计算总量增长了,则系统会调高教学题的难度值 .使得预期完成下一个区块的时间依然在一定时间内
■当在挖矿过程中,发现别的节点新发布了 一个区块,那么应该停止挖矿 , 重新从UTXO中取出一系列合法交易组成候选区块,在刚发布的这个区块后面开始挖矿
UTXO:
UTXO(Unspent Transaction Outputs)是未花费的交易输出,它是比特币交易生成及验证的一个核心概念。交易构成了一组链式结构,所有合法的比特币交易都可以追溯到前向一个或多个交易的输出,这些链条的源头都是挖矿奖励,末尾则是当前未花费的交易输出。
UTXO:未使用的交易输出,比特币核心概念之一参考链接:UTXO:未使用的交易输出,比特币核心概念之一
■因为一方面这个区块中的交易可能和网刚在挖的那个区块有面复,另一个本质的原因就是修选区块的块头有指向前一个区块的哈希指针,因为最新的区块已经变了这个哈希指针也要跟着改变
基于此,提问:这样是不是之前的工作都白费了而很可惜?
答:不可惜,因为挖矿过程的无记忆性,无论是在刚刚的区块上继续挖,还是新组装一个区块继续挖,成功的概论是一样的。
比特币的区块体:
■这些交易以什么样的数据格式/数据结构存储呢?
■区块链中的Merkle树将会对海笔交易进行数字签名,可以保证每笔交易都不可伪造 ,且没有重贸交易。所有的交易将通过Markle树的Hash过程产生一 个唯的Merkle根值计入区块头
■Merkle根/Master Hash/Top Hash/RootHash
■Merklet将相邻的两个交易数据的两个哈希值组成一一个字符串,再对这个字符串进行哈希,得到上层父节点的哈希值
■这些数据放在 levelDB数据库中
Merkle树
■在一个Merkle树里, 数据块是两两组的,每个块的哈希值是储存在上一级节点的。而上一节点又两两一组,其哈希值储存在更上- -级的节点。这样一直持续到触及根节点
■特点:叶子节点上的值通常为交易数据块的哈希值,而非叶子节点上的值是该节点的所有子节点的组合结果的哈希值,这类非叶子节点的哈希被称为路径哈希值
■只需记住树开头的哈希指针,就有能力去管理列表中任意一点的哈希指针,能判断确保数据有没有被篡改过,因为如果有攻击者修改了树下面的一些数据块,那么这将导致高级的哈希指针不会再匹配。就算他继续修改更高级的块,但是数据的改变已经影响到了他无法修改的树的最顶端,因为我们已经保存好了顶端的数据。因此,任何试图修改任意数据的行为都将被检查到,而我们只需记住顶端的哈希指针
隶属证明(成员证明 Proof of membership)
■Merkle树的另外一个优点。允许简洁的成员证明
■即想要证明一个确切的数据块是否Merkle树中的一-员?
■通常,只记住了数根,之后需要向我们展示这个区块和通向数根沿途的所有数据块。就可以暂时忽略树的其他部分,沿途的数据块就已经足以让我们验证到数根
■如果在树上有n个节点,那么就只有log(0)个块需要被展示,因为每个步骤都只需要计算下一级块的哈希,所以这大概只需要log(n)次去证明它.即定位的时间复杂度为0log(m)
■所以即使这个Merkdle树包含了非常多的块依旧可以在个较短的时间内证明一个成员块
Merkle Proof默克尔证明
■对于 SPV(简化支付验证,Simplified Payment Verification )轻钱包而言,怎么知道一个交易是否真实的呢?
■SPV拿到一个交易信息之后(比如接收到一笔钱),并不能确认这个交易是否合法 ,因此要对这个交易的输入进行验证。但是它只拿到了单个交易的信息,而没有本地的完整区块链数据,因此,SPV要拿着这个交易的信息向网络发起查询请求,这个请求被称为merkle block message
■当其他有完整区块链数据的客户端收到这个请求之后,利用传过来的交易信息在自己的区块链数据库中进行查询,并把验证路径返回给请求源,SPV 拿到验证路径之后,再做-次merke校验.确认无误之后,就认为这个交易是可信的
区块链网络中,节点一般分为:
全节点
轻节点
SPV节点SPV与轻节点
不同点:
SPV节点: 目的是验证一笔交易是否上链、是否得到多个确认。
轻节点:节点本地保存与其自身相关的交易数据,目的不仅仅是验证交易,还有管理节点自身的资产收入、支付等信息。文章来源:https://www.toymoban.com/news/detail-402285.html共同点:
SPV节点和轻节点都无需在本地保存全部数据
文章来源地址https://www.toymoban.com/news/detail-402285.html
到了这里,关于区块链学习笔记(2)难度整定,区块形成,区块体,Merkle树,Merkle Proof默克尔证明的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!