区块链原理(笔记)

数据存储:分布式记账

竞争记账是什么

是比特币系统的记账方式,,解决了如何在去中心化的记账系统中保证比特币系统账本一致性的问题。
解释:在比特币网络中,全网矿工共同参与算了竞争,算力高的矿工计算能力更强,更容易获得记账权,成功抢到记账权的矿工负责记账,并将账本信息同步给整个网络,作为回报,矿工将获得系统新生成的比特币1作为奖励。

分布式记账
定义

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

优势

在区块链中,系统的每一个人都有机会进行记账,系统会评判这段时间内记账最快、最好的人,将其记录的内容写到账本里,并发送给系统内的其他人进行备份,这样系统里的每一个人都有一本完整的账本。篡改者需要同时修改超过半数的系统节点数据才能真正的篡改数据,这种篡改的代价极高,导致几乎不可能。

公链记账:挖矿与奖励

挖矿是什么

挖矿是将一段时间内比特币系统中比特币系统发生的交易进行确认并记录在区块链上形成新区块的过程,简单的说挖矿就是记账的过程。通过奖励系统新生比特币来激励矿工挖矿,因此挖矿就是生成比特币的过程。

比特币怎么挖矿

每10分钟,全网一起计算一道算术题,先算出答案的相当于挖到了这个区块,该矿工便能获得新产生的比特币。随着比特币的价值升高,挖矿人数增多,挖矿难度成指数级上升,大家开始用矿机挖矿,但比特币网络算力太大,个人购置矿机也难以挖矿。于是很多矿工加入矿池一起挖矿。矿场负责计算,矿池负责信息打包,矿池挖到比特币之后根据矿场的算力占比分配收益。

交易支付:代币交易

比特币交易与找零

比特币转账可以一次把多个地址的余额转出或者一次转向多个地址(后者需要告知矿工,否则剩余比特币可能会给矿工当手续费)

一个交易的生命周期

1、某人发出请求
2、广播交易到p2p网络
3、矿工验证交易正确性
4、多个交易组成一个区块
5、新的区块加入到一个已经存在的区块链中
6、交易完成

系统奖励:交易币基

比特币和Q币

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

交易币基

交易信息前几个字节表示的是该区块包含的交易数量,交易数量类型采用的是一种压缩尺寸的变长整形,并且每个区块第一个交易规定为coinbase交易。

  • Coinbase交易结构
    在这里插入图片描述
  • 交易输入结构

Coinbase的交易输入格式经过数次改变,在高度227836之前遵从的区块版本号为1.
在这里插入图片描述

  • 交易输出结构
    在这里插入图片描述

溯源的基础:Merkle

什么是Merkle树

顾名思义,Merkel Tree就是存储hash值的一棵树,树的的叶子是数据块的hash值,非叶子节点的是其对应子节点的hash.

在这里插入图片描述

Merkle树结构

Hash

Hash是把任意长度的数据映射成固定长度的数据的函数。例如,对于数据完整性校验,最简单的方法是对整个数据做Hash运算得到固定长度的Hash值,然后把得到的Hash值公布在网上,这样用户下载到数据之后,对数据再次进行Hash运算,比较运算结果和网上公布的Hash值进行比较,如果两个Hash值相等,说明下载的数据没有损坏。并且,根据Hash值反推原始数据的特征是困难的。

Hash List

在点对点网络中作数据传输的时候,会同时从多个机器上下载数据,而且很多机器可以认为是不稳定或者不可信的。为了校验数据的完整性,更好的办法是把大的文件分割成小的数据块。这样的好处是,如果小块数据在传输过程中损坏了,那么只要重新下载这一快数据就行了,不用重新下载整个文件。那我们是如何确定小的数据块有没有损坏?
在下载数据的时候,我们首先会从可信源得到正确的根Hash,然后将每一小块数据的Hash值拼到一起,然后对这个长字符串在做一次Hash,与根的Hash进行对比校验。

Merkle Tree

我们从叶子节点出发,将底层两个相邻的哈希并成一个并进行哈希运算,得到子哈希,一层层向上推,如果有一层是单数的情况下就会有一个遗漏的,这个遗漏的就直接进行哈希运算,最终形成一棵倒挂的树,到了树根的位置就会有一个根哈希,称作Merkle Root.

在p2p网络下载网络之前,先从可信的源获得文件的MerkleTree树根。一旦获得了树根,就可以从其他从不可信的源获取Merkletree。通过可信的树根来检查接受到的MerkleTree。如果MerkleTree是损坏的或者虚假的,就从其他源获得另一个MerkleTree,直到获得一个与可信树根匹配的MerkleTree。

MerkleTree和HashList的主要区别是

