Merkle Tree本地测试(js and solidity)
JS生成MerKle Tree
代码如下,需要安装merkletreejs 和 keccak256
const { MerkleTree } = require('merkletreejs');
cost keccak256 = require('keccak256')
const whitelistAddress = ['0x5B38Da6a701c568545dCfcB03FcB875f56beddC4',
'0xA5A18D604b438B405a1C5a11F1cb923DBaC7bA1B', ' 0x9470F6dE2A4787a534CD21C8E115CFE1513189DA']
const leafNodes = whitelistAddress.map((addr) => keccak256(addr))
const merkleTree = new MerkleTree(leafNodes, keccak256, { sortPairs: true })
const rootHash = merkleTree.getHexRoot()
console.log('merkleTree:', merkleTree.toString())
console.log('rootHash:', merkleTree.getHexRoot())
console.log("-----------------");
console.log("生成 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4 proof");
const proof = merkleTree.getHexProof(keccak256("0x5B38Da6a701c568545dCfcB03FcB875f56beddC4"));
console.log("proof:",proof); // 只有在列表中的才可以生成出proof
console.log("------------------");
console.log("认证 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4 是否在白名单中");
const v = merkleTree.verify(proof,keccak256("0x5B38Da6a701c568545dCfcB03FcB875f56beddC4"),rootHash);
console.log(v);
针对whitelistAddress生成root,再针对0x5B38Da6a701c568545dCfcB03FcB875f56beddC4生成proof,最后用proof和0x5B38Da6a701c568545dCfcB03FcB875f56beddC4进行校验判断
运行之后得到下面的结果
solidity校验
1.先设置好root
2.输入address校验
输入proof的时候有坑,一定要双引号
["0x67291d3d99b77ed052d1c50f719ae942e92c20b63f93fbad3bc707182f2256bf","0x8c1b4d3f6998419f132d37bd1138d350ee57df13b6076744bccb5f6b8c8a305a"]

可以看到校验通过
参考:
Last updated