我在从固定合同中调用简单功能时遇到麻烦。到目前为止,代码的结构如下:
在我的web3Api.js
文件中,我有:
export function getContract(contractDefinition) {
initWeb3();
const contract = initContract(contractDefinition);
contract.setProvider(web3.currentProvider);
if (typeof contract.currentProvider.sendAsync !== 'function') {
contract.currentProvider.sendAsync = function () {
return contract.currentProvider.send.apply(
contract.currentProvider, arguments
);
};
}
return contract.deployed();
}
然后在我的projectApi.js
文件中,我拥有:
import { getContract } from './web3Api';
import CompiledContract '../../../build/contracts/compiledContract.json';
let globalVariable;
export async function testing123() {
const contractInstance = await getContract(CompiledContract)
globalVariable = contractInstance;
}
注意:当我在整个文件中调用全局变量时,它成功返回了我所有合同的功能
TruffleContract {constructor: ƒ, abi: Array(33), contract: Contract, PracticeEvent: ƒ, Transfer: ƒ, …}
所以下一部分是我遇到麻烦的地方。
为了这篇文章的缘故,我只是想从合同中调用这个简单的函数:
function smartContractFunction() public {
emit PracticeEvent("practice event has been called");
}
现在回到我的projectApi.js
文件中,我正在使用globalVariable尝试从合同中获取此功能。这是我写的:
export async function practiceInteract() {
const submitTest = await globalVariable.smartContractFunction().call();
console.log(submitTest);
}
当我运行该应用程序时,出现错误消息“ formatters.js:274未捕获(承诺)错误:地址无效”
有什么想法为什么不能在我的projectAPI.js文件中调用此Solidity函数?
如果我没有清楚地写出我的问题,很高兴澄清这一点。 谢谢!
答案 0 :(得分:1)
您的问题是您根本没有定义调用该函数的地址。如果您以自己的方式使用web3
,则需要定义谁在调用函数。正确的代码是:
export async function practiceInteract() {
const submitTest = await globalVariable.smartContractFunction().call({from: web3.eth.accounts[0]});
console.log(submitTest);
}