Flutter加密工具插件chia_crypto_utils的使用
Flutter加密工具插件chia_crypto_utils的使用
本仓库提供了用于处理Chia原语的对象模型,作为Chia客户端的基础。它包含以下功能:
- 从24字助记词种子生成强化和非强化密钥
- 标准交易(XCH)硬币花费
- CAT
- PlotNFT
- NFT
- Offer
- 使用Chia模拟器的集成测试
- 序列化和反序列化到和从字节,便于安全存储集成
- Chia和比特币之间的原子交换
依赖项
本仓库用Dart编写,以支持移动和Web使用。您可以安装Dart SDK或包含Dart的Flutter SDK。
构建和测试
运行测试:
dart test
对于集成测试,执行以下脚本:
bash ./integration_test/run_tests.sh
要从VS Code UI运行集成测试,请在chia-crypto-utils根目录添加以下json文件:
{
"path": "absolute_path_to_simulator_gen_folder"
}
示例
Keychain
初始化Keychain
const mnemonic = ['elder', 'quality', 'this', ...];
// 这些密钥不应存储在内存中,如果需要,只能存储在加密存储中
final keychainSecret = KeychainCoreSecret.fromMnemonic(mnemonic);
// 生成密钥、地址、派生索引处的谜题哈希(包括强化和非强化)
final walletKeyAddressSet = WalletSet.fromPrivateKey(keychainSecret.masterPrivateKey, 0);
final keychain = WalletKeychain.fromWalletSets([walletKeyAddressSet]);
为给定资产ID添加CAT外层谜题哈希到你的Keychain
keychain.addOuterPuzzleHashesForAssetId(assetId);
上下文
// 传递给钱包服务的上下文,以便它们了解传入的区块链
Context context = NetworkContext.makeContext(Network.mainnet);
推送标准交易
// 初始化WalletKeychain
const mnemonic = ['elder', 'quality', 'this', ...];
KeychainCoreSecret keychainSecret = KeychainCoreSecret.fromMnemonic(testMnemonic);
final walletsSetList = <WalletSet>[];
for (var i = 0; i < 10; i++) {
final set1 = WalletSet.fromPrivateKey(keychainSecret.masterPrivateKey, i);
walletsSetList.add(set1);
}
final keychain = WalletKeychain.fromWalletSets(walletsSetList);
// 初始化FullNodeInterface
final fullNodeRpc = FullNodeHttpRpc(
'https://localhost:8555',
certBytes: myPrivateCertBytes,
keyBytes: myPrivateKeyBytes
);
final fullNode = ChiaFullNodeInterface(fullNodeRpc);
// 初始化Service
Context context = NetworkContext.makeContext(Network.mainnet);
StandardWalletService standardWalletService = StandardWalletService(context);
// 获取要搜索的谜题哈希
List<Puzzlehash> myPuzzlehashes = keychain.unhardenedMap.values
.map((walletVector) => walletVector.puzzlehash);
List<Coin> myCoins = await fullNode.getCoinsByPuzzleHashes(myPuzzlehashes);
// 创建并推送支出包
final spendBundle = standardWalletService.createSpendBundle(
[
Payment(amountToSendA, destinationPuzzlehashA),
Payment(amountToSendB, destinationPuzzlehashB)
],
myCoins,
changePuzzlehash,
keychain,
fee: fee,
);
await fullNode.pushTransaction(spendBundle);
推送CAT交易
// 初始化WalletKeychain
const mnemonic = ['elder', 'quality', 'this', ...];
final keychainSecret = KeychainCoreSecret.fromMnemonic(testMnemonic);
final walletsSetList = <WalletSet>[];
for (var i = 0; i < 10; i++) {
final set1 = WalletSet.fromPrivateKey(keychainSecret.masterPrivateKey, i);
walletsSetList.add(set1);
}
// 外层谜题哈希必须添加到Keychain以便查找正确的密钥,用于创建支出包
final keychain = WalletKeychain.fromWalletSets(walletsSetList)
..addOuterPuzzleHashesForAssetId(assetId);
// 初始化FullNodeInterface
final fullNodeRpc = FullNodeHttpRpc(
'https://localhost:8555',
certBytes: myPrivateCertBytes,
keyBytes: myPrivateKeyBytes
);
final fullNode = ChiaFullNodeInterface(fullNodeRpc);
// 初始化Service
final context = NetworkContext.makeContext(Network.mainnet);
final catWalletService = CatWalletService(context);
// 从Keychain获取外层谜题哈希
final myOuterPuzzlehashes = keychain.getOuterPuzzleHashesForAssetId(assetId);
List<CatCoin> myCatCoins = await fullNode.getCatCoinsByOuterPuzzleHashes(myOuterPuzzlehashes);
// 创建并推送支出包
final spendBundle = catWalletService.createSpendBundle(
[
Payment(amountToSendA, destinationPuzzlehashA),
Payment(amountToSendB, destinationPuzzlehashB)
],
myCatCoins,
changePuzzlehash,
keychain,
);
await fullNode.pushTransaction(spendBundle);
更多关于Flutter加密工具插件chia_crypto_utils的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter加密工具插件chia_crypto_utils的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用chia_crypto_utils
插件的一个示例。这个插件可能提供了一些用于加密和解密操作的工具。假设你已经将这个插件添加到了你的pubspec.yaml
文件中,并且已经运行了flutter pub get
。
首先,确保你的pubspec.yaml
文件中包含以下依赖项:
dependencies:
flutter:
sdk: flutter
chia_crypto_utils: ^latest_version # 请替换为实际的最新版本号
然后,你可以在你的Flutter项目中使用这个插件。以下是一个简单的示例,展示如何使用chia_crypto_utils
进行加密和解密操作(请注意,具体的API调用和参数可能会根据插件的版本和具体实现有所不同,以下代码仅为示例,你需要参考插件的官方文档进行实际使用)。
import 'package:flutter/material.dart';
import 'package:chia_crypto_utils/chia_crypto_utils.dart'; // 导入插件
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String? encryptedText;
String? decryptedText;
String plainText = "Hello, Flutter!";
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Chia Crypto Utils Demo'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Plain Text: $plainText'),
SizedBox(height: 20),
ElevatedButton(
onPressed: () async {
// 加密操作
String key = 'your-secret-key'; // 替换为你的密钥
String iv = 'your-initialization-vector'; // 替换为你的初始化向量
encryptedText = await ChiaCryptoUtils.encrypt(plainText!, key, iv);
setState(() {});
},
child: Text('Encrypt'),
),
SizedBox(height: 20),
if (encryptedText != null)
Text('Encrypted Text: $encryptedText'),
SizedBox(height: 20),
ElevatedButton(
onPressed: () async {
// 解密操作
if (encryptedText != null && key != null && iv != null) {
decryptedText = await ChiaCryptoUtils.decrypt(encryptedText!, key, iv);
setState(() {});
}
},
child: Text('Decrypt'),
),
SizedBox(height: 20),
if (decryptedText != null)
Text('Decrypted Text: $decryptedText'),
],
),
),
),
);
}
}
// 假设 ChiaCryptoUtils 类提供了 encrypt 和 decrypt 静态方法(实际使用请参照插件文档)
class ChiaCryptoUtils {
static Future<String?> encrypt(String plainText, String key, String iv) async {
// 加密逻辑(实际代码取决于插件的具体实现)
// 这里仅作为示例,返回加密后的文本(实际应为加密后的字节数组转换为字符串或Base64编码)
// return await someEncryptFunction(plainText, key, iv);
return 'Encrypted:${plainText.hashCode}'; // 示例代码,不要在生产环境中使用
}
static Future<String?> decrypt(String encryptedText, String key, String iv) async {
// 解密逻辑(实际代码取决于插件的具体实现)
// 这里仅作为示例,返回解密后的文本(实际应为解密后的字符串)
// return await someDecryptFunction(encryptedText, key, iv);
// 由于我们的示例加密只是返回了哈希码,这里简单返回原始文本(仅作为示例)
if (encryptedText.startsWith('Encrypted:')) {
return plainTextFromHashCode(int.parse(encryptedText.split(':')[1]));
}
return null;
}
// 示例函数,不要在生产环境中使用
static String plainTextFromHashCode(int hashCode) {
// 这是一个完全错误的示例,仅用于说明如何返回字符串
// 在实际情况下,你不能从哈希码恢复原始文本
return 'HashCode:$hashCode';
}
}
// 注意:上面的 ChiaCryptoUtils 类中的 encrypt 和 decrypt 方法只是示例,
// 实际使用时,你需要根据 chia_crypto_utils 插件提供的API来实现。
// 通常,加密和解密方法会处理字节数组,并可能涉及Base64编码/解码。
重要提示:
- 上面的
ChiaCryptoUtils
类中的encrypt
和decrypt
方法是示例代码,并不是chia_crypto_utils
插件的实际实现。你需要参考插件的官方文档来了解如何正确调用加密和解密方法。 - 加密和解密操作通常涉及字节数组和Base64编码/解码,而不是简单的字符串操作。
- 不要在生产环境中使用上面的示例代码,特别是
plainTextFromHashCode
方法,它只是用于说明目的。
在实际项目中,你需要仔细阅读chia_crypto_utils
插件的文档,了解其API和用法,并根据实际需求进行实现。