Merkle Tree(默克尔树)算法解析

2023-11-06

Merkle Tree(默克尔树)算法解析


1、Merkle Tree概念

  

  Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一棵树。Merkle树的叶子是数据块(例如,文件或者文件的集合)的hash值。非叶节点是其对应子节点串联字符串的hash。[1]

  1. Hash

  Hash是一个把任意长度的数据映射成固定长度数据的函数[2]。例如,对于数据完整性校验,最简单的方法是对整个数据做Hash运算得到固定长度的Hash值,然后把得到的Hash值公布在网上,这样用户下载到数据之后,对数据再次进行Hash运算,比较运算结果和网上公布的Hash值进行比较,如果两个Hash值相等,说明下载的数据没有损坏。可以这样做是因为输入数据的稍微改变就会引起Hash运算结果的面目全非,而且根据Hash值反推原始输入数据的特征是困难的。[3]

  如果从一个稳定的服务器进行下载,采用单一Hash是可取的。但如果数据源不稳定,一旦数据损坏,就需要重新下载,这种下载的效率是很低的。

  2. Hash List

  在点对点网络中作数据传输的时候,会同时从多个机器上下载数据,而且很多机器可以认为是不稳定或者不可信的。为了校验数据的完整性,更好的办法是把大的文件分割成小的数据块(例如,把分割成2K为单位的数据块)。这样的好处是,如果小块数据在传输过程中损坏了,那么只要重新下载这一快数据就行了,不用重新下载整个文件。

  怎么确定小的数据块没有损坏哪?只需要为每个数据块做Hash。BT下载的时候,在下载到真正数据之前,我们会先下载一个Hash列表。那么问题又来了,怎么确定这个Hash列表本事是正确的哪?答案是把每个小块数据的Hash值拼到一起,然后对这个长字符串在作一次Hash运算,这样就得到Hash列表的根Hash(Top Hash or Root Hash)。下载数据的时候,首先从可信的数据源得到正确的根Hash,就可以用它来校验Hash列表了,然后通过校验后的Hash列表校验数据块。

  3. Merkle Tree

  Merkle Tree可以看做Hash List的泛化(Hash List可以看作一种特殊的Merkle Tree,即树高为2的多叉Merkle Tree)。

  在最底层,和哈希列表一样,我们把数据分成小的数据块,有相应地哈希和它对应。但是往上走,并不是直接去运算根哈希,而是把相邻的两个哈希合并成一个字符串,然后运算这个字符串的哈希,这样每两个哈希就结婚生子,得到了一个”子哈希“。如果最底层的哈希总数是单数,那到最后必然出现一个单身哈希,这种情况就直接对它进行哈希运算,所以也能得到它的子哈希。于是往上推,依然是一样的方式,可以得到数目更少的新一级哈希,最终必然形成一棵倒挂的树,到了树根的这个位置,这一代就剩下一个根哈希了,我们把它叫做 Merkle Root[3]

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

  Merkle Tree和Hash List的主要区别是,可以直接下载并立即验证Merkle Tree的一个分支。因为可以将文件切分成小的数据块,这样如果有一块数据损坏,仅仅重新下载这个数据块就行了。如果文件非常大,那么Merkle tree和Hash list都很到,但是Merkle tree可以一次下载一个分支,然后立即验证这个分支,如果分支验证通过,就可以下载数据了。而Hash list只有下载整个hash list才能验证。


2、Merkle Tree的特点

  1. MT是一种树,大多数是二叉树,也可以多叉树,无论是几叉树,它都具有树结构的所有特点;
  2. Merkle Tree的叶子节点的value是数据集合的单元数据或者单元数据HASH。
  3. 非叶子节点的value是根据它下面所有的叶子节点值,然后按照Hash算法计算而得出的。[4][5]

  通常,加密的hash方法像SHA-2和MD5用来做hash。但如果仅仅防止数据不是蓄意的损坏或篡改,可以改用一些安全性低但效率高的校验和算法,如CRC。

  Second Preimage Attack: Merkle tree的树根并不表示树的深度,这可能会导致second-preimage attack,即攻击者创建一个具有相同Merkle树根的虚假文档。一个简单的解决方法在Certificate Transparency中定义:当计算叶节点的hash时,在hash数据前加0x00。当计算内部节点是,在前面加0x01。另外一些实现限制hash tree的根,通过在hash值前面加深度前缀。因此,前缀每一步会减少,只有当到达叶子时前缀依然为正,提取的hash链才被定义为有效。


