Flutter Jumpcoin集成插件jumpcoinlib的使用

Flutter Jumpcoin集成插件jumpcoinlib的使用

jumpcoinlib

pub.dev

jumpcoinlib #

jumpcoinlib 是一个多币种和类似加密货币的简单且模块化的库,包括对Taproot的支持。此库允许构建和签名交易,并管理BIP32钱包。

安装和使用 #

如果你正在使用 Flutter,请查看 jumpcoinlib_flutter 插件。否则,可以通过以下方式将 jumpcoinlib 添加到项目中:

dart pub add jumpcoinlib

如果你在Web上使用该库,则该库已准备好使用。如果你在Linux、macOS或Windows上使用该库,请参阅下面的 "为Linux构建""为macOS构建""为Windows构建" 部分。

该库可以通过以下方式导入:

import 'package:jumpcoinlib/jumpcoinlib.dart';

在使用库之前,必须异步加载库,通过等待 loadJumpCoinlib() 函数完成加载。

该库使用函数式面向对象编程风格。除了某些特殊情况外,对象是不可变的。方法返回新的修改后的对象。例如,对交易进行签名会返回一个新的已签名交易对象:

final signedTx = unsignedTx.sign(inputN: 0, key: privateKey);

示例可以在 example/ 目录中找到。

为Linux构建 #

需要Docker或Podman来为Linux构建库。

可以使用 dart run jumpcoinlib:build_linux 在包的根目录下构建Linux共享库,这将在 build/libsecp256k1.so 中生成一个共享库。也可以在 jumpcoinlib 的根目录下运行 dart run bin/build_linux.dart

此库可以放在 build 目录下的当前工作目录(PWD)中,作为系统库安装,或者包含在 $LD_LIBRARY_PATH 中。

为macOS构建 #

为macOS构建需要使用homebrew安装autotools:

brew install autoconf automake libtool

macOS动态库必须在运行dart代码时提供为 $PWD/build/libsecp256k1.dylib,或者作为一个名为 secp256k1.framework 的系统框架。

要构建动态库,请运行 dart run jumpcoinlib:build_macos,它会在 build 目录下放置库。

为Windows构建 #

原生Windows构建 #

请注意,在本节中描述的原生Windows构建有时可能在构建过程中冻结。 如果发生这种情况,请使用在 "使用WSL交叉编译Windows" 中描述的WSL构建过程。

在Windows上构建需要CMake作为依赖项。

可以使用 dart run jumpcoinlib:build_windows 在包的根目录下构建Windows共享库,这将在 build/libsecp256k1.dll 中生成一个共享库。也可以在 jumpcoinlib 的根目录下运行 dart run bin/build_windows.dart

Windows构建使用Visual Studio 17 2022生成器。较早版本的Visual Studio工具链可以通过编辑 bin/build_windows.dart 来使用。

从Linux交叉编译Windows #

在Ubuntu 20.04主机上使用 dart run jumpcoinlib:build_windows_crosscompile 交叉编译一个secp256k1 DLL用于Windows。也可以在 jumpcoinlib 的根目录下运行 dart run bin/build_windows_crosscompile.dart

使用WSL交叉编译Windows #

可以在WSL2(Windows Subsystem for Linux)上完成Windows上的构建。首先,在WSL(2)主机上安装以下软件包:

  • autoconf
  • libtool
  • build-essential
  • git
  • cmake
  • mingw-w64

如:

apt-get update -y
apt-get install -y autoconf libtool build-essential git cmake mingw-w64

然后,在Ubuntu 20.04 WSL2实例上使用 dart run jumpcoinlib:build_wsldart run bin/build_wsl.dartjumpcoinlib 的根目录下交叉编译一个secp256k1 DLL用于Windows。也可以在安装了Docker或Podman的WSL上完成上述 "在Linux上交叉编译Windows" 过程。无需在WSL中安装Flutter即可完成构建。

开发 #

此部分仅与库的开发者相关。