Merkle可以直接下载并立即验证Merkle Tree的一个分支,因为可以将文件分成小的数据块,这样如果有一块数据损坏,仅仅重新下载这个数据块即可,Merkletree可以一次下载一个分支,然后立即验证这个分支,如果分支验证通过,就可以下载数据了。而Hashlist只有下载整个hashlist才能验证。

Merkle树的应用

1、数字签名最初MerkleTree目的是高效的处理Lamportone-timesignatures。每一个Lamportkey只能被用来签名一个消息,但是与Merkletree结合可以来签名多条Merkle。这种方法成为了一种高效的数字签名框架,即MerkleSignatureScheme。
2、P2P网络在P2P网络中,MerkleTree用来确保从其他节点接受的数据块没有损坏且没有被替换,甚至检查其他节点不会欺骗或者发布虚假的块。
3、比特币梅克尔树最早的应用是比特币,它是由中本聪在2009年描述并创建的。Bitcoin的Blockchain利用Merkleproofs来存储每个区块的交易。

Merkle树与区块链

区块链分布式记账存在的问题

区块链是实现无中心分布式总账的一种技术,总账技术的基本单元是‘交易’,整个账本是由一条条的交易构成‘块’类似于账本中的页,每页都记录了若干条交易,把一页一页的账页按照时间顺序装订起来,就形成了一个完整的账本——‘区块链’。‘块’是交易的容器,‘块’通过密码学算法相连接,形成了按照时间序列的‘链’。
优点:
数据易于保持完整,并且从密码学角度看安全性较高。
缺点:
对于比特币系统来说,这个问题并不大,因为截止目前为止,比特币仍然是每10分钟一个区块,每个区块1MB,即便到了100年后,总的数据量也不会大到单机无法处理。但是对于某些企业级应用的区块链系统来说,情况就完全不一样了。每个区块可能会非常大,生成区块的速度也会非常快,数据量就会变得非常的大。

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

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

实际上,中本聪已经预留了一个最佳的解决方案:默克尔树(MerkleTree)算法。
区块的结构图如下:
在这里插入图片描述

1、每个区块中的Hash1就是本区块中所有交易的哈希值。但这个哈希值不是把所有交易连成一个长字符串后计算HASH值,而是使用了默克尔树(MerkleTree)算法来计算获得这个HASH值,我们称之为Merkle根。(棒!)

2、 默克尔树算法在这里并不是直接计算整个字符串的Hash值,而是每个交易都计算一个Hash值,然后两两连接再次计算Hash,一直到最顶层的Merkle根。默克尔树(MerkleTree)算法的最大好处就是,每个交易都可以单独直接删除,只保留这个交易的Hash值即可。这样,对整个区块来说,并没有改变他的密码学安全性和完整性,但是数据量可以大大减小。(Hash值32个字节,而一笔交易一般要400多个字节)。

区块链如何运用Merkle树验证交易真实性

既然区块链采用了Merkle树的数据结构,怎么能快速的找到该笔交易和验证交易的真实性呢?

那么会有人说,每笔交易不是都用哈希计算出来了嘛,直接保存所有的数据,验证一个交易是否存在还不简单?
但是由于中本聪在比特币发明之初,有一种轻钱包的设计,简称SPV。
特性:
轻钱包并不保存完整的区块链,而是只保存每一个区块的区块头。区块体保存了完整的交易信息,而交易信息需要的存储量大部分都是交易头的千倍以上。所以,如果只保存交易头,就可以极大的减少本地客户端存储的区块链信息。

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

这个时候区块头里的merkleroot就发挥作用了。

在讲述轻钱包如何验证时,先了解如何在merkletree里面做验证。

我们已知merkletree里面父节点和子节点的运算关系,因此,当我们要证明一个叶子节点存在于这棵树时,只需要得到从该叶子节点到根的运算过程里面需要的那些hash即可,并不需要所有叶子节点参与计算。

在这里插入图片描述

你可能觉得有点奇怪,为什么不直接把所有的叶子节点告诉它就行了,你用所有叶子节点能算出roothash就验证通过了。但事实就是这样,因为每一个父节点hash一定是由两个子节点hash运算得到,所以,我们只需要挑选出所有参与运算的节点,就可以证明这个叶子节点存在于树中。这样可以减少hash运算的次数。而这些被挑选出来的节点,以及它们之间的层级关系,就是验证路径,即上图中merkleroot那个盒子下面的所有盒子。

比特币网络中的交易,只有已经被记录到区块链,并且已经得到6个确认的,才被认为是真实的。那么对于SPV轻钱包而言,怎么知道一个交易是否真实的呢?

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

