主页 > imtoken正版app下载 > 区块链原理(笔记)

区块链原理(笔记)

imtoken正版app下载 2023-06-03 05:45:01

数据存储:什么是分布式记账竞争记账

它是比特币系统的记账方式,解决了去中心化记账系统中如何保证比特币系统账本一致性的问题。

说明:在比特币网络中,全网矿工参与算力竞赛。 算力高的矿工算力更强,更容易获得记账权。 同步到全网,作为回报,矿工将收到新生成的比特币 1 作为奖励。

分布式记账的定义

分布式记账技术是一个分布在多个计算机节点上的数据库,每个节点可以复制和保存一个账本,每台计算机可以独立更新。 其特点是账本不由任何中央机构维护,而是由各个计算机节点独立构建和记录。 在对新分类账(也称为共识机制)进行投票后,一旦达成共识,分布式分类账就会自行更新。

优势

在区块链中,系统中的每个人都有记账的机会。 系统会判断这段时间最快最好的记账人,将记录的内容写入账本,发送给系统。 系统内的其他人做备份,让系统内的每个人都有一个完整的账本。 篡改者需要同时修改一半以上的系统节点数据,才能真正篡改数据。 这种篡改的成本非常高,几乎不可能实现。

公链记账:什么是挖矿和奖励挖矿

挖矿是在一段时间内在比特币系统中确认和记录交易以在区块链上形成新区块的过程。 简单来说,挖矿就是记账的过程。 通过奖励制度鼓励矿工去挖新的比特币,所以挖矿就是产生比特币的过程。

如何开采比特币

每隔10分钟,全网一起计算一道算术题。 最先算出答案就相当于挖了这个区块,矿工可以获得新生成的比特币。 随着比特币价值的增加,挖矿的人数增加,挖矿难度呈指数级增长。 大家开始使用矿机挖矿。 但是比特币网络的算力太大,个人很难购买矿机进行挖矿。 这么多矿工加入矿池一起挖矿。 矿场负责计算,矿池负责信息打包。 挖出比特币后,矿池根据矿场的算力分配收益。

交易支付:代币交易 比特币交易和找零

比特币转账可以一次性转移多个地址的余额,也可以一次性转移到多个地址(后者需要通知矿工,否则剩余的比特币可能会作为矿工的服务费)

事务的生命周期

1.有人提出要求

2. 向 p2p 网络广播交易

比特币平台关闭后比特币怎么办_比特币为什么不能伪造_比特币区块和比特币的区别

3. 矿工验证交易的正确性

4. 多个交易组成一个区块

5. 新块添加到现有区块链

6.交易完成

系统奖励:交易币基础比特币和Q币

比特币是一种没有发行实体的去中心化数字资产。 Q币是腾讯发行的一种类似于电子信用的电子货币。 它实际上不是一种货币。 Q币获得腾讯信用背书认可。 Q币的价值完全取决于人们对腾讯的信任。

交易货币基础

交易信息的前几个字节表示区块中包含的交易数量。 交易号的类型是压缩大小的变长整数,每个区块中的第一笔交易被指定为coinbase交易。

Coinbase的交易输入格式改过几次,高度227836之前跟的区块版本号是1。

在这里插入图片描述

溯源基础:Merkle 什么是Merkle树

顾名思义,默克尔树是一种存储哈希值的树。 树的叶子是数据块的哈希值,非叶子节点是其对应子节点的哈希值。

在这里插入图片描述

Merkle树结构Hash

哈希是一种将任意长度的数据映射到固定长度的数据的函数。 例如,对于数据的完整性验证,最简单的方法就是对整个数据进行Hash运算,得到一个固定长度的Hash值,然后将得到的Hash值发布到互联网上,这样用户下载数据后,就可以再次对数据进行Hash运算,将比较运算的结果与网上公布的Hash值进行比较,如果两个Hash值相等,则说明下载的数据没有损坏。 而且很难根据Hash值推断出原始数据的特征。

比特币平台关闭后比特币怎么办_比特币区块和比特币的区别_比特币为什么不能伪造

哈希列表

在点对点网络中传输数据时,会同时从多台机器下载数据,许多机器可以被认为是不稳定或不可信的。 为了验证数据的完整性,更好的方法是将大文件分成小数据块。 这样做的好处是,如果在传输过程中有一小块数据损坏了,只需要重新下载这块快数据比特币为什么不能伪造,而不用重新下载整个文件。 那么如何判断小数据块是否损坏呢?

