区块链中如何验证交易存在? 如何验证交易不存在?Merkel Proof和Merkel Tree的应用——中山大学软件工程学院专选课《区块链》课堂小测

这篇具有很好参考价值的文章主要介绍了区块链中如何验证交易存在? 如何验证交易不存在?Merkel Proof和Merkel Tree的应用——中山大学软件工程学院专选课《区块链》课堂小测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Merkle Proof 是一种用于验证区块链中某一特定交易确实存在于某一区块内的机制。这一机制是基于 Merkle Tree(默克尔树)的结构来进行的。

证明存在

默克尔树是一种二叉树,其中每个叶节点是某个交易的哈希值,每个非叶节点是其子节点哈希值合并后再哈希的结果。

验证步骤:

  1. 找到交易哈希:首先,你需要知道你想要验证的交易的哈希值。

  2. 获取路径(Merkle Path):从该交易的哈希开始,找到一条路径通向默克尔树的根。这个路径上会有一系列的哈希值,这些哈希值是用于从叶节点(你的交易)计算到根节点的。

  3. 重新计算并比对根哈希:使用这些路径上的哈希值和给定的交易哈希,通过相同的哈希函数重新计算出一个根哈希。

  4. 验证根哈希:如果重新计算出的根哈希与区块头中存储的默克尔根相匹配,那么这个交易就被认为是存在于该区块内的。

示例:

假设要验证交易 T3 存在于以下的默克尔树中:

                          Root=H(H1+H2)
                         /              \
                  H1=H(T1+T2)        H2=H(T3+T4)
                 /          \        /          \
               T1          T2     T3          T4

你只需要以下几个哈希值来验证 T3:

  • T3 的哈希(自己有)
  • T4 的哈希(路径上的兄弟节点)
  • H1 的哈希(路径上的“叔叔”节点)

然后,用这些哈希值重构一个新的默克尔根,并与原来的默克尔根进行比对。如果一致,就证明了 T3 确实存在于该区块中。

这种方式的优点是,你不需要知道区块内所有的交易,只需要路径上的几个哈希值就能完成验证,大大提高了效率。

证明不存在?

如果先对下面的交易用哈希值进行排序。

验证步骤:

  1. 寻找相邻节点:找出该交易哈希应该插入的位置,以及应该与其相邻的两个存在于树中的交易(一个比它小,一个比它大)。

  2. 提供路径证明:提供从这两个相邻交易到默克尔根的路径(Merkle Path)。

  3. 验证与相邻交易的顺序关系:验证这两个交易确实是按照预期的顺序排序的(一个比目标交易小,一个比目标交易大)。

  4. 重新计算默克尔根:使用提供的Merkle Path和相邻交易的哈希值来重新计算默克尔根。

  5. 比对默克尔根:如果重新计算出的默克尔根与区块头中的默克尔根匹配,那么就证明了该交易确实不存在于这个区块中。

这样,你就提供了一个加密学证明,表明某个特定的交易并不在排序的默克尔树中。

示例:

假设我们有一个简化的默克尔树,其中包含四个交易:T1, T2, T3 和 T4。它们的哈希值分别是 H(T1), H(T2), H(T3) 和 H(T4)。这些交易已经按照哈希值排序。默克尔树和其对应的默克尔根(Merkle Root)将如下:

                 Merkle Root = H( H(T1 + T2) + H(T3 + T4) )
                        /                             \
                H(T1 + T2)                    H(T3 + T4)
               /          \                  /           \
           H(T1)        H(T2)           H(T3)         H(T4)

现在,我们要证明一个交易 T5(假设其哈希值为 H(T5))不存在于这个树中。

步骤

  1. 寻找相邻节点: 假设 H(T5) 的值介于 H(T2) 和 H(T3) 之间,那么这两个哈希值就是它的相邻节点。

  2. 提供路径证明: 为了证明 T5 不存在,我们需要提供从 H(T2) 和 H(T3) 到 Merkle Root 的路径。这个路径包括 H(T1 + T2) 和 H(T3 + T4)。

  3. 验证与相邻交易的顺序关系: 确保 H(T2) < H(T5) < H(T3)。

  4. 重新计算默克尔根: 使用提供的路径和相邻交易的哈希值重新计算 Merkle Root。这个重新计算的值应该与原来的 Merkle Root 相匹配。

  5. 比对默克尔根: 如果重新计算出的 Merkle Root 与区块头中的 Merkle Root 匹配,那么证明了 T5 确实不存在于这个默克尔树中。

课堂小测

区块链中如何验证交易存在? 如何验证交易不存在?Merkel Proof和Merkel Tree的应用——中山大学软件工程学院专选课《区块链》课堂小测,区块链课程笔记,区块链

