Flutter未知功能插件nwc的使用(注意:由于介绍为undefined,以下基于插件名称推测)

发布于 1周前 作者 bupafengyu 来自 Flutter

Flutter未知功能插件nwc的使用(注意:由于介绍为undefined,以下基于插件名称推测)

nostr_tools package logo

一个简化了集成Nostr Wallet Connect协议到客户端应用的dart包。

概述 #

NWC (Nostr Wallet Connect) 是一个Dart包。它为开发者提供了一个简单的方法来将他们的应用程序与NWC协议集成,通过标准化的协议实现对远程Lightning钱包的无缝访问。协议规范定义在NIP47中,此包是为了遵循这些规范而创建的。

特性 #

  • 简单集成:轻松地将NWC协议实现到您的Nostr客户端或Flutter应用中,只需少量工作。
  • 标准化协议:遵循NIP47中定义的规范,以确保一致性和可靠性。
  • 安全通信:确保客户端与远程Lightning钱包之间的安全通信 (NIP04 实现)。

安装 #

在你的pubspec.yaml文件中添加以下行:

dependencies:
  nwc: ^1.0.0

然后运行:

$ flutter pub get

使用 #

初始化 "nwc" 包 #

要开始使用 "nwc" 包,首先需要将其导入到您的Dart项目中。然后实例化 NWC 类:

import 'package:nwc/nwc.dart';

final nwc = NWC();

解析连接 URI #

使用 parseNostrConnectUri 方法解析连接 URI,提取诸如公钥、中继器、密钥和lud16等重要信息,以便与远程Lightning钱包进行通信:

final parsedUri = nwc.nip47.parseNostrConnectUri(connectionURI);

初始化中继服务 #

在与远程钱包交互之前,需要初始化中继服务。这一步确保建立了适当的通信通道:

await nwc.relaysService.init(relaysUrl: [parsedUri.relay]);

订阅事件 #

您可以使用过滤器订阅来自远程钱包的特定事件。这允许您的应用程序响应相关的更新:

final subToFilter = Request(
  filters: [
    Filter(
      kinds: [23195], // 23195 注册用于 NIP47 响应
      authors: [parsedUri.pubkey], // 指定钱包服务的公钥
      since: DateTime.now(), // 指定一个时间戳以开始过滤事件
    ),
  ],
);

final nostrStream = nwc.relaysService.startEventsSubscription(
  request: subToFilter,
  onEose: (relay, eose) => 
      print('[+] subscriptionId: ${eose.subscriptionId}, relay: $relay'),
);

监听事件流 #

订阅后,您可以监听事件流并相应地做出反应。事件根据 NIP04 协议解密和处理:

nostrStream.stream.listen((Event event) {
  if (event.kind == 23195 && event.content != null) {
    try {
      final decryptedContent = nwc.nip04.decrypt(
        parsedUri.secret,
        parsedUri.pubkey,
        event.content!,
      );

      final content = nwc.nip47.parseResponseResult(decryptedContent);

      // 处理不同类型事件
      if (content.resultType == NWCResultType.get_balance) {
        final result = content.result as Get_Balance_Result;
        print('[+] Balance: ${result.balance} msat');
      } else if (content.resultType == NWCResultType.make_invoice) {
        final result = content.result as Make_Invoice_Result;
        print('[+] Invoice: ${result.invoice}');
      } else if (content.resultType == NWCResultType.pay_invoice) {
        final result = content.result as Pay_Invoice_Result;
        print('[+] Preimage: ${result.preimage}');
      } else if (content.resultType == NWCResultType.error) {
        final result = content.result as NWC_Error_Result;
        print('[+] Preimage: ${result.errorMessage}');
      } else {
        print('[+] content: $decryptedContent');
      }
    } catch (e) {
      if (e is DecipherFailedException) {
        print('$e');
      }
    }
  }
});

发送事件 #

最后,您可以使用适当的方法向远程钱包发送事件,这些方法在 NIP47 中定义。这允许您执行操作如获取余额、生成发票或进行支付:

final message = {"method": "get_balance"};

final content = nwc.nip04.encrypt(
  parsedUri.secret,
  parsedUri.pubkey,
  jsonEncode(message),
);

final request = Event.fromPartialData(
  kind: 23194,
  content: content,
  tags: [['p', parsedUri.pubkey]],
  createdAt: DateTime.now(),
  keyPairs: KeyPairs(private: parsedUri.secret),
);

final okCommand = await nwc.relaysService.sendEventToRelays(
  request,
  timeout: const Duration(seconds: 3),
);

