zoukankan      html  css  js  c++  java
  • 区块链进阶笔记(一)

       我的博客地址:https://blog.csdn.net/qq_41907991

        本节就要开始学习一些区块链的进阶知识啦~

        想想还有些小激动,从区块链的简单认识,到共识算法,我之前的笔记都有提及,都是网上找的资料,还有自己看的书,一些

    很多书中的原话,外加自己的一些浅薄见解,希望大大多多指正。

        本节主要学习了简单支付验证(SPV)。

        概述:

        简单支付验证是一种无须维护完整的区块链信息只需要保存所有的区块头的信息即可支付的验证的技术。该

    技术可以大大节省区块链支付验证用户的存储空间,减轻用户的存储负担,降低区块链未来交易量剧增而给用户

    带来的压力。以比特币系统为例,节点只需要保存所有区块头信息,即可进行交易支付验证。节点虽然不能独立

    验证交易,但能从区块链其他节点获取验证的必要信息,从而完成交易支付验证,同时还可以得到整个区块链网

    络对交易的确认数。

        要理解SPV的概念,首先需要理解如下两类概念的区别。

        一是SPV与轻钱包的区别。轻钱包指的是节点本地只保存和自身相关的交易数据(尤其是可支配交易数据)

    但并不保存完整区块链信息的技术。SPV的目标是验证每个支付是否真实存在,并得到多少个确认。比如爱丽丝

    (Alice)收到来自鲍勃(Bob)的一个通知,包庇声称已经从其账户中汇款一定数额的钱给了爱丽丝。如何快速

    验证该支付的真实性,是SPV的工作目标。轻钱包的主要是为了管理节点自身的资产收入跟支付等信息。比如爱

    丽丝使用轻钱包管理自身在区块链的收入跟支出信息,在本地只保存跟爱丽丝相关的交易数据记录,尤其是可支配

    交易数据。轻钱包与SPV最大的区别就在于,轻钱包仍然需要下载每个新区块的全部数据并进行解析,获取并本

    地存储与自身相关的交易数据,只是无需在本地保存全部数据而已。而SPV节点不需要下载新区块的全部数据,

    只需要保存区块头部信息即可。虽然轻钱包或瘦客户端中部分借鉴了SPV的理念,但和SPV是完全不同的。

        二是区块链支付验证于区块链交易验证的区别。SPV指的是区块链支付验证,而不是区块链交易验证。这两种

    验证方式存在很大区别。区块链交易验证比较复杂,包括账户余额验证,双重支付判断等,通常由保存区块链完

    整信息的区块链验证节点来做。而支付验证的过程比较简单,只是判断该笔支付交易是否已经得到了区块链节点

    共识验证,并得到了多少确认数即可。还是以比特币的系统为例,用户爱丽丝收到来自鲍勃的通知,鲍勃声称已

    经从其账户汇款一定数额的钱给爱丽丝。爱丽丝进行交易验证的过程如下:

        首先,爱丽丝遍历完整的区块链账本,在区块链账本的交易中保存了鲍勃的历史交易信息(包括鲍勃的汇款账

    户,鲍勃的签名,历史收款人的地址以及汇款金额信息等),查询鲍勃的账户可以判断鲍勃是否由足够的余额,

    如果余额不足则验证交易失败;其次,爱丽丝根据区块链账本判断鲍勃是否已经支出了这笔钱给别人,即是否存

    在双重支付问题,如果存在,则交易验证失败;最后,判断鲍勃是否拥有其提供账户的支配权,如果判断失败则

    交易验证失败。而如果爱丽丝只是进行支付验证,则过程简单得多:通过SPV,爱丽丝可以进行支付快速验证,

    即检查此项支付交易是否已经被收录存储于区块链中,并得到多少个确认数,就可以判断支付验证得合法性。

        技术原理

    我们知道,在区块链中,区块信息主要包括区块大小,区块头,交易数量和交易信息四部分内容。以比特币为
    例,区块头的数据结构如下图所示:

       

        通过区块的哈希值,可以识别出区块链中的对应区块。区块前后有序连接,每一个区块都可以通过其区块头的

    “前一区块的哈希值”字段引用前一区块,这样一来,每个区块所保存的前一区块的哈希值就创建了一条可以追

    溯到创世区块的链条,前一区块的哈希值,可以确保区块链所交易的交易次序。默克尔树的跟哈希值可以确保收

    录到区块中,所有交易的真实性。

        SPV的具体工作原理如下:

        1.计算待验证支付的交易哈希值

        2.节点从区块链网络上获取并存储最长链的所有区块头到本地

        3.节点从区块链获取待验证支付对应的默克尔树哈希认证路径

        4.根据哈希认证路径,计算默克尔树的根哈希值,将计算结果与本地区块头的默克尔树的根哈希值进行比较,

    定位到包含待验证交易的区块

        5.验证该区块的区块头是否已经包含在已知最长链中,如果包含说明支付真实有效

        6.根据该区块头所处的位置,确定该支付已经得到的确认数量

  • 相关阅读:
    实习项目1.
    try catch finally的用法
    asp.net 验证控件
    数据库操作语言
    webform Response的一些成员
    jQuery
    C#@的用法
    SQL分页查询
    抽象类与接口的区别
    抽象类与接口
  • 原文地址:https://www.cnblogs.com/daimzh/p/12854506.html
Copyright © 2011-2022 走看看