什么是Merkle树
定义
MerkleTree,也叫默克尔树或哈希树,是区块链的底层加密技术,被以太坊区块链广泛采用。MerkleTree是一种自下而上构建的加密树,每个叶子是对应数据的哈希,而每个非叶子为它的2个子节点的哈希。
如何生成Merkle树的数据
在solidity中我们通过keccak256算法计算hash值:
keccak256(abi.encodePacked(toHashValue)e.g.:hash前0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2hash后0x999bf57501565dbd2fdcea36efa2b9aef8340a8901e3459f4a4c926275d36cdb
Metropolitan Commercial Bank:FDIC保险不会对 Voyager Digital的破产提供保护:7月7日消息,Voyager Digital从未向FDIC保险投保,其此前的宣传内容中承诺持有的美元由FDIC承保是由于Metropolitan Commercial Bank向FDIC投保的缘故。此外,Voyager Digital的客户协议中也显示,FDIC保险不保护Voyager或任何托管人的渎职行为。Metropolitan CommercialBank则在其声明中表示,FDIC保险仅适用于防止Metropolitan CommercialBank的失败,并不保护Voyager的失败、Voyager或其员工的任何作为或不作为,或加密货币或其他资产的价值损失。(TheBlock)[2022/7/7 1:56:37]
在对叶子节点的值进行hash运算之后,再把相邻的节点再进行hash运算,直到只剩下一个根节点。假设存在两个相邻的节点A和B,那么在进行hash运算的时候到地址是hash(A+B)呢?还是hash(B+A)呢?其实这是由A和B的大小决定的,在openzeppelin对应的merkle代码中我们可以找到这么一段代码:
Avalanche链游Crabada推出游戏专用链Swimmer Network:3月3日,Avalanche链游Crabada在社交媒体发文表示,专用于游戏的子网区块链 Swimmer Network已经推出,该子网利用了Avalanche链上现有基础设施和安全支持。SwimmerNetwork上的网络费用Token为TUS,网络费用将按照一定比例进行销毁。
Swimmer Network网络测试网Aplha版将会在3月4日启动,3月7日将会在网络上打补丁解决机器人问题;3月底将进行迁移项目,3月底或4月初将推出对战游戏模式。[2022/3/3 13:34:51]
function_hashPair(bytes32a,bytes32b)privatepurereturns(bytes32){returna<b?_efficientHash(a,b):_efficientHash(b,a);}
Mercado Bitcoin从软银处获得2亿美元融资:7月1日,巴西首家加密货币交易所Mercado Bitcoin获软银拉丁美洲基金2亿美元B轮投资,软银本轮投资对Mercado Bitcoin非运营母公司2TM Group的估值为21亿美元,使其跻身拉丁美洲前10名独角兽之列。2TM Group的首席执行官兼执行主席Roberto Dagnoni表示,该轮融资资金将用于Mercado Bitcoin在拉丁美洲扩张,后续将考虑在阿根廷、智利、哥伦比亚和墨西哥设立分支机构。
2021年1月,Mercado Bitcoin获得了由G2D/GP Investments与Parallax Ventures领投,HS Investimentos、Gear Ventures、DealMake等参投的A轮融资。
Mercado Bitcoin成立于2013年,为巴西首家加密货币交易所,目前已拥有280万左右的用户。其控股公司2TM Group旗下有包括数字资产托管平台Bitrust、股权众筹平台Clearbook等企业。 (techcrunch)[2021/7/1 0:20:36]
总结来说就是把相对小的数值放到前面去这么来排序计算hash值。这个地方在自己动手实际运算的时候可能会有些许困惑。在实际的项目中一般只需要把计算的最后结果的根hash值存储到合约中,如果大量的地址都需要存到合约中的话会消耗大量的gas费。经过merkle树计算之后,大大的减少了需要存储的数据。通过一段foundry的setUp演示下如何计算和存储roothash值:
动态 | 电子商务网站WooCommerce将支持VET付款:2月25日消息,允许艺术家在VeChain上创建代币的电子商务网站WooCommerce宣布引入Thor插件ThorCommerce,用户可以在网站将法定货币转换成VET。(CryptoBriefing)[2020/2/25]
bytes32publicroot;bytes32publicleafs;bytes32publicl2;functionsetUp()public{addressmemoryaddrss=newaddress(4);addrss=0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2;addrss=0x2d886570A0dA04885bfD6eb48eD8b8ff01A0eb7e;addrss=0xed857ac80A9cc7ca07a1C213e79683A1883df07B;addrss=0x690B9A9E9aa1C9dB991C7721a92d351Db4FaC990;//通过地址列表计算叶子节点的hash值leafs.push(keccak256(abi.encodePacked(addrss)));leafs.push(keccak256(abi.encodePacked(addrss)));leafs.push(keccak256(abi.encodePacked(addrss)));leafs.push(keccak256(abi.encodePacked(addrss)));//计算第二层的hash值l2.push(keccak256(abi.encodePacked(leafs,leafs)));l2.push(keccak256(abi.encodePacked(leafs,leafs)));//计算根的hash值root=keccak256(abi.encodePacked(l2,l2));}
为了演示方便我们值写了4个地址,实际项目中可能地址数量非常大。
如何来验证Merkle树
在合约中存储到roothash值之后我们如何去验证由客户端发过来的地址是否是有效地址或者说在白名单中的地址呢?首先我们需要将地址进行hash运算,作为第三个参数,然后将地址相邻的hash值作为proof传到验证函数中。proof列表对应下面图片中的红色标记区域
测试的验证方法:
functiontestVerify()public{addressproofAddress=0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2;bytes32memoryproof=newbytes32(2);proof=leafs;proof=l2;assert(MerkleProof.verify(proof,root,keccak256(abi.encodePacked(proofAddress))));}
在实际项目中的应用场景
发放空投
NFT的白名单
在合约审计中的常见漏洞
functionparentHash(bytes32a,bytes32b)publicpurereturns(bytes32){if(a<b){returnkeccak256(abi.encode(a,b));}else{returnkeccak256(abi.encode(b,a));}}
abi.encode(address,uint)将会输出64字节。由于abi.encode(bytes32,bytes32)也是64字节,因此在叶子节点和父节点之间可能会发生哈希碰撞。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。