根据上面的验证过程就会出现下面的问题:

怎么从区块链里面查一个交易?
怎么获取merkle验证路径?
怎么确保网络上这个返回的验证路径不是伪造的?

怎么从区块链里面查一个交易?

区块链的数据结构是离散的,比特币里面一个区块被保存在一个文件里面,要得到一个交易的验证路径,必须得到这个交易所在的区块链。这是一个复制的查询过程,可能需要把所有的区块都遍历一遍才能找到。
解决方案有:
1、把每一个区块的数据结构修改为关系型数据库,通过关系型数据库,可以用sql语句快速查询。但是,要遍历查询所有区块链,是比较浪费的。
2、利用交易的时间戳来快速定位区块位置,在临近的几个区块中快速找到它

如何获取merkle验证路径?

实际上,merkle的验证路径生成的前提是已经存在一棵完整的merkle树。市面上有很多merkle树的实现包,有的包直接给出来getProof的方法来获取某个叶子节点的验证路径。
在客户端收到merkleblockmessage之后,要执行下面的步骤:
①通过上述方法找到包含该交易的区块
②检查该区块是否是整个网络中最长链条里面的
③取出所有交易生成merkletree,利用getProof方法得到该交易的验证路径
④将该验证路径发送回请求源

怎么确保网络上这个返回的验证路径不是伪造的?

SPV得到响应之后,要将取回来的merkleroot进行验证,验证步骤如下:

1.同步区块链,确保是整个网络中最长的一条
2.先拿到merkleroot去区块链中查找,确保该merkleroothash是在链条中
3.利用拿到的验证路径,再进行一次merkle校验,确保验证路径全部合法

参考资料:
知链科技区块链教育。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 编译原理是针对计算机编程语言的研究,目的是将高级语言转化为机器语言并执行。编译原理笔记PDF是一份系统性的学习笔记,包含了编译原理的各个方面。这份学习笔记可以帮助学习者深入了解编译原理,掌握相关的技能。 编译原理笔记PDF通常包含以下几个方面的内容:编译原理的基本概念,编译器的结构与原理,语法分析器的设计与实现,语义分析器的设计与实现,中间代码生成和机器码生成,以及优化技术等。这些内容都是非常重要的编译原理知识点,可以帮助学习者理解编译原理的各个方面,并掌握相关的技术细节。 编译原理笔记PDF还可以提供一些编译原理实战案例,帮助学习者将所学知识应用到实际情况中。实际中有很多编译器与解析器需要我们开发,而这份学习笔记可以准确清晰地指导我们如何设计和开发这些编译器。 总之,编译原理笔记PDF是一份非常有价值的学习资料,可以帮助我们深入了解编译原理,掌握相关的技能,并将这些知识应用到实际情况中。 ### 回答2: 编译原理笔记PDF是一份非常全面的编译原理学习资料,其中详细介绍了编译原理的各个方面,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等。这些内容不仅涵盖了编译原理的基本理论概念和算法,还提供了许多实际的实现案例和实际开发中的工具。 对于想要学习编译原理的同学来说,编译原理笔记PDF是一个非常好的选择,它可以帮助同学们快速地掌握编译原理的相关知识和技能。通过对这份资料的学习,同学们能够从实际问题和实际应用的角度深入理解编译原理的相关概念和算法,同时掌握一些实用的工具和技术,从而更好地应对工作和学习中的编译问题。 总之,编译原理笔记PDF是一份非常有价值的学习资料,它能够帮助同学们更好地学习和理解编译原理的相关概念和算法,同时提供一些实际的工具和技术供同学们参考和应用。建议有相关需求的同学一定要好好利用这份资料,从中学到更多有用的知识和技能。 ### 回答3: 编译原理笔记 pdf是一本关于编译原理的学习资料,其中涵盖了编译原理的基础知识、重要概念、算法和分析等内容。编译原理是计算机科学中非常重要的一门学科,其研究的是如何将一种高级语言转化为低级语言,并使之在计算机中运行。编译原理涵盖的内容很广,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等等。 编译原理笔记 pdf可以帮助学习者更好地理解和掌握编译原理的知识,尤其是对于那些正在学习编译原理或者准备学习编译原理的人来说,是一本非常有价值的资料。它可以帮助学习者更深入地了解编译原理的基础概念,例如编译器、编译过程、语言处理器等等,同时也可以帮助学习者更准确地理解编译原理中的各种概念和算法,例如文法、自动机、LL(1)分析器、LR分析器等等。 总之,编译原理笔记 pdf是一本非常实用、有价值的学习资料,它对于那些正在学习或者准备学习编译原理的人来说,是一本非常有趣和有用的书籍。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

混子王江江

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值