绑定和WebAssembly #

WebAssembly (WASM) 模块已经预编译并准备好使用。FFI绑定已经预先生成。只有在底层secp256k1库更改时才需要更新这些绑定。

本地库的绑定(不包括WebAssembly)是从 headers/secp256k1.h 文件生成的,使用 dart run ffigenjumpcoinlib 包中。

WebAssembly模块已经预建到 lib/src/secp256k1/secp256k1.wasm.g.dart。可以在 jumpcoinlib 的根目录下使用 dart run bin/build_wasm.dart 重新构建它。

完整示例代码

import "package:jumpcoinlib/jumpcoinlib.dart";

void main() async {

  // 总是记得为Web使用加载库
  // Flutter应用程序应该使用jumpcoinlib_flutter插件,并使用JumpCoinlibLoader小部件。
  await loadJumpCoinlib();

  // 从种子创建HD密钥
  final seed = generateRandomBytes(16);
  final wallet = HDPrivateKey.fromSeed(seed);

  // 在10'处派生硬化的密钥
  final hardened = wallet.deriveHardened(10);

  // 在4处进一步派生密钥
  final key1 = hardened.derive(4);

  // 密钥也可以通过路径派生
  final key2 = wallet.derivePath("m/10'/4");

  // 公共密钥可以比较
  if (key1.publicKey == key2.publicKey) {
    print("派生的密钥匹配");
  }

  // 使用主网前缀生成P2PKH地址
  final address = P2PKHAddress.fromPublicKey(
    key1.publicKey,
    version: Network.mainnet.p2pkhPrefix,
  );
  print("地址: $address");

  // 使用密钥和地址签署消息并验证

  final msg = "Hello World!";
  final msgSig = MessageSignature.sign(
    key: key1.privateKey,
    message: msg,
    prefix: Network.mainnet.messagePrefix,
  );

  if (
    msgSig.verifyAddress(
      address: address,
      message: msg,
      prefix: Network.mainnet.messagePrefix,
    )
  ) {
    print("消息签名有效: $msgSig");
  }

  // 创建一个花费P2PKH输入到先前生成地址的交易
  // 默认版本设置为3,锁定时间为0。

  print("\nP2PKH交易");

  // hexToBytes是一个方便的函数。
  final prevHash = hexToBytes(
    "32d1f1cf811456c6da4ef9e1cb7f8bb80c4c5e9f2d2c3d743f2b68a9c6857823",
  );

  final tx = Transaction(
    inputs: [
      P2PKHInput(prevOut: OutPoint(prevHash, 1), publicKey: key1.publicKey),
    ],
    outputs: [
      Output.fromAddress(BigInt.from(2000000), address),
    ],
  );

  if (!tx.complete) {
    print("未签名的交易不完整");
  }

  // 使用私钥对输入进行签名。签名交易作为新的对象返回,因为库中的大多数对象都是不可变的。
  final signedTx = tx.sign(inputN: 0, key: key1.privateKey);

  if (signedTx.complete) {
    print("签名交易完整");
  }

  print("Txid = ${signedTx.txid}");
  print("Tx hex = ${signedTx.toHex()}");

  print("\nTaproot");

  // 使用内部密钥创建Taproot对象
  final taproot = Taproot(internalKey: key1.publicKey);

  // 打印P2TR地址
  final trAddr = P2TRAddress.fromTaproot(
    taproot, hrp: Network.mainnet.bech32Hrp,
  );
  print("Taproot地址: $trAddr");

  // 使用key-path对TR输入进行签名,并发送到相同的TR输出

  final trOutput = Output.fromProgram(
    BigInt.from(123456),
    P2TR.fromTaproot(taproot),
  );

  final trTx = Transaction(
    inputs: [TaprootKeyInput(prevOut: OutPoint(prevHash, 1))],
    outputs: [trOutput],
  ).sign(
    inputN: 0,
    // 私钥必须被Taproot对象调整
    key: taproot.tweakPrivateKey(key1.privateKey),
    prevOuts: [trOutput],
  );

  print("TR Tx hex = ${trTx.toHex()}");
}

