当前位置:   article > 正文

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

vue web3.js approve demo

 

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

FirstContract.sol文件

  1. pragma solidity >=0.4.24 < 0.7.0;
  2. contract FirstContract {
  3. string public fName;
  4. uint public age;
  5. event eventInfo(string fName,uint age);
  6. function setInfo(string memory _fName, uint _age) public {
  7. fName = _fName;
  8. age = _age;
  9. emit eventInfo(fName,age);
  10. }
  11. function getInfo() public view returns (string memory, uint) {
  12. return (fName, age);
  13. }
  14. }

 

eth_web.js文件

  1. * 说明:Vue+truffle+web3.js(1.0版本)开发的以太坊区块链案例!
  2. * 注意:本案例是vue+纯web3.js案例(不能同时导入truffle-contract库)
  3. * vue中无法使用web3.jsHttpProvider;官方解释:因为它不支持订阅,所以被弃用!
  4. * vue开发web3.js主要为了兼容Metamask,所以此案例仅保留了浏览器识别的Web3.givenProvider提供者!
  5. const Web3 = require( 'web3' );
  6. // 导入FirstContract.sol智能合约的ABI编码数据!
  7. const first_contract_json = require( '@/plugins/my_plugins/web3/truffle/build/contracts/FirstContract.json' );
  8. class FirstContractWeb3 {
  9. constructor () {
  10. this.contract_addr = '0x1224890D56aFb04F2b84151aa740ef4E8aF84cdb';
  11. this.from_addr = '0xEB1b0DFFae2f691700d88E116b44e3C88FFE469F';
  12. this.base_transaction = {
  13. 'from': this.from_addr,
  14. 'gas': 1000000,
  15. };
  16. this.init_web3_1_0_version();
  17. // this.init_contract_web3_deploy_1_0_wersion();
  18. this.init_contract_web3_at_1_0_wersion();
  19. }
  20. // web3对象初始化(仅兼容web3.js 1.0版本)
  21. init_web3_1_0_version () {
  22. // 自动使用Metamask插件来调试或正式上线主网!
  23. if (!Web3.givenProvider) {
  24. console.log( '请确保您的浏览器已经安装了MetaMask插件' );
  25. return;
  26. }
  27. this.web3 = new Web3( Web3.givenProvider );
  28. this.listening_web3();
  29. console.log( 'this.web3', this.web3 );
  30. }
  31. listening_web3 () {
  32. this.web3.eth.net.isListening().then( ( result ) => {
  33. console.log( '您正在监听网络:', result );
  34. } );
  35. this.web3.eth.net.getId().then( ( result ) => {
  36. console.log( '您当前网络ID:', result );
  37. } );
  38. }
  39. event_contract ( contract_instance ) {
  40. contract_instance.events.eventInfo( ( error, event ) => {
  41. // 正常情况下这里的(error, event)不会返还任何数据!
  42. console.log( 'eventInfo', error, event );
  43. } ).on( 'data', ( result ) => {
  44. // 这里返回事件的数据,并存放在数组returnValues对象中!
  45. console.log( 'data', result.returnValues );
  46. } ).on( 'changed', ( result ) => {
  47. console.log( 'changed', result );
  48. } ).on( 'error', console.error );
  49. }
  50. /**
  51. * 1、初始化web3.eth.Contract合约
  52. * 2、直接调用truffle手动部署成功的合约实例(合约地址)
  53. * 注意:from发送账户务必注意两点:1、必须存在于区块链上; 2、浏览器访问Metamask的账户必须是发送地址账户!
  54. */
  55. init_contract_web3_at_1_0_wersion () {
  56. // 基于原生的web3.eth.Contract对象来创建合约(调用合约的方法)
  57. let contract_instance = new this.web3.eth.Contract( first_contract_json.abi, this.contract_addr );
  58. console.log( 'contract_instance合约实例:', contract_instance );
  59. // 调用solidity合约的只读方法,并在EVM中直接执行方法,不需要发送任何交易。因此不会改变合约的状态。
  60. contract_instance.methods.getInfo().call().then( ( result ) => {
  61. console.log( 'get已经执行了' );
  62. console.log( result );
  63. } );
  64. // 向solidity合约发送交易来执行指定方法,将改变合约的状态(必须输入发送交易的账户地址,需要消耗gas)
  65. contract_instance.methods.setInfo( 'kirin2019', 18 ).send( this.base_transaction ).then( ( result ) => {
  66. console.log( 'set已经执行了' );
  67. console.log( 'setInfo返回对象:', result );
  68. } );
  69. /**
  70. * 监听solidity事件一定是先触发在监听的原则
  71. * 务必注意:合约方法内部触发的事件,web3.js先调用合约方法,才能监听到对应的合约事件
  72. * 比如说:在合约内部setInfo方法调用了eventInfo事件,那么web3.js必须先调用了setInfo方法后,再监听events
  73. */
  74. this.event_contract( contract_instance );
  75. }
  76. init_contract_web3_deploy_1_0_wersion () {
  77. // 基于原生的web3.eth.Contract对象来创建合约(调用合约的方法)
  78. let contract = new this.web3.eth.Contract( first_contract_json.abi );
  79. contract.deploy( { data: first_contract_json.bytecode } )
  80. .send( this.base_transaction ).then( ( instance ) => {
  81. console.log( 'contract_instance合约实例为:', instance );
  82. let contract_instance = instance;
  83. // 调用solidity合约的只读方法,并在EVM中直接执行方法,不需要发送任何交易。因此不会改变合约的状态。
  84. contract_instance.methods.getInfo().call().then( ( result ) => {
  85. console.log( 'get已经执行了' );
  86. console.log( result );
  87. } );
  88. // 向solidity合约发送交易来执行指定方法,将改变合约的状态(必须输入发送交易的账户地址,需要消耗gas)
  89. contract_instance.methods.setInfo( 'kirin2019', 18 ).send( this.base_transaction ).then( ( result ) => {
  90. console.log( 'set已经执行了' );
  91. console.log( result );
  92. } );
  93. /**
  94. * 监听solidity事件一定是先触发在监听的原则
  95. * 务必注意:合约方法内部触发的事件,web3.js先调用合约方法,才能监听到对应的合约事件
  96. * 比如说:在合约内部setInfo方法调用了eventInfo事件,那么web3.js必须先调用了setInfo方法后,再监听events
  97. */
  98. this.event_contract( contract_instance );
  99. } ).catch( ( error ) => {
  100. throw error;
  101. } );
  102. }
  103. }
  104. // 测试执行!
  105. let first_contract = new FirstContractWeb3();

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/445101
推荐阅读
相关标签
  

闽ICP备14008679号