Solidity 中的事件触发
Posted
技术标签:
【中文标题】Solidity 中的事件触发【英文标题】:Event triggering in solidity 【发布时间】:2016-06-03 09:44:55 【问题描述】:我目前正在开发以太坊平台(node.js 和solidity)。我的问题是如何使用 node.js 在solidity(contract) 中触发事件?
【问题讨论】:
您可能希望尝试Ethereum Stackexchange 网站来解决此类问题。 我不同意:这是一个编程问题,因此非常适合 ***(非编程以太坊问题是不同的情况)。 【参考方案1】:事件从函数内部触发。因此,您可以通过调用调用事件的函数来触发。这里有更多信息:Solidity Event Documentation。
【讨论】:
【参考方案2】:这是智能合约中的示例事件定义:
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
【讨论】:
【参考方案3】:事件允许方便地使用 EVM 日志记录工具,进而可用于在 dapp 的用户界面中“调用”JavaScript 回调,这些回调会监听这些事件,您可以查看here 了解详情
【讨论】:
【参考方案4】:将事件发射添加到函数,然后调用该函数。您还可以使用模拟合约(仅在必要时),以防您只使用事件进行调试并且不需要合约本身的事件。在这种情况下,从您的合约函数中获取一个返回到模拟函数中,然后使用该返回值触发一个事件。在 JS 中你只需要调用 mock 的函数,然后读取一个事件。
【讨论】:
【参考方案5】:您必须在智能合约中定义事件并让它从智能合约中的函数触发。要通过节点触发它,您必须通过 web3 调用智能合约中的函数。
【讨论】:
【参考方案6】:所以基本上你不会在整个 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
【讨论】:
以上是关于Solidity 中的事件触发的主要内容,如果未能解决你的问题,请参考以下文章
智能合约实战 solidity 语法学习 13 [ 事件event emit日志logs 异常throw revertrequireassert] 附代码
智能合约实战 solidity 语法学习 13 [ 事件event emit日志logs 异常throw revertrequireassert] 附代码
智能合约实战 solidity 语法学习 13 [ 事件event emit日志logs 异常throw revertrequireassert] 附代码