热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

区块链学习总结2

比特币和以太坊的数据结构众所周知,比特币作为区块链最早最成功的应用,其不可篡改性和隐私保护性是基于哈希算法的。为了迎合哈希算法的使用,M
比特币和以太坊的数据结构

众所周知,比特币作为区块链最早最成功的应用,其不可篡改性和隐私保护性是基于哈希算法的。为了迎合哈希算法的使用,Merkle-Tree应运而生。Merkle-Tree就是一颗将指针换为哈希指针的特殊的树。然而,比特币的记录是基于交易的,这样就不能很方便地查询某个时刻某节点的余额(balance)。虽然,比特币中的全节点也维护一个UTXO(即未支出的交易),轻节点也可以向全节点查询UTXO中的内容从而得到某节点的余额。但是,这耗费的成本和时间是不必要的,同时也与我们的日常习惯相悖。

于是,以太坊提出了基于账户的区块,即以太坊中的区块体中是包括每一个区块的余额的。这时,问题来了。我们是否还能采用比特币中的Merkle-Tree结构进行账户余额的存储呢?后面我们将会揭晓。

比特币的数据结构

在这里插入图片描述
以上便是区块体中交易的存储结构。首先,各个交易Di生成一个哈希值,然后逐层向上两两合并,最后得到一颗树结构。最后,将树的根哈希值存放在区块头中作为所有交易的唯一标识。只要Merkle-Tree上的任何一笔交易被篡改,对应的哈希也会逐层变更,正所谓牵一发而动全身,最后根哈希也会被改变。所以,基于Merkle-Tree的数据结构是可以保证交易数据的不可篡改性的。其次,在区块链网络中存在着许多轻节点,即只存放区块链头信息的节点。那么当这些轻节点想检验某个交易是否被记录在区块上时,它需要怎么做呢?

难道它需要向节点请求下载树上的完整信息吗?当然不是。它只需要全节点提供该交易到根的路径上其他有关生成哈希的必要哈希值,通过沿着路径生成哈希,最后轻节点会计算出一个根哈希值。最后只需要比较计算出的根哈希和区块上记录的根哈希是否一致,若一致则说明该交易确实被记录在区块里,否则则说明该交易不存在。

这样,每个区块都把10分钟左右的交易记录在案,所有交易都将可追溯。通过交易的验证,双花问题就可以得到解决。通常,在一笔交易中,比如A需要向B支付10个比特币。那么A就得证明它在之前的区块中有得到一定量比特币的交易,这个叫做output script。比如,之前C向A支付了8个比特币,D向A支付了5个比特币。这样A在给B转账的时候,需要明确的指出C和D是曾经以一共给了他13个比特币的,这样才能顺利完成交易。同时,剩余的3个比特币需要A自己建立一个新的找零账户进行存储,否则就会被矿工当成交易费拿走(doge)。

大家有没有觉得这样很麻烦?每次给别人钱,都得去证明自己手头上的钱是合法的。于是,以太坊建立了基于账户的区块,这样显式地记录某账户的余额,就无需像比特币一般进行多次验证。

以太坊的数据结构

以太坊中的区块含有三棵树,他们都采用同一个数据结构。这里对数据结构的决定起主要作用的当然就是状态树(state tree),也就是显示某个账户有多少余额的树。这里需要维护的好像就是一个(key,value)对,key就是账户的地址,而value就是余额(balance)。

那么,不如试一下哈希表?它的查询、更新速度很快。有什么问题呢?如何生成根哈希呢?所有哈希同时一起算出一个根哈希可行吗?那么这就无法提供快速的Merkle-proof,如果采用哈希表,只有获得区块体中其余所有账户的哈希才能证明某个账户的余额是正确的。这对轻节点是十分不友好的。

那么,可否采用比特币的Merkle-Tree依葫芦画瓢呢?这里是不行的。我们需要认清比特币和以太坊的一个很大的区别。在比特币中,被记录在Merkle-Tree上的交易都是有效交易;但在以太坊中,Merkle-Tree上记录的是全部节点的余额。但在一段时间中,可能只有很少一部分账户的余额发生了变化,这对存储造成了巨大的浪费。同时,Merkle-Tree也没有快速查找和更新的方法,也没有唯一性保证。

那么,能不能只将当前发生余额变化的账户记录到Merkle-Tree上呢?这个想法不错。但可惜,仍然是不可行的。举个例子,如果B要收取A一笔费用。B就需要从当前区块逐个向前寻找包含A账户余额的区块,假若A很长一段时间没有参与交易,那么对B而言就会造成巨大的时间成本。更有甚者,如果A压根未出现过,B就需要一直搜索到创始区块(genisis block)才能发现。

现在已经否决了hash table和Merkle- Tree了。我们再次进行升级——Sorted Merkle Tree。会排序的Merkle-Tree,这就解决了快速查找和更新的问题。不幸的是,SMT的插入成本是很大的,它需要重构整颗树,代价很大。

所以,我们目前面临的一个情况是,少量的账户的余额如何进行证明?这里需要说明的是,账户的地址是由40位的16进制组成,地址之间是十分稀疏的。当然,我们还是需要对所有节点的余额信息进行存储。

想想其他数据结构。既然地址的每一位都是0~f,有没有一点思路?没错!就是trie,传说中的前缀树。它在这里简直合适不过了。其一,它的查找效率取决于地址的长度,这个我们都可以接受。其二,无论输入顺序如何,它的结构都是唯一的。其三,如果更新局部信息,只需沿着一条路径进行访问即可,无需重构数据结构。

trie在这里看似已经不错了,但其实还是有一定的缺陷。例如存在一定的存储浪费,可能地址中间的某些信息对区分地址是无用的,这就需要将其合并。这就引出了我们最终的结果:Patricia tree(路径压缩trie)。再与哈希结合,它就成了Merkle-Patricia-tree,也就是MPT。

在这里插入图片描述
总结
比特币和以太坊的工作机制固然是空前的,但我们不仅应该熟悉其工作原理,更重要的是我们应该尝试去揣测整个思考过程。正是这种批判性思维,使得区块链应用一步步趋于更加合理化。正是这种批判性思维,推动着科技发展走向新的台阶!


推荐阅读
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • HashMap的扩容知识详解
    本文详细介绍了HashMap的扩容知识,包括扩容的概述、扩容条件以及1.7版本中的扩容方法。通过学习本文,读者可以全面了解HashMap的扩容机制,提升对HashMap的理解和应用能力。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了源码分析--ConcurrentHashMap与HashTable(JDK1.8)相关的知识,希望对你有一定的参考价值。  Concu ... [详细]
  • 查找给定字符串的所有不同回文子字符串原文:https://www ... [详细]
  • 区块链为什么是不可篡改的
    不可篡改是区块链最为重要的特性和应用之一。其是由区块链本身的结构、共识机制、网络拓扑和加 ... [详细]
  • 可编辑区块链:打破你对“不可篡改”的认知,但这样的区块链还安全吗
    很多人最初了解区块链是什么的时候,除了比特币和中本聪的白皮书,听到最多的说法应该是“去中心化且不可篡改的分布式账本”。由此,区块链“不可篡改”的特性一直都深入人心。不可篡改,我是这 ... [详细]
  • iMesh网站数据在暗网上被出售
    iMesh公司曾是美国三大音乐视频分享服务提供商之一,但是据国外媒体报道,这家公司近期正式对外宣布破产。iMesh是一个文件分享软件,它能够让 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • Neutrino开放日|Polkadot 中国开发者分享会活动回顾(可下载嘉宾分享 PPT)
    3月3日下午,Neutrino开放日第2期线下活动在上海顺利结束。此次活动特邀了国内专注于Polkadot的资深区块链开发团队ChainX到场进行分享流交流。嘉宾分享 ... [详细]
  • 前面刚有AWS开战MongoDB,双方“隔空互呛”,这厢又曝出2亿+简历信息泄露——MongoDB的这场开年似乎“充实”得过分了些。长期以来,作为“最受欢迎的NoSQL数据库”,M ... [详细]
  • 区块链技术的应用案例展示
    按照行业主流观点,区块链技术应用将经历数字货币(1.0)、合约(2.0)和社会治理(3.0)阶段,当前正逐渐迈入合约阶段。一、区块链1.0:数字货币区块链技术伴随比特币应用而生,比 ... [详细]
author-avatar
书友10689978
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有