一、准备环境:remix开发环境、已经生成好的默克尔树验证叶子(proof)、根节点(root)
生成Merkel Tree的JavaScript代码
const {MerkleTree} = require('merkletreejs');
const keccak256 = require('keccak256');
// const {ethers} = require("hardhat");
main()
function main() {
let whitelistAddresses = [
'0x701cDa6a701c568545dCfcB03FcB875f579D3BDC',
'0x701ce5Ba30Da6eB11978939379D383beb5Df9b33',
'0x701c0c8cE7C35c40F4F94070a9Ed592fC85c231D',
'0x701c076d3Cd709a38D2f83Cd032297a1941beb5D',
];
let leafNodes = [];
for (let test in whitelistAddresses) {
let leafNode = keccak256(whitelistAddresses[test]);
leafNodes.push(leafNode)
}
let tree = new MerkleTree(leafNodes, keccak256, {sortPairs: true});
console.log('root:', tree.getHexRoot());
console.log(tree.getHexProof(leafNodes[0]));
}
生成结果:
root: 0xfc775a5c531afb0936554eae9340d2ca34fea18af6800f3f742458dbecd38036
proof: [
'0x523db50444164c0acac5dcb2ef413f1d87f11a8053d0d49f64a8d8a407cf77db',
'0x8b6125cc1d4676bb87517a23c2122afd97590f28b6b14e8c50713046de756f0f'
]
二、solidity Merkel Tree验证
function checkCertification(bytes32[] calldata _merkleProof, address _to) public view returns (bool) {
bytes32 leaf = keccak256(abi.encodePacked(_to));
return MerkleProof.verify(_merkleProof, _merkleRoot, leaf);
}
三、出现问题
1.remix部署传参。需要bytes32的参数,已经填入白名单列表里的地址,提示“bad address checksum”。
四、解决办法
把address地址从bscscan上复制下来,再填入,验证成功!
五、Merkel Tree对大小写敏感
- 刚开始填入的地址
0x701cDa6a701c568545dCfcB03FcB875f579D3BDC - 从bscscan复制过来的地址
0x701Cda6A701C568545DCfcb03FCb875f579d3BdC