0

我正在尝试使用 Merkle 树为 NFT 创建白名单以节省气体成本。我在这里看到了一个很棒的实现,用 javascript,但我想用 Python 来做。似乎我无法使用 keccak 哈希创建 merkle 树,我认为对于 etheruem 区块链来说这是必要的。Open-zeppelin 的MerkleProof.sol使用 kaccack 哈希来验证叶子。我猜我可以将其更改为使用 sha256,但我不喜欢这些快速修复。

这是我在下面尝试的:

from pymerkle import MerkleTree
from Crypto.Hash import keccak
from scripts.helpful_scripts import get_account
from brownie import NFTCollectible, network, config


def hash(address):
    k = keccak.new(digest_bits=256)
    k.update(address.encode("utf_8"))
    return k.hexdigest()


def main():
    account = get_account()
    nft_collectible = NFTCollectible[-1]

    whitelistedAddresses = [
        "0x5B38Da6a701c568545dCfcB03FcB875f56beddC4",
        "0x78D6CF3DEF45AF458442E787FE6E64A03750AB94",
        "0xA7B0E4CF55AF900F6E80D619AE1E00965044BC4E",
        "0x38C4278F42A26A588176017F5E4F6ED831835EA2",
        "0x9F9A0AA0507FE79CA1FF8F26A8D84BD8BB0EC9DF",
        "0xDABF258F5619942D19AD87C3472FABE893B26D7D",
        "0xD30ED9C457C7D32F3F7B949964191E4084C53F66",
    ]

    leafNodes = []
    for address in whitelistedAddresses:
        hashedAddress = hash(address)
        leafNodes.append(hashedAddress)

    merkleTree = MerkleTree()
    for leaf in leafNodes:
        merkleTree.update(leaf)

    print(merkleTree)

    root = merkleTree.rootHash.decode("utf-8")
    print(root)

它确实返回一棵 Merkle 树,但使用 sha256 进行散列,因为 pymerkle 没有 keccak 散列。(上面的 keccak 库用于对钱包进行哈希处理)。运行它会返回与 JS 中不同的 Merkle 树。我什至不确定差异是否是因为散列。

这就是我想验证的可靠性:

        // using merkle tree for whitelist
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); // this will work good since the wallets are hashed by keccak
        require(
            MerkleProof.verify(merkleProof, whitelistedMerkleRoot, leaf), // this will fail
            "Not on the whitelist"
        );
4

0 回答 0