Flutter插件mkm的使用方法详解
Flutter插件mkm的使用方法详解
本文档介绍了一个通用的账户模块(Account Module),用于去中心化的用户身份认证。
元数据(Meta)
Meta
是由你的私钥生成的,可以用来构建一个新的实体ID,或验证ID/公钥对。
它包含四个字段:
字段 | 描述 |
---|---|
type | 算法版本 |
key | 公钥 |
seed | 实体名称(可选) |
fingerprint | 用于生成地址的签名(可选) |
规则:
- 如果
seed
存在,则fingerprint = privateKey.sign(seed)
; - 如果
seed
不存在,则fingerprint = publicKey.data
。
元数据类型(Meta Type)
MKM
(默认)BTC
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字节且小于32字节;
- 它应由 a-z, A-Z, 0-9, 或字符 ‘_’、’-’、’.’ 组成;
- 它不能包含特殊字符 ‘@’ 和 ‘/’。
// 名称示例
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
更多关于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'),
),
),
),
);
}
}
注意事项
- API文档:在实际使用中,你应该参考
mkm
插件的官方API文档来了解其提供的方法和属性。 - 错误处理:始终包含错误处理逻辑,以便在插件调用失败时能够妥善处理。
- 插件版本:确保你使用的插件版本与你的Flutter SDK版本兼容。
由于 mkm
插件的具体信息未知,以上代码仅作为集成和使用第三方Flutter插件的通用流程示例。在实际项目中,你需要根据插件的实际API进行调整。