10

我目前正在开发以太坊平台(node.js 和solidity)。我的问题是如何使用 node.js 在solidity(contract) 中触发事件?

4

6 回答 6

15

这是智能合约中的示例事件定义:

contract Coin {
    //Your smart contract properties...

    // Sample event definition: use 'event' keyword and define the parameters
    event Sent(address from, address to, uint amount);


    function send(address receiver, uint amount) public {
        //Some code for your intended logic...

        //Call the event that will fire at browser (client-side)
        emit Sent(msg.sender, receiver, amount);
    }
}

line 事件Sent(address from, address to, uint amount);声明了一个所谓的“<code>event”,它在函数的最后一行被触发send。用户界面(当然还有服务器应用程序)可以监听那些在区块链上触发的事件,而无需太多成本。一旦它被触发,监听器也将收到参数from,toamount,这使得跟踪事务变得容易。为了收听此事件,您将使用。

将捕获事件并在浏览器控制台中写入一些消息的 Javascript 代码:

Coin.Sent().watch({}, '', function(error, result) {
    if (!error) {
        console.log("Coin transfer: " + result.args.amount +
            " coins were sent from " + result.args.from +
            " to " + result.args.to + ".");
        console.log("Balances now:\n" +
            "Sender: " + Coin.balances.call(result.args.from) +
            "Receiver: " + Coin.balances.call(result.args.to));
    }
})

参考: http ://solidity.readthedocs.io/en/develop/introduction-to-smart-contracts.html

于 2018-01-10T13:44:46.573 回答
10

事件是从函数内部触发的。因此,您可以通过调用调用事件的函数来触发。这里有更多信息:Solidity 事件文档

于 2016-02-26T11:37:25.147 回答
1

所以基本上你不会在整个 node.js 代码中直接触发事件。
假设您有如下所示的可靠合约:

contract MyContract {
    event Deposit(address indexed _from, uint256 _value);
    
    function deposit(uint256 value) public {
        ...
        emit Deposit(msg.sender, value);
        ...
    }
}

为了触发事件,您必须调用deposit(uint256)函数,如下所示:

const myContract = new web3.eth.Contract(contract_abi, contract_address);

myContract.deposit("1000").send({ from: "0x..." }) // function call

只有当函数调用生成的事务成功并且您订阅了此类事件时,您才能看到发出的事件。


关于如何订阅活动

于 2021-07-16T17:00:16.970 回答
0

事件允许方便地使用 EVM 日志记录工具,而这些工具又可用于在 dapp 的用户界面中“调用”JavaScript 回调,这些回调会监听这些事件,您可以在此处查看详细信息

于 2018-02-15T12:06:22.920 回答
0

将事件发射添加到函数,然后调用该函数。您还可以使用模拟合约(仅在必要时),以防您只使用事件进行调试并且不需要合约本身的事件。在这种情况下,从您的合约函数中获取一个返回到模拟函数中,然后使用该返回值触发一个事件。在 JS 中你只需要调用 mock 的函数然后读取一个事件。

于 2019-06-07T21:21:34.150 回答
0

您必须在智能合约中定义事件并让它从智能合约中的函数触发。要通过节点触发它,您必须通过 web3 调用智能合约中的函数。

于 2021-04-08T22:01:05.910 回答