event
event
是 Solidity 提供的一种日志机制,可以在链上记录特定行为(比如转账、投票、交易等)。它们被写入到交易日志(transaction logs)中,可以被客户端或监听程序(如 DApp)读取和响应。
🛠️ 定义方式
event 事件名(参数类型 参数名, ...);
🔸 举个例子:
event Deposit(address indexed sender, uint256 amount);
-
Deposit
是事件名 -
参数是
sender
和amount
-
indexed
关键字表示可以用这个字段做筛选查询(最多只能有 3 个indexed
)
📣 触发(emit)
事件定义之后,需要在逻辑中触发它,用 emit
关键字:
emit Deposit(msg.sender, msg.value);
这条语句会把一条日志写入链上,前端可以用 Web3.js 或 Ethers.js 来监听这个事件。
✅ 使用示例(完整)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Bank {
event Deposit(address indexed sender, uint amount);
event Withdraw(address indexed receiver, uint amount);
function deposit() external payable {
emit Deposit(msg.sender, msg.value);
}
function withdraw(uint amount) external {
payable(msg.sender).transfer(amount);
emit Withdraw(msg.sender, amount);
}
}
🔍 客户端监听
用 ethers
监听:
const { ethers } = require("ethers");
// ✅ 替换为你的 provider,例如 Infura、Alchemy、或本地节点
const provider = new ethers.providers.JsonRpcProvider("https://sepolia.infura.io/v3/YOUR_INFURA_PROJECT_ID");
// ✅ 替换为部署好的合约地址
const contractAddress = "0xYourContractAddress";
// ✅ 替换为合约 ABI 中的 events 部分
const abi = [
"event Deposit(address indexed sender, uint256 amount)"
];
// 创建合约实例
const contract = new ethers.Contract(contractAddress, abi, provider);
// 监听事件
contract.on("Deposit", (sender, amount, event) => {
console.log("📥 Deposit Event Detected:");
console.log("Sender:", sender);
console.log("Amount (wei):", amount.toString());
console.log("Tx Hash:", event.transactionHash);
});
🧠 总结一下
特性 | 描述 |
---|---|
用途 | 记录关键事件(转账、投票等) |
存储位置 | 区块链的交易日志(不计入存储 gas) |
查询效率 | indexed 参数可提升筛选效率 |
前端 | 可监听这些事件进行 UI 更新或通知 |