【重磅推荐】vue之web3.js以太坊开发总结与完整案例!

2023-11-17

 

一个完整的Vue+web3.js(基于Metamask开发测试和正式上线!)  

FirstContract.sol文件

pragma solidity >=0.4.24 < 0.7.0;

contract FirstContract {

    string public fName;
    uint public age;
    event eventInfo(string fName,uint age);

    function setInfo(string memory _fName, uint _age) public  {
        fName = _fName;
        age = _age;
        emit eventInfo(fName,age);
    }

    function getInfo() public view returns (string memory, uint) {
        return (fName, age);
    }
}

 

eth_web.js文件

 * 说明:Vue+truffle+web3.js(1.0版本)开发的以太坊区块链案例!
 * 注意:本案例是vue+纯web3.js案例(不能同时导入truffle-contract库)
 * vue中无法使用web3.js的HttpProvider;官方解释:因为它不支持订阅,所以被弃用!
 * vue开发web3.js主要为了兼容Metamask,所以此案例仅保留了浏览器识别的Web3.givenProvider提供者!


const Web3 = require( 'web3' );
// 导入FirstContract.sol智能合约的ABI编码数据!
const first_contract_json = require( '@/plugins/my_plugins/web3/truffle/build/contracts/FirstContract.json' );


class FirstContractWeb3 {
    constructor () {
        this.contract_addr = '0x1224890D56aFb04F2b84151aa740ef4E8aF84cdb';
        this.from_addr = '0xEB1b0DFFae2f691700d88E116b44e3C88FFE469F';
        this.base_transaction = {
            'from': this.from_addr,
            'gas': 1000000,
        };
        this.init_web3_1_0_version();
        // this.init_contract_web3_deploy_1_0_wersion();
        this.init_contract_web3_at_1_0_wersion();
    }

    // web3对象初始化(仅兼容web3.js 1.0版本)
    init_web3_1_0_version () {
        // 自动使用Metamask插件来调试或正式上线主网!
        if (!Web3.givenProvider) {
            console.log( '请确保您的浏览器已经安装了MetaMask插件' );
            return;
        }
        this.web3 = new Web3( Web3.givenProvider );
        this.listening_web3();
        console.log( 'this.web3', this.web3 );
    }

    listening_web3 () {
        this.web3.eth.net.isListening().then( ( result ) => {
            console.log( '您正在监听网络:', result );
        } );
        this.web3.eth.net.getId().then( ( result ) => {
            console.log( '您当前网络ID:', result );
        } );
    }

    event_contract ( contract_instance ) {
        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 );
    }

    /**
     * 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 );
        console.log( 'contract_instance合约实例:', contract_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( this.base_transaction ).then( ( result ) => {
            console.log( 'set已经执行了' );
            console.log( 'setInfo返回对象:', result );
        } );

        /**
         * 监听solidity事件一定是先触发在监听的原则
         * 务必注意:合约方法内部触发的事件,web3.js先调用合约方法,才能监听到对应的合约事件
         * 比如说:在合约内部setInfo方法调用了eventInfo事件,那么web3.js必须先调用了setInfo方法后,再监听events
         */
        this.event_contract( contract_instance );
    }

    init_contract_web3_deploy_1_0_wersion () {
        // 基于原生的web3.eth.Contract对象来创建合约(调用合约的方法)
        let contract = new this.web3.eth.Contract( first_contract_json.abi );
        contract.deploy( { data: first_contract_json.bytecode } )
            .send( this.base_transaction ).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( this.base_transaction ).then( ( result ) => {
                console.log( 'set已经执行了' );
                console.log( result );
            } );

            /**
             * 监听solidity事件一定是先触发在监听的原则
             * 务必注意:合约方法内部触发的事件,web3.js先调用合约方法,才能监听到对应的合约事件
             * 比如说:在合约内部setInfo方法调用了eventInfo事件,那么web3.js必须先调用了setInfo方法后,再监听events
             */
            this.event_contract( contract_instance );
        } ).catch( ( error ) => {
            throw error;
        } );
    }
}

// 测试执行!
let first_contract = new FirstContractWeb3();


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【重磅推荐】vue之web3.js以太坊开发总结与完整案例! 的相关文章

  • Python----Python调用C语言方法

    原文链接 1 为什么要使用Python调用C语言 可以将一些耗时的操作的函数使用C语言编写 然后主题代码是python 这样使用python去调用C语言 就可以做既能有python语言的简单性 有可以利用C语言的高性能 从而达到整体既简单又

