Flutter NDK与Rust代码验证插件ndk_rust_verifier的使用

Flutter NDK与Rust代码验证插件ndk_rust_verifier的使用

ndk_rust_verifier

ndk_rust_verifier 是一个用 Rust 编写的 Nostr 事件验证器,与 dart_ndk 兼容。

主要包: Dart Nostr 开发工具包 (NDK)

安装

首先,在 pubspec.yaml 文件中添加依赖:

dependencies:
  ndk: ^0.1.0
  ndk_rust_verifier: ^0.1.0

然后运行 flutter pub get 来获取这些依赖。

使用示例

以下是一个完整的示例,展示了如何在 Flutter 应用中使用 ndk_rust_verifier 插件来验证 Nostr 事件。

1. 初始化 NDK 和 Rust 验证器
import 'package:flutter/material.dart';
import 'package:ndk/ndk.dart';
import 'package:ndk_rust_verifier/ndk_rust_verifier.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Nostr Event Verifier'),
        ),
        body: Center(
          child: VerifyEventButton(),
        ),
      ),
    );
  }
}

class VerifyEventButton extends StatefulWidget {
  [@override](/user/override)
  _VerifyEventButtonState createState() => _VerifyEventButtonState();
}

class _VerifyEventButtonState extends State<VerifyEventButton> {
  String result = '';

  void verifyEvent() async {
    // 创建 NDK 实例
    final ndk = Ndk();

    // 创建 Rust 验证器实例
    final verifier = NdkRustVerifier();

    // 示例 Nostr 事件
    final eventJson = '''
    {
      "id": "95e60c7053d966d48f9b113f3a40c06f41d060738a928356d97904f3f287d77",
      "pubkey": "61e691f7938f0444720558a005f5d9d5f48062022508c05331f5d205d704e7f",
      "created_at": 1695047992,
      "kind": 1,
      "tags": [],
      "content": "Hello, world!",
      "sig": "2279465d6715f7b0365533f50732c2678028554422c03a8304e097f2c41637013d5f4c807c0304830f5d7c144395c5924454c769859537153d7421474126"
    }
    ''';

    // 解析 JSON 字符串为 Map
    final eventMap = jsonDecode(eventJson);

    // 创建 Nostr 事件对象
    final event = NdkEvent.fromJson(eventMap);

    // 使用 Rust 验证器验证事件
    final isValid = await verifier.verify(event);

    // 更新 UI
    setState(() {
      result = '事件验证结果: ${isValid ? '有效' : '无效'}';
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: verifyEvent,
      child: Text('验证 Nostr 事件'),
    );
  }
}

更多关于Flutter NDK与Rust代码验证插件ndk_rust_verifier的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter NDK与Rust代码验证插件ndk_rust_verifier的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在使用Flutter进行跨平台开发时,有时需要与本地代码(如C/C++或Rust)进行交互。Flutter提供了与Android NDK(Native Development Kit)集成的能力,允许开发者编写本地代码并通过Flutter插件调用这些代码。Rust是一种系统编程语言,以其内存安全和高性能而闻名,因此有时开发者可能会选择使用Rust编写本地代码,并通过Flutter插件与Flutter应用程序进行交互。

ndk_rust_verifier 是一个假设的插件名称,用于说明如何将Flutter、NDK和Rust代码集成在一起。以下是使用Flutter NDK与Rust代码验证插件 ndk_rust_verifier 的步骤:

1. 创建Flutter插件项目

首先,创建一个Flutter插件项目:

flutter create --template=plugin ndk_rust_verifier
cd ndk_rust_verifier

这将创建一个Flutter插件项目,其中包含Android和iOS平台的代码模板。

2. 配置Android项目以支持NDK

android 目录下,配置项目以支持NDK:

  1. 打开 android/build.gradle 文件,确保 minSdkVersion 至少为 21(因为NDK支持需要较高的API级别)。
  2. android/app/build.gradle 文件中,添加NDK配置:
android {
    ...
    defaultConfig {
        ...
        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }
        ndk {
            abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
        }
    }
    ...
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

3. 编写Rust代码

在项目根目录下创建一个 rust 文件夹,并在其中编写Rust代码:

mkdir rust
cd rust
cargo new --lib verifier

rust/verifier/src/lib.rs 中编写Rust代码,例如:

#[no_mangle]
pub extern "C" fn verify(value: i32) -> i32 {
    if value > 10 {
        return 1;
    } else {
        return 0;
    }
}

4. 生成Rust的C库

使用 cargo 将Rust代码编译为C库:

cd rust/verifier
cargo build --target aarch64-linux-android --release

这将生成一个 .so 文件,可以在Android项目中使用。

5. 配置CMake

android/app/src/main/cpp 目录下,创建一个 CMakeLists.txt 文件,并配置CMake以链接Rust生成的库:

cmake_minimum_required(VERSION 3.4.1)

add_library(ndk_rust_verifier SHARED
    ndk_rust_verifier.cpp
)

find_library(log-lib log)

target_link_libraries(ndk_rust_verifier
    ${log-lib}
    ${CMAKE_SOURCE_DIR}/../../../rust/verifier/target/aarch64-linux-android/release/libverifier.so
)

6. 编写C++代码

android/app/src/main/cpp 目录下,创建一个 ndk_rust_verifier.cpp 文件,并编写C++代码以调用Rust函数:

#include <jni.h>
#include <string>

extern "C" {
    int verify(int);
}

extern "C"
JNIEXPORT jint JNICALL
Java_com_example_ndk_1rust_1verifier_NdkRustVerifierPlugin_verify(JNIEnv *env, jobject thiz, jint value) {
    return verify(value);
}

7. 编写Flutter插件代码

lib 目录下,编写Flutter插件的Dart代码:

class NdkRustVerifier {
  static const MethodChannel _channel =
      const MethodChannel('ndk_rust_verifier');

  static Future<int> verify(int value) async {
    final int result = await _channel.invokeMethod('verify', value);
    return result;
  }
}

8. 注册插件

android/src/main/kotlin/com/example/ndk_rust_verifier/NdkRustVerifierPlugin.kt 中,注册插件并实现JNI调用:

class NdkRustVerifierPlugin: FlutterPlugin, MethodCallHandler {
  override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
    val channel = MethodChannel(flutterPluginBinding.binaryMessenger, "ndk_rust_verifier")
    channel.setMethodCallHandler(this)
  }

  override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
    if (call.method == "verify") {
      val value = call.arguments as Int
      val verificationResult = verify(value)
      result.success(verificationResult)
    } else {
      result.notImplemented()
    }
  }

  private external fun verify(value: Int): Int

  companion object {
    init {
      System.loadLibrary("ndk_rust_verifier")
    }
  }

  override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {
    // Clean up
  }
}

9. 测试插件

在Flutter应用中,使用 NdkRustVerifier 类来调用Rust代码:

void main() async {
  int result = await NdkRustVerifier.verify(15);
  print('Verification result: $result'); // Should print 1
}
回到顶部