使用 Web3 从 Solidity 调用函数

Posted

技术标签:

【中文标题】使用 Web3 从 Solidity 调用函数【英文标题】:Call Function From Solidity With Web3 【发布时间】:2019-03-28 01:00:52 【问题描述】:

我无法从我的 Solidity 合约中调用一个简单的函数。到目前为止,代码的结构如下:

在我的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 Uncaught (in promise) Error: invalid address”

知道为什么我不能在我的 projectAPI.js 文件中调用这个solidity 函数吗?

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

【问题讨论】:

你能检查一下合约地址是否正确并且实际上指向你的合约吗? 【参考方案1】:

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

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

【讨论】:

当你call一个函数时这不是必需的。仅当您发送transaction 时才需要。您可以在文档中了解更多信息:web3js.readthedocs.io/en/1.0/web3-eth-contract.html

以上是关于使用 Web3 从 Solidity 调用函数的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python Web3.py 调用 Solidity 函数

如何在 REMIX(Solidity IDE)中从 web3 调用带有参数的构造函数

如何调用 Solidity 函数从智能合约中返回以太币?

Solidity 函数将空数组返回给 web3.js

solidity中bytes32传参调用合约

从 Web.js 连接到 Solidity 合约时地址无效