Appearance
智能合约事件
以太坊中的智能合约事件是一种通知机制,用于在智能合约的状态变化或交易通过区块链网络被确认时提供通知。
合约创建者可以设定事件名称、事件参数、事件触发条件等信息。这些信息会被记录在合约的 ABI 文件中。
智能合约事件通常由应用程序通过合约的 Web3.js 接口进行订阅。当符合事件触发条件的智能合约方法被调用或交易被确认时,智能合约事件将被触发,并将通知应用程序。应用程序可以通过读取事件参数来处理事件,以确保已经准确地读取了智能合约的状态变化。
例如,一个基于以太坊的披萨外卖应用程序可以使用智能合约事件来通知店家,当一个新订单被创建或订单状态发生变化时。当订单的状态发生变化时,智能合约会触发状态变化事件,并将新状态传递给应用程序,以便在App中更新订单状态,这可以实现披萨外卖的实时跟踪,并使店家和客户双方可以准确地了解他们的订单状态。 |
---|
在区块链中,事件的存储通常是通过交易日志来完成的,因为区块链是由区块组成的列表,每个区块包含各种交易的记录。
每个交易记录都包含一个交易日志,其中包含了事件的结果信息。当合约执行时,如果产生了事件,该事件结果将被写入到交易日志中。
1. 准备合约
下面这个合约当你调用hello函数时,它将触发一个事件并将消息作为参数传递给事件。该事件会在区块链上存储,可以通过合约地址访问。
solidity
pragma solidity ^0.8.0;
contract HelloWorld {
event Greet(string message);
function hello(string memory _name) public {
emit Greet(string(abi.encodePacked("Hello, ", _name, "!")));
}
}
2. 事件监听
js
let Web3 = require("web3")
let web3 = new Web3(new Web3.providers.HttpProvider("HTTP://127.0.0.1:8545"))
// 定义要监听的事件名称
const eventName = 'Greet';
// 定义合约地址和ABI
const contractAddress = '0xC41e6E966cC01D9502DDf1a44F963462E88A0e16';
const contractABI = ABI;
// 创建合约实例
const contract = new web3.eth.Contract(contractABI, contractAddress);
// 监听事件
contract.events[eventName]({ fromBlock: 0, toBlock: 'latest' })
.on('data', (event) => {
console.log('获取到事件数据:', event.returnValues.message);
})
.on('error', (error) => {
console.error('获取事件时发生错误:', error);
})