Flutter插件功能扩展插件substrate_metadata_fixed的使用
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
更多关于Flutter插件功能扩展插件substrate_metadata_fixed的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
substrate_metadata_fixed
是一个 Flutter 插件,用于与 Substrate 区块链交互,特别是用于解析和处理 Substrate 链的元数据。Substrate 是一个区块链开发框架,由 Parity Technologies 开发,用于构建自定义区块链。
插件功能
substrate_metadata_fixed
插件的主要功能包括:
- 解析元数据:从 Substrate 链中获取并解析元数据。
- 类型编码/解码:支持 Substrate 类型系统的编码和解码。
- 交易构建:帮助构建符合 Substrate 链的交易。
- 事件解析:解析链上事件。
使用步骤
-
添加依赖: 在
pubspec.yaml
文件中添加substrate_metadata_fixed
插件的依赖。dependencies: flutter: sdk: flutter substrate_metadata_fixed: ^1.0.0
然后运行
flutter pub get
来获取依赖。 -
导入插件: 在你的 Dart 文件中导入插件。
import 'package:substrate_metadata_fixed/substrate_metadata_fixed.dart';
-
初始化插件: 在使用插件之前,通常需要初始化它。
final substrateMetadata = SubstrateMetadata();
-
获取和解析元数据: 你可以通过插件获取并解析 Substrate 链的元数据。
final metadata = await substrateMetadata.getMetadata('wss://rpc.polkadot.io'); print(metadata);
-
编码/解码数据: 使用插件提供的工具进行数据的编码和解码。
final encoded = substrateMetadata.encode('Balance', BigInt.from(1000000)); final decoded = substrateMetadata.decode('Balance', encoded); print(decoded);
-
构建交易: 使用插件构建并发送交易。
final tx = substrateMetadata.createTransaction( sender: '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY', callIndex: '0x0400', args: {'dest': '5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty', 'value': BigInt.from(1000000)}, ); final txHash = await substrateMetadata.submitTransaction(tx); print(txHash);
-
解析事件: 解析链上事件。
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'),
),
),
));
}