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

基于Sepolia测试网的Node.js调用智能家居合约失败求助

问题解决:Node.js调用智能合约方法返回函数对象的修复

核心问题分析

  • 未实际执行合约方法:你只是引用了send方法/方法对象,没有触发实际调用
  • 参数类型不匹配:addAppliance的bytes1参数需传入十六进制格式值,而非数字
  • 缺少交易签名与异步处理:修改合约状态的方法需要签名交易,且所有合约调用都是异步操作

修正后的完整代码

const web3 = require('web3');

const CONTRACT_ABI = `[
        {
                "anonymous": false,
                "inputs": [
                        {
                                "indexed": true,
                                "internalType": "address",
                                "name": "previousOwner",
                                "type": "address"
                        },
                        {
                                "indexed": true,
                                "internalType": "address",
                                "name": "newOwner",
                                "type": "address"
                        }
                ],
                "name": "OwnershipTransferred",
                "type": "event"
        },
        {
                "inputs": [
                        {
                                "internalType": "string",
                                "name": "name",
                                "type": "string"
                        },
                        {
                                "internalType": "bytes1",
                                "name": "pin",
                                "type": "bytes1"
                        }
                ],
                "name": "addAppliance",
                "outputs": [],
                "stateMutability": "nonpayable",
                "type": "function"
        },
        {
                "inputs": [
                        {
                                "internalType": "uint256",
                                "name": "",
                                "type": "uint256"
                        }
                ],
                "name": "appliances",
                "outputs": [
                        {
                                "internalType": "uint256",
                                "name": "id",
                                "type": "uint256"
                        },
                        {
                                "internalType": "string",
                                "name": "name",
                                "type": "string"
                        },
                        {
                                "internalType": "bool",
                                "name": "status",
                                "type": "bool"
                        },
                        {
                                "internalType": "bytes1",
                                "name": "pin",
                                "type": "bytes1"
                        }
                ],
                "stateMutability": "view",
                "type": "function"
        },
        {
                "inputs": [
                        {
                                "internalType": "uint256",
                                "name": "id",
                                "type": "uint256"
                        }
                ],
                "name": "getAppliance",
                "outputs": [
                        {
                                "components": [
                                        {
                                                "internalType": "uint256",
                                                "name": "id",
                                                "type": "uint256"
                                        },
                                        {
                                                "internalType": "string",
                                                "name": "name",
                                                "type": "string"
                                        },
                                        {
                                                "internalType": "bool",
                                                "name": "status",
                                                "type": "bool"
                                        },
                                        {
                                                "internalType": "bytes1",
                                                "name": "pin",
                                                "type": "bytes1"
                                        }
                                ],
                                "internalType": "struct Appliance",
                                "name": "",
                                "type": "tuple"
                        }
                ],
                "stateMutability": "view",
                "type": "function"
        },
        {
                "inputs": [],
                "name": "getAppliances",
                "outputs": [
                        {
                                "components": [
                                        {
                                                "internalType": "uint256",
                                                "name": "id",
                                                "type": "uint256"
                                        },
                                        {
                                                "internalType": "string",
                                                "name": "name",
                                                "type": "string"
                                        },
                                        {
                                                "internalType": "bool",
                                                "name": "status",
                                                "type": "bool"
                                        },
                                        {
                                                "internalType": "bytes1",
                                                "name": "pin",
                                                "type": "bytes1"
                                        }
                                ],
                                "internalType": "struct Appliance[]",
                                "name": "",
                                "type": "tuple[]"
                        }
                ],
                "stateMutability": "view",
                "type": "function"
        },
        {
                "inputs": [],
                "name": "getAppliancesCount",
                "outputs": [
                        {
                                "internalType": "uint256",
                                "name": "",
                                "type": "uint256"
                        }
                ],
                "stateMutability": "view",
                "type": "function"
        },
        {
                "inputs": [],
                "name": "owner",
                "outputs": [
                        {
                                "internalType": "address",
                                "name": "",
                                "type": "address"
                        }
                ],
                "stateMutability": "view",
                "type": "function"
        },
        {
                "inputs": [
                        {
                                "internalType": "uint256",
                                "name": "id",
                                "type": "uint256"
                        }
                ],
                "name": "removeAppliance",
                "outputs": [],
                "stateMutability": "nonpayable",
                "type": "function"
        },
        {
                "inputs": [],
                "name": "renounceOwnership",
                "outputs": [],
                "stateMutability": "nonpayable",
                "type": "function"
        },
        {
                "inputs": [
                        {
                                "internalType": "uint256",
                                "name": "id",
                                "type": "uint256"
                        },
                        {
                                "internalType": "bool",
                                "name": "status",
                                "type": "bool"
                        }
                ],
                "name": "toggleAppliance",
                "outputs": [],
                "stateMutability": "nonpayable",
                "type": "function"
        },
        {
                "inputs": [
                        {
                                "internalType": "address",
                                "name": "newOwner",
                                "type": "address"
                        }
                ],
                "name": "transferOwnership",
                "outputs": [],
                "stateMutability": "nonpayable",
                "type": "function"
        },
        {
                "inputs": [
                        {
                                "internalType": "uint256",
                                "name": "id",
                                "type": "uint256"
                        },
                        {
                                "internalType": "string",
                                "name": "name",
                                "type": "string"
                        },
                        {
                                "internalType": "bytes1",
                                "name": "pin",
                                "type": "bytes1"
                        }
                ],
                "name": "updateAppliance",
                "outputs": [],
                "stateMutability": "nonpayable",
                "type": "function"
        }
]`;
const CONTRACT_ADDRESS = "0x13d9FA79D364070510B410c2FaC1976F21E3e218";

