/**
* 一个基于truffle-contract库实现的以太坊solidity智能合约调用案例!
* 注意:truffle-contract库和web3.js使用nodej或import同时导入转码的时候会打架冲突!
* 为此如果使用truffle-contract库来实现solidity调用,必须使用truffle-contract原生链的Web3对象!
* truffle-contract是truffle框架基于web3.js进一步封装使用更方便的库!
* **/
const TruffleContract = require( 'truffle-contract' );
const first_contract_json = require( '@/truffle/build/contracts/FirstContract.json' );
class FirstContractWeb3 {
constructor () {
this.from_addr = '0x88D9C6F37E10A4B8801a06979ad6f60D91bA0a52';
this.init_web3_1_0_version();
this.get_truffle_contract_init();
}
/**
* 创建一个空合约truffle_contract,目的是拿到truffle_contract库中的Web3!
* 这里不能直接require或import导入web3.js中的Web3,因为与truffle_contract不兼容,会报错!
*/
get_Web3_from_truffle_contract () {
let contract_empty = TruffleContract();
/**
* truffle-contract库就是基于Web3对象封装的,这里的Web就是truffl-contract原生链上的Web对象!
* 这里不能用require或import的方式导入web.js库导入Web3,测试发现truffl-contract和web3.js会打架!
* 这里用法等价于let Web3 = this.contract.web3.__proto__.constructor;
*/
return Object.getPrototypeOf( contract_empty.web3 ).constructor;
}
// web3对象初始化(仅兼容web3.js 1.0版本)
init_web3_1_0_version () {
let Web3 = this.get_Web3_from_truffle_contract();
console.log( '判断浏览器是否启用Metamask插件的对象Web3.givenProvider结果为:', Web3.givenProvider );
/**
* 如果浏览器安装了Metamask钱包(如:谷歌、火狐),那么Web3.givenProvider等于Metamask
* 如果浏览器没有安装或不支持Metamask,那么Web3.givenProvider等于null
*/
this.web3 = new Web3( Web3.givenProvider || new Web3.providers.HttpProvider( 'http://127.0.0.1:8545' ) );
console.log( 'this.web3对象:', this.web3 );
}
// truffle-contract智能合约初始化函数!
get_truffle_contract_init () {
let first_contract = TruffleContract( first_contract_json );
first_contract.setProvider( this.web3.currentProvider );
let deployed = first_contract.deployed();
let constract_instance;
deployed.then( ( instance ) => {
constract_instance = instance;
console.log( '合约实例constract_instance:', constract_instance );
// 调用getInfo方法,call声明不改变合约状态!
return constract_instance.getInfo.call();
} ).then( ( result ) => {
console.log( 'getInfo返回结果:', result );
// 调用setInfo方法,sendTransaction发送交易,改变合约状态!
// 监听setInfo中的event事件!
return constract_instance.setInfo.sendTransaction( 'kirin', 28,
{ 'from': this.from_addr } ).then( ( result ) => {
console.log( 'setInfo发送成功返回结果:', result );
// 事件返回的数据会存放于result.logs[0].args对象中!
console.log( 'event返回结果:', result);
} ).catch( ( err ) => {
alert( 'ERROR! ' + err.message );
} );
} ).catch( ( err ) => {
alert( 'ERROR! ' + err.message );
} );
}
}
let contract = new FirstContractWeb3();