Flutter区块链交互插件kadena_dart_sdk的使用

Flutter区块链交互插件kadena_dart_sdk的使用

概述

这是一个用于与Kadena区块链进行交互的Dart SDK。

签名和快速签名用法

dApp用法

import 'package:kadena_dart_sdk/kadena_dart_sdk.dart';

// 创建一个签名API对象
ISigningApi signingApi = SigningApi();

// 创建一个签名或快速签名请求
SignRequest signRequest = SignRequest(
  code: '"Hello"', // 这里应为有效的Pact命令字符串
  data: {},
  sender: 'sender',
  networkId: 'testnet04',
  chainId: '1',
  gasLimit: 1000,
  gasPrice: 1e-5,
  signingPubKey: 'pubKey',
  ttl: 600,
  caps: [
    DappCapp(
      role: 'Gas',
      description: 'Gas Cap',
      cap: Capability(
        name: 'Gas',
        args: [],
      ),
    ),
  ],
);

QuicksignRequest quicksignRequest = QuicksignRequest(
  commandSigDatas: [
    CommandSigData(
      cmd: 'Hello, World!', // 这里应为有效的Pact命令字符串
      sigs: [
        QuicksignSigner(
          pubKey: 'pubKey',
        ),
      ],
    ),
  ],
);

// 可以通过将其转换为JSON格式来传输该对象
final signRequestJson = signRequest.toJson();
final quicksignRequestJson = quicksignRequest.toJson();

钱包用法

import 'package:kadena_dart_sdk/kadena_dart_sdk.dart';

// 创建一个签名API对象
ISigningApi signingApi = SigningApi();

// 创建公钥/私钥对
final KadenaSignKeyPair kp = KadenaSignKeyPair(
  publicKey: 'priv_key',
  privateKey: 'pub_key',
);

// 获取从dApp接收到的签名/快速签名请求对象
final Map<String, dynamic> quicksignRequestJson = {
  "commandSigDatas": [
    {
      "cmd": "Hello, World!", // 这里应为有效的Pact命令字符串
      "sigs": [
        {
          "pubKey":
              '8d48094ca84b475ece568c4b0d8aacfb1de3278b6bd16b33a60c068b86a2ba51',
        }
      ]
    }
  ]
};
final Map<String, dynamic> signRequestJson = {
  "code": '"Hello"', // 这里应为有效的Pact命令字符串
  "data": {},
  "sender": "sender",
  "networkId": "testnet04",
  "chainId": "1",
  "gasLimit": 1000,
  "gasPrice": 1e-5,
  "signingPubKey": '8d48094ca84b475ece568c4b0d8aacfb1de3278b6bd16b33a60c068b86a2ba51',
  "ttl": 600,
  "caps": [
    {
      "role": "Gas",
      "description": "Gas Cap",
      "cap": {
        "name": "Gas",
        "args": []
      }
    }
  ]
};

/// 签名请求流程 ///
// 1. 解析请求
final SignRequest signRequest = signingApi.parseSignRequest(
  signRequestJson,
);

// 2. 使用请求构造一个PactCommandPayload
final PactCommandPayload pactCommandPayload = signingApi.constructPactCommandPayload(
  request: signRequest,
);

// 3. 以某种方式(弹窗、底部面板等)获取用户的签名批准
final bool approval = true;

// 4. 签名交易
SignResult signResult;
if (approval) {
  signResult = signingApi.sign(
    request: signRequest,
    keyPairs: kp,
  );
} else {
  signResult = SignResult(
    error: SignRequestError(
      msg: 'User declined to sign',
    ),
  );
}

// 5. 将签名结果返回给dApp以JSON格式
final Map<String, dynamic> signResultJson = signResult.toJson();

/// 快速签名流程 ///
// 1. 解析请求
final QuicksignRequest quicksignRequest = signingApi.parseQuicksignRequest(
  quicksignRequestJson,
);

