Flutter加密工具插件chia_crypto_utils的使用

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

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

1 回复

更多关于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编码/解码。

重要提示

  1. 上面的ChiaCryptoUtils类中的encryptdecrypt方法是示例代码,并不是chia_crypto_utils插件的实际实现。你需要参考插件的官方文档来了解如何正确调用加密和解密方法。
  2. 加密和解密操作通常涉及字节数组和Base64编码/解码,而不是简单的字符串操作。
  3. 不要在生产环境中使用上面的示例代码,特别是plainTextFromHashCode方法,它只是用于说明目的。

在实际项目中,你需要仔细阅读chia_crypto_utils插件的文档,了解其API和用法,并根据实际需求进行实现。

回到顶部