Flutter Nostr核心功能插件nostr_core_dart的使用
Flutter Nostr核心功能插件nostr_core_dart的使用
概述
nostr_core_dart
是一个基于 Dart 实现的 Nostr 协议库,用于在 Flutter 应用中实现 Nostr 的核心功能。该库扩展了标准的 Nostr 功能,并提供了更好的性能和易用性,特别适用于 0xchat 等应用场景。
安装
在你的 Flutter 项目中添加 nostr_core_dart
依赖:
flutter pub add nostr_core_dart
支持的 NIPs
nostr_core_dart
目前支持以下 NIPs(Nostr Improvement Proposals):
- ✅ NIP 01 基本协议流描述
- ✅ NIP 02 联系人列表和昵称
- ✅ NIP 04 加密私信
- ✅ NIP 05 将 Nostr 密钥映射到基于 DNS 的互联网标识符
- ✅ NIP 10 文本事件中的 “e” 和 “p” 标签
- ✅ NIP 15 存储事件结束通知
- ✅ NIP 19 bech32 编码实体
- ✅ NIP 20 命令结果
- ✅ NIP 28 公共聊天
- ✅ NIP 51 列表
- ✅ NIP 101 别名密钥交换(专为 0xchat 设计)
使用示例
以下是一个完整的示例,展示如何在 Flutter 中使用 nostr_core_dart
实现基本的 Nostr 功能。
初始化 Nostr 客户端
import 'package:nostr_core_dart/nostr_core_dart.dart';
void main() {
// 初始化 Nostr 客户端
final client = NostrClient();
// 设置公钥和私钥
final privateKey = 'your_private_key_here';
final publicKey = 'your_public_key_here';
// 连接到 Nostr 网络
client.connect(privateKey);
// 订阅事件
client.subscribe(['*'], (event) {
print('Received event: ${event.toJson()}');
});
// 发布一条文本事件
final textEvent = NostrEvent(
kind: 1,
content: 'Hello Nostr!',
tags: [],
);
client.publish(textEvent);
}
解释
-
初始化客户端:
- 使用
NostrClient()
创建一个新的 Nostr 客户端实例。 - 设置用户的公钥和私钥。
- 使用
-
连接到网络:
- 调用
client.connect(privateKey)
连接到 Nostr 网络。
- 调用
-
订阅事件:
- 使用
client.subscribe(['*'], callback)
订阅所有类型的事件。 - 当接收到事件时,执行回调函数并打印事件内容。
- 使用
-
发布事件:
- 创建一个
NostrEvent
对象,设置事件类型 (kind
) 和内容 (content
)。 - 使用
client.publish(event)
发布事件。
- 创建一个
输出示例
当运行上述代码时,控制台将显示类似以下输出:
Received event: {"id": "event_id", "pubkey": "your_public_key", "content": "Hello Nostr!", "created_at": 1698745600, "kind": 1, "tags": []}
更多关于Flutter Nostr核心功能插件nostr_core_dart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter Nostr核心功能插件nostr_core_dart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
nostr_core_dart
是一个用于在 Flutter 或 Dart 应用程序中实现 Nostr 协议核心功能的库。Nostr 是一个去中心化的、基于事件的协议,用于构建抗审查的社交网络和其他应用。
安装
首先,你需要在 pubspec.yaml
文件中添加 nostr_core_dart
作为依赖项:
dependencies:
nostr_core_dart: ^0.1.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
基本用法
1. 创建密钥对
在 Nostr 中,每个用户都有一个公钥和私钥。你可以使用 nostr_core_dart
来生成密钥对。
import 'package:nostr_core_dart/nostr_core_dart.dart';
void main() {
final keyPair = KeyPair.generate();
print('Public Key: ${keyPair.publicKey}');
print('Private Key: ${keyPair.privateKey}');
}
2. 创建事件
Nostr 中的事件(Event)是协议的核心。你可以创建一个事件并对其进行签名。
import 'package:nostr_core_dart/nostr_core_dart.dart';
void main() {
final keyPair = KeyPair.generate();
final event = Event(
kind: 1, // 事件类型,1 表示文本消息
content: 'Hello, Nostr!', // 事件内容
pubkey: keyPair.publicKey, // 公钥
created_at: DateTime.now().millisecondsSinceEpoch ~/ 1000, // 时间戳
);
event.sign(keyPair.privateKey); // 使用私钥对事件进行签名
print('Event ID: ${event.id}');
print('Event Signature: ${event.sig}');
}
3. 验证事件
你可以验证事件的签名是否有效。
import 'package:nostr_core_dart/nostr_core_dart.dart';
void main() {
final keyPair = KeyPair.generate();
final event = Event(
kind: 1,
content: 'Hello, Nostr!',
pubkey: keyPair.publicKey,
created_at: DateTime.now().millisecondsSinceEpoch ~/ 1000,
);
event.sign(keyPair.privateKey);
final isValid = event.verify();
print('Is Event Valid? $isValid');
}
4. 与其他节点交互
你可以将事件发布到 Nostr 网络中的其他节点,或者从其他节点订阅事件。
import 'package:nostr_core_dart/nostr_core_dart.dart';
void main() async {
final keyPair = KeyPair.generate();
final event = Event(
kind: 1,
content: 'Hello, Nostr!',
pubkey: keyPair.publicKey,
created_at: DateTime.now().millisecondsSinceEpoch ~/ 1000,
);
event.sign(keyPair.privateKey);
final relay = Relay('wss://relay.nostr.example'); // 替换为实际的 Nostr 中继地址
await relay.connect();
await relay.publish(event);
relay.subscribe([], (event) {
print('Received Event: ${event.content}');
});
// 保持连接
await Future.delayed(Duration(seconds: 10));
await relay.disconnect();
}
高级用法
1. 处理不同的事件类型
Nostr 支持多种事件类型,你可以根据事件的 kind
字段来处理不同类型的事件。
import 'package:nostr_core_dart/nostr_core_dart.dart';
void main() async {
final relay = Relay('wss://relay.nostr.example');
await relay.connect();
relay.subscribe([], (event) {
switch (event.kind) {
case 1:
print('Text Note: ${event.content}');
break;
case 2:
print('Recommend Relay: ${event.content}');
break;
// 处理其他事件类型
default:
print('Unknown Event Kind: ${event.kind}');
}
});
await Future.delayed(Duration(seconds: 10));
await relay.disconnect();
}
2. 使用过滤器订阅事件
你可以使用过滤器来订阅特定的事件。
import 'package:nostr_core_dart/nostr_core_dart.dart';
void main() async {
final relay = Relay('wss://relay.nostr.example');
await relay.connect();
final filter = Filter(
kinds: [1], // 只订阅文本消息
authors: ['some_public_key'], // 只订阅特定作者
);
relay.subscribe([filter], (event) {
print('Filtered Event: ${event.content}');
});
await Future.delayed(Duration(seconds: 10));
await relay.disconnect();
}