const web3js = new web3(new web3.providers.HttpProvider("https://sepolia.infura.io/v3/9e644c118b7c44068674e2d12a776536"));

const myAddress = '0x46Be881Fa6935a8FC969A4ddDFC74d625c558996';
const privateKey = 'PRIVATE-KEY'; // 直接传入字符串私钥,无需Buffer转换
const contractABI = JSON.parse(CONTRACT_ABI);
const contract = new web3js.eth.Contract(contractABI, CONTRACT_ADDRESS);

// 封装成异步函数处理合约调用
async function interactWithContract() {
    try {
        // 1. 构建添加设备的交易
        const addApplianceTx = contract.methods.addAppliance("fan", "0x01"); // bytes1参数传入十六进制格式
        const gasEstimate = await addApplianceTx.estimateGas({ from: myAddress });
        
        // 签名交易
        const signedTx = await web3js.eth.accounts.signTransaction(
            {
                to: CONTRACT_ADDRESS,
                data: addApplianceTx.encodeABI(),
                gas: gasEstimate,
                gasPrice: await web3js.eth.getGasPrice(),
                nonce: await web3js.eth.getTransactionCount(myAddress),
                chainId: 11155111 // Sepolia测试网链ID
            },
            privateKey
        );
        
        // 发送交易并等待确认
        const txReceipt = await web3js.eth.sendSignedTransaction(signedTx.rawTransaction);
        console.log("设备添加成功,交易哈希:", txReceipt.transactionHash);

        // 2. 查询所有设备信息
        const appliances = await contract.methods.getAppliances().call();
        console.log("当前设备列表:", appliances);
    } catch (error) {
        console.error("操作失败:", error);
    }
}

// 执行交互函数
interactWithContract();

关键修复点说明

  • 实际调用合约方法:修改状态的方法需执行.send()(或签名后发送),只读方法需执行.call(),不能仅引用方法对象
  • 参数类型修正:bytes1类型参数必须传入十六进制字符串(如'0x01'),不能直接传数字
  • 交易签名:Sepolia测试网要求修改合约状态的交易必须签名,使用web3.eth.accounts.signTransaction处理签名逻辑
  • 异步处理:所有合约调用都是异步操作,用async/await处理结果,避免回调地狱
  • 链ID与Gas配置:指定Sepolia的链ID(11155111),自动估算Gas并获取当前Gas价格,确保交易能成功上链

内容的提问来源于stack exchange,提问作者Martin Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:01:12