建议和反馈

请填写你的反馈内容

web3.js v1.0.0如何监控以太坊合约

2020-01-14 ·952次阅读 ·读完需要5分钟

为了使前台显示的数据与DApp中合同的数据同步,我检查了是否可以监视合约的状态。这可以通过定期获取数据来实现,但是考虑到前部负载和气体成本,我们将选择一种有效的方法。

验证DApp

将SetValue事件添加到先前介绍的教程DApp中。

pragma solidity ^0.4.23;contract SimpleStore {
    string value;
    event SetValue(address from, string value);
    function set(string _value) public {
        value = _value;
        emit SetValue(msg.sender, _value);
    }
    function get() public view returns (string) {
        return (value);
    }}

SetValue事件是一个简单的事件,它记录发件人地址和发送的值。
在set函数中调用SetValue事件。

*从Solidity0.4.21引入了emitt关键字,以区分函数执行和事件触发。

更新合约

部署和更新合同。

$ truffle migrate --resetCompiling ./contracts/SimpleStore.sol...Writing artifacts to ./build/contractsUsing network 'development'.Running migration: 1_initial_migration.js
  Replacing Migrations...  ... 0x3d6ab4afbdbcf1d62479ce1f556f9c232b3e13b76eccf8d45b116a4d0e78c09a
  Migrations: 0xdca7ffd3ee28b1f3266a8793137cb4d04b817e29Saving successful migration to network...  ... 0xd4bfe57e75456a48a1afcfdbf4e09945e8d086935bb1445f7941a21ae12569c1Saving artifacts...Running migration: 2_deploy_contracts.js
  Replacing SimpleStore...  ... 0xdb75462f6e52730dae12c2f01296d0b7acfd53eb914f7303a06e7a900fc8ae21
  SimpleStore: 0x1e01faaff41ebced1840750a647811f326767072Saving successful migration to network...  ... 0x66a82562cd2f4ad196c10cc16ad747a5f1699d67e0d38ea6230a8f29479f7fafSaving artifacts...

接下来,更新正面的地址和ABI。

  • src / index.html

var contractAddress = "0xdc30da2490373416e7bf7467bb297bae624287b4";
  • src / js / contract_abi.js

/build/contracts/SimpleStore.json复制并粘贴“

var contractABI = [
  {
    anonymous: false,
    inputs: [
      {
        indexed: false,
        name: 'from',
        type: 'address'
      },
      {
        indexed: false,
        name: 'value',
        type: 'string'
      }
    ],
    name: 'SetValue',
    type: 'event'
  },
  {
    constant: false,
    inputs: [
      {
        name: '_value',
        type: 'string'
      }
    ],
    name: 'set',
    outputs: [],
    payable: false,
    stateMutability: 'nonpayable',
    type: 'function'
  },
  {
    constant: true,
    inputs: [],
    name: 'get',
    outputs: [
      {
        name: '',
        type: 'string'
      }
    ],
    payable: false,
    stateMutability: 'view',
    type: 'function'
  }];

移加密僵尸处理

继续进行正面的事件获取处理。

让我们通过参考CryptoZombies的Lesson6中引入的事件获取过程来实现。

将以下代码添加到startApp函数的末尾。

contract.events.SetValue()
    .on("data", function (event) {
        let data = event.returnValues;
        console.log('Get event');
        console.log(data);
    })
    .on("error", console.error);

让我们检查一下操作。

set函数中的日志已输出,但似乎无法获取该事件。

MetaMask无法获取事件

根据Google的研究,web3.js v1.0.0似乎还无法通过MetaMask获取事件。

我们上面刚刚描述的语法来自Web3.js的最新1.0版本,该版本使用WebSockets订阅事件。
但是,MetaMask尚不支持最新的事件API(尽管他们正在积极地使用它-请查看github问题以获取更新)(MetaMask版本4.5.1),
因此现在我们必须使用单独的Web3提供程序支持专门用于事件的WebSockets。我们可以使用Infura实例化第二个副本,如下所示:

var web3Infura = new Web3(new Web3.providers.WebsocketProvider("wss://mainnet.infura.io/ws"));var czEvents = new web3Infura.eth.Contract(cryptoZombiesABI, cryptoZombiesAddress);

的JavaScript

复制

似乎如果不连接测试网就无法确认。

部署到测试网(固定)

由于您需要使用Infura,因此请在Infura中创建一个项目。
复制API KEY,infura_access_token创建一个名为的新文件,然后粘贴API KEY。

接下来,获取Metamask助记符,mnemonic创建并粘贴一个新文件。

安装所需的库。

$ npm install truffle-hdwallet-provider

truffle.js添加测试网络(连接)的连接信息。

var { readFileSync } = require('fs');var HDWalletProvider = require('truffle-hdwallet-provider');var mnemonic = readFileSync('./mnemonic', 'utf-8').replace(/\r?\n/g, '');var accessToken = readFileSync('./infura_access_token', 'utf-8');module.exports = {
  // See <http://truffleframework.com/docs/advanced/configuration>
  // to customize your Truffle configuration!
  networks: {
    development: {
      host: '127.0.0.1',
      port: 8545,
      network_id: '*'
    },
    ropsten: {
      provider: function() {
        return new HDWalletProvider(
          mnemonic,
          'https://ropsten.infura.io/v3/' + accessToken        );
      },
      //Ropsten gas limit is 4700000 (Truffle default gas limit is 4712388).
      gas: 4700000,
      network_id: 1
    }
  }};

