我目前正在研究以太坊平台(node.js和solidity)。我的问题是如何使用node.js触发一个事件(合同)?
答案 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
的最后一行被触发。用户界面(当然还有服务器应用程序)可以在没有太多成本的情况下监听在区块链上触发的事件。一旦触发,侦听器也将收到参数from
,to
和amount
,这样可以轻松跟踪事务。为了听取这个事件,你可以使用。
将在浏览器控制台中捕获事件并写入一些消息的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
并且只有当函数调用生成的事务成功并且您订阅了此类事件时,您才能看到发出的事件。
答案 3 :(得分:0)
事件允许方便地使用EVM日志记录工具,而这些工具又可用于在dapp的用户界面中“调用”JavaScript回调,监听这些事件,您可以查看here以获取详细信息
答案 4 :(得分:0)
将事件添加到函数,然后调用该函数。如果仅使用事件进行调试,而合同本身不需要事件,则也可以使用模拟合同(仅在必要时使用)。在这种情况下,您可以从合约函数中获取返回值到模拟函数中,然后在该事件中使用该返回值触发事件。在JS中,您只需要调用模拟函数,然后读取事件即可。
答案 5 :(得分:0)
您必须在智能合约中定义事件,并让它从智能合约中的函数触发。要通过节点触发它,您必须通过 web3 调用智能合约中的函数。