Flutter密钥管理插件polkadart_keyring的使用

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

Flutter密钥管理插件polkadart_keyring的使用

简介

Polkadart Keyring 是一个用于管理基于 sr25519 的密钥对的工具。它提供了一个方便的接口来管理 sr25519 密钥对,允许你从 BIP39 助记词创建密钥对、将它们添加到密钥环中、通过地址或公钥检索密钥对,并执行各种操作。

安装

要在你的 Dart 项目中使用 Polkadart Keyring,请在 pubspec.yaml 文件中添加以下依赖:

dependencies:
  polkadart_keyring: ^0.3.2

使用示例

1. 从助记词创建密钥对

你可以从 BIP39 助记词创建一个新的 KeyPair 并将其添加到密钥环中。以下是一个示例:

import 'package:polkadart_keyring/polkadart_keyring.dart';

void main() async {
  final keyring = Keyring();
  final mnemonic = 'moral movie very draw assault whisper awful rebuild speed purity repeat card';
  
  // 从助记词创建密钥对
  final keyPair = await keyring.fromMnemonic(mnemonic);
  print('Address: ${keyPair.address}');
}
2. 添加和检索密钥对

你可以通过种子(seed)创建密钥对并将其添加到密钥环中,然后通过地址或公钥检索这些密钥对。以下是一个示例:

import 'package:polkadart_keyring/polkadart_keyring.dart';
import 'dart:typed_data';
import 'package:convert/convert.dart';

void main() {
  final keyring = Keyring();

  // 创建两个密钥对
  final keyPair1 = KeyPair.sr25519.fromSeed(
      Uint8List.fromList('12345678901234567890123456789012'.codeUnits));
  final keyPair2 = KeyPair.sr25519.fromSeed(
      Uint8List.fromList(hex.decode('9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60')));

  // 将密钥对添加到密钥环
  keyring.add(keyPair1);
  keyring.add(keyPair2);

  // 获取所有地址
  final addresses = keyring.addresses;
  print('Addresses: $addresses');
}
3. 通过公钥检索密钥对

你可以通过公钥检索密钥对。以下是一个示例:

import 'package:polkadart_keyring/polkadart_keyring.dart';
import 'dart:typed_data';

void main() {
  final keyring = Keyring();

  // 创建一个密钥对
  final keyPair1 = KeyPair.sr25519.fromSeed(
      Uint8List.fromList('12345678901234567890123456789012'.codeUnits));

  // 获取公钥
  final publicKey1 = keyPair1.publicKey.bytes;

  // 将密钥对添加到密钥环
  keyring.add(keyPair1);

  // 通过公钥检索密钥对
  final retrievedKeyPair = keyring.getByPublicKey(publicKey1);
  if (retrievedKeyPair != null) {
    print('Retrieved KeyPair Address: ${retrievedKeyPair.address}');
  } else {
    print('KeyPair not found');
  }

  // 尝试检索不存在的密钥对
  final nonExistentKeyPair = keyring.getByPublicKey([1, 2, 3]);
  if (nonExistentKeyPair == null) {
    print('Non-existent KeyPair not found');
  }
}
4. 删除密钥对

你可以从密钥环中删除密钥对。以下是一个示例:

import 'package:polkadart_keyring/polkadart_keyring.dart';
import 'dart:typed_data';

void main() {
  final keyring = Keyring();

  // 创建两个密钥对
  final keyPair1 = KeyPair.sr25519.fromSeed(
      Uint8List.fromList('12345678901234567890123456789012'.codeUnits));
  final keyPair2 = KeyPair.sr25519.fromSeed(
      Uint8List.fromList(hex.decode('9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60')));

  // 将密钥对添加到密钥环
  keyring.add(keyPair1);
  keyring.add(keyPair2);

  // 删除一个密钥对
  keyring.remove(keyPair1.address);

  // 尝试检索已删除的密钥对
  final nonExistentKeyPair = keyring.getByAddress(keyPair1.address);
  if (nonExistentKeyPair == null) {
    print('KeyPair removed successfully');
  }
}
5. 编码和解码地址

你可以编码和解码地址。以下是一个示例:

