从 web3js 调用 Factory 合约的子函数

Posted

技术标签:

【中文标题】从 web3js 调用 Factory 合约的子函数【英文标题】:Calling function in child of Factory contract from web3js 【发布时间】:2019-07-08 18:41:19 【问题描述】:

给定一份​​合同Example和一份工厂合同ExampleFactory

//Example.sol

contract ExampleFactory 
  Example [] public examples;

 function newExample(bytes32 _name) 
   Example example = new Example(_name);
   examples.push(example);
 


contract Example 

  bytes32 public name;
  bool printed;
  event Print(bytes32);

  constructor(bytes32 _name) 
    name = _name;
  

  function printName() public 
    printed = true;
    emit Print(name);
  

如何在我的truffle test 中调用printName?:

//Example.test.sol

artifacts.require("ExampleFactory");

contract("Example", function () 

  beforeEach(async function() 
    this.exampleFactory = await ExampleFactory.new()
    await ExampleFactory.newExample(web3.utils.utf8ToHex("hello"))
  )

  describe("printName()", function () 

    it("PRINTS!", async function() 
     const example = await this.exampleFactory.examples(0);
     await example.printName() // example.printName is not a function!!
    )

  )
)

【问题讨论】:

【参考方案1】:

调用this.exampleFactory.examples(0)返回子合约的地址,web3.js不知道ABI。 需要导入孩子的ABI,并用地址实例化一个对象

artifacts.require("Example" )

Const example = await Example.at(await this.exampleFactory.examples(0))

【讨论】:

以上是关于从 web3js 调用 Factory 合约的子函数的主要内容,如果未能解决你的问题,请参考以下文章

使用 web3js 和 galanche 调用具有价值的以太坊智能合约

java使用web3j,部署智能合约在测试链上,并调用(万字详细教程)

java使用web3j,部署智能合约在测试链上,并调用(万字详细教程)

使用 web3 js 调用智能合约函数

区块链以太坊 web3j for java 使用 - 部署和调用合约 <3;

如何将一组结构从 web3js 发送到 Solidity 合约?