truffle-contract与web3.js一样,都是用来与以太坊智能合约交互的JS库,但是相对于web3.js来说,truffle-contract封装得更简单一些,本文示范如何通过truffle-contract与以太坊主链上部署好的合约通信。
第一步引入相关的包和合约ABI文件,并通过contract(abi)
函数得到合约对象,ABI文件可以通过truffle comile
命令对solidity代码编译得来,address
保存了合约的地址:
import { default as Web3 } from 'web3'
import { default as contract } from 'truffle-contract'
import StudentFactoryArtifacts from '../../build/contracts/StudentFactory.json'
var StudentFactory = contract(StudentFactoryArtifacts)
var address = '0x04a5122698adf47ae0cdd0a10274742797684d44'
第二步实例化web3对象,如果有Mist或Metamask就默认由它们提供,否则使用本地的Provider。
window.addEventListener('load', function () {
if (typeof web3 !== 'undefined') {
window.web3 = new Web3(window.web3.currentProvider)
} else {
// 提醒用户下载Metamask或Mist
}
window.App.start()
})
第三步,start函数对合约对象设置了Provider,并获取账户列表
window.App = {
start: function () {
StudentFactory.setProvider(window.web3.currentProvider)
window.web3.eth.getAccounts(function (err, accs) {
if (err != null) {
return
}
if (accs.length === 0) {
return
}
accounts = accs
account = accounts[0]
})
}
}
第四步,重头戏,通过at(address)
获取到实例,再调用合约里的函数即可。如果是读取数据后面加.call()
,写数据不用加。
owner: function () {
var studentFactory
StudentFactory.at(address).then(function (instance) {
studentFactory = instance // 获得实例
return studentFactory.owner.call() // 调用合约函数
}).then(function (result) {
// 处理查询结果
}).catch(function (e) {
console.warn(e) // 打印warning
})
}
truffle-contract与合约以太坊主链合约通信的完整代码可以查看github仓库