使用 Merkle 树实现一个完整的空投系统

360影视 欧美动漫 2025-09-16 02:14 1

摘要:Python 示例:生成 Merkle 树和证明import hashlibdef hash(data):"""计算数据的哈希值"""return hashlib.sha256(data.encode('utf-8')).hexdigestdef build_

Python 示例:生成 Merkle 树和证明import hashlibdef hash(data):"""计算数据的哈希值"""return hashlib.sha256(data.encode('utf-8')).hexdigestdef build_merkle_tree(data_list):"""构建 Merkle 树"""if len(data_list) % 2 != 0:data_list.append(data_list[-1]) # 如果节点数是奇数,则复制最后一个节点tree = [data_list] # 第一层是叶节点while len(tree[-1]) > 1:level = for i in range(0, len(tree[-1]), 2):combined = hash(tree[-1][i] + tree[-1][i + 1])level.append(combined)tree.append(level)return treedef get_merkle_root(tree):"""获取 Merkle 树根"""return tree[-1][0]def get_proof(tree, index):"""生成某个节点的 Merkle 证明"""proof = for level in tree[:-1]: # 不包含根sibling_index = index ^ 1 # 获取兄弟节点索引if sibling_index // SPDX-License-Identifier: MITpragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC20/IERC20.sol";contract MerkleAirdrop {address public admin;bytes32 public merkleRoot;IERC20 public token;// 记录已经领取的地址mapping(address => bool) public hasClaimed;event Claimed(address indexed account, uint256 amount);event MerkleRootUpdated(bytes32 merkleRoot);constructor(address _token) {admin = msg.sender;token = IERC20(_token);}modifier onlyAdmin {require(msg.sender == admin, "Not admin");_;}/*** @notice 更新 Merkle 根* @param _merkleRoot 新的 Merkle 根*/function updateMerkleRoot(bytes32 _merkleRoot) external onlyAdmin {merkleRoot = _merkleRoot;emit MerkleRootUpdated(_merkleRoot);}/*** @notice 领取空投* @param amount 领取的代币数量* @param proof Merkle 证明路径*/function claim(uint256 amount, bytes32 calldata proof) external {require(!hasClaimed[msg.sender], "Already claimed");// 验证 Merkle 证明bytes32 leaf = keccak256(abi.encodePacked(msg.sender, amount));require(verify(leaf, proof), "Invalid proof");// 标记为已领取并发送代币hasClaimed[msg.sender] = true;require(token.transfer(msg.sender, amount), "Transfer failed");emit Claimed(msg.sender, amount);}/*** @notice 验证 Merkle 证明* @param leaf 被验证的叶子节点* @param proof Merkle 证明路径* @return 是否有效*/function verify(bytes32 leaf, bytes32 memory proof) public view returns (bool) {bytes32 computedHash = leaf;for (uint256 i = 0; i

The Web3 是一个专注于 Web3 技术解决方案设计与开发的社区,致力于为个人和企业提供专业提升的教程设计、研发与培训服务。此外,The web3 还提供项目安全审计、投研分析和项目孵化等全方位支持。

来源:TheWeb3社区

相关推荐