3、Merkle Tree的操作

  1. 创建Merckle Tree

  加入最底层有9个数据块。

  step1:(红色线)对数据块做hash运算,Node0i = hash(Data0i), i=1,2,…,9

  step2: (橙色线)相邻两个hash块串联,然后做hash运算,Node1((i+1)/2) = hash(Node0i+Node0(i+1)), i=1,3,5,7;对于i=9, Node1((i+1)/2) = hash(Node0i)

  step3: (黄色线)重复step2

  step4:(绿色线)重复step2

  step5:(蓝色线)重复step2,生成Merkle Tree Root

易得,创建Merkle Tree是O(n)复杂度(这里指O(n)次hash运算),n是数据块的大小。得到Merkle Tree的树高是log(n)+1。

  2. 检索数据块

为了更好理解,我们假设有A和B两台机器,A需要与B相同目录下有8个文件,文件分别是f1 f2 f3 ....f8。这个时候我们就可以通过Merkle Tree来进行快速比较。假设我们在文件创建的时候每个机器都构建了一个Merkle Tree。具体如下图:

  从上图可得知,叶子节点node7的value = hash(f1),是f1文件的HASH;而其父亲节点node3的value = hash(v7, v8),也就是其子节点node7 node8的值得HASH。就是这样表示一个层级运算关系。root节点的value其实是所有叶子节点的value的唯一特征。

  假如A上的文件5与B上的不一样。我们怎么通过两个机器的merkle treee信息找到不相同的文件? 这个比较检索过程如下:

  Step1. 首先比较v0是否相同,如果不同,检索其孩子node1和node2.

  Step2. v1 相同,v2不同。检索node2的孩子node5 node6;

  Step3. v5不同,v6相同,检索比较node5的孩子node 11 和node 12

  Step4. v11不同,v12相同。node 11为叶子节点,获取其目录信息。

  Step5. 检索比较完毕。

  以上过程的理论复杂度是Log(N)。过程描述图如下:

 

  从上图可以得知真个过程可以很快的找到对应的不相同的文件。

  3. 更新,插入和删除

  虽然网上有很多关于Merkle Tree的资料,但大部分没有涉及Merkle Tree的更新、插入和删除操作,讨论Merkle Tree的检索和遍历的比较多。我也是非常困惑,一种树结构的操作肯定不仅包括查找,也包括更新、插入和删除的啊。后来查到stackexchange上的一个问题,才稍微有点明白,原文见[6]。

  对于Merkle Tree数据块的更新操作其实是很简单的,更新完数据块,然后接着更新其到树根路径上的Hash值就可以了,这样不会改变Merkle Tree的结构。但是,插入和删除操作肯定会改变Merkle Tree的结构,如下图,一种插入操作是这样的:

  插入数据块0后(考虑数据块的位置),Merkle Tree的结构是这样的:

  而[6]中的同学在考虑一种插入的算法,满足下面条件:

  

  • re-hashing操作的次数控制在log(n)以内
  • 数据块的校验在log(n)+1以内
  • 除非原始树的n是偶数,插入数据后的树没有孤儿,并且如果有孤儿,那么孤儿是最后一个数据块
  • 数据块的顺序保持一致
  • 插入后的Merkle Tree保持平衡

  然后上面的插入结果就会变成这样:

  根据[6]中回答者所说,Merkle Tree的插入和删除操作其实是一个工程上的问题,不同问题会有不同的插入方法。如果要确保树是平衡的或者是树高是log(n)的,可以用任何的标准的平衡二叉树的模式,如AVL树,红黑树,伸展树,2-3树等。这些平衡二叉树的更新模式可以在O(lgn)时间内完成插入操作,并且能保证树高是O(lgn)的。那么很容易可以看出更新所有的Merkle Hash可以在O((lgn)2)时间内完成(对于每个节点如要更新从它到树根O(lgn)个节点,而为了满足树高的要求需要更新O(lgn)个节点)。如果仔细分析的话,更新所有的hash实际上可以在O(lgn)时间内完成,因为要改变的所有节点都是相关联的,即他们要不是都在从某个叶节点到树根的一条路径上,或者这种情况相近。

  [6]的回答者说实际上Merkle Tree的结构(是否平衡,树高限制多少)在大多数应用中并不重要,而且保持数据块的顺序也在大多数应用中也不需要。因此,可以根据具体应用的情况,设计自己的插入和删除操作。一个通用的Merkle Tree插入删除操作是没有意义的。


