NEAR上的Rust智能合约是否支持事件监听?需手动轮询吗?
NEAR Rust智能合约事件相关问题解答
事件功能支持情况
NEAR链上基于Rust开发的智能合约原生支持事件能力,不存在功能层面的限制。
NEAR的事件遵循统一的NEP-297标准实现,本质是合约执行过程中输出的结构化日志,不需要依赖特殊的链上预编译合约,也不用引入额外第三方依赖,开发者直接用官方Rust SDK自带的log!宏就能触发事件,简单实现示例如下:
use near_sdk::log; use serde::Serialize; // 自定义事件结构 #[derive(Serialize)] #[serde(tag = "event", content = "data")] pub enum MyContractEvent { Deposit { user: String, amount: u128 }, Withdraw { user: String, amount: u128 } } // 合约业务逻辑中触发事件 pub fn handle_deposit(&mut self) { // 省略存款校验、状态更新等核心业务逻辑 let event = MyContractEvent::Deposit { user: "bob.near".to_string(), amount: 1_000_000_000_000_000_000 }; log!("{}", serde_json::to_string(&event).unwrap()); }
事件获取方式
完全不需要通过手动轮询区块链的方式获取事件数据,开发者可以直接配置监听器实时获取目标合约的事件:
- 可以对接NEAR生态的索引服务,按目标合约地址、事件类型配置过滤规则,服务会在对应事件被链上最终确认后实时推送匹配的事件数据,同时也支持按条件查询历史事件。
- 如果是自建节点的场景,可以直接对接节点的交易执行结果数据流,实时过滤目标合约输出的结构化日志,自行解析后就能得到对应的事件内容,适合对数据可控性要求高的场景。
手动轮询逐块扫描交易当然也能拿到事件数据,但效率极低、延迟高,还容易因为区块回滚等问题出现数据不一致,完全没有必要,现有监听方案的实时性和稳定性都远好于自写轮询逻辑。
需要额外注意的是,事件本身不会写入合约的持久化状态,仅附着在交易执行结果中,如果需要长期留存事件数据,需要在监听到事件后自行做持久化存储。
内容的提问来源于stack exchange,提问作者Віталій Казміревський БС-21м
相关产品推荐
相关产品推荐

