部署智能合约时获取“未定义”的无效参数数量

Posted

技术标签:

【中文标题】部署智能合约时获取“未定义”的无效参数数量【英文标题】:Getting Invalid number of parameters for "undefined" when deploying smart contract 【发布时间】:2018-01-28 06:34:13 【问题描述】:

我正在尝试在 testRPC 上部署我的第一个投票合约,下面是我的代码..由于某种原因,当我开始部署时它会抱怨。

错误似乎来自 arguments 参数。我尝试传递一个空数组,它说“得到 0 预期 1!”。我尝试只传递一个名称,它说“value.forEach”不是一个函数。

Web3 = require('web3')
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
sourceCode = fs.readFileSync('Voting.sol').toString()
solc = require('solc')
compiledCode = solc.compile(sourceCode)
abiDefinition = JSON.parse(compiledCode.contracts[':Voting'].interface)
VotingContract = new web3.eth.Contract(abiDefinition)
byteCode = compiledCode.contracts[':Voting'].bytecode

VotingContract.deploy(
    data: byteCode, 
    arguments:['Joseph','Sean','Matthew']
).send(
    from: '0x00D1AE0A6fC13B9ecdefA118B94cF95ac16D4ab0', 
    gas: 4700000
)
.on('error', function(error) 
    console.log(error);

.then(function(newContractInstance) 
    console.log(newContractInstance.options.address)

任何帮助将不胜感激。谢谢。

【问题讨论】:

【参考方案1】:

在迁移中,将您的参数添加到部署器中。

// Deploy a single contract with constructor arguments
deployer.deploy(A, arg1, arg2, ...);

其中 A 是您的智能合约,arg1、arg2 等是参数

这在文档中有提到:https://www.trufflesuite.com/docs/truffle/getting-started/running-migrations#deployer-deploy-contract-args-options-

【讨论】:

【参考方案2】:

为需要构造函数参数的合约尝试类似的方法

var bytecodeWithParam = MyContract.new.getData(
    param1,
    param2,
     data: compiledByteCode );

您粘贴到“字节码”字段中的就是这个 bytecodeWithParam。仔细看的话,最后会看到param1和param2都是32字节打包的。

另一个例子

var MyContract = web3.eth.contract(abiArray);

// instantiate by address
var contractInstance = MyContract.at(address);

// deploy new contract
var contractInstance = MyContract.new([constructorParam1] [, constructorParam2], data: '0x12345...', from: myAccount, gas: 1000000);

// Get the data to deploy the contract manually
var contractData = MyContract.new.getData([constructorParam1] [, constructorParam2], data: '0x12345...');
// contractData = '0x12345643213456000000000023434234'

https://github.com/ethereum/wiki/wiki/javascript-API#web3ethcontract

【讨论】:

我忘了写我在我的问题中使用的是 web3.js v1.0。感谢您的回答,但我发现 this link 更有帮助,因为问题使用的是 v1.0。仍然感谢您的帮助!

以上是关于部署智能合约时获取“未定义”的无效参数数量的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试使用 JavaScript 调用智能合约函数时,它们显示为未定义

数字商品指南系列第三篇:编写智能合约并编译部署

区块链实战如何创建一个带参数的智能合约

区块链实战如何创建一个带参数的智能合约

二.私有以太坊网络部署智能合约

主网在 Remix Solidity 智能合约中部署地址数组作为构造函数参数不起作用