H(usc):df77c5138ae76098923e7fd44343e18781f7f1ecb6c36dd5d98bc8a522dcd2e0

H(sysu):2a5511e342dfa8c10702aab2c4c7ff9c1ffebb42c37aa04a412dfaed54fca809

H(edu):e613bb442bf089c035920266fa19f94a0972c896f212eda804d265c3b3f0e3f9

H(cn):ff2082aa78aea80a27cb4fb91f0350153702c16dce790a77f0bb0bfbf6899977

H(http):e0603c499aae47eb89343ad0ef3178e044c62e70ae2309b35591d1d49a3211ec

H(www):7c2ecd07f155648431e0f94b89247d713c5786e1e73e953f2fe7eca39534cd6d

H(sse):fe3811fe21af748f53a05a169da84013d11253a53e3ef80355d20419fd89042e

H(com):71b4f3a3748cd6843c01e293e701fce769f52381821e21daf2ff4fe9ea57a6f3

从左到右设为1~8。

H(12):f5b0b7461833a4e2ac56657c150f11bb63ed0e36ec43af5a96eaf7d3242c3807

H(34):80e017a08b6183caa32503a5bad1ac90e74dfff1b320aaca21f473d0e3967317

H(56):eea8657e41e85285f413dd2d16cf08b37740e60ca5cbd6b91ee3f12b064699d8

H(78):c368e3368d22f4097c5fe9217b45515b5dc1ccf8f673e3abb90d965a23b71ded

H(1234):a11727da1551ad53dfb52845e41ffbc3da34ae860e7fcd78ff01de9a8e618eef

H(5678):ccb6f11b960f33d2716403bf052653539ec868e8db3120f4a449782b6d3ef324

H(12345678):1f60e41b8d3f13a560ac45aabcf837d2dfc08e7fa20fb8953f348d0cd2a6ada3

最后对比程序发现对不上,经过检查,发现是H(78)搞错了

H(78):e843dfb9cad6473137ca1fc850ad73ae6c248363463af387e33212d610a458d8

H(5678):251a199817adefc2e538ace4cc1840c00183a1cd3d676efdf52e58b1498ba436

H(12345678):b879b81f6b08259a3616e6a0ce690d33bba80c25d1768fe54ae570259f065c77

