合约抽象对象概述
Truffle提供了一个合约抽象层,用来与合约进行交互。
获取合约抽象对象
要获取合约抽象实例,可以使用artifacts
对象的require()
方法来载入
指定的合约构件。在控制台环境外,artifacts在迁移文件、测试文件和exec
脚本中也是有效的。可以如下方式创建指定合约的抽象对象:
const MyContract = artifacts.require("MyContract");
在开发控制台中也可以获取到合约抽象实例。在开发控制台可以使用 at、deployed或new方法获取到合约抽象实例:
truffle(development)> const myContract = await MyContract.deployed();
现在可以访问MyContract的以下函数:
- at(): 创建一个合约抽象实例,表征部署在指定地址的MyContract合约
- deployed():创建一个合约抽象实例,表征MyContract管理的默认地址
- new():向链上部署一个新版本合约,并获取新合约对应的抽象实例
合约方法调用
每个合约抽象实例都绑定到以太坊网络上的特定地址,并且js实例的方法与合约
方法是一一对应的。例如,如果你的Solidity合约有一个函数
someFunction(uint value) {}
,那么可以像这样调用其对应的js方法:
let deployed;
MyContract.deployed()
.then((instance) => {
deployed = instance;
return deployed.someFunction(5);
}).then((result) => {
// Do something with the result or continue with more transactions.
});
也可以使用async/await语法来简化上面的代码。在本文的剩余部分将使用 async/await,但是记住你也可以使用promise来与合约交互:
const deployed = await MyContract.deployed();
const result = await deployed.someFunction(5);
// Do something with the result or continue with more transactions.
合约事件监听
合约的方法和事件具有EventEmitter接口,因此可以像下面这样配置 监听句柄:
const example = await artifacts.require("Example").deployed();
example
.setValue(45)
.on('transactionHash', hash => {})
.on('receipt', receipt => {})
.on('error', error => {})
.on('confirmation', (num, receipt) => {})
.then(receipt => {});
example
.ExampleEvent()
.on('data', event => ... etc ... )
example
.ExampleEvent()
.once('data', event => ... etc ... )
合约抽象API
合约抽象有两组API,一个是静态合约抽象API,另一个是合约实例API。合约抽象
API适用于所有的合约,例如MyContract.at()
,而合约实例API则对应于区块链
上合约的特定部署。