准备部署。

$ truffle migrate --network ropsten --resetUsing network 'ropsten'.Running migration: 1_initial_migration.js
  Replacing Migrations...  ... 0x82a6d8ed87baf27c24aadc97bd592c48c90f720fc988be4683e703126c31d676
  Migrations: 0x5bf5e971e8ed63bd2ac95f548d547506b0db8568Saving successful migration to network...  ... 0xbc22ccc08533def5b14460beee87eebcf4709f1d93d3ef05043ca7bb7c11f0d3Saving artifacts...Running migration: 2_deploy_contracts.js
  Deploying SimpleStore...  ... 0xa2b341b77ba332333c1b73f3e6aed473d3d59cd78224aa5eedaefb6559c56c32
  SimpleStore: 0x7f0855af33e8d66e20545b88d9043d93ff5029abSaving artifacts...


如果您没有足够的汽油,您将得到一个错误;如果您没有足够的汽油,请获得罗普森醚。

如果成功,则更新前台地址和ABI以及更新合同。

修改在startApp函数末尾添加的事件获取过程。

const web3Infura = new Web3(new Web3.providers.WebsocketProvider("wss://ropsten.infura.io/ws"));const czEvents = new web3Infura.eth.Contract(contractABI, contractAddress);czEvents.events.SetValue().on("data", function (event) {
    let data = event.returnValues;
    console.log('Get event');
    console.log(data);}).on("error", console.error);

检查浏览器控制台将导致WebSocket连接错误。

web3.min.js:1到'wss://ropsten.infura.io/ws'的WebSocket连接失败:WebSocket握手期间出错:发送了非空的'Sec-WebSocket-Protocol'标头,但未收到任何响应

web3.js版本

显然,如果web3.js的版本为v1.0.0-beta.34(或35),则会发生错误。

再次下载v1.0.0-beta.33,然后重试。

替换为Download /src/js/web3.min.js

让我们检查一下操作。

输出了“获取事件”,因此我能够确认事件的获得

监视截至2019年8月的合同事件

  • 获得测试网(Infura)合同

  • 使用web3.js v1.0.0-beta33

在本地网络上检查有点困难。
我认为将来会有所改善,所以我想关注趋势。


评论(0)问答(0)
请先登录或注册

请先登陆或注册

相关推荐

以太坊区块链的简单可靠性智能合约

这是使用Solidity的典型智能合约示例简单银行的修改版本,例如:https : //github.com/ScottWorks/ConsenSys-Academy-Notes/blob/maste......
区块链社区 · 2020-01-21
751阅读 · 0赞赏 · 0问答

如何从私钥创建以太坊钱包地址

在本系列的第一篇文章中,我们生成了一个比特币私钥:60cf347dbc59d31c1358c8e5cf5e45b822ab85b79cb32a9f3d98184779a9efc2。在这里,我们将使用该......
区块链网 · 2020-01-19
708阅读 · 0赞赏 · 0问答

plasma能否解决以太坊的可扩展性问题?

plasma是一种新技术,可以解决以太坊的可扩展性问题。第二大市值的以太坊(Ethereum)试图解决Plasma和更高级的Plasma Cash的各种问题。在本文中,我们将介绍plasma的机理和好......
区块链社区 · 2020-01-14
805阅读 · 0赞赏 · 0问答

以太坊挖矿初学者指南

挖矿在区块链应用中很受欢迎,围绕比特币的炒作真的不足为奇。开采比特币需要大量投资于一种非常专业的机器。它被称为ASIC矿工。ASIC是专用集成电路的缩写。简而言之,这些设备是为完成一件事情而定制的:挖......
古风 · 2020-01-13
1015阅读 · 0赞赏 · 0问答

使用Python编译,部署和调用以太坊智能合约

我们在Ubuntu 16.04上使用Python 3.5.3,并进行以下设置:pip3 install web3==4.7.2 py-solc==3.2.0python3 -m solc.instal......
HBO · 2020-01-13
939阅读 · 0赞赏 · 0问答

Blockchain

1629

LK币

20

粉丝

39

笔记

感谢"Blockchain"

这篇精彩的笔记,目前已经帮助

  • 0
  • 0
  • 9
  • 5
  • 2
喜欢0
链客社群 加入

微博进入

商务合作>

广告投放>

公司名称:北京链客行科技有限公司

联系方式:010-67707199

ICP备案号:京ICP备18032136号

Copyright:链客区块链技术问答社区 版权所有

感谢您的提问,问题被社区永久收入以便新人查看。一定要记得采纳最佳答案哦!加油!

感谢您的善举,每一次解答会成为新人的灯塔,回答被采纳后获得20算力和相应的LK币奖励

您将赞赏给对方2LK币的奖励哦!感谢您的赞赏!

您将赞赏给对方2LK币的奖励哦!感谢您的赞赏!