使用truffle-contract与合约以太坊主链合约通信

truffle-contractweb3.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仓库

猜你喜欢

转载自blog.csdn.net/qq_33829547/article/details/80559379