基于truffle-contract库之solidity事件与合约调用完整案例!

/**
 * 一个基于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();


 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值