【Solidity】MerkleTree 默克爾樹 設置白名單 範例
Merkle Tree 是一種數據結構,可用於驗證大量數據的完整性。
它是由一系列節點組成的樹狀結構,其中每個節點都是由它的子節點的哈希值計算而成的。
只需要檢查根節點的哈希值,就可以確保整棵樹中的所有數據都是完整的。
Merkle Tree常用於區塊鏈技術中,用來驗證區塊的完整性.
文章目錄
- MerkleProof.sol
- MerkleTree.sol
- 鏈上智能合約
1.MerkleProof.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
library MerkleProof {
function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
return processProof(proof, leaf) == root;
}
function processProof(bytes32[] memory proof, bytes32 leaf) private pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
return a < b ? keccak256(abi.encodePacked(a, b)) : keccak256(abi.encodePacked(b, a));
}
}
2.MerkleTree.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
import "./MerkleProof.sol";
contract MerkleTree {
using MerkleProof for bytes32[];
bytes32 immutable public merkleRoot;
mapping(address => bool) public player;
constructor(bytes32 _merkleRoot) {
merkleRoot = _merkleRoot;
}
// 前端帶入 MerkleProof
function participate(bytes32[] calldata _proof) external {
// 發送地址 Hash
require(verify(_proof), "address is not on the whitelist");
player[msg.sender] = true;
}
function verify(bytes32[] calldata merkleProof) internal view returns (bool) {
bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
return merkleProof.verify(merkleRoot, leaf);
}
}
// Root
// 0xeeefd63003e0e702cb41cd0043015a6e26ddb38073cc6ffeb0ba3e808ba8c097
// 第一個地址
// 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4
// 0x5931b4ed56ace4c46b68524cb5bcbf4195f1bbaacbe5228fbd090546c88dd229
// 第二個地址
// 0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2
// 0x999bf57501565dbd2fdcea36efa2b9aef8340a8901e3459f4a4c926275d36cdb
// 第三個地址
// 0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db
// 0x04a10bfd00977f54cc3450c9b25c9b3a502a089eba0097ba35fc33c4ea5fcb54
// 第四個地址
// 0x78731D3Ca6b7E34aC0F824c42a7cC18A495cabaB
// 0xdfbe3e504ac4e35541bebad4d0e7574668e16fefa26cd4172f93e18b59ce9486
// merkleTree online
// https://lab.miguelmota.com/merkletreejs/example
3.鏈上智能合約
BSC Testnet MerkleTree