使用Web3从Solid调用函数

时间:2018-10-23 17:47:08

标签: javascript ethereum solidity web3 truffle

我在从固定合同中调用简单功能时遇到麻烦。到目前为止,代码的结构如下:

在我的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函数?

如果我没有清楚地写出我的问题,很高兴澄清这一点。 谢谢!

1 个答案:

答案 0 :(得分:1)

您的问题是您根本没有定义调用该函数的地址。如果您以自己的方式使用web3,则需要定义谁在调用函数。正确的代码是:

export async function practiceInteract() {
   const submitTest = await globalVariable.smartContractFunction().call({from: web3.eth.accounts[0]});
   console.log(submitTest);
}