合约:import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
}
function isVerifyMerkleNormal(bytes32[] calldata proof) view public returns (bool) {
bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
return MerkleProof.verify(proof, whiteRootNormal, leaf);
}
首先你需要import,然后合约的角色是去验证,传入proof,然后生成leaf对象,verify方法会根据root去做校验,这里会在构造方法里先初始化一个root,后面如果有白名单的增删改查的话,只要去修改这个root就行了,如果有修改只需要修改一次gas费即可。
前端
前端这里的流程是这样的,有一个accounts的数组,根据这个数组去生成默克尔树的roots,如果是部署合约的时候,直接把这个roots写进合约里就行了,但如果是增删改查白名单的话,就需要在合约里的write contract方法里去更新这个roots了。
这里注意,如果非数组里的账户生成的proof为空,前端如果要测试的话就可以这么来测试是否为白名单。
//生成白名单
const generateWhiteOGProofs = () => {
//buffer化叶子结点
const leafNodes = whitelistAddressesOG.map(addr => keccak256(addr));
//实例化默克尔树
const merkleTree = new MerkleTree(leafNodes, keccak256, { sortPairs: true });
setMerkleTreeOG(merkleTree);
//获取根哈希值
const rootHash = merkleTree.getRoot();
console.log(rootHash);
console.log('Whitelist Merkle Tree og\n', merkleTree.toString());
}