4、Merkle Tree的应用

  1. 数字签名

  最初Merkle Tree目的是高效的处理Lamport one-time signatures。 每一个Lamport key只能被用来签名一个消息,但是与Merkle tree结合可以来签名多条Merkle。这种方法成为了一种高效的数字签名框架,即Merkle Signature Scheme。

  2. P2P网络

  在P2P网络中,Merkle Tree用来确保从其他节点接受的数据块没有损坏且没有被替换,甚至检查其他节点不会欺骗或者发布虚假的块。大家所熟悉的BT下载就是采用了P2P技术来让客户端之间进行数据传输,一来可以加快数据下载速度,二来减轻下载服务器的负担。BT即BitTorrent,是一种中心索引式的P2P文件分分析通信协议[7]

  要进下载必须从中心索引服务器获取一个扩展名为torrent的索引文件(即大家所说的种子),torrent文件包含了要共享文件的信息,包括文件名,大小,文件的Hash信息和一个指向Tracker的URL[8]。Torrent文件中的Hash信息是每一块要下载的文件内容的加密摘要,这些摘要也可运行在下载的时候进行验证。大的torrent文件是Web服务器的瓶颈,而且也不能直接被包含在RSS或gossiped around(用流言传播协议进行传播)。一个相关的问题是大数据块的使用,因为为了保持torrent文件的非常小,那么数据块Hash的数量也得很小,这就意味着每个数据块相对较大。大数据块影响节点之间进行交易的效率,因为只有当大数据块全部下载下来并校验通过后,才能与其他节点进行交易。

  就解决上面两个问题是用一个简单的Merkle Tree代替Hash List。设计一个层数足够多的满二叉树,叶节点是数据块的Hash,不足的叶节点用0来代替。上层的节点是其对应孩子节点串联的hash。Hash算法和普通torrent一样采用SHA1。其数据传输过程和第一节中描述的类似。

 

  3. Trusted Computing

  可信计算是可信计算组为分布式计算环境中参与节点的计算平台提供端点可信性而提出的。可信计算技术在计算平台的硬件层引入可信平台模块(Trusted Platform,TPM),实际上为计算平台提供了基于硬件的可信根(Root of trust,RoT)。从可信根出发,使用信任链传递机制,可信计算技术可对本地平台的硬件及软件实施逐层的完整性度量,并将度量结果可靠地保存再TPM的平台配置寄存器(Platform configuration register,PCR)中,此后远程计算平台可通过远程验证机制(Remote Attestation)比对本地PCR中度量结果,从而验证本地计算平台的可信性。可信计算技术让分布式应用的参与节点摆脱了对中心服务器的依赖,而直接通过用户机器上的TPM芯片来建立信任,使得创建扩展性更好、可靠性更高、可用性更强的安全分布式应用成为可能[10]。可信计算技术的核心机制是远程验证(remote attestation),分布式应用的参与结点正是通过远程验证机制来建立互信,从而保障应用的安全。

  文献[10]提出了一种基于Merkle Tree的远程验证机制,其核心是完整性度量值哈希树。

  首先,RAMT 在内核中维护的不再是一张完整性度量值列表(ML),而是一棵完整性度量值哈希树(integrity measurement hash tree,简称IMHT).其中,IMHT的叶子结点存储的数据对象是待验证计算平台上被度量的各种程序的完整性哈希值,而其内部结点则依据Merkle 哈希树的构建规则由子结点的连接的哈希值动态生成。

  其次,为了维护IMHT 叶子结点的完整性,RAMT 需要使用TPM 中的一段存储器来保存IMHT 可信根哈希的值。

  再次,RAMT 的完整性验证过程基于认证路径(authentication path)实施.认证路径是指IMHT 上从待验证叶子结点到根哈希的路径。

  4. IPFS

  IPFS(InterPlanetary File System)是很多NB的互联网技术的综合体,如DHT( Distributed HashTable,分布式哈希表),Git版本控制系统,Bittorrent等。它创建了一个P2P的集群,这个集群允许IPFS对象的交换。全部的IPFS对象形成了一个被称作Merkle DAG的加密认证数据结构。

  IPFS对象是一个含有两个域的数据结构:

  • Data – 非结构的二进制数据,大小小于256kB
  • Links – 一个Link数据结构的数组。IPFS对象通过他们链接到其他对象

  Link数据结构包含三个域:

  • Name – Link的名字
  • Hash – Link链接到对象的Hash
  • Size – Link链接到对象的累积大小,包括它的Links

  通过Name和Links,IPFS的集合组成了一个Merkle DAG(有向无环图)。

  对于小文件(<256kB),是一个没有Links的IPFS对象。

  对于大文件,被表示为一个文件块(<256kB)的集合。只有拥有最小的Data的对象来代表这个大文件。这个对象的Links的名字都为空字符串。

  目录结构:目录是没有数据的IPFS对象,它的链接指向其包含的文件和目录。

  IPFS可以表示Git使用的数据结构,Git commit object。Commit Object主要的特点是他有一个或多个名为’parent0’和‘parent1’等的链接(这些链接指向前一个版本),以及一个名为object的对象(在Git中成为tree)指向引用这个commit的文件系统结构。

  5. BitCoin和Ethereum[12][13]

  Merkle Proof最早的应用是Bitcoin,它是由中本聪在2009年描述并创建的。Bitcoin的Blockchain利用Merkle proofs来存储每个区块的交易。

  而这样做的好处,也就是中本聪描述到的“简化支付验证”(Simplified Payment Verification,SPV)的概念:一个“轻客户端”(light client)可以仅下载链的区块头即每个区块中的80byte的数据块,仅包含五个元素,而不是下载每一笔交易以及每一个区块:

  • 上一区块头的哈希值
  • 时间戳
  • 挖矿难度值
  • 工作量证明随机数(nonce)
  • 包含该区块交易的Merkle Tree的根哈希

  如果客户端想要确认一个交易的状态,它只需简单的发起一个Merkle proof请求,这个请求显示出这个特定的交易在Merkle trees的一个之中,而且这个Merkle Tree的树根在主链的一个区块头中。

  但是Bitcoin的轻客户端有它的局限。一个局限是,尽管它可以证明包含的交易,但是它不能进行涉及当前状态的证明(如数字资产的持有,名称注册,金融合约的状态等)。

  Bitcoin如何查询你当前有多少币?一个比特币轻客户端,可以使用一种协议,它涉及查询多个节点,并相信其中至少会有一个节点会通知你,关于你的地址中任何特定的交易支出,而这可以让你实现更多的应用。但对于其他更为复杂的应用而言,这些远远是不够的。一笔交易影响的确切性质(precise nature),可以取决于此前的几笔交易,而这些交易本身则依赖于更为前面的交易,所以最终你可以验证整个链上的每一笔交易。为了解决这个问题,Ethereum的Merkle Tree的概念,会更进一步。

  Ethereum的Merkle Proof

  每个以太坊区块头不是包括一个Merkle树,而是为三种对象设计的三棵树:

  • 交易Transaction
  • 收据Receipts(本质上是显示每个交易影响的多块数据)
  • 状态State

  这使得一个非常先进的轻客户端协议成为了可能,它允许轻客户端轻松地进行并核实以下类型的查询答案:

  • 这笔交易被包含在特定的区块中了么?
  • 告诉我这个地址在过去30天中,发出X类型事件的所有实例(例如,一个众筹合约完成了它的目标)
  • 目前我的账户余额是多少?
  • 这个账户是否存在?
  • 假如在这个合约中运行这笔交易,它的输出会是什么?

  第一种是由交易树(transaction tree)来处理的;第三和第四种则是由状态树(state tree)负责处理,第二种则由收据树(receipt tree)处理。计算前四个查询任务是相当简单的。服务器简单地找到对象,获取Merkle分支,并通过分支来回复轻客户端。

  第五种查询任务同样也是由状态树处理,但它的计算方式会比较复杂。这里,我们需要构建一个Merkle状态转变证明(Merkle state transition proof)。从本质上来讲,这样的证明也就是在说“如果你在根S的状态树上运行交易T,其结果状态树将是根为S',log为L,输出为O” (“输出”作为存在于以太坊的一种概念,因为每一笔交易都是一个函数调用;它在理论上并不是必要的)。

  为了推断这个证明,服务器在本地创建了一个假的区块,将状态设为 S,并在请求这笔交易时假装是一个轻客户端。也就是说,如果请求这笔交易的过程,需要客户端确定一个账户的余额,这个轻客户端(由服务器模拟的)会发出一个余额查询请求。如果需要轻客户端在特点某个合约的存储中查询特定的条目,这个轻客户端就会发出这样的请求。也就是说服务器(通过模拟一个轻客户端)正确回应所有自己的请求,但服务器也会跟踪它所有发回的数据。

  然后,服务器从上述的这些请求中把数据合并并把数据以一个证明的方式发送给客户端。

  然后,客户端会进行相同的步骤,但会将服务器提供的证明作为一个数据库来使用。如果客户端进行步骤的结果和服务器提供的是一样的话,客户端就接受这个证明。

  MPT(Merkle Patricia Trees)

  前面我们提到,最为简单的一种Merkle Tree大多数情况下都是一棵二叉树。然而,Ethereum所使用的Merkle Tree则更为复杂,我们称之为“梅克尔.帕特里夏树”(Merkle Patricia tree)。

  对于验证属于list格式(本质上来讲,它就是一系列前后相连的数据块)的信息而言,二叉Merkle Tree是非常好的数据结构。对于交易树来说,它们也同样是不错的,因为一旦树已经建立,花多少时间来编辑这棵树并不重要,树一旦建立了,它就会永远存在并且不会改变。

  但是,对于状态树,情况会更复杂些。以太坊中的状态树基本上包含了一个键值映射,其中的键是地址,而值包括账户的声明、余额、随机数nounce、代码以及每一个账户的存储(其中存储本身就是一颗树)。例如,摩登测试网络(the Morden testnet )的创始状态如下所示:

  然而,不同于交易历史记录,状态树需要经常地进行更新:账户余额和账户的随机数nonce经常会更变,更重要的是,新的账户会频繁地插入,存储的键( key)也会经常被插入以及删除。我们需要这样的数据结构,它能在一次插入、更新、删除操作后快速计算到树根,而不需要重新计算整个树的Hash。这种数据结构同样得包括两个非常好的第二特征:

  • 树的深度是有限制的,即使考虑攻击者会故意地制造一些交易,使得这颗树尽可能地深。不然,攻击者可以通过操纵树的深度,执行拒绝服务攻击(DOS attack),使得更新变得极其缓慢。
  • 树的根只取决于数据,和其中的更新顺序无关。换个顺序进行更新,甚至重新从头计算树,并不会改变根。

  MPT是最接近同时满足上面的性质的的数据结构。MPT的工作原理的最简单的解释是,值通过键来存储,键被编码到搜索树必须要经过的路径中。每个节点有16个孩子,因此路径又16进制的编码决定:例如,键‘dog’的16进制编码是6 4 6 15 6 7,所以从root开始到第六个分支,然后到第四个,再到第六个,再到第十五个,这样依次进行到达树的叶子。

  在实践中,当树稀少时也会有一些额外的优化,我们会使过程更为有效,但这是基本的原则。

  6. 其他应用

  用到Merkle Tree的应用还有很多,比如Git,Amazon Dynamo,Apache Wave Protocol,Tahoe-LAFS backup system,Certificate Transparency framework,NoSQL systems like Apache Cassadra and Riak等