随机推荐

  • 萌梦聊天室16.9.23.77更新

    App名称 萌梦聊天室 App格式 apk 安卓适用 测试机型Android 4 4 红米2 exe Windows 10 App大小 18 2MB Android 27 7MB Windows 10 更新履历 1 修正Android等移动
  • pcre c语言,pcre函数详细解析

    PCRE是一个NFA正则引擎 不然不能提供完全与Perl一致的正则语法功能 但它同时也实现了DFA 只是满足数学意义上的正则 1 pcre compile 原型 include pcre pcre compile const char pa
  • Windows 2012 DHCP超级作用域的一个坑

    今天在将Cisco交换机DHCP服务改为Windows2012服务器DHCP服务的过程中 发现一个奇怪的现象 环境 Cisco2960S交换机上划分有多个VLAN interface Vlan3 ipaddress 10 86 24 1 2
  • (2021-8-16) QT5 信号与槽

    1 概念 信号 Signal 就是在特定情况下被发射的事件 如点击按钮会发送 click 事件 槽 Slot 就是对信号响应的函数 槽就是一个函数 与一般的 C 函数是一样的 可以 定义在类的任何部分 public private 或 pr
  • C语言中的结构体(struct)

    C语言中 结构体类型属于一种构造类型 其他的构造类型还有 数组类型 联合类型 本文主要介绍关于结构体以下几部分 1 概念 为什么要有结构体 因为在实际问题中 一组数据往往有很多种不同的数据类型 例如 登记学生的信息 可能需要用到 char型
  • TCP滑动窗口和拥塞控制

    目录 滑动窗口 什么是滑动窗口 为什么要使用滑动窗口 滑动窗口的工作原理 滑动窗口会出现的几种问题 数据包丢失怎么解决 ACK丢失怎么解决 拥塞控制 拥塞控制是什么 拥塞控制的实现 理解拓展 拥塞控制是如何判断网络拥塞情况的 滑动窗口 什么
  • 虚拟机防火墙以及端口操作

    CentOS7 firewalld 默认安装 和 iptables 都不是防火墙 它们只是防火墙的管理程序 防火墙的开启 关闭 禁用命令 设置开机启用 禁用防火墙 systemctl enable disable firewalld ser
  • ⛳ 面试题-单例模式会存在线程安全问题吗?

    目录 面试题 单例模式会存在线程安全问题吗 一 单例模式 简介 二 饿汉式 三 懒汉式 3 1 懒汉式 在调用 getInstance 的时候才创建对象 线程不安全 3 2 改造1 对懒汉式进行加锁改造 线程安全 3 3 改造2 对懒汉式继
  • 网络抓包命令

    Linux环境下抓包 可以使用tcpdump命令 tcpdump i ens192 w dataAll pcap port 8008 这其中 ens192 指代网卡 可以通过ifconfig获取 也可以直接用 any 代替 意思是抓取全部网
  • CSS快速实现居中

    上效果 实现 父元素 diplay flex div用 margin auto
  • Windows7(sp1)上第一次搭建Flutter开发环境踩坑记录

    环境变量的配置 系统环境的要求 SDK的下载这些在Flutter中文网和各种博客中已经讲的很多了 过程中有问题也可以很快的解决 有一点需要说一下 我先是从Flutter中文网直接下载的SDK压缩包 解压后在Flutter目录下打开flutt
  • linux启动kvm虚拟机,CentOS 7系统KVM虚拟机支持UEFI启动

    1 安装OVMF Open Virtual Machine Firmware root DT Node 172 30 200 203 cat gt etc yum repos d kraxel repo lt create new qemu
  • nginx 卸载后重新安装/etc/nginx配置文件没了,cannot open /etc/nginx/nginx.conf (No such file or directory)

    sudo apt get purge remove nginx common sudo apt get purge remove nginx sudo apt get autoremove sudo apt install nginx
  • 解决nginx报错:502 Bad Gateway以及504 Gateway Time-out问题

    wordpress及宝塔面板的基本环节 出现nginx错误 502 Bad Gateway 502 Bad Gateway以及504 Gateway Time out 504 Gateway Time out问题后的解决办法 更多分类文章
  • Intellij IDEA 自动生成 serialVersionUID

    Setting gt Inspections gt Serialization issues gt Serializable class without serialVersionUID 选上以后 在你的class中 Alt Enter就会
  • 网络安全行业的那些岗位

    网络安全行业 正在蓬勃发展 想要找网络安全岗位的 可以参考这篇文章 一 网络安全岗位 1 需要网络安全人员的企业 有三种企业招聘网络安全人员 乙方企业 甲方企业 国有企业 乙方企业是专门从事网络安全行业的企业 为客户提供安全产品 如防火墙
  • VMware vRealize Suite 8.8.0

    https pan baidu com s 16 VtEGgAMia8vLjMweHjGA 输入提示信息 j323 目录 VMware vRealize Suite 2019 8 8 0 百度网盘群共享 629229614 VMware爱好
  • 抖音,B站,小红书三大平台品牌投放特征与建议

    目前 小红书 抖音 B站作为品牌投放的主要平台 应该如何选择 一 抖音 平台特征 用户类型 抖音用户男女均衡 以19 30岁年龄阶段用户为主 一二线城市用户偏多 南方用户偏多 内容形式 表演剧情 vlog 颜值出境等丰富多样的短视频展示形式
  • 【雅思备考】写作表达积累

    小作文 Line graph amount of source of provided generating 用来描述来源 means of xxx generation 生产方式 over a period of over the per
  • 【重磅推荐】vue之web3.js以太坊开发总结与完整案例!

    一个完整的Vue web3 js 基于Metamask开发测试和正式上线 FirstContract sol文件 pragma solidity gt 0 4 24 lt 0 7 0 contract FirstContract strin