Flutter区块链操作插件flutterchain的使用

Flutter区块链操作插件flutterchain的使用

Flutter Chain

Flutterchain 是一个库,它为开发者提供了与不同区块链通信的简单API,并调用智能合约。通过使用 Flutterchain,开发者可以轻松地将流行的加密货币集成到他们的Web 3.0项目中。借助 Flutterchain,开发者可以构建强大的去中心化应用,而无需深入了解底层区块链技术。通过 Flutterchain,开发者可以轻松地与智能合约交互,发送转账等。这是一款易于使用且灵活的解决方案,适用于希望构建基于区块链的应用程序的开发者。

前提条件

在开始使用此库之前,请确保已安装以下依赖项或前提条件:

  • Node JS
  • 已安装 webpack(JavaScript包)
  • 已安装 watch(JavaScript包)
  • Flutter
  • 已安装 Android Studio 和 Android SDK(用于Android开发)
  • 已安装 Xcode(用于IOS和Mac OS开发)

构建

以下是构建库源码的步骤:

  1. 克隆此仓库:git clone https://github.com/vlmoon99/flutterchain
  2. 导航到项目根目录:cd flutterchain
  3. 运行 bash dev_build.shbash prod_build.sh 以构建 flutterchain 库

如何使用

以下是使用 Flutterchain 的步骤:

  1. 在Web项目的头部添加以下代码:

    <script type="application/javascript" 
      src="/assets/packages/flutter_inappwebview_web/assets/web/web_support.js" 
      defer
    ></script>
    
    <script
        type="application/javascript"
        src="/assets/packages/flutterchain/assets/crypto-lib/dist/bundle.js"
        defer
    ></script>
    
  2. 设置 Android: minSdkVersion >= 19,compileSdk >= 34,AGP版本 >= 7.3.0 在 android/app/build.gradle 文件中,并在 manifest 中添加 android:usesCleartextTraffic=“true”

  3. 向 Android manifest 添加网络权限:

    <uses-permission android:name="android.permission.INTERNET"/>
    
  4. 注入所有依赖项,例如使用 Modular 或 Get 它,或者使用提供的类中的默认构造函数(不推荐)

  5. 在 main 函数中初始化 flutterchain 库,在 WidgetsFlutterBinding.ensureInitialized() 之后调用:

    WidgetsFlutterBinding.ensureInitialized();
    await initFlutterChainLib();
    

要执行所有区块链操作,您需要创建私钥和公钥。为此,您有两个选项:

  1. 使用生成助记词创建钱包(使用 Trust Wallet Core):

    Wallet wallet = await cryptoLibrary.createWalletWithGeneratedMnemonic(walletName: walletName);
    

    如果您想从其他地方导入助记词,可以使用以下代码:

    Wallet wallet = await cryptoLibrary.createWalletByImportedMnemonic(mnemonic: mnemonic!, walletName: walletName);
    
  2. 如果您仅使用服务来签名和发送交易,您可以使用以下方法生成区块链数据(在此示例中,我将使用 Near 区块链):

    final nearBlockChainService  = NearBlockChainService.defaultInstance();
    NearBlockChainData blockchainData = nearBlockChainService.getBlockChainDataFromMnemonic(your_mnemonic,your_passphrase);
    

一旦您获得了包含私钥和公钥的区块链数据,您就可以轻松地与区块链进行通信。

您可以使用我的库来签署交易。首先,您可以只用于签署交易。要签署任何交易,您需要使用 BlockchainServices。目前,我只支持 Near 区块链。

final nearBlockChainService  = NearBlockChainService.defaultInstance();

// 1. 获取来自 Near 区块链的 nonce 和 blockhash 信息(或使用您自己的实现方法)。
final transactionInfo = await nearBlockChainService.getNonceAndBlockHashInfo(
  accountId: fromAddress,
  publicKey: publicKey,
);

// 2. 获取 gas 信息。
final gas = BlockchainGas.gas[BlockChains.near];

// 3. 定义动作。所有可能的动作可以在我的资产 /crypto-lib(我的库内的 JavaScript 项目)NearBlockchain 类中找到。
final actions = [
  {
    "type": "transfer",
    "data": {"amount": NearFormatter.nearToYoctoNear(transferAmount)}
  }
];

// 4. 签名动作
final signedAction = await nearBlockChainService.signNearActions(
  fromAddress: fromAddress,
  toAddress: toAdress,
  transferAmount: NearFormatter.nearToYoctoNear(transferAmount),
  privateKey: privateKey,
  gas: gas,
  nonce: transactionInfo.nonce,
  blockHash: transactionInfo.blockHash,
  actions: actions,
);

log("Result of signed the tx ${signedAction}");

// 5. 将交易发送到 Near 区块链并获取响应(或使用您自己的 Near RPC 网络客户端)。
final res = await nearBlockChainService.nearRpcClient.sendSyncTx([signedAction]);
log("Result of transaction executing ->  ${res.toJson().toString()}");

另外,您可以一起使用整个库。您可以在库中的 flutterchain_arch.drawio 文件中查看架构。

(重要)要一起使用我的库,请确保您熟悉依赖注入(DI)原则。首先,您可以在示例文件夹中的 modules 文件夹(example/lib/modules)内看到一个示例。您可以看到我在 .module.dart 文件中如何初始化依赖项。之后,您可以进入组件和页面(example/lib/modules/home/components/chains/near)并查看我如何使用我的库。