print('[+] getBalance() => okCommand: $okCommand');

通过遵循这些步骤,您可以有效地将 “nwc” 包集成到您的Flutter应用中,从而通过NWC协议实现与远程Lightning钱包的无缝通信。

example/nwc_example.dart

import 'dart:convert';

import 'package:nwc/nwc.dart';
import 'package:nwc/src/utils/exceptions.dart';

const connectionURI = 'nostr+walletconnect://......';

Future<void> main() async {
  final nwc = NWC();

  final parsedUri = nwc.nip47.parseNostrConnectUri(connectionURI);

  await nwc.relaysService.init(relaysUrl: [parsedUri.relay]);

  final subToFilter = Request(
    filters: [
      Filter(
        kinds: [23195],
        authors: [parsedUri.pubkey],
        since: DateTime.now(),
      )
    ],
  );

  final nostrStream = nwc.relaysService.startEventsSubscription(
    request: subToFilter,
    onEose: (relay, eose) => 
        print('[+] subscriptionId: ${eose.subscriptionId}, relay: $relay'),
  );

  nostrStream.stream.listen((Event event) {
    if (event.kind == 23195 && event.content != null) {
      try {
        final decryptedContent = nwc.nip04.decrypt(
          parsedUri.secret,
          parsedUri.pubkey,
          event.content!,
        );

        final content = nwc.nip47.parseResponseResult(decryptedContent);
        if (content.resultType == NWCResultType.get_balance) {
          final result = content.result as Get_Balance_Result;
          print('[+] Balance: ${result.balance} msat');
        } else if (content.resultType == NWCResultType.make_invoice) {
          final result = content.result as Make_Invoice_Result;
          print('[+] Invoice: ${result.invoice}');
        } else if (content.resultType == NWCResultType.pay_invoice) {
          final result = content.result as Pay_Invoice_Result;
          print('[+] Preimage: ${result.preimage}');
        } else if (content.resultType == NWCResultType.list_transactions) {
          final result = content.result as List_Transactions_Result;
          print(
              '[+] First Tx description: ${result.transactions.first.description}');
        } else if (content.resultType == NWCResultType.error) {
          final result = content.result as NWC_Error_Result;
          print('[+] Preimage: ${result.errorMessage}');
        } else {
          print('[+] content: $decryptedContent');
        }
      } catch (e) {
        if (e is DecipherFailedException) {
          print('$e');
        }
      }
    }
  });

  await getBalance(nwc, parsedUri);
  // await makeInvoice(nwc, parsedUri);
  // await payInvoice(nwc, parsedUri);
  await listTransactions(nwc, parsedUri);
}

Future<void> getBalance(NWC nwc, NostrWalletConnectUri parsedUri) async {
  final message = {"method": "get_balance"};

  final content = nwc.nip04.encrypt(
    parsedUri.secret,
    parsedUri.pubkey,
    jsonEncode(message),
  );

  final request = Event.fromPartialData(
    kind: 23194,
    content: content,
    tags: [
      ['p', parsedUri.pubkey]
    ],
    createdAt: DateTime.now(),
    keyPairs: KeyPairs(private: parsedUri.secret),
  );

  final okCommand = await nwc.relaysService.sendEventToRelays(
    request,
    timeout: const Duration(seconds: 3),
  );

  print('[+] getBalance() => okCommand: $okCommand');
}

Future<void> makeInvoice(NWC nwc, NostrWalletConnectUri parsedUri) async {
  final amountInSats = 100;
  final description = 'Hello Nostr Wallet Connect!';

  final message = {
    "method": "make_invoice",
    "params": {
      "amount": amountInSats * 1000, // 金额以毫秒计算
      "description": description, // 发票描述,可选
    }
  };

  final content = nwc.nip04.encrypt(
    parsedUri.secret,
    parsedUri.pubkey,
    jsonEncode(message),
  );

  final request = Event.fromPartialData(
    kind: 23194,
    content: content,
    tags: [
      ['p', parsedUri.pubkey]
    ],
    createdAt: DateTime.now(),
    keyPairs: KeyPairs(private: parsedUri.secret),
  );

  final okCommand = await nwc.relaysService.sendEventToRelays(
    request,
    timeout: const Duration(seconds: 3),
  );

  print('[+] makeInvoice() => okCommand: $okCommand');
}

