You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

与Solidity智能合约交互时遇invalid type(struct)错误求助

解决Solidity struct类型无效错误的方案

错误原因

当前用嵌套数组[[address, proof]]传递Proof结构体数组,但ethers.js等Web3库要求结构体参数必须匹配字段名的对象格式,而非按顺序的数组。另外,getMerkelProof返回的proof格式也不符合Soliditybytes32[]的要求。

修正步骤

1. 调整Merkle Proof格式

MerkleTree.getProof返回的是包含data属性的对象数组,需要提取其中的data值转换成纯bytes32数组,适配Solidity的bytes32[]类型:

const getMerkelProof = (addresses: string[]) => {
    const leaf = keccak256(addresses[0]);
    const leaves = addresses.map((x: any) => keccak256(x));
    const tree = new MerkleTree(leaves, keccak256, { sortPairs: true });
    // 提取proof中的data字段,转换成bytes32数组
    const proof = tree.getProof(leaf, 0).map(item => item.data);
    const root = tree.getRoot().toString("hex");
    return {
        proof,
        root,
    };
};

2. 以对象格式传递结构体数组

把原来的嵌套数组改成包含nftAddress和proof字段的对象数组,严格匹配Solidity中Proof结构体的字段名:

// 生成请求方的Proof对象
const requestedProof = {
    nftAddress: counter_party_nfts_addresses[0],
    proof: getMerkelProof(counter_party_nfts_addresses).proof
};

// 生成提供方的Proof对象
const offeredProof = {
    nftAddress: my_nft_addresses[0],
    proof: getMerkelProof(my_nft_addresses).proof
};

// 调用合约函数
const tx = await contractWithSigner.createOffer(
    address,
    [counter_party_nfts_addresses[0]],
    [counter_party_nft_ids[0]],
    [my_nft_addresses[0]],
    [my_nft_ids[0]],
    [requestedProof], // Proof[] 数组,每个元素是匹配字段的对象
    [offeredProof]
);

关键说明

  • Web3库(如ethers.js)解析Solidity结构体时,依赖字段名匹配而非参数顺序,必须用对象格式传递。
  • 必须确保Merkle Proof的每个元素都是bytes32类型,避免因格式不匹配触发类型错误。

内容的提问来源于stack exchange,提问作者Rashid Iqbal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 05:40:23