// 2. 存储快速签名响应,并循环处理每个CommandSigData
final List<QuicksignResponse> quicksignResponseList = [];
for (final CommandSigData commandSigData in quicksignRequest.commandSigDatas) {
  // 3. 以某种方式(弹窗、底部面板等)获取用户的签名批准
  var approval = true;

  // 4. 根据批准情况,签名交易或添加noSig快速签名结果
  if (approval) {
    final QuicksignResult quicksignResult = signingApi.quicksignSingleCommand(
      commandSigData: commandSigData,
      keyPairs: kp,
    );
    quicksignResponseList.add(quicksignResult);
  } else {
    quicksignResponseList.add(
      QuicksignResponse(
        commandSigData: commandSigData,
        outcome: QuicksignOutcome(
          result: QuicksignOutcome.noSig,
        ),
      ),
    );
  }
}

// 5. 返回快速签名结果给dApp以JSON格式
final QuicksignResult quicksignResult = QuicksignResult(
  responses: quicksignResponseList,
).toJson();

实现

ISigningApi 是一个接口,这样可以轻松地对其进行模拟,并且可以创建未来的版本,这些版本可以轻松替换当前实现。

此库旨在使dApp构建请求和钱包签名变得简单。

测试

要运行测试:

flutter test

测试验证了描述在KIP中的功能。然而,KIP尚未合并,未最终确定,且可能发生变化。

待办事项

  • 构建签名API的签名部分
  • 与示例dApp一起构建集成测试以证明功能

常见命令

重建生成的代码:

flutter pub run build_runner build --delete-conflicting-outputs

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中集成并使用kadena_dart_sdk与Kadena区块链进行交互的示例代码。这个示例将展示如何初始化SDK、连接到Kadena网络、查询区块链信息以及发送交易。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  kadena_dart_sdk: ^最新版本号 # 替换为实际的最新版本号

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

2. 初始化SDK

在你的Flutter项目的Dart文件中(例如main.dart),你需要初始化kadena_dart_sdk

import 'package:flutter/material.dart';
import 'package:kadena_dart_sdk/kadena_dart_sdk.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Kadena Blockchain Interaction'),
        ),
        body: KadenaInteraction(),
      ),
    );
  }
}

class KadenaInteraction extends StatefulWidget {
  @override
  _KadenaInteractionState createState() => _KadenaInteractionState();
}

class _KadenaInteractionState extends State<KadenaInteraction> {
  late KadenaClient kadenaClient;

  @override
  void initState() {
    super.initState();
    // 初始化KadenaClient
    kadenaClient = KadenaClient(
      network: KadenaNetwork.MAINNET, // 或者 KadenaNetwork.TESTNET
      privateKey: '你的私钥', // 请替换为你的私钥
    );
  }

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        children: [
          ElevatedButton(
            onPressed: () async {
              // 查询区块信息
              try {
                BlockInfo blockInfo = await kadenaClient.getBlockInfo(1);
                print('Block Info: ${blockInfo.toJson()}');
              } catch (e) {
                print('Error fetching block info: $e');
              }
            },
            child: Text('Get Block Info'),
          ),
          ElevatedButton(
            onPressed: () async {
              // 发送交易(示例:转账)
              try {
                TransactionReceipt receipt = await kadenaClient.sendTransaction(
                  toAddress: '接收者地址', // 请替换为接收者的地址
                  amount: '10000000000', // PACT的微小单位,例如1 PACT = 10^10 单位
                  memo: '测试转账',
                );
                print('Transaction Receipt: ${receipt.toJson()}');
              } catch (e) {
                print('Error sending transaction: $e');
              }
            },
            child: Text('Send Transaction'),
          ),
        ],
      ),
    );
  }
}

3. 注意事项

  1. 私钥安全:确保私钥的安全存储,不要在代码中硬编码私钥。
  2. 错误处理:实际开发中应添加更多的错误处理逻辑。
  3. 网络配置:根据实际需求选择主网或测试网。
  4. 依赖版本:确保使用kadena_dart_sdk的最新版本,并查看其文档以获取最新的API信息。

4. 运行项目

使用flutter run命令运行你的Flutter项目,然后在应用界面中点击按钮进行区块信息查询和交易发送。

这个示例提供了一个基本的框架,你可以根据实际需求进行扩展和修改。

回到顶部