Future<void> payInvoice(NWC nwc, NostrWalletConnectUri parsedUri) async {
  final invoice = 'lnbc1240n1pnrm654pp5q9evu4tpgd2f8luaz5vscezc5j84m7yqv2vk0h735r6mvc9ujwusdqu2askcmr9wssx7e3q2dshgmmndp5scqzzsxqyz5vqsp5rjq5vef8nuv4adtrlr22n5su5nkt9dh3xw8953yesg8f28n4k4js9qyyssqy80q0a057s67qz3cepdkfeucjnga6w08zsk7pp8eq9wuxkfr65uney4a4vs5c78k3vl7e43s0j97nwqrvc2s7k585j3p9gxfylp3ewgpwt3j6m';
  final message = {
    "method": "pay_invoice",
    "params": {
      "invoice": invoice,
    }
  };

  final content = nwc.nip04.encrypt(
    parsedUri.secret,
    parsedUri.pubkey,
    jsonEncode(message),
  );

  final request = Event.fromPartialData(
    kind: 23194,
    content: content,
    tags: [
      ['p', parsedUri.pubkey]
    ],
    createdAt: DateTime.now(),
    keyPairs: KeyPairs(private: parsedUri.secret),
  );

  final okCommand = await nwc.relaysService.sendEventToRelays(
    request,
    timeout: const Duration(seconds: 3),
  );

  print('[+] payInvoice() => okCommand: $okCommand');
}

Future<void> listTransactions(NWC nwc, NostrWalletConnectUri parsedUri) async {
  final message = {
    "method": "list_transactions",
    "params": {
      "limit": 10,
    }
  };

  final content = nwc.nip04.encrypt(
    parsedUri.secret,
    parsedUri.pubkey,
    jsonEncode(message),
  );

  final request = Event.fromPartialData(
    kind: 23194,
    content: content,
    tags: [
      ['p', parsedUri.pubkey]
    ],
    createdAt: DateTime.now(),
    keyPairs: KeyPairs(private: parsedUri.secret),
  );

  final okCommand = await nwc.relaysService.sendEventToRelays(
    request,
    timeout: const Duration(seconds: 3),
  );

  print('[+] listTransactions() => okCommand: $okCommand');
}

更多关于Flutter未知功能插件nwc的使用(注意:由于介绍为undefined,以下基于插件名称推测)的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter未知功能插件nwc的使用(注意:由于介绍为undefined,以下基于插件名称推测)的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,使用第三方插件通常涉及以下几个步骤:添加依赖、导入包、初始化插件以及调用插件提供的功能。尽管你提到的 nwc 插件在官方文档中未被定义,但基于插件名称和常见 Flutter 插件的使用模式,以下是一个推测性的代码示例,展示了如何在一个 Flutter 项目中使用一个假定的 nwc 插件。

步骤 1: 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 nwc 插件的依赖。请注意,这里的版本号是一个占位符,你需要替换为实际可用的版本号(如果插件存在的话)。

dependencies:
  flutter:
    sdk: flutter
  nwc: ^x.y.z  # 替换为实际版本号

然后,运行 flutter pub get 命令来安装依赖。

步骤 2: 导入包

在你的 Dart 文件中导入 nwc 包。

import 'package:nwc/nwc.dart';

步骤 3: 初始化插件(如果需要)

某些插件可能需要在应用启动时进行初始化。如果 nwc 插件有这样的要求,你可能会在应用的主入口点(如 main.dart)中找到初始化代码。

void main() {
  // 假设 nwc 插件有一个初始化方法
  NwcPlugin.instance.initialize().then((_) {
    runApp(MyApp());
  }).catchError((error) {
    // 处理初始化错误
    print('Failed to initialize nwc plugin: $error');
    runApp(ErrorHandlingApp()); // 一个处理错误的替代应用
  });
}

注意:上述 initialize 方法是一个假设性的方法。你需要查阅 nwc 插件的实际文档来了解如何正确初始化它。

步骤 4: 使用插件功能

假设 nwc 插件提供了一个名为 performAction 的方法,你可以这样调用它:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('nwc Plugin Demo'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              try {
                // 调用 nwc 插件的 performAction 方法
                var result = await NwcPlugin.instance.performAction();
                // 处理结果
                print('Action performed successfully. Result: $result');
              } catch (error) {
                // 处理错误
                print('Failed to perform action: $error');
              }
            },
            child: Text('Perform Action'),
          ),
        ),
      ),
    );
  }
}

总结

上述代码是一个基于假设的示例,展示了如何在 Flutter 项目中使用一个名为 nwc 的未知插件。由于 nwc 插件的具体功能和 API 未知,你需要查阅该插件的实际文档来了解如何正确安装、初始化和使用它。如果 nwc 插件实际上不存在,你可能需要寻找一个满足你需求的替代插件或自己实现所需的功能。

回到顶部