下载数据的时候,我们会先从一个可信的来源得到正确的根Hash,然后把每一小块数据的Hash值放在一起,然后对这个长字符串做一个Hash,和根Hash校验.

默克尔树

我们从叶子节点开始,将最底层的两个相邻哈希合二为一进行哈希运算得到子哈希,逐层向上推。 如果一层是单一的,就会少一层。 缺的直接哈希,最后形成一棵倒树。 在树的根部,会有一个根哈希,称为 Merkle Root。

在下载到 p2p 网络上的网络之前,从可信来源获取文件的 MerkleTree 根。 一旦获得根,就可以从其他不受信任的来源获得 Merkletree。 根据可信根检查收到的 MerkleTree。 如果 MerkleTree 损坏或伪造,则从其他来源获得另一棵 MerkleTree,直到获得与可信树的根匹配的 MerkleTree。

MerkleTree 和 HashList 的主要区别是

Merkle可以直接下载并立即验证Merkle Tree的一个分支,因为文件可以分成小的数据块,这样如果一个数据损坏,只需重新下载数据块,Merkletree可以一次下载一个分支时间,然后立即验证分支,如果分支验证通过,则可以下载数据。 哈希列表只能通过下载整个哈希列表来验证。

Merkle 树的应用

1. 数字签名 MerkleTree 的初衷是为了高效地处理 Lamportone-time 签名。 每个 Lamportkey 只能用于签署一条消息,但它可以与 Merkletree 结合签署多个 Merkles。 这种方法已经成为一种高效的数字签名框架,即 MerkleSignatureScheme。

2. P2P 网络 在P2P 网络中,MerkleTree 用于保证从其他节点收到的数据块没有损坏,没有被替换,甚至检查其他节点不会欺骗或发布假块。

3. 比特币默克尔树最早的应用是比特币,由中本聪在2009年描述和创建。比特币的区块链利用Merkleproofs来存储每个区块的交易。

Merkle 树和区块链分布式记账的问题

区块链是一种实现去中心化分布式账本的技术。 总账技术的基本单位是“交易”。 整个账本由一系列交易组成。 交易,一页一页按时间顺序绑定,形成一个完整的账本——“区块链”。 “区块”是交易的容器,“区块”通过密码学算法连接起来,形成时间序列上的“链”。

优势:

比特币为什么不能伪造_比特币区块和比特币的区别_比特币平台关闭后比特币怎么办

数据往往会保持完整且加密安全。

缺点:

对于比特币系统来说,这个问题并不大,因为到现在为止,比特币还是每10分钟出一个块,每个块1MB。 即使在 100 年后,数据总量也不会大到 Standalone 无法处理的程度。 但对于一些企业级的区块链系统,情况就完全不同了。 每个区块可能都很大,出块的速度会很快,数据量会变得很大。

如何解决数据量过大的问题

这种情况在传统的数据系统中也存在。 一般的处理方法是将历史交易数据移动到其他专门的存储设备中,主机数据库可以保存账户的最新状态和最近一段时间的交易记录。 但是在区块链系统中,特别是在使用UTXO来存储交易的区块链系统中,保存的是交易的过程,即如果一个账户没有交易,则不会出现在最新的区块中。 那么,按照传统数据库删除历史数据的方式,只要一个区块中有一笔交易,并且没有后续交易,就说明没有人使用这个交易账户,但是为了维护密码学整个区块链系统的完整性和安全性,必须保留。 块,并且该块之后的所有块也需要保留。

事实上,中本聪已经预留了一个最优解:MerkleTree算法。

框图如下:

在这里插入图片描述

1、每个区块中的hash1是该区块中所有交易的哈希值。 但是这个hash值并不是把所有的交易连接成一个长串后计算出HASH值,而是使用MerkleTree算法计算出HASH值,我们称之为Merkle根。 (伟大的!)

2、这里的Merkle树算法并不是直接计算整个字符串的Hash值,而是对每笔交易计算一个Hash值,然后通过pairwise connection再次计算Hash,一直计算到最上面的Merkle root。 MerkleTree算法最大的优点是可以直接删除每笔交易,只保留交易的Hash值。 这样,对于整个区块来说,其密码学的安全性和完整性没有改变,但数据量却可以大大减少。 (Hash值是32个字节,一笔交易一般需要400多个字节)。