要证明存在交易"sysu"就要找到一条"merkel path",sysu对应H(2),那path(最后能算出H(12345678)在这里是H(1),H(34),H(5678)。

H(12)=H(H(1) H(2))

        =f5b0b7461833a4e2ac56657c150f11bb63ed0e36ec43af5a96eaf7d3242c3807

之前算过H(34)=80e017a08b6183caa32503a5bad1ac90e74dfff1b320aaca21f473d0e3967317

那么H(1234)=a11727da1551ad53dfb52845e41ffbc3da34ae860e7fcd78ff01de9a8e618eef

H(12345678)=b879b81f6b08259a3616e6a0ce690d33bba80c25d1768fe54ae570259f065c77

与之前算出来的Root Hash相同,故存在。文章来源地址https://www.toymoban.com/news/detail-716333.html

代码实现

import hashlib


# 计算SHA256哈希
def sha256(text):
    return hashlib.sha256(text.encode()).hexdigest()


# 创建默克尔树
def merkle_tree(leaf_nodes):
    if len(leaf_nodes) == 1:
        return leaf_nodes[0]

    parent_nodes = []

    for i in range(0, len(leaf_nodes), 2):
        left = leaf_nodes[i]
        if i + 1 < len(leaf_nodes):
            right = leaf_nodes[i + 1]
        else:
            right = left  # 奇数个节点时复制最后一个

        parent = sha256(left + right)
        print(f"左子节点:{left}, 右子节点:{right}, 父节点:{parent}")  # 打印出每一步生成的哈希值
        parent_nodes.append(parent)

    return merkle_tree(parent_nodes)


# 生成并验证默克尔证明
def merkle_proof(target, leaf_nodes, merkle_root):
    for leaf in leaf_nodes:
        if sha256(target) == leaf:
            calculated_root = merkle_tree(leaf_nodes)
            if calculated_root == merkle_root:
                return "存在"
    return "不存在"

'''
usc
sysu
edu
cn
http
www
sse
com
'''
# 主程序
n = int(input("请输入节点数量:"))
leaf_nodes = []

print("请输入{}个字符串:".format(n))
for _ in range(n):
    text = input()
    leaf_nodes.append(sha256(text))

merkle_root = merkle_tree(leaf_nodes)
print("Merkle Root:", merkle_root)

target = input("请输入要验证的字符串:")
result = merkle_proof(target, leaf_nodes, merkle_root)
print("字符串{}在给定的字符串列表中{}".format(target, result))

到了这里,关于区块链中如何验证交易存在? 如何验证交易不存在?Merkel Proof和Merkel Tree的应用——中山大学软件工程学院专选课《区块链》课堂小测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【区块链 | Merkle】使用Merkle Tree空投,白名单验证

      Merkle Tree在高效验证数据的同时减少了链上计算和存储,因为非常适合基于区块链的白名单验证,空投,IDO等需要验证数据的业务。 默克尔树,在区块链出现前,曾广泛用于文件系统和P2P系统中。 在区块链中,默克尔树常用于高效验证数据,如,实现空投,白名单,IDO,混

    2024年02月04日
    浏览(70)
  • J9数字论:如何理解区块链中的公链,私链,侧链,联盟链

    区块链简而言之,就是一个分散式的记账本,有着点对点交易查询,公正,透明,可追溯,不可篡改,去中心化的特点。 区块链在大类上被分为公共区块链(公链),联盟区块链和私有区块链,TVL和用户量最大的公链当属以太坊。而除以太坊以外,其他公链在自身定位分类或

    2024年02月12日
    浏览(34)
  • 服务发现:在区块链中的应用:如何通过服务发现来提高区块链应用效率和客户满意度

    作者:禅与计算机程序设计艺术 随着数字货币、区块链技术的普及,以及互联网公司对其功能的整合,传统的单体应用模式已不能适应这一趋势,需要逐渐向分布式架构转型。分布式架构通常使用微服务架构的方式,将一个系统分解成多个小模块,各自独立运行且互相通信。

    2024年02月11日
    浏览(29)
  • Merkle Tree、Merkle Proof、SPV安全性分析、Bloom过滤器

    区块链基础参考前面翻译的白皮书 Merkle Tree的最大特点是:可以以一个很简短的方法来证明一棵树中存在某一个元素。即 Simplified Payment Verification,SPV 【问题】tx10、proof均为外部提供的信息,roothash又是公开信息,是否可以构造恶意数据对(tx,proof)骗过轻节点的验证,如果不能

    2024年02月09日
    浏览(30)
  • 比特币如何运作?区块链、网络、交易

    免责声明:观点来自原文作者,与本人无关,文章仅供参考学习,请自行辨别真伪,切勿跟风,风险自担。 翻译原文:https://www.blockpit.io/blog/how-does-bitcoin-work 比特币是一种革命性的数字货币,由化名中本聪的匿名人士或团体于 2008 年发明。它是世界上第一个加密货币,负责将

    2024年03月24日
    浏览(38)
  • 区块链中的:哈希算法

    哈希算法,又称散列算法,它是一个单向函数,可以把任意长度的输入数据转化为固定长度的输出: h=H(x)h=H(x)h=H(x) 例如,对  morning  和  bitcoin  两个输入进行某种哈希运算,得到的结果是固定长度的数字: 我们通常用十六进制表示哈希输出。 因为哈希算法是一个 单向函

    2024年02月06日
    浏览(34)
  • 区块链交易隐私如何保证?华为零知识证明技术实战解析

    【摘要】 零知识证明技术不管应用于金融还是其他领域,都可以对隐私保护,性能提升,或者安全性等场景带来很多帮助。本文通过介绍华为如何在同态加密及零知识证明框架的集成介绍来介绍了一些对金融领域交易隐私保护的思路,通过代码结和应用场景描述了zksnark如何

    2024年01月19日
    浏览(33)
  • 区块链中基础数据结构

    1个输入:发起人A的地址 2个输出:给B转1个币   A还剩1个币  区块链是有多个区块组成的链表,每个区块包含块头和块体, 块头中包含1. 上一个区块的哈希指针 2. 块体的根哈希 3. 时间戳 块体中包含1. 哈希树 叶子结点记录详细交易记录 非叶子结点记录哈希地址。  首先A用

    2024年02月13日
    浏览(25)
  • 区块链学习笔记(2)难度整定,区块形成,区块体,Merkle树,Merkle Proof默克尔证明

           是在每个完整节点中独立自动发生的。每2016个区块,所有节点都会按统的公式自动调整难度,这个公式是由最新2016个区块的花要时长与期望时长(期望时长为20160分钟,即两周,是按每10分钟一个区块的产生速率计算出的总时长 )比较得出的,根据实际时长与期望时

    2023年04月08日
    浏览(66)
  • QLearning在区块链中的应用

    非常感谢您的阅读。我将以专业的技术语言撰写这篇深入的技术博客文章。 区块链作为一种分布式账本技术,凭借其去中心化、不可篡改、透明公开等特性,在金融、供应链管理、数字资产交易等领域广受关注和应用。而强化学习算法Q-Learning作为一种有效的智能决策方法,近年

    2024年04月15日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包