Flutter底层数据元数据管理插件substrate_metadata的使用

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

Flutter底层数据元数据管理插件substrate_metadata的使用

substrate_metadata 是一个用于编码和解码链元数据、常量、交易和事件的 Flutter 和 Dart 库。

让我们开始吧

解码元数据

// 解码后的元数据
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);

解码交易

// 解码元数据
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);

编码交易

// 解码元数据
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);
  
// 编码后的交易Hex
final extrinsicsHex = output.toString();

解码事件

// 解码元数据
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);

编码事件

// 解码元数据
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);
  
// 事件Hex
final eventsHex = output.toString();

解码常量

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

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

//
// 查看链描述中的常量
for (final palletMapEntry in chainInfo.constants.entries) {

    //
    // 遍历给定pallet的所有常量
    for (final constantMapEntry in palletMapEntry.value.entries) {
        final Constant originalConstant = constantMapEntry.value;
        
        //
        // 编码后的常量字节
        final encodedBytes = originalConstant.bytes;
        
        //
        // 解码后的常量值
        final decoded = originalConstant.value;
    }
}

编码常量

// 解码元数据
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);

使用链解码交易

// 当使用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);

使用链编码交易

// 当使用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);

使用链解码事件

// 当使用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);

使用链编码事件

// 当使用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.fromJson( { blockJson } );

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

// 编码后的区块事件哈希等于原始区块事件
final RawBlockEvents encodedBlockEvents = chain.encodeEvents(decodedEvents);

更多关于Flutter底层数据元数据管理插件substrate_metadata的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter底层数据元数据管理插件substrate_metadata的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,substrate_metadata 插件通常用于管理底层数据的元数据。虽然具体的实现细节可能会因插件版本和具体需求有所不同,但我可以提供一个基本的代码案例来展示如何使用这个插件进行元数据的管理。

请注意,由于substrate_metadata并非一个广为人知的官方或主流Flutter插件,以下示例将基于假设的API和功能进行编写。如果你使用的是特定的第三方插件或有特定文档,请参考相应的文档进行调整。

假设substrate_metadata插件提供了基本的CRUD(创建、读取、更新、删除)操作来管理元数据,以下是一个基本的代码示例:

  1. 添加依赖: 首先,确保在pubspec.yaml文件中添加了substrate_metadata插件的依赖(这里假设该插件存在于pub.dev或你的私有包仓库中)。

    dependencies:
      flutter:
        sdk: flutter
      substrate_metadata: ^x.y.z  # 替换为实际版本号
    
  2. 导入插件: 在你的Dart文件中导入插件。

    import 'package:substrate_metadata/substrate_metadata.dart';
    
  3. 初始化插件: 通常,插件需要在应用启动时进行初始化。

    void main() async {
      WidgetsFlutterBinding.ensureInitialized();
      await SubstrateMetadata.instance.init();  // 假设插件提供了init方法
      runApp(MyApp());
    }
    
  4. 使用插件管理元数据: 下面是一个简单的示例,展示了如何使用插件进行元数据的CRUD操作。

    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: Text('Substrate Metadata Demo'),
            ),
            body: Center(
              child: MetadataManager(),
            ),
          ),
        );
      }
    }
    
    class MetadataManager extends StatefulWidget {
      @override
      _MetadataManagerState createState() => _MetadataManagerState();
    }
    
    class _MetadataManagerState extends State<MetadataManager> {
      final SubstrateMetadata _metadataService = SubstrateMetadata.instance;
    
      Future<void> createMetadata() async {
        try {
          Map<String, dynamic> metadata = {
            'key1': 'value1',
            'key2': 'value2',
          };
          await _metadataService.create(metadata);
          print('Metadata created successfully.');
        } catch (e) {
          print('Error creating metadata: $e');
        }
      }
    
      Future<void> readMetadata() async {
        try {
          Map<String, dynamic> metadata = await _metadataService.read('someKeyId');
          print('Metadata retrieved: $metadata');
        } catch (e) {
          print('Error reading metadata: $e');
        }
      }
    
      Future<void> updateMetadata() async {
        try {
          Map<String, dynamic> updatedMetadata = {
            'key1': 'newValue1',
          };
          await _metadataService.update('someKeyId', updatedMetadata);
          print('Metadata updated successfully.');
        } catch (e) {
          print('Error updating metadata: $e');
        }
      }
    
      Future<void> deleteMetadata() async {
        try {
          await _metadataService.delete('someKeyId');
          print('Metadata deleted successfully.');
        } catch (e) {
          print('Error deleting metadata: $e');
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: createMetadata,
              child: Text('Create Metadata'),
            ),
            ElevatedButton(
              onPressed: readMetadata,
              child: Text('Read Metadata'),
            ),
            ElevatedButton(
              onPressed: updateMetadata,
              child: Text('Update Metadata'),
            ),
            ElevatedButton(
              onPressed: deleteMetadata,
              child: Text('Delete Metadata'),
            ),
          ],
        );
      }
    }
    

在这个示例中,我们假设SubstrateMetadata类提供了initcreatereadupdatedelete方法来进行元数据的管理。你需要根据实际的插件API文档来调整这些方法的使用。

请确保你已经正确安装并配置了substrate_metadata插件,并且API调用符合插件的实际实现。如果插件提供了更多的功能或不同的方法签名,请参考相应的文档进行实现。

回到顶部