区块链如何使用默克尔树来验证交易的真实性

既然区块链采用了默克尔树的数据结构,那么我们如何才能快速找到交易并验证交易的真实性呢?

那么有人会说,每笔交易不都是用hash计算的吗,直接把所有数据存起来验证一笔交易是否存在不是很简单吗?

但是,由于中本聪在比特币发明之初就采用了轻钱包设计,简称SPV。

特征:

比特币平台关闭后比特币怎么办_比特币为什么不能伪造_比特币区块和比特币的区别

轻钱包不保存完整的区块链,只保存每个区块的区块头。 区块体存储了完整的交易信息,大部分交易信息所需的存储量是交易头的千倍以上。 因此,如果只保存交易头,则可以大大减少本地客户端存储的区块链信息。

但是问题来了,没有交易信息怎么验证呢?

这时候,区块头中的merkleroot就发挥作用了。

在描述如何验证轻钱包时,首先了解如何在merkletree中进行验证。

我们知道merkletree中父节点和子节点的运算关系,所以当我们想证明这棵树中存在一个叶子节点时,只需要获取从叶子节点到子节点的运算过程中需要的hash即可root,和所有叶子节点都不需要参与计算。

在这里插入图片描述

你可能会觉得有点奇怪,为什么不把所有的叶子节点都告诉它,你可以用所有的叶子节点去计算roothash,验证就通过了。 但这是事实,因为每个父节点哈希必须通过两次子节点哈希运算得到,所以我们只需要选择所有参与运算的节点即可证明叶子节点存在于树中。 这可以减少散列操作的次数。 而这些选中的节点,以及它们之间的层级关系,就是验证路径,也就是上图中merkleroot框下面的所有框。

比特币网络中的交易只有在被记录在区块链中并收到 6 次确认后才被认为是真实的。 那么对于SPV轻钱包来说,如何知道一笔交易是否真实呢?

SPV在拿到一笔交易信息后(比如收到一笔钱),无法确认这笔交易是否合法,因此需要验证这笔交易的输入。 但它只是获取单笔交易的信息,没有完整的本地区块链数据。 因此,SPV 需要向网络发送带有交易信息的查询请求。 这个请求被称为 merkleblockmessage。 当其他拥有完整区块链数据的客户端收到该请求时,利用传输过来的交易信息在自己的区块链数据库中进行查询,并将验证路径返回给请求源。 SPV得到验证路径后,再次做merkle check,确认无误后,认为交易可信。

按照上面的验证过程,会出现以下问题:

如何检查来自区块链的交易?

如何获取merkle验证路径?

如何保证网络返回的验证路径不是伪造的?

如何检查来自区块链的交易?

区块链的数据结构是离散的。 比特币中的一个块存储在一个文件中。 要获取交易的验证路径,必须获取交易所在的区块链。 这是一个重复的查询过程,可能需要遍历所有块才能找到它们。

比特币平台关闭后比特币怎么办_比特币区块和比特币的区别_比特币为什么不能伪造

解决方案是:

1.修改每个块的数据结构为关系数据库,通过关系数据库,可以用SQL语句快速查询。 但是,遍历和查询所有区块链是一种浪费。

2.利用交易的时间戳快速定位区块位置,在相邻的几个区块中快速找到

如何获取merkle验证路径?

其实merkle验证路径生成的前提是已经有一棵完整的merkle树。 市面上有很多merkle树的实现包,有的包直接提供了getProof方法来获取某个叶子节点的验证路径。

客户端收到merkleblock消息后比特币为什么不能伪造,执行以下步骤:

①通过上述方法找到包含交易的区块

② 检查该区块是否在全网最长链中

③ 取出所有交易生成merkletree,使用getProof方法获取交易的验证路径

④ 将验证路径回传给请求源

如何保证网络返回的验证路径不是伪造的?

SPV 得到响应后,需要对检索到的 merkleroot 进行验证。 验证步骤如下:

1. 同步区块链,保证是全网最长的

2.先获取merkleroot在区块链中搜索,确保merkleroothash在链中

3.用得到的验证路径再进行一次merkle验证,保证所有的验证路径都是合法的

参考:

智联科技区块链教育。