5、参考

[1]  https://en.wikipedia.org/wiki/Merkle_tree

[2]  https://en.wikipedia.org/wiki/Hash_function#Hash_function_algorithms

[3]  http://www.jianshu.com/p/458e5890662f

[4]  http://blog.csdn.net/xtu_xiaoxin/article/details/8148237

[5]  http://blog.csdn.net/yuanrxdu/article/details/22474697?utm_source=tuicool&utm_medium=referral

[6]  http://crypto.stackexchange.com/questions/22669/merkle-hash-tree-updates

[7]  https://en.wikipedia.org/wiki/BitTorrent

[8]  梁成仁, 李健勇, 黄道颖, 等. 基于 Merkle 树的 BT 系统 torrent 文件优化策略[J]. 计算机工程, 2008, 34(3): 85-87.

[9]  http://bittorrent.org/beps/bep_0030.html

[10] 徐梓耀, 贺也平, 邓灵莉. 一种保护隐私的高效远程验证机制[J]. Journal of Software, 2011, 22(2).

[11] http://whatdoesthequantsay.com/2015/09/13/ipfs-introduction-by-example/

[12] https://www.weusecoins.com/what-is-a-merkle-tree/

[13] http://www.8btc.com/merkling-in-ethereum


注:本文参考  Merkle Tree学习qu

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Merkle Tree(默克尔树)算法解析 的相关文章

  • 怎样选择好的数字货币来进行投资?

    对区块链行业来说 2018年可以说是非常萧条的一年 因为许多投资者目睹并经历了非理性繁荣和泡沫破裂 对于普通投资者来说 投资数字现金通常面临两种风险 一是数字现金本身是否存在投机风险 二是数字现金交易平台存在的相关风险没有监管 数字货币自身
  • 荐读

    本文转自 链闻 ChainNews 作者 Karen 虽然区块链技术诞生至今不过短短十余年 但是东西方天然的文化差异在加密世界中同样留下了一些痕迹 当社交媒体上关于 东方区块链 只关心币价 利益和投机而只有 西方区块链 才关心底层技术的革新
  • Gikee 大数据

    据Gikee数据显示 今日13 58分 地址 1MAhRt279uYmVC1dUxKR6dWwEULBJT34Nh 向地址 1Fc4QQu6nEc4snAe4HAb4Kryd8koH89pYk 转了34010个BTC 价值约2 17亿美元
  • 2018年区块链人才趋势:降温、调节、蓄势待发

    2018年 戊戌年 是一个不平静的年份 自960年前的戊戌年王安石变法 到最近两百年的四个戊戌年 其间发生的大事无不与 变革 息息相关 年初 从科技圈 金融圈里 引爆出一个叫 区块链 的公众热点 从技术角度而言 这并非新生事物 但因其巨大的
  • [区块链安全-CTF Protocol]区块链智能合约安全实战(已完结)

    区块链安全 CTF Protocol 区块链智能合约安全实战 前言 1 The Lost Kitty 2 RootMe 3 Trickster 4 The Golden Ticket 5 Smart Horrocrux 6 Gas Valv
  • 浅析『链上数据分析』 : 区块链 + 数据分析

    什么是链上数据分析 01 区块链 02 链上数据 03 为什么要分析链上数据 04 数据分析思维 05 数据分析技能 06 数据分析工具 07 业务逻辑理解 什么是链上数据分析 链上数据分析 顾名思义 就是对区块链上的数据进行分析 其实就是
  • 初识区块链

    这篇博客主要从社会和经济层面来直白的向大家讲述区块链是什么 比特币是什么 分享的内容仅限于自己的理解 里面会存在本人的观点 但是希望读者能有自己的独立看法 审慎的阅读本文 甚至能考虑到我的认知不足导致的偏差 不为任何投资电子货币者提供意见
  • Go语言实现区块链与加密货币-Part3(交易优化,单机模拟多节点通信)

    交易 二 在这个系列文章的一开始 我们就提到了 区块链是一个分布式数据库 不过在之前的文章中 我们选择性地跳过了 分布式 这个部分 而是将注意力都放到了 数据库 部分 到目前为止 我们几乎已经实现了一个区块链数据库的所有元素 今天 我们将会
  • 阿里巴巴都害怕的区块链电商到底是什么?

    近日 区块链权威机构中国通信工业协会区块链专业委员会 CCIAPCB 发出倡议 联合各界将中共中央政治局10月24日集体学习区块链主席讲话日作为 区块链中国日 此次中央将区块链技术放在了国家战略层面高度上 让区块链一时间成了全民热点 特别是
  • 区块链的安全性与去中心化特点:深入探讨区块链技术的安全性和去中心化特点

    摘要 本文将深入探讨区块链技术的两个核心特点 安全性和去中心化 区块链作为一种分布式账本技术 通过其独特的安全性和去中心化特点 在许多领域引起了广泛关注 我们将分析区块链的安全性原理和其与去中心化的关系 以及区块链技术在保护数据安全和提供信
  • 链语BTChat力推“加密+社交” 引领区块链新社交时代

    近些年来互联网的发展日新月异 大数据化 人工智能 物联网这些都在成为人们生活中触手可及的东西 而区块链技能则被认为是继互联网之后最具颠覆性的创新技术 此前区块链技术在金融服务业 游戏 供应链等不同的产业中都有着广泛应用 同样的对于社交平台而
  • Fabric private data入门实战

    Hyperledger Fabric private data是1 2版本引入的新特性 fabric private data是利用旁支数据库 SideDB 来保存若干个通道成员之间的私有数据 从而在通道之上又提供了一层更灵活的数据保护机制
  • 使用web3和infura开发以太坊ethereum区块链

    web3 Github https github com ethereum web3 js web3 js是以太坊提供的一个Javascript库 它封装了以太坊的RPC通信API 提供了一系列与区块链交互方法 使js与以太坊交互变得简单
  • Cumulus Encrypted Storage System(CESS)激励测试网 v0.7.5 于11月29日正式上线

    Cumulus Encrypted Storage System CESS 是基于区块链的去中心化云存储网络和 CDN 网络 支持数据在线存储和实时共享 为 Web3 高频动态数据的存储和检索提供全栈解决方案 CESS 数据价值网络是以 D
  • 新加坡社区领袖卓顺发的荣誉与大爱精神

    2023年11月24日 善济医社义务执行主席卓顺发太平绅士JP BBM L PVPA受邀出席内政部主办的答谢活动2023 主宾为内政部长兼律政部长尚穆根先生 Mr K Shanmugam 2018年起 卓顺发受委为太平绅士后 应内政部邀请
  • Solidity之旅(十)OOP-抽象合约

    抽象合约 abstractcontract 前文在讲合约继承的基类构造函数的参数时 有提到抽象合约 也就是说 如果派生合约未能给其继承的基合约指定构造函数参数时 那么 该派生合约必须声明为抽象合约 abstractcontract 我们知道
  • 股指期权开通要什么条件?

    股指期权是一种金融衍生工具 它赋予持有者在未来某一特定日期按照约定的价格买入或卖出标的资产的权利 对于投资者来说 开通股指期权账户需要满足一定的条件 那么股指期权开通要什么条件 本文来自 财顺期权 开通股指期权账户需要的条件是 申请前20个
  • 期权开户最低多少钱个人可以开?

    大家新年好 现在2024年龙年 很多想玩期权的小伙伴都知道期权开通需要50万的门槛 那么今天来给大家详细介绍下期权开户最低多少钱个人可以开 本文将对期权开户最低金额进行探讨 帮助投资者更好地了解期权交易的投资门槛 本文来自 期权酱 一 期权
  • 英国金融时报关注TRX登陆Mercado Bitcoin交易所:波场TRON强化南美洲布局,国际化进程持续加速

    近日 波场TRON网络原生代币TRX正式上线巴西最大的合规加密交易所Mercado Bitcoin 英国金融时报 Decrypt Blockworks等财经及加密行业权威媒体对该话题进行了报道 表示此次合作是波场TRON全球业务增长的有力证
  • 你的服务器还安全吗?用户数据是否面临泄露风险?

    一系列严重的网络安全事件引起了广泛关注 多家知名公司的服务器遭到黑客挟持 用户的个人数据和敏感信息面临泄露的风险 这些事件揭示了网络安全的脆弱性和黑客攻击的威胁性 提醒着企业和个人加强对网络安全的重视 一 入侵案例 1 1 蔚来数据泄露 1

