什么是Merkle树
定义
MerkleTree,也叫默克尔树或哈希树,是区块链的底层加密技术,被以太坊区块链广泛采用。MerkleTree是一种自下而上构建的加密树,每个叶子是对应数据的哈希,而每个非叶子为它的2个子节点的哈希。
如何生成Merkle树的数据
在solidity中我们通过keccak256算法计算hash值:
keccak256(abi.encodePacked(toHashValue)e.g.:hash前0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2hash后0x999bf57501565dbd2fdcea36efa2b9aef8340a8901e3459f4a4c926275d36cdb
Merge Club已发行9999张名为XMan.的NFT:9月15日消息,ETH Merge爱好者社区Merge Club已发行9999张名为XMan.的NFT,首批发行1000张,现已上线Opensea。[2022/9/15 6:58:06]
在对叶子节点的值进行hash运算之后,再把相邻的节点再进行hash运算,直到只剩下一个根节点。假设存在两个相邻的节点A和B,那么在进行hash运算的时候到地址是hash(A+B)呢?还是hash(B+A)呢?其实这是由A和B的大小决定的,在openzeppelin对应的merkle代码中我们可以找到这么一段代码:
function_hashPair(bytes32a,bytes32b)privatepurereturns(bytes32){returna<b?_efficientHash(a,b):_efficientHash(b,a);}
万事达卡与Mercado Libre合作加强其巴西加密货币计划:金色财经报道,万事达卡已与 Mercado Libre 合作,以加强其最近在巴西推出的加密货币计划的安全性和透明度。Mastercard 的 CipherTrace 技术将使 Mercado Libre 能够监控、识别和了解风险,并帮助零售商管理其监管和合规义务。
与 Mercado Libre 的合作增加了万事达卡的发展势头,万事达卡利用其不断增长的合作伙伴关系来建立安全、简单和安全的加密货币交易。它还将帮助开发新平台,以测试和支持围绕更广泛使用区块链技术 NFT 的中央银行数字货币计划,并提供直接在其网络上支持选择法定支持的稳定币的潜力。(finextra)[2022/6/9 4:12:06]
总结来说就是把相对小的数值放到前面去这么来排序计算hash值。这个地方在自己动手实际运算的时候可能会有些许困惑。在实际的项目中一般只需要把计算的最后结果的根hash值存储到合约中,如果大量的地址都需要存到合约中的话会消耗大量的gas费。经过merkle树计算之后,大大的减少了需要存储的数据。通过一段foundry的setUp演示下如何计算和存储roothash值:
xFarmer CEO:目前正在向GameFi领域进军:官方消息,xFarmer CEO Jody Raddack 近日接受外媒采访表示目前正在带领项目向GameFi领域进军。首轮合作项目为:Legend (TLOD), PokeMine (PMD), Witch。
未来,xFarmer 将在致力于提供准确的价格数据及聚合交易的同时为了更多GameFi项目提供流量入口及NFT拍卖支持。[2021/11/1 21:15:54]
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));}
动态 | 推特CEO推荐比特币相关书籍《Bitcoin And Black America》:推特CEO Jack Dorsey在推特推荐比特币相关书籍《Bitcoin And Black America》和该书作者的采访。该书分析了加密货币在为非裔美国人带来金融自主权方面的作用。作者Isaiah Jackson指出,黑人在银行业中没有得到充分的服务,在选择区块链资产方面也步履缓慢。[2020/2/24]
为了演示方便我们值写了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字节,因此在叶子节点和父节点之间可能会发生哈希碰撞。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。