import 'package:polkadart_keyring/polkadart_keyring.dart';
import 'dart:typed_data';

void main() {
  final keyring = Keyring();

  // 创建一个密钥对
  final keyPair1 = KeyPair.sr25519.fromSeed(
      Uint8List.fromList('12345678901234567890123456789012'.codeUnits));

  // 获取地址和公钥
  final address = keyPair1.address;
  final publicKey = keyPair1.publicKey.bytes;

  // 编码公钥为地址
  final encodedAddress = keyring.encodeAddress(publicKey);
  print('Encoded Address: $encodedAddress');

  // 解码地址为公钥
  final decodedPublicKey = keyring.decodeAddress(address);
  print('Decoded Public Key: $decodedPublicKey');

  // 验证编码和解码是否正确
  final isAddressCorrect = encodedAddress == address;
  final isPublicKeyCorrect = decodedPublicKey == publicKey;

  print('Is Address Correct: $isAddressCorrect');
  print('Is Public Key Correct: $isPublicKeyCorrect');
}
6. 设置和获取 SS58 地址格式

你可以设置和获取密钥环使用的 SS58 地址格式。以下是一个示例:

import 'package:polkadart_keyring/polkadart_keyring.dart';

void main() {
  final keyring = Keyring();

  // 设置 SS58 地址格式
  keyring.ss58Format = 42;

  // 获取 SS58 地址格式
  print('SS58 Format: ${keyring.ss58Format}');
}
7. 获取所有公钥

你可以获取密钥环中的所有公钥。以下是一个示例:

import 'package:polkadart_keyring/polkadart_keyring.dart';
import 'dart:typed_data';
import 'package:convert/convert.dart';

void main() {
  final keyring = Keyring();

  // 创建两个密钥对
  final keyPair1 = KeyPair.sr25519.fromSeed(
      Uint8List.fromList('12345678901234567890123456789012'.codeUnits));
  final keyPair2 = KeyPair.sr25519.fromSeed(
      Uint8List.fromList(hex.decode('9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60')));

  // 将密钥对添加到密钥环
  keyring.add(keyPair1);
  keyring.add(keyPair2);

  // 获取所有公钥
  final publicKeys = keyring.publicKeys;
  print('Public Keys: $publicKeys');
}
8. 获取所有地址

你可以获取密钥环中的所有地址。以下是一个示例:

import 'package:polkadart_keyring/polkadart_keyring.dart';
import 'dart:typed_data';
import 'package:convert/convert.dart';

void main() {
  final keyring = Keyring();

  // 创建两个密钥对
  final keyPair1 = KeyPair.sr25519.fromSeed(
      Uint8List.fromList('12345678901234567890123456789012'.codeUnits));
  final keyPair2 = KeyPair.sr25519.fromSeed(
      Uint8List.fromList(hex.decode('9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60')));

  // 将密钥对添加到密钥环
  keyring.add(keyPair1);
  keyring.add(keyPair2);

  // 获取所有地址
  final addresses = keyring.addresses;
  print('Addresses: $addresses');
}
9. 获取所有密钥对

你可以获取密钥环中的所有密钥对。以下是一个示例:

import 'package:polkadart_keyring/polkadart_keyring.dart';
import 'dart:typed_data';
import 'package:convert/convert.dart';

void main() {
  final keyring = Keyring();

  // 创建两个密钥对
  final keyPair1 = KeyPair.sr25519.fromSeed(
      Uint8List.fromList('12345678901234567890123456789012'.codeUnits));
  final keyPair2 = KeyPair.sr25519.fromSeed(
      Uint8List.fromList(hex.decode('9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60')));

  // 将密钥对添加到密钥环
  keyring.add(keyPair1);
  keyring.add(keyPair2);

  // 获取所有密钥对
  final allKeyPairs = keyring.all;
  for (final kp in allKeyPairs) {
    print('Address: ${kp.address}');
  }
}
10. 删除所有密钥对

你可以删除密钥环中的所有密钥对。以下是一个示例:

import 'package:polkadart_keyring/polkadart_keyring.dart';
import 'dart:typed_data';
import 'package:convert/convert.dart';

