solidity合约中的event

25 阅读1分钟

event 是 Solidity 提供的一种日志机制,可以在链上记录特定行为(比如转账、投票、交易等)。它们被写入到交易日志(transaction logs)中,可以被客户端或监听程序(如 DApp)读取和响应


🛠️ 定义方式

 event 事件名(参数类型 参数名, ...);

🔸 举个例子:

 event Deposit(address indexed sender, uint256 amount);
  • Deposit 是事件名
  • 参数是 senderamount
  • 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 更新或通知