Flutter Jumpcoin集成插件jumpcoinlib的使用
Flutter Jumpcoin集成插件jumpcoinlib的使用
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_wsl
或 dart run bin/build_wsl.dart
在 jumpcoinlib
的根目录下交叉编译一个secp256k1 DLL用于Windows。也可以在安装了Docker或Podman的WSL上完成上述 "在Linux上交叉编译Windows" 过程。无需在WSL中安装Flutter即可完成构建。
开发 #
此部分仅与库的开发者相关。
绑定和WebAssembly #
WebAssembly (WASM) 模块已经预编译并准备好使用。FFI绑定已经预先生成。只有在底层secp256k1库更改时才需要更新这些绑定。
本地库的绑定(不包括WebAssembly)是从 headers/secp256k1.h
文件生成的,使用 dart run ffigen
在 jumpcoinlib
包中。
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