Flutter插件mkm的使用方法详解

Flutter插件mkm的使用方法详解

本文档介绍了一个通用的账户模块(Account Module),用于去中心化的用户身份认证。

元数据(Meta)

Meta 是由你的私钥生成的,可以用来构建一个新的实体ID,或验证ID/公钥对。

它包含四个字段:

字段 描述
type 算法版本
key 公钥
seed 实体名称(可选)
fingerprint 用于生成地址的签名(可选)

规则:

  1. 如果 seed 存在,则 fingerprint = privateKey.sign(seed)
  2. 如果 seed 不存在,则 fingerprint = publicKey.data

元数据类型(Meta Type)

  1. MKM (默认)
  2. BTC
  3. ETH

元数据示例(Meta Example)

/* Meta(JSON) for hulk@4YeVEN3aUnvC1DNUufCq1bs9zoBSJTzVEj */
{
    "type"        : 0x01,
    "key"         : {
        "algorithm" : "RSA",
        "data"      : "-----BEGIN PUBLIC KEY-----\nMIGJAoGBALB+vbUK48UU9rjlgnohQowME+3JtTb2hLPqtatVOW364/EKFq0/PSdnZVE9V2Zq+pbX7dj3nCS4pWnYf40ELH8wuDm0Tc4jQ70v4LgAcdy3JGTnWUGiCsY+0Z8kNzRkm3FJid592FL7ryzfvIzB9bjg8U2JqlyCVAyUYEnKv4lDAgMBAAE=\n-----END PUBLIC KEY-----",
        "mode"      : "ECB",
        "padding"   : "PKCS1",
        "digest"    : "SHA256"
    },
    "seed"        : "hulk",
    "fingerprint" : "jIPGWpWSbR/DQH6ol3t9DSFkYroVHQDvtbJErmFztMUP2DgRrRSNWuoKY5Y26qL38wfXJQXjYiWqNWKQmQe/gK8M8NkU7lRwm+2nh9wSBYV6Q4WXsCboKbnM0+HVn9Vdfp21hMMGrxTX1pBPRbi0567ZjNQC8ffdW2WvQSoec2I="
}

ID

ID 用于标识一个实体(用户/群组)。它包含三个字段:

字段 描述
type 实体类型
name meta.seed 相同(可选)
address 唯一识别符
terminal 登录点(可选)

ID格式为 <name>@<address>[/<terminal>]

ID 名称(ID Name)

Name 字段是一个用户名,或者只是一个随机字符串作为群组名称:

  1. 名称长度必须大于1字节且小于32字节;
  2. 它应由 a-z, A-Z, 0-9, 或字符 ‘_’、’-’、’.’ 组成;
  3. 它不能包含特殊字符 ‘@’ 和 ‘/’。
// 名称示例
user_name  = "Albert.Moky";
group_name = "Group-9527";

它等同于 meta.seed

ID 地址(ID Address)

Address 字段是通过 Meta 和一个网络ID创建的:

import 'dart:typed_data';

import 'package:mkm/type.dart';
import 'package:mkm/digest.dart';
import 'package:mkm/format.dart';
import 'package:mkm/mkm.dart';

///  Address like BitCoin
///  ~~~~~~~~~~~~~~~~~~~~
///
///      data format: "network+digest+code"
///          network    --  1 byte
///          digest     -- 20 bytes
///          check code --  4 bytes
///
///      algorithm:
///          fingerprint = PK.data
///          digest      = ripemd160(sha256(fingerprint));
///          code        = sha256(sha256(network + digest)).prefix(4);
///          address     = base58_encode(network + digest + code);
///

class BTCAddress extends ConstantString implements Address {
  BTCAddress(super.string, int network) : _type = network;

  final int _type;

  [@override](/user/override)
  int get network => _type;

  ///  Generate BTC address with fingerprint and network ID
  ///
  /// [@param](/user/param) fingerprint - meta.fingerprint or key.data
  /// [@param](/user/param) network - address type
  /// [@return](/user/return) Address object
  static BTCAddress generate(Uint8List fingerprint, int network) {
    // 1. digest = ripemd160(sha256(fingerprint))
    Uint8List digest = RIPEMD160.digest(SHA256.digest(fingerprint));
    // 2. head = network + digest
    BytesBuilder bb = BytesBuilder(copy: false);
    bb.addByte(network);
    bb.add(digest);
    Uint8List head = bb.toBytes();
    // 3. cc = sha256(sha256(head)).prefix(4)
    Uint8List cc = _checkCode(head);
    // 4. data = base58_encode(head + cc)
    bb = BytesBuilder(copy: false);
    bb.add(head);
    bb.add(cc);
    return BTCAddress(Base58.encode(bb.toBytes()), network);
  }

  ///  Parse a string for BTC address
  ///
  /// [@param](/user/param) address - address string
  /// [@return](/user/return) null on error
  static BTCAddress? parse(String address) {
    if (address.length < 26 || address.length > 35) {
      return null;
    }
    // decode
    Uint8List? data = Base58.decode(address);
    if (data == null || data.length != 25) {
      return null;
    }
    // check code
    Uint8List prefix = data.sublist(0, 21);
    Uint8List suffix = data.sublist(21, 25);
    Uint8List cc = _checkCode(prefix);
    if (Arrays.equals(cc, suffix)) {
      return BTCAddress(address, data[0]);
    } else {
      return null;
    }
  }
}

Uint8List _checkCode(Uint8List data) {
  return SHA256.digest(SHA256.digest(data)).sublist(0, 4);
}

更多关于Flutter插件mkm的使用方法详解的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter插件mkm的使用方法详解的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


针对你提到的Flutter插件 mkm(由于介绍为undefined,以下基于插件名称推测),虽然我们不能确切知道其具体功能,但我可以展示一个如何在Flutter项目中集成和使用一个假设的第三方插件的通用流程。请注意,以下代码示例是假设性的,因为 mkm 插件的具体实现和API未知。

步骤 1: 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 mkm 插件的依赖(假设它存在于pub.dev上,或者是一个本地路径依赖)。由于我们不知道确切的包名,这里用 mkm_plugin 作为示例:

dependencies:
  flutter:
    sdk: flutter
  mkm_plugin: ^x.y.z  # 替换为实际版本号或路径依赖

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

步骤 2: 导入插件

在你的 Dart 文件中导入该插件:

import 'package:mkm_plugin/mkm_plugin.dart';

步骤 3: 使用插件功能

由于我们不知道 mkm 插件的具体功能,以下是一个假设性的使用示例。假设该插件有一个方法 performAction,它接受一些参数并返回一个结果。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('MKM Plugin Demo'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 假设 performAction 是插件的一个方法
              try {
                var result = await MkmPlugin.performAction(
                  param1: 'value1',
                  param2: 123,
                );
                
                // 处理结果
                ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(content: Text('Result: $result')),
                );
              } catch (e) {
                // 处理异常
                ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(content: Text('Error: ${e.message}')),
                );
              }
            },
            child: Text('Perform Action'),
          ),
        ),
      ),
    );
  }
}

注意事项

  1. API文档:在实际使用中,你应该参考 mkm 插件的官方API文档来了解其提供的方法和属性。
  2. 错误处理:始终包含错误处理逻辑,以便在插件调用失败时能够妥善处理。
  3. 插件版本:确保你使用的插件版本与你的Flutter SDK版本兼容。

由于 mkm 插件的具体信息未知,以上代码仅作为集成和使用第三方Flutter插件的通用流程示例。在实际项目中,你需要根据插件的实际API进行调整。

回到顶部