随机推荐

  • 循环动态渲染img标签

    img alt listInfo icon buKa png type 补卡 id 1 icon xiuJia png type 休假 id 2
  • VS工程的3个基本文件

    VS的工程根目录下有3个文件 这3个文件都可以用记事本打开 其中 1 MyTest sln 工程主文件 含属性设置 工程从该文件打开 工程的主要属性设置在该文件中 2 MyTest filters 工程目录结构筛选器 工程的目录结构保存在这
  • leetCode热题52-57 解题代码,调试代码和思路

    前言 本文属于特定的六道题目题解和调试代码 1 剑指 Offer 22 链表中倒数第k个节点 Easy 2022 09 01 91 2 76 最小覆盖子串 Hard 2023 03 27 82 3 165 比较版本号 Medium 2023
  • Me and My Girlfriend靶机渗透

    背景描述 这个VM告诉我们 有一对恋人 即Alice和Bob 这对夫妻本来很浪漫 但是自从Alice在一家私人公司 Ceban Corp 工作以来 爱丽丝对鲍勃的态度发生了一些变化是 隐藏的 而鲍勃 Bob 寻求您的帮助 以获取爱丽丝 Al
  • Python 第四章 字典:当索引不好用时

    字典 是Python中唯一内建的映射数据结构类型 这里的映射是指通过名字引用值 字典中的值并没有特殊的顺序 值都是存储在一个特定的键里 键可以是数字 字符串甚至是元祖 什么是键 什么是值 怎么映射呢 请继续看下去 创建和使用字典 下面来创建
  • ‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序

    运行 npm run serve 报以下错误 首先检查一下文件中是否有node modules文件夹 如果没有则执行以下代码 npm install 其中可能会有很多警告 不用搭理 如果文件中已经有node modules文件夹 那么先把n
  • 接口自动化测试总结

    前言 本文是我在公司总结的一点点个人建议 可能有非常多的遗漏 先记录下来这时候我的理解 公司是做共享单车业务的 所以场景基本上也可以复用 毕竟大家都骑过单车 注明 code是我司接口返回的标志 编写之前 接口相关 这块总结不全 了解接口的功
  • 【Springboot WebSocket STOMP使用 2】STOMP使用@SendToUser实现用户个人请求-响应

    背景 STOMP协议的模型是 订阅 发布 式的 所以一般场景是同一个主题的广播 而有些场景下用户既想保持当前的WebSocket Session复用 又想消息的响应只有我自己能收到 指定其他某一个用户也行 不过得用其他api方法 不需要别人
  • 九月十月百度人搜,阿里巴巴,腾讯华为笔试面试八十题(第331-410题)

    九月十月百度人搜 阿里巴巴 腾讯华为小米搜狗笔试面试八十题 引言 自发表上一篇文章至今 事实上 上篇文章更新了近3个月之久 blog已经停了3个多月 而在那之前 自开博以来的21个月每月都不曾断过 正如上一篇文章支持向量机通俗导论 理解SV
  • 嵌入式Linux下使用OpenCV

    By Toradex 秦海 1 简介 OpenCV的全称是Open Source Computer Vision Library 是一个跨平台的计算机视觉库 OpenCV是由英特尔公司发起并参与开发 以BSD许可证授权发行 可以在商业和研究
  • 机器学习之实战matlab神经网络工具箱

    上节在 机器学习之从logistic到神经网络算法 中 我们已经从原理上介绍了神经网络算法的来源与构造 并编程实战了简单神经网络对于线性与非线性数据的分类测试实验 看过上节的可能会发现 上节实现的算法对于非线性数据的分类效果并不是非常完美
  • Java并发编程系列8 - 多线程实战

    主要基于小米最近的多线程项目 抽离出里面的多线程实例 前言 Java多线程的学习 也有大半个月了 从开始学习Java多线程时 就给自己定了一个小目标 希望能写一个多线程的Demo 今天主要是兑现这个小目标 这个多线程的示例 其实是结合最近小
  • JVM_09 类加载与字节码技术(字节码指令2)

    1 条件判断指令 几点说明 byte short char 都会按 int 比较 因为操作数栈都是 4 字节 goto 用来进行跳转到指定行号的字节码 源码 public class Demo3 3 public static void m
  • ES 的聚合机制和模糊匹配

    一 Elasticsearch对于大数据量 上亿量级 的聚合如何实现 Elasticsearch 提供的首个近似聚合是cardinality 度量 它提供一个字段的基数 即该字段的distinct或者unique值的数目 它是基于HLL算法
  • node.js入门学习

    文章目录 一 第一个node js应用 二 node js文件系统 1 读取文件 2 写入文件 三 node js模块化 新建一个module1 js文件 在require js文件中引入module1 js文件 四 node js发起GE
  • 参考文献期刊首字大写_sci论文参考文献格式

    学术论文的写作都离不开参考文献的引用与借鉴 参考文献的引用与借鉴可以让我们的文章更具可读性 也更具权威性与科学性 所以学术界对参考文献的引用有着明确的格式要求 凡是引用他人的文献都要在文章中做相应标注 这对原作者来说也是一种权利的保护 参考
  • 【OLED驱动】:stm32F103的四线模拟IIC驱动的0.96寸OLED屏幕显示数字,字母,汉字,图片的例程

    文章目录 前言 一 四线OLED是什么 二 IIC原理 1 四线0 96寸OLED是IIC驱动来实现显示 2 IIC协议的OLED屏幕 3 STM32驱动代码 4 IIC使用代码 总结 前言 最近在做一个开源方案 平衡车 即将开源硬件和软件
  • C++报错不允许使用不完整的类型

    include pch h include
  • #define _CRT_SECURE_NO_WARNINGS 1问题

    文章目录 前言 一 为什么用了scanf strcyp strlen strcat等函数会报错 二 操作步骤 1 下载notepad 2 修改 总结 前言 当我们的代码出现这样的报错时 不要慌张 应该是你用了scanf strcyp str
  • Merkle Tree(默克尔树)算法解析

    Merkle Tree 默克尔树 算法解析 1 Merkle Tree概念 Merkle Tree 通常也被称作Hash Tree 顾名思义 就是存储hash值的一棵树 Merkle树的叶子是数据块 例如 文件或者文件的集合 的hash值