gpt4 book ai didi

ethereum - 从前端订阅 Solidity 事件

转载 作者:行者123 更新时间:2023-12-03 16:41:05 26 4
gpt4 key购买 nike

我正在尝试订阅 PurchaseMade从前端在 Solidty 中定义的事件。我没有得到预期的结果,需要帮助我做错了什么。

环境 :

  • ganache-cli, 松露
  • web3.js, React.js

  • 初始化合约实例 :
    export const getContractInstance = () => {
    let web3Provider

    if (typeof window.web3 !== 'undefined') {
    // if metamask is on, web3 is injected...
    web3Provider = web3.currentProvider
    } else {
    // otherwise, use ganache-cli...
    web3Provider = new Web3.providers.HttpProvider('http://localhost:8545')
    }

    web3 = new Web3(web3Provider)

    return new web3.eth.Contract(CryptoKpopAbi, CONTRACT_ADDRESS)
    }

    订阅 PurchaseMade 事件
    onBuy = (obj) => {
    web3.eth.subscribe("PurchaseMade", {}, () => {
    debugger
    });

    this.ContractInstance.methods.buy(1).send({
    from: this.state.currentUserAddress,
    gas: GAS_LIMIT,
    value: web3.utils.toWei(price.toString(), "ether"),
    }).then((receipt) => {
    console.log(receipt)
    }).catch((err) => {
    console.log(err.message)
    })
    }

    当我调用 web3.eth.subscribe 时收到此警告:
    Subscription "PurchaseMade" doesn't exist. Subscribing anyway.

    我在 tx 收据上收到此错误(在 send()` 成功后
    Uncaught TypeError: Cannot read property 'subscriptionName' of undefined

    我使用这个官方文档来设置订阅

    http://web3js.readthedocs.io/en/1.0/web3-eth-subscribe.html

    先感谢您!

    更新:

    合约中的事件声明
    event PurchaseMade(uint objId, uint oldPrice, uint newPrice, string objName, address prevOwner, address newOwner);

    合约中的事件调用
    function buy(uint _tokenId) payable public {
    address prevOwner = ownerOf(_tokenId);
    uint currentPrice = tokenIdToPrice[_tokenId];

    ...

    PurchaseMade(_tokenId, currentPrice, newPrice,
    tokens[_tokenId].name, prevOwner, msg.sender);
    }

    最佳答案

    您正在尝试订阅事件本身。该 API 允许您订阅事件类型并添加过滤器。有效的事件类型是:

  • pendingTransactions:接收发送到区 block 链的新交易子集(主要用于希望对其处理的交易有选择性的矿工)
  • newBlockHeaders:当新区 block 被添加到区 block 链时接收通知。
  • 同步:节点同步开始/停止时接收通知
  • 日志:接收关于区 block 链日志更新的通知。这些是您感兴趣的事件。

  • API documentation有关如何使用 subscribe("logs") 的示例.
    subscribe API 通常用于监听跨区 block 链发生的事件。监听特定合约事件的更简单方法是使用 events对于已部署的合约 ( documentation)。这与使用 subscribe 没有太大区别。上面,但它已经有合约地址和主题过滤器。
    this.ContractInstance.events.PurchaseMade({}, (error, data) => {
    if (error)
    console.log("Error: " + error);
    else
    console.log("Log data: " + data);
    });

    不过,有一个重要的注意事项。使用 web3 1.0, listening to events is not supported using HttpProvider .您必须使用 Websockets 或 IPC。

    编辑 - 我忘了提到您还可以从交易收据中获取事件:
    contractInstance.events.eventName.returnValues;

    关于ethereum - 从前端订阅 Solidity 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48608398/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com