能否在Truffle中通过合约B实例调用其内部合约A的方法?
解答:无法直接通过
b.a.function1()访问合约A的方法 首先明确说:你不能直接用b.a.function1()这种方式在Truffle的JavaScript环境中调用合约A的方法,原因如下:
在你的Solidity代码里,A public a;会让Solidity自动生成一个getter方法a(),这个方法的作用是返回合约A实例的地址。但在Truffle的JS测试或脚本中,调用b.a()得到的只是一个字符串格式的以太坊地址,而不是合约A的可调用实例——所以你没法直接链式调用function1()。
正确的调用方式
你需要先获取合约A的地址,再用这个地址实例化合约A的对象,之后才能调用它的方法:
- 先获取合约A的地址:
const aAddress = await b.a();
- 导入合约A的Artifact并实例化:
const A = artifacts.require("A"); const aInstance = await A.at(aAddress);
- 调用合约A的方法:
await aInstance.function1();
如果你想简化写法,也可以把这些步骤合并成一行:
await (await A.at(await b.a())).function1();
补充说明
如果是在Solidity合约内部(比如合约B的方法里),你确实可以直接用a.function1()调用合约A的方法——因为Solidity会自动识别a是合约A的实例,而不是单纯的地址。但在Truffle的JS环境中,必须显式实例化合约对象才能调用方法。
内容的提问来源于stack exchange,提问作者Pittie
相关产品推荐
相关产品推荐

