Flutter插件dim_plugins的介绍与使用

Flutter插件dim_plugins的介绍与使用

DIM Plugins (Dart)

License PRs Welcome Platform Issues Repo Size Tags Version Watchers Forks Stars Followers

插件

数据编码

  • Base-58
  • Base-64
  • Hex
  • UTF-8
  • JSON
  • PNF (可移植网络文件)
  • TED (传输编码数据)

摘要算法

  • MD-5
  • SHA-1
  • SHA-256
  • Keccak-256
  • RipeMD-160

加密

  • AES-256 (AES/CBC/PKCS7Padding)
  • RSA-1024 (RSA/ECB/PKCS1Padding), (SHA256withRSA)
  • ECC (Secp256k1)

地址

  • BTC
  • ETH

元数据

  • MKM (默认)
  • BTC
  • ETH

文档

  • Visa (用户)
  • Profile
  • Bulletin (群组)

扩展

地址

import 'package:dimp/dimp.dart';
import 'package:dim_plugins/mkm.dart';

class CompatibleAddressFactory extends BaseAddressFactory {

  @override
  Address? parse(String address) {
    int len = address.length;
    if (len == 0) {
      assert(false, 'address empty');
      return null;
    } else if (len == 8) {
      // "anywhere"
      String lower = address.toLowerCase();
      if (lower == Address.ANYWHERE.toString()) {
        return Address.ANYWHERE;
      }
    } else if (len == 10) {
      // "everywhere"
      String lower = address.toLowerCase();
      if (lower == Address.EVERYWHERE.toString()) {
        return Address.EVERYWHERE;
      }
    }
    Address? res;
    if (26 <= len && len <= 35) {
      res = BTCAddress.parse(address);
    } else if (len == 42) {
      res = ETHAddress.parse(address);
    } else {
      // throw AssertionError('invalid address: $address');
      res = null;
    }
    //
    //  TODO: parse for other types of address
    //
    if (res == null && 4 <= len && len <= 64) {
      res = UnknownAddress(address);
    }
    assert(res != null, 'invalid address: $address');
    return res;
  }

}

/// 不支持的地址
/// ~~~~~~~~~~~~~~~~~~~
class UnknownAddress extends ConstantString implements Address {
  UnknownAddress(super.string);

  @override
  int get network => 0;

}

元数据

import 'package:dimp/crypto.dart';
import 'package:dimp/mkm.dart';
import 'package:dimp/plugins.dart';
import 'package:dim_plugins/mkm.dart';

class CompatibleMetaFactory extends BaseMetaFactory {
  CompatibleMetaFactory(super.type);

  @override
  Meta createMeta(VerifyKey pKey, {String? seed, TransportableData? fingerprint}) {
    Meta out;
    switch (type) {

      case Meta.MKM:
        out = DefaultMeta.from('1', pKey, seed!, fingerprint!);
        break;

      case Meta.BTC:
        out = BTCMeta.from('2', pKey);
        break;

      case Meta.ETH:
        out = ETHMeta.from('4', pKey);
        break;

      default:
        // TODO: other types of meta
        throw Exception('unknown meta type: $type');
    }
    assert(out.isValid, 'meta error: $out');
    return out;
  }

  @override
  Meta? parseMeta(Map meta) {
    Meta out;
    var ext = SharedAccountExtensions();
    String? version = ext.helper!.getMetaType(meta, '');
    switch (version) {

      case 'MKM':
      case 'mkm':
      case '1':
        out = DefaultMeta(meta);
        break;

      case 'BTC':
      case 'btc':
      case '2':
        out = BTCMeta(meta);
        break;

      case 'ETH':
      case 'eth':
      case '4':
        out = ETHMeta(meta);
        break;

      default:
        // TODO: other types of meta
        throw Exception('unknown meta type: $type');
    }
    return out.isValid ? out : null;
  }

}

插件加载器

import 'dart:typed_data';

import 'package:dimp/crypto.dart';
import 'package:dimp/mkm.dart';
import 'package:dim_plugins/format.dart';
import 'package:dim_plugins/plugins.dart';

import 'compat_address.dart';
import 'compat_meta.dart';

class CompatiblePluginLoader extends PluginLoader {

  @override
  void registerAddressFactory() {
    Address.setFactory(CompatibleAddressFactory());
  }

  @override
  void registerMetaFactories() {
    var mkm = CompatibleMetaFactory(Meta.MKM);
    var btc = CompatibleMetaFactory(Meta.BTC);
    var eth = CompatibleMetaFactory(Meta.ETH);

    Meta.setFactory('1', mkm);
    Meta.setFactory('2', btc);
    Meta.setFactory('4', eth);

    Meta.setFactory('mkm', mkm);
    Meta.setFactory('btc', btc);
    Meta.setFactory('eth', eth);

    Meta.setFactory('MKM', mkm);
    Meta.setFactory('BTC', btc);
    Meta.setFactory('ETH', eth);
  }

  @override
  void registerBase64Coder() {
    /// Base64 编码
    Base64.coder = PatchBase64Coder();
  }
}

/// Base-64
class PatchBase64Coder extends Base64Coder {

  @override
  Uint8List? decode(String string) {
    string = trimBase64String(string);
    return super.decode(string);
  }

  static String trimBase64String(String b64) {
    if (b64.contains('\n')) {
      b64 = b64.replaceAll('\n', '');
      b64 = b64.replaceAll('\r', '');
      b64 = b64.replaceAll('\t', '');
      b64 = b64.replaceAll(' ', '');
    }
    return b64.trim();
  }
}

使用方法

在您的业务运行之前,必须加载所有插件:

import 'package:dimsdk/plugins.dart';
import 'package:your_package_name/compat_loader.dart'; // 替换为您的实际路径

void main() {
  ExtensionLoader().run();
  CompatiblePluginLoader().run();
  // 在所有扩展和插件加载后执行您的任务
}

更多关于Flutter插件dim_plugins的介绍与使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

回到顶部