Solidity

【Solidity】MerkleTree 默克爾樹 設置白名單 範例

【Solidity】MerkleTree 默克爾樹 設置白名單 範例

Merkle Tree 是一種數據結構,可用於驗證大量數據的完整性。

它是由一系列節點組成的樹狀結構,其中每個節點都是由它的子節點的哈希值計算而成的。

只需要檢查根節點的哈希值,就可以確保整棵樹中的所有數據都是完整的。

Merkle Tree常用於區塊鏈技術中,用來驗證區塊的完整性.


文章目錄

  1. MerkleProof.sol
  2. MerkleTree.sol
  3. 鏈上智能合約

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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *