链资讯 链资讯
Ctrl+D收藏链资讯

ASH:Merkle树的逻辑和证明_ADD

作者:

时间:

什么是Merkle树

定义

MerkleTree,也叫默克尔树或哈希树,是区块链的底层加密技术,被以太坊区块链广泛采用。MerkleTree是一种自下而上构建的加密树,每个叶子是对应数据的哈希,而每个非叶子为它的2个子节点的哈希。

如何生成Merkle树的数据

在solidity中我们通过keccak256算法计算hash值:

keccak256(abi.encodePacked(toHashValue)e.g.:hash前0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2hash后0x999bf57501565dbd2fdcea36efa2b9aef8340a8901e3459f4a4c926275d36cdb

在对叶子节点的值进行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);}

总结来说就是把相对小的数值放到前面去这么来排序计算hash值。这个地方在自己动手实际运算的时候可能会有些许困惑。在实际的项目中一般只需要把计算的最后结果的根hash值存储到合约中,如果大量的地址都需要存到合约中的话会消耗大量的gas费。经过merkle树计算之后,大大的减少了需要存储的数据。通过一段foundry的setUp演示下如何计算和存储roothash值:

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字节,因此在叶子节点和父节点之间可能会发生哈希碰撞。

标签:ASHHASHADDDDR0cashHash PotDADDYETHDDRT

币赢交易所热门资讯
tzNFT: Tezos 上基于 FA2 的非同质代币

来源/LongHash 了解tzNFT教程库请点击https://github.com/tqtezos/nft-tutorial 关于tzNFT TQTezos发布了如何基于Tezos的FA2代.

NFT:Pi Network欧美社区为何没有亚洲狂热?_Gale Network

PiNetwork在欧美地区有着相当规模的社区,但相对于一些亚洲社区的狂热程度而言,欧美社区的热情似乎相对较低。这可能与以下因素有关:首先,PiNetwork在欧美地区的推广和宣传力度相对较小.

区块链:Pi网络几年了没有开放主网,真的要把先锋熬白头发吗?_区块链工程专业学什么课程好

Pi网络已经几年没有开放主网了,这让许多先锋者感到非常沮丧。但是,我们不能让这种情绪占据我们的内心.

PIN:博士对Pi Network非常有信心_Gale Network

在繁忙的硅谷,有一个神秘的博士,他对一个名为PiNetwork的项目充满了信心。这位博士并非普通的技术专家,他是人工智能领域的资深研究员,拥有数十年积累的丰富经验.

比特币:92% 的加密代币在过去七天里的表现优于比特币_玩比特币的男人能嫁么

来源/LongHash 在一轮令人瞩目的牛市之后,比特币价格在过去一周开始出现下滑。截至本文发稿时间,比特币兑美元汇率在过去七天里已经下跌了近12%.

比特币:卷严重、难度高、激励少,如何适应空投市场新变化_PROMISE

自从空投交互从2020年开始之后,不少人都开始加入到空投交互的行列中,一些项目也因为“格局”的因素,在项目正式上线前都会给早期参与者空投代币,以此吸引大家的关注.