/**
* 说明:Vue+truffle+web3.js(1.0版本)开发的以太坊区块链案例!
* 注意:本案例中没有使用truffle-contract库调用智能合约!
* 关于使用truffle-contract库与solidity智能合约交互的案例后续分享新版本!
**/
const Web3 = require("web3");
// 导入FirstContract.sol智能合约的ABI编码数据!
const first_contract_json = require("@/truffle/build/contracts/FirstContract.json");
class FirstContractWeb3 {
constructor() {
this.contract_addr = "0x5D559560D3DdBa836625e2D07aC38eD02C0acA26";
this.from_addr = "0x05E37d1b1872A633c588408442E46FC8ada2d241";
this.init_web3_1_0_version();
this.init_contract_web3_deploy_1_0_wersion();
}
// web3对象初始化(仅兼容web3.js 1.0版本)
init_web3_1_0_version() {
this.web3 = new Web3(Web3.givenProvider || new Web3.providers.HttpProvider('http://127.0.0.1:8545'));
console.log('this.web3', this.web3);
}
/**
* 1、初始化web3.eth.Contract合约
* 2、直接调用truffle手动部署成功的合约实例(合约地址)
* 注意:from发送账户务必注意两点:1、必须存在于区块链上; 2、浏览器访问Metamask的账户必须是发送地址账户!
*/
init_contract_web3_at_1_0_wersion() {
// 基于原生的web3.eth.Contract对象来创建合约(调用合约的方法)
let contract_instance = new this.web3.eth.Contract(first_contract_json.abi, this.contract_addr);
// 监听solidity事件
contract_instance.events.eventInfo((error, event) => {
// 正常情况下这里的(error, event)不会返还任何数据!
console.log("eventInfo", error, event);
}).on("data", (result) => {
// 这里返回事件的数据,并存放在数组returnValues对象中!
console.log("data", result.returnValues);
}).on('changed', (result) => {
console.log("changed", result);
}).on('error', console.error);
// 调用solidity合约的只读方法,并在EVM中直接执行方法,不需要发送任何交易。因此不会改变合约的状态。
contract_instance.methods.getInfo().call().then((result) => {
console.log('get已经执行了');
console.log(result);
});
// 向solidity合约发送交易来执行指定方法,将改变合约的状态(必须输入发送交易的账户地址,需要消耗gas)
contract_instance.methods.setInfo('kirin2019', 18).send({from: this.from_addr}).then((result) => {
console.log('set已经执行了');
console.log(result);
});
}
init_contract_web3_deploy_1_0_wersion() {
// 基于原生的web3.eth.Contract对象来创建合约(调用合约的方法)
let contract = new this.web3.eth.Contract(first_contract_json.abi);
let deploy = contract.deploy({data: first_contract_json.bytecode})
.send({from: this.from_addr}).then((instance) => {
console.log("contract_instance合约实例为:", instance);
let contract_instance = instance;
// 调用solidity合约的只读方法,并在EVM中直接执行方法,不需要发送任何交易。因此不会改变合约的状态。
contract_instance.methods.getInfo().call().then((result) => {
console.log('get已经执行了');
console.log(result);
});
// 向solidity合约发送交易来执行指定方法,将改变合约的状态(必须输入发送交易的账户地址,需要消耗gas)
contract_instance.methods.setInfo('kirin2019', 18).send({from: this.from_addr}).then((result) => {
console.log('set已经执行了');
console.log(result);
});
// 监听solidity事件
contract_instance.events.eventInfo((error, event) => {
// 正常情况下这里的(error, event)不会返还任何数据!
console.log("eventInfo", error, result);
}).on("data", (result) => {
// 这里返回事件的数据,并存放在数组returnValues对象中!
console.log("data", result.returnValues);
}).on('changed', (result) => {
console.log("changed", result);
}).on('error', console.error);
}).catch((error) => {
throw error;
});
}
}
// 测试执行!
let first_contract = new FirstContractWeb3();