event

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 更新或通知

posted @ 2025-08-12 23:44  Lucas_coming  阅读(158)  评论(0)    收藏  举报