简而言之,我有一个包含 BlockchainServices 和一些 Repository(目前仅支持 Wallet 模型)的库。我还拥有一个当前钱包的流。FlutterChainLibrary 类提供了使用 WEB 3.0 的高级API。您可以发送原生代币转账,调用智能合约等。

例如:

final response = cryptoLibrary.sendTransferNativeCoin(
  walletId: walletId,
  typeOfBlockchain: typeOfBlockchain,
  toAddress: toAddress,
  currentDerivationPath: currentDerivationPath,
  transferAmount: NearFormatter.nearToYoctoNear(transferAmount),
);

log(response.toJson().toString());

// walletId 是 walletsStream 中的钱包ID。您可以从中获取钱包,并提供钱包的区块链类型和派生路径(https://github.com/satoshilabs/slips/blob/master/slip-0044.md ,https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki)。

如果您需要某些特定功能,可以从 FlutterChainService 获取:

final nearBlockChainService = cryptoLibrary.blockchainService
  .blockchainServices[BlockChains.near] as NearBlockChainService?;

并使用 NearBlockChainService 中的函数。

更多关于Flutter区块链操作插件flutterchain的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter区块链操作插件flutterchain的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用flutterchain插件进行区块链操作的简单示例。请注意,flutterchain可能是一个虚构的插件名称,因为在实际开发中,Flutter社区可能没有一个广泛认可的、名为flutterchain的区块链操作插件。不过,我会根据常见的区块链操作需求,提供一个基于Flutter和Dart语言的示例,假设你有一个类似的插件可以使用。

首先,你需要在你的pubspec.yaml文件中添加对flutterchain(假设存在)的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutterchain: ^x.y.z  # 替换为实际的版本号

然后运行flutter pub get来安装依赖。

接下来,我将展示一个如何在Flutter中使用这个插件进行简单区块链操作的示例。这个示例将包括初始化区块链客户端、查询区块链信息和发送交易。

import 'package:flutter/material.dart';
import 'package:flutterchain/flutterchain.dart';  // 假设这是你的区块链插件

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Blockchain Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: BlockchainScreen(),
    );
  }
}

class BlockchainScreen extends StatefulWidget {
  @override
  _BlockchainScreenState createState() => _BlockchainScreenState();
}

class _BlockchainScreenState extends State<BlockchainScreen> {
  late BlockchainClient _client;
  String _blockchainInfo = '';
  String _transactionStatus = '';

  @override
  void initState() {
    super.initState();
    // 初始化区块链客户端
    _client = BlockchainClient('YOUR_API_KEY');  // 替换为你的API密钥或连接参数
  }

  Future<void> fetchBlockchainInfo() async {
    try {
      var info = await _client.getBlockchainInfo();
      setState(() {
        _blockchainInfo = info.toString();
      });
    } catch (e) {
      setState(() {
        _blockchainInfo = 'Error fetching blockchain info: $e';
      });
    }
  }

  Future<void> sendTransaction() async {
    try {
      var transaction = Transaction(
        fromAddress: 'SENDER_ADDRESS',
        toAddress: 'RECEIVER_ADDRESS',
        amount: 1.0,  // 假设是某种数字货币的金额
        currency: 'CURRENCY_CODE',
      );
      var result = await _client.sendTransaction(transaction);
      setState(() {
        _transactionStatus = result.status.toString();
      });
    } catch (e) {
      setState(() {
        _transactionStatus = 'Error sending transaction: $e';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Blockchain Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          children: <Widget>[
            Button(
              onPressed: fetchBlockchainInfo,
              child: Text('Fetch Blockchain Info'),
            ),
            Text(_blockchainInfo),
            SizedBox(height: 20),
            Button(
              onPressed: sendTransaction,
              child: Text('Send Transaction'),
            ),
            Text(_transactionStatus),
          ],
        ),
      ),
    );
  }
}

// 假设的区块链客户端类
class BlockchainClient {
  String apiKey;

  BlockchainClient(this.apiKey);

  // 假设的获取区块链信息方法
  Future<Map<String, dynamic>> getBlockchainInfo() async {
    // 这里应该是调用API并返回信息的代码
    // 为了示例,我们直接返回一个模拟的Map
    return {
      'blocks': 1000,
      'difficulty': 10,
      'network': 'testnet',
    };
  }

  // 假设的发送交易方法
  Future<TransactionResult> sendTransaction(Transaction transaction) async {
    // 这里应该是调用API并发送交易的代码
    // 为了示例,我们直接返回一个模拟的TransactionResult
    return TransactionResult(status: 'success');
  }
}

// 假设的交易类
class Transaction {
  String fromAddress;
  String toAddress;
  double amount;
  String currency;

  Transaction({
    required this.fromAddress,
    required this.toAddress,
    required this.amount,
    required this.currency,
  });
}

// 假设的交易结果类
class TransactionResult {
  String status;

  TransactionResult({required this.status});
}

// 简单的按钮组件,用于演示
class Button extends StatelessWidget {
  final VoidCallback onPressed;
  final Widget child;

  Button({required this.onPressed, required this.child});

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: onPressed,
      child: child,
    );
  }
}

请注意,上述代码是一个高度简化和假设的示例,用于演示如何在Flutter应用中集成和使用一个区块链插件。在实际应用中,你需要根据具体的区块链插件API文档来实现相应的功能。此外,处理敏感信息(如API密钥和私钥)时,请务必采取适当的安全措施。

回到顶部