void main() {
  final keyring = Keyring();

  // 创建两个密钥对
  final keyPair1 = KeyPair.sr25519.fromSeed(
      Uint8List.fromList('12345678901234567890123456789012'.codeUnits));
  final keyPair2 = KeyPair.sr25519.fromSeed(
      Uint8List.fromList(hex.decode('9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60')));

  // 将密钥对添加到密钥环
  keyring.add(keyPair1);
  keyring.add(keyPair2);

  // 删除所有密钥对
  keyring.clear();

  // 检查密钥环是否为空
  final isKeyringEmpty = keyring.all.isEmpty;
  print('Is Keyring Empty: $isKeyringEmpty');
}
11. 签名和验证

你可以签名和验证消息。以下是一个示例:

import 'package:polkadart_keyring/polkadart_keyring.dart';
import 'dart:typed_data';
import 'package:convert/convert.dart';

void main() {
  final keyring = Keyring();

  // 创建一个密钥对
  final keyPair2 = KeyPair.sr25519.fromSeed(
      Uint8List.fromList(hex.decode('9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60')));

  // 将密钥对添加到密钥环
  keyring.add(keyPair2);

  // 通过公钥检索密钥对
  final kp = keyring.getByPublicKey(keyPair2.publicKey.bytes);

  // 签名消息
  final message = 'Hello, Polkadart!';
  final signature = kp.sign(message.codeUnits);

  // 验证签名
  final isVerified = kp.verify(message.codeUnits, signature);
  print('Is Verified: $isVerified');
}

更多关于Flutter密钥管理插件polkadart_keyring的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter密钥管理插件polkadart_keyring的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用polkadart_keyring插件进行密钥管理的示例代码。这个插件主要用于与Polkadot及其相关链进行交互,管理密钥对。

首先,确保你已经在pubspec.yaml文件中添加了polkadart_keyring依赖:

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

然后运行flutter pub get来获取依赖。

接下来,你可以在你的Flutter项目中导入并使用polkadart_keyring。以下是一个简单的示例,展示如何生成一个密钥对并获取其公钥:

import 'package:flutter/material.dart';
import 'package:polkadart_keyring/keyring.dart';
import 'package:polkadart_keyring/utils/ss58.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Polkadart Keyring Example'),
        ),
        body: Center(
          child: KeyringExample(),
        ),
      ),
    );
  }
}

class KeyringExample extends StatefulWidget {
  @override
  _KeyringExampleState createState() => _KeyringExampleState();
}

class _KeyringExampleState extends State<KeyringExample> {
  String publicKey = '';

  @override
  void initState() {
    super.initState();
    _generateKeyPair();
  }

  Future<void> _generateKeyPair() async {
    // 创建一个Keyring实例,这里我们使用“ed25519”作为签名算法
    final keyring = Keyring.instance;
    final pair = keyring.pairFromUri('myAccount', sr25519: Sr25519());

    // 获取公钥并转换为SS58格式
    final ss58Address = ss58AddressFromPublicKey(pair.publicKey, networkType: NetworkType.polkadot);

    // 更新UI
    setState(() {
      publicKey = ss58Address;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('Generated Public Key (SS58):'),
        Text(publicKey),
      ],
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 创建一个Flutter应用。
  2. KeyringExample组件的initState方法中调用_generateKeyPair方法来生成密钥对。
  3. 使用polkadart_keyringKeyring.instance.pairFromUri方法生成一个密钥对。注意这里我们指定了使用Sr25519作为签名算法。
  4. 使用ss58AddressFromPublicKey方法将公钥转换为SS58格式,这里指定了Polkadot网络类型。
  5. 更新UI以显示生成的公钥。

请注意,pairFromUri方法通常用于从URI生成密钥对,这里的URI ('myAccount') 只是一个标识符,实际使用中你可能会有不同的方式来生成或管理密钥对。

此外,这个示例代码没有处理错误或异常情况,在实际应用中,你应该添加适当的错误处理来确保应用的健壮性。

希望这个示例能帮助你理解如何在Flutter项目中使用polkadart_keyring进行密钥管理。如果你有任何其他问题,欢迎继续提问!

回到顶部