更多关于Flutter Jumpcoin集成插件jumpcoinlib的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Jumpcoin集成插件jumpcoinlib的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


jumpcoinlib 是一个用于在 Flutter 应用中集成 Jumpcoin 支付功能的插件。通过这个插件,你可以轻松地在你的 Flutter 应用中实现 Jumpcoin 支付功能。以下是如何使用 jumpcoinlib 插件的详细步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 jumpcoinlib 插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  jumpcoinlib: ^1.0.0  # 请根据实际版本号进行替换

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

2. 初始化 Jumpcoin 插件

在你的 Flutter 应用中,你需要在启动时初始化 jumpcoinlib 插件。通常,你可以在 main.dart 文件中进行初始化。

import 'package:jumpcoinlib/jumpcoinlib.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化 Jumpcoin 插件
  await JumpcoinLib.initialize(
    apiKey: 'your_api_key',  // 你的 Jumpcoin API Key
    environment: Environment.sandbox,  // 使用沙盒环境进行测试
  );

  runApp(MyApp());
}

3. 创建支付请求

在你需要发起支付的地方,创建一个支付请求。你可以使用 JumpcoinPaymentRequest 类来定义支付请求的参数。

import 'package:jumpcoinlib/jumpcoinlib.dart';

void createPayment() async {
  var paymentRequest = JumpcoinPaymentRequest(
    amount: 100,  // 支付金额(单位:分)
    currency: 'USD',  // 货币类型
    description: 'Test Payment',  // 支付描述
    callbackUrl: 'https://your-callback-url.com',  // 支付回调URL
  );

  try {
    var paymentResponse = await JumpcoinLib.createPayment(paymentRequest);
    print('Payment created: ${paymentResponse.paymentId}');
  } catch (e) {
    print('Failed to create payment: $e');
  }
}

4. 处理支付回调

当用户完成支付后,Jumpcoin 会向你提供的 callbackUrl 发送支付结果。你需要在服务器端处理这个回调,并根据支付结果更新你的应用状态。

5. 查询支付状态

你可以通过 jumpcoinlib 查询支付状态,以确认支付是否成功。

import 'package:jumpcoinlib/jumpcoinlib.dart';

void checkPaymentStatus(String paymentId) async {
  try {
    var paymentStatus = await JumpcoinLib.getPaymentStatus(paymentId);
    print('Payment status: ${paymentStatus.status}');
  } catch (e) {
    print('Failed to check payment status: $e');
  }
}

6. 处理支付结果

根据支付结果,你可以更新应用的 UI 或执行其他操作。

void handlePaymentResult(PaymentStatus status) {
  if (status == PaymentStatus.success) {
    // 支付成功
    print('Payment succeeded!');
  } else if (status == PaymentStatus.failed) {
    // 支付失败
    print('Payment failed!');
  } else {
    // 支付处理中
    print('Payment is processing...');
  }
}

7. 错误处理

在使用 jumpcoinlib 时,可能会遇到各种错误,例如网络错误、API 错误等。你可以通过 try-catch 块来捕获并处理这些错误。

try {
  var paymentResponse = await JumpcoinLib.createPayment(paymentRequest);
  print('Payment created: ${paymentResponse.paymentId}');
} catch (e) {
  print('Failed to create payment: $e');
}

8. 测试

在开发过程中,建议使用 Jumpcoin 的沙盒环境进行测试。你可以在初始化 jumpcoinlib 时指定 Environment.sandbox

await JumpcoinLib.initialize(
  apiKey: 'your_sandbox_api_key',
  environment: Environment.sandbox,
);

9. 发布

当你完成测试并准备发布应用时,将 Jumpcoin 的环境切换到生产环境。

await JumpcoinLib.initialize(
  apiKey: 'your_production_api_key',
  environment: Environment.production,
);
回到顶部