无法在部署的合同中调用函数
Cannot call function within deployed contract
我正在尝试将已部署的 HelloWorld 合同获取到节点应用程序中的 运行。我想 运行 call()
函数像这样检查它:
const deployed = helloWorldContract.new({
from: acct1,
data: compiled.contracts[':HelloWorld'].bytecode,
gas: 151972,
gasPrice: 5
}, (error, contract) => {
if(!error){
console.log(contract.displayMessage.call());
} else {
console.log(error);
}
});
合同供参考:
contract HelloWorld {
function displayMessage() public constant returns (string){
return "hello from smart contract - {name}";
}
}
当我在回调中尝试 console.log(contract.displayMessage.call())
时,returns:TypeError: Cannot read property 'call' of undefined
,但是,当我记录 console.log(contract.displayMessage)
时,它 returns 这个:
{ [Function: bound ]
request: [Function: bound ],
call: [Function: bound ],
sendTransaction: [Function: bound ],
estimateGas: [Function: bound ],
getData: [Function: bound ],
'': [Circular] }
我在这里做错了什么?我如何 运行 已部署合约中的函数 call
?
我认为您的问题可能是由 .new
构造函数引起的。我个人不推荐使用它,因为它很奇怪。相反,您应该将字节码部署为标准事务。
无论如何,如果您查看 .new
的 source code,您会发现回调实际上 被调用了两次 。它完全是非标准的,据我所知,没有记录。
交易发送后第一次回调,contract
对象会transactionHash
设置
第二次调用回调时,contract
对象应该设置 address
属性。这就是你想要的,因为没有地址 属性,你无法调用合约方法。
简而言之,试试这个
const deployed = helloWorldContract.new({
from: acct1,
data: compiled.contracts[':HelloWorld'].bytecode,
gas: 151972,
gasPrice: 5
}, (error, contract) => {
if (error){
console.error(error);
} else {
console.log(contract);
if (contract.address) {
console.log(contract.displayMessage());
}
}
});
要在不使用.new
方法的情况下部署合约,您首先需要生成合约字节码和ABI。您可以使用 solc 或在线 solidity 编译器或任何其他方式获得它。
然后使用web3.eth.sendTransaction
部署合约,data
参数设置为字节码,空to
地址。 sendTransaction
会 return 你一个 transactionHash
,你需要等待被开采和确认。最简单的方法是通过轮询 - 一个很好的起点可以是我写的这个方法 - https://gist.github.com/gaiazov/17c9fc7fdedf297e82386b74b34c61cd
如果您的合约采用构造函数参数,它们将附加到字节码,例如data: bytecode + encodedConstructorArguments
.
我正在尝试将已部署的 HelloWorld 合同获取到节点应用程序中的 运行。我想 运行 call()
函数像这样检查它:
const deployed = helloWorldContract.new({
from: acct1,
data: compiled.contracts[':HelloWorld'].bytecode,
gas: 151972,
gasPrice: 5
}, (error, contract) => {
if(!error){
console.log(contract.displayMessage.call());
} else {
console.log(error);
}
});
合同供参考:
contract HelloWorld {
function displayMessage() public constant returns (string){
return "hello from smart contract - {name}";
}
}
当我在回调中尝试 console.log(contract.displayMessage.call())
时,returns:TypeError: Cannot read property 'call' of undefined
,但是,当我记录 console.log(contract.displayMessage)
时,它 returns 这个:
{ [Function: bound ]
request: [Function: bound ],
call: [Function: bound ],
sendTransaction: [Function: bound ],
estimateGas: [Function: bound ],
getData: [Function: bound ],
'': [Circular] }
我在这里做错了什么?我如何 运行 已部署合约中的函数 call
?
我认为您的问题可能是由 .new
构造函数引起的。我个人不推荐使用它,因为它很奇怪。相反,您应该将字节码部署为标准事务。
无论如何,如果您查看 .new
的 source code,您会发现回调实际上 被调用了两次 。它完全是非标准的,据我所知,没有记录。
交易发送后第一次回调,contract
对象会transactionHash
设置
第二次调用回调时,contract
对象应该设置 address
属性。这就是你想要的,因为没有地址 属性,你无法调用合约方法。
简而言之,试试这个
const deployed = helloWorldContract.new({
from: acct1,
data: compiled.contracts[':HelloWorld'].bytecode,
gas: 151972,
gasPrice: 5
}, (error, contract) => {
if (error){
console.error(error);
} else {
console.log(contract);
if (contract.address) {
console.log(contract.displayMessage());
}
}
});
要在不使用.new
方法的情况下部署合约,您首先需要生成合约字节码和ABI。您可以使用 solc 或在线 solidity 编译器或任何其他方式获得它。
然后使用web3.eth.sendTransaction
部署合约,data
参数设置为字节码,空to
地址。 sendTransaction
会 return 你一个 transactionHash
,你需要等待被开采和确认。最简单的方法是通过轮询 - 一个很好的起点可以是我写的这个方法 - https://gist.github.com/gaiazov/17c9fc7fdedf297e82386b74b34c61cd
如果您的合约采用构造函数参数,它们将附加到字节码,例如data: bytecode + encodedConstructorArguments
.