事件触发稳固

时间:2016-02-22 04:02:33

标签: ethereum solidity

我目前正在研究以太坊平台(node.js和solidity)。我的问题是如何使用node.js触发一个事件(合同)?

6 个答案:

答案 0 :(得分:10)

事件由函数内部触发。因此,您可以通过调用调用事件的函数来触发一个。以下是更多信息:Solidity Event Documentation

答案 1 :(得分:9)

以下是智能合约的示例事件定义:

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);
    }
}

行事件Sent(address from, address to, uint amount);声明了一个所谓的“event”,它在函数send的最后一行被触发。用户界面(当然还有服务器应用程序)可以在没有太多成本的情况下监听在区块链上触发的事件。一旦触发,侦听器也将收到参数fromtoamount,这样可以轻松跟踪事务。为了听取这个事件,你可以使用。

将在浏览器控制台中捕获事件并写入一些消息的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

答案 2 :(得分:1)

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

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

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


On how to subscribe to event

答案 3 :(得分:0)

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

答案 4 :(得分:0)

将事件添加到函数,然后调用该函数。如果仅使用事件进行调试,而合同本身不需要事件,则也可以使用模拟合同(仅在必要时使用)。在这种情况下,您可以从合约函数中获取返回值到模拟函数中,然后在该事件中使用该返回值触发事件。在JS中,您只需要调用模拟函数,然后读取事件即可。

答案 5 :(得分:0)

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