基于原生web3.js(1.0版本)之solidity事件与合约调用完整案例!

/**
 * 说明: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();


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值