Flutter插件功能扩展插件substrate_metadata_fixed的使用

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

Flutter插件功能扩展插件substrate_metadata_fixed的使用

substrate_metadata_fixed 是一个用于在 Flutter 和 Dart 中对区块链元数据(metadata)、常量(constants)、交易(extrinsics)和事件(events)进行编码和解码的库。以下是其使用方法和示例代码。


让我们开始吧

解码元数据(Decode Metadata)

// 解码元数据
final DecodedMetadata decodedMetadata = MetadataDecoder.instance.decode('0x6d657.....790b807d0b');

// 获取原始的 Map<String, dynamic>
final rawMetadata = decodedMetadata.metadataJson;

// 获取元数据对象
final metadataObject = decodedMetadata.metadataObject;

从元数据创建 ChainInfo

// 解码元数据
final DecodedMetadata decodedMetadata = MetadataDecoder.instance.decode('0x6d657.....790b807d0b');

// 从元数据创建 ChainInfo
final ChainInfo chainInfo = ChainInfo.fromMetadata(decodedMetadata);

解码交易(Decode Extrinsic)

// 解码元数据
final DecodedMetadata decodedMetadata = MetadataDecoder.instance.decode('0x6d657.....790b807d0b');

// 从元数据创建 ChainInfo
final ChainInfo chainInfo = ChainInfo.fromMetadata(decodedMetadata);

// 定义交易的十六进制字符串
final String extrinsicHex = '0x990403......a2f9e184';

// 创建交易输入
final input = Input.fromHex(extrinsicHex);

// 解码交易
final dynamic decoded = ExtrinsicsCodec(chainInfo: chainInfo).decode(input);

编码交易(Encode Extrinsic)

// 解码元数据
final DecodedMetadata decodedMetadata = MetadataDecoder.instance.decode('0x6d657.....790b807d0b');

// 从元数据创建 ChainInfo
final ChainInfo chainInfo = ChainInfo.fromMetadata(decodedMetadata);

// 创建输出对象
final output = HexOutput();

// 定义交易映射
final Map<String, dynamic> extrinsicsMap = {'version': 4, 'signature': ....... };

// 编码交易
ExtrinsicsCodec(chainInfo: chainInfo).encodeTo(extrinsicsMap, output);

// 获取编码后的交易十六进制字符串
final extrinsicsHex = output.toString();

解码事件(Decode Events)

// 解码元数据
final DecodedMetadata decodedMetadata = MetadataDecoder.instance.decode('0x6d657.....790b807d0b');

// 从元数据创建 ChainInfo
final ChainInfo chainInfo = ChainInfo.fromMetadata(decodedMetadata);

// 定义编码的事件十六进制字符串
final String encodedEventsHex = '0x38000dd14c4572......................5ec6e6fcd6184d952d000000';

// 创建事件输入
final input = Input.fromHex(encodedEventsHex);

// 解码事件列表
final List<dynamic> decodedEvents = chainInfo.scaleCodec.decode('EventCodec', input);

编码事件(Encode Events)

// 解码元数据
final DecodedMetadata decodedMetadata = MetadataDecoder.instance.decode('0x6d657.....790b807d0b');

// 从元数据创建 ChainInfo
final ChainInfo chainInfo = ChainInfo.fromMetadata(decodedMetadata);

// 定义事件映射
final Map<String, dynamic> events = [{ 'phase': {'ApplyExtrinsic': 0}, 'event': {....} }];

// 创建输出对象
final output = HexOutput();

// 编码事件
chainInfo.scaleCodec.encodeTo('EventCodec', events, output);

// 获取编码后的事件十六进制字符串
final eventsHex = output.toString();

解码常量(Decode Constants)

// 解码元数据
final DecodedMetadata decodedMetadata = MetadataDecoder.instance.decode('0x6d657.....790b807d0b');

// 从元数据创建 ChainInfo
final ChainInfo chainInfo = ChainInfo.fromMetadata(decodedMetadata);

// 遍历链描述中的常量
for (final palletMapEntry in chainInfo.constants.entries) {
  for (final constantMapEntry in palletMapEntry.value.entries) {
    final Constant originalConstant = constantMapEntry.value;

    // 获取编码的常量字节
    final encodedBytes = originalConstant.bytes;

    // 获取解码后的常量值
    final decoded = originalConstant.value;
  }
}

编码常量(Encode Constants)

// 解码元数据
final DecodedMetadata decodedMetadata = MetadataDecoder.instance.decode('0x6d657.....790b807d0b');

// 从元数据创建 ChainInfo
final ChainInfo chainInfo = ChainInfo.fromMetadata(decodedMetadata);

// 创建输出对象
final output = ByteOutput();

// 定义解码后的常量值
final decodedConstantValue = /** Some constant value from originalConstant **/;

// 编码常量值
originalConstant.type.encodeTo(decodedConstantValue, output);

// 获取编码后的常量字节
final encodedConstant = output.toBytes();

添加 SpecVersion

final specJson = {'specName': 'polkadot', 'specVersion':......};

final specVersion = SpecVersion.fromJson(specJson);

// 将 SpecVersion 添加到支持解码区块
chainObject.addSpecVersion(specVersion);

从 SpecVersion 创建 ChainInfo

// 当使用 preV14 元数据时
final chainDefinitions = LegacyTypesBundle.fromJson(chainJson);
final Chain chain = Chain(chainDefinitions);

// 或者

// 当使用 V14 元数据时,无需提供 chainDefinitions
final Chain chain = Chain();

final specJson = {'specName': 'polkadot', 'specVersion':......};

final SpecVersion specVersion = SpecVersion.fromJson(specJson);

final ChainInfo chainInfo = chain.getChainInfoFromSpecVersion(specVersion);

使用 Chain 解码交易(Decode Extrinsic with Chain)

// 当使用 preV14 元数据时
final chainDefinitions = LegacyTypesBundle.fromJson(chainJson);
final Chain chain = Chain(chainDefinitions);

// 或者

// 当使用 V14 元数据时,无需提供 chainDefinitions
final Chain chain = Chain();

// 提供所有可用的 Spec-Version 信息
chain.initSpecVersionFromFile('../chain/versions.json');

final RawBlock rawBlock = RawBlock.fromJson({ blockJson });

// 解码交易
final DecodedBlockExtrinsics decodedExtrinsic = chain.decodeExtrinsics(rawBlock);

使用 Chain 编码交易(Encode Extrinsic with Chain)

// 当使用 preV14 元数据时
final chainDefinitions = LegacyTypesBundle.fromJson(chainJson);
final Chain chain = Chain(chainDefinitions);

// 或者

// 当使用 V14 元数据时,无需提供 chainDefinitions
final Chain chain = Chain();

// 提供所有可用的 Spec-Version 信息
chain.initSpecVersionFromFile('../chain/versions.json');

final RawBlock rawBlock = RawBlock.fromJson({ blockJson });

// 解码交易
final DecodedBlockExtrinsics decodedExtrinsic = chain.decodeExtrinsics(rawBlock);

// 编码交易
final RawBlock encodedRawBlock = chain.encodeExtrinsic(decodedExtrinsic);

使用 Chain 解码事件(Decode Events with Chain)

// 当使用 preV14 元数据时
final chainDefinitions = LegacyTypesBundle.fromJson(chainJson);
final Chain chain = Chain(chainDefinitions);

// 或者

// 当使用 V14 元数据时,无需提供 chainDefinitions
final Chain chain = Chain();

// 提供所有可用的 Spec-Version 信息
chain.initSpecVersionFromFile('../chain/versions.json');

final RawBlockEvents rawBlockEvents = RawBlockEvents.fromJson({ blockJson });

// 解码事件
final DecodedBlockEvents decodedEvents = chain.decodeEvents(rawBlockEvents);

使用 Chain 编码事件(Encode Events with Chain)

// 当使用 preV14 元数据时
final chainDefinitions = LegacyTypesBundle.fromJson(chainJson);
final Chain chain = Chain(chainDefinitions);

// 或者

// 当使用 V14 元数据时,无需提供 chainDefinitions
final Chain chain = Chain();

// 提供所有可用的 Spec-Version 信息
chain.initSpecVersionFromFile('../chain/versions.json');

final RawBlockEvents rawBlockEvents = RawBlockEvents.fromJson({ blockJson });

// 解码事件
final DecodedBlockEvents decodedEvents = chain.decodeEvents(rawBlockEvents);

// 编码事件
final RawBlockEvents encodedBlockEvents = chain.encodeEvents(decodedEvents);

更多关于Flutter插件功能扩展插件substrate_metadata_fixed的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter插件功能扩展插件substrate_metadata_fixed的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


substrate_metadata_fixed 是一个 Flutter 插件,用于与 Substrate 区块链交互,特别是用于解析和处理 Substrate 链的元数据。Substrate 是一个区块链开发框架,由 Parity Technologies 开发,用于构建自定义区块链。

插件功能

substrate_metadata_fixed 插件的主要功能包括:

  1. 解析元数据:从 Substrate 链中获取并解析元数据。
  2. 类型编码/解码:支持 Substrate 类型系统的编码和解码。
  3. 交易构建:帮助构建符合 Substrate 链的交易。
  4. 事件解析:解析链上事件。

使用步骤

  1. 添加依赖: 在 pubspec.yaml 文件中添加 substrate_metadata_fixed 插件的依赖。

    dependencies:
      flutter:
        sdk: flutter
      substrate_metadata_fixed: ^1.0.0

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

  2. 导入插件: 在你的 Dart 文件中导入插件。

    import 'package:substrate_metadata_fixed/substrate_metadata_fixed.dart';
  3. 初始化插件: 在使用插件之前,通常需要初始化它。

    final substrateMetadata = SubstrateMetadata();
  4. 获取和解析元数据: 你可以通过插件获取并解析 Substrate 链的元数据。

    final metadata = await substrateMetadata.getMetadata('wss://rpc.polkadot.io');
    print(metadata);
  5. 编码/解码数据: 使用插件提供的工具进行数据的编码和解码。

    final encoded = substrateMetadata.encode('Balance', BigInt.from(1000000));
    final decoded = substrateMetadata.decode('Balance', encoded);
    print(decoded);
  6. 构建交易: 使用插件构建并发送交易。

    final tx = substrateMetadata.createTransaction(
      sender: '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY',
      callIndex: '0x0400',
      args: {'dest': '5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty', 'value': BigInt.from(1000000)},
    );
    final txHash = await substrateMetadata.submitTransaction(tx);
    print(txHash);
  7. 解析事件: 解析链上事件。

    final events = await substrateMetadata.getEvents('wss://rpc.polkadot.io', blockHash);
    for (var event in events) {
      print(event);
    }

注意事项

  • 网络连接:确保你的应用有网络权限,并且可以访问 Substrate 链的节点。
  • 错误处理:在实际使用中,建议添加适当的错误处理机制,以应对网络问题或数据解析错误。
  • 版本兼容性:确保你使用的插件版本与 Substrate 链的版本兼容。

示例代码

以下是一个简单的示例,展示如何使用 substrate_metadata_fixed 插件获取并解析元数据:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  final substrateMetadata = SubstrateMetadata();
  final metadata = await substrateMetadata.getMetadata('wss://rpc.polkadot.io');
  
  runApp(MaterialApp(
    home: Scaffold(
      appBar: AppBar(title: Text('Substrate Metadata Example')),
      body: Center(
        child: Text('Metadata: $metadata'),
      ),
    ),
  ));
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!