Flutter Starknet交互插件starknet的使用

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

Flutter Starknet交互插件starknet的使用

starknet.dart 介绍

starknet.dart 是一个用于与StarkNet智能合约进行类型安全交互的SDK。它允许你调用StarkNet全节点暴露的JSON-RPC端点(详见规范)。该SDK的目标是为Dart应用程序提供最佳的Starknet SDK,从而解锁Flutter移动应用在StarkNet上的时代。

动机

StarkNet是Web3世界的一场革命:它可以通过ZK-Rollups扩展以太坊,并通过账户抽象或会话密钥等独特功能提供最佳的用户体验。然而,除非去中心化应用能够进入移动设备,否则Web3的主流采用不会发生。因此,构建最佳的Starknet SDK以支持Dart应用程序是一个优先事项,这将推动Flutter移动应用在StarkNet上的发展。

路线图

你可以直接在项目的看板上跟踪项目进展。

贡献

如果你想要贡献代码或有任何建议,请参考我们的贡献指南。

开发指南

初始设置

请参考主README文件中的初始设置说明。

运行测试

你可以使用以下命令运行测试:

dart test

要在devnet上运行集成测试,使用以下命令:

NETWORK=devnet dart test -t integration
生成Freezed模型类

为了避免编写过多的样板代码,我们使用freezed库自动生成序列化逻辑。你可以使用以下命令生成这些类:

dart run build_runner build

或者在VSCode中按 Cmd + Shift + B

生成文档

要生成文档,运行以下命令:

dart doc .

对于更高级的功能,可以参考dartdoc包。

编译Cairo合约

编译Cairo合约的方法请参考主README文件。你也可以在contracts/build文件夹中查看已编译的合约。

完整示例Demo

以下是一个完整的示例代码,展示了如何使用starknet.dart与StarkNet智能合约进行交互:

import 'package:starknet/starknet.dart';
import 'package:starknet/utils/contract_address.dart';

void main() async {
  // 初始化StarkNet客户端
  final client = StarknetClient(
    network: NetworkName.mainnet, // 或者使用 devnet, testnet 等
  );

  // 加载钱包
  final wallet = await StarknetWallet.fromMnemonic(
    mnemonic: 'your-mnemonic-phrase',
    derivationPath: "m/44'/9004'/0'/0/0",
  );

  // 部署合约
  final contractAddress = await client.deployContract(
    compiledContract: 'path/to/compiled_contract.json',
    constructorCalldata: [],
    senderAddress: wallet.address,
    privateKey: wallet.privateKey,
  );

  print('Contract deployed at address: $contractAddress');

  // 调用合约函数
  final contract = Contract(
    address: contractAddress,
    abi: await File('path/to/contract_abi.json').readAsString(),
    client: client,
  );

  // 调用合约的某个函数
  final result = await contract.callFunction(
    functionName: 'balanceOf',
    calldata: [wallet.address],
    senderAddress: wallet.address,
    privateKey: wallet.privateKey,
  );

  print('Balance of the wallet: ${result[0]}');
}

更多关于Flutter Starknet交互插件starknet的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Starknet交互插件starknet的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中与Starknet进行交互通常需要依赖一些底层库来处理区块链通信。虽然目前可能没有直接针对Flutter的官方Starknet插件,但我们可以通过集成现有的Dart或JavaScript库,或者通过HTTP请求与Starknet节点进行交互来实现。以下是一个基本的思路,展示如何在Flutter中调用Starknet节点API。

步骤 1: 设置Flutter项目

首先,确保你已经设置好了一个Flutter项目。如果还没有,可以使用以下命令创建一个新的Flutter项目:

flutter create starknet_flutter_app
cd starknet_flutter_app

步骤 2: 添加依赖

虽然Flutter本身没有直接支持Starknet的库,但你可以使用http包来发送HTTP请求到Starknet节点。在pubspec.yaml文件中添加http依赖:

dependencies:
  flutter:
    sdk: flutter
  http: ^0.13.4  # 请检查最新版本号

然后运行flutter pub get来安装依赖。

步骤 3: 编写Starknet交互代码

接下来,你可以编写一个Dart类来处理与Starknet节点的交互。以下是一个简单的示例,展示如何调用Starknet节点的API来获取账户信息(注意:这只是一个假设的API调用,实际API可能会根据Starknet节点的实现有所不同):

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

class StarknetService {
  final String starknetNodeUrl;

  StarknetService({required this.starknetNodeUrl});

  Future<Map<String, dynamic>> getAccountInfo(String accountAddress) async {
    final Uri uri = Uri.parse('$starknetNodeUrl/api/v1/accounts/$accountAddress');

    try {
      final response = await http.get(uri);
      if (response.statusCode == 200) {
        return jsonDecode(response.body);
      } else {
        throw Exception('Failed to fetch account info: ${response.statusCode}');
      }
    } catch (e) {
      throw Exception('Error fetching account info: $e');
    }
  }
}

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late StarknetService starknetService;
  String? accountAddress = '0x1234567890abcdef1234567890abcdef12345678'; // 示例地址
  Map<String, dynamic>? accountInfo;
  String? errorMessage;

  @override
  void initState() {
    super.initState();
    starknetService = StarknetService(starknetNodeUrl: 'https://your-starknet-node-url.com');
    fetchAccountInfo();
  }

  Future<void> fetchAccountInfo() async {
    try {
      accountInfo = await starknetService.getAccountInfo(accountAddress!);
    } catch (e) {
      errorMessage = e.toString();
    }

    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Starknet Flutter App'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              if (errorMessage != null)
                Text(
                  'Error: $errorMessage',
                  style: TextStyle(color: Colors.red),
                ),
              if (accountInfo != null)
                Text(
                  'Account Info: ${jsonEncode(accountInfo!)}',
                  style: TextStyle(fontSize: 16),
                ),
            ],
          ),
        ),
      ),
    );
  }
}

注意

  1. Starknet节点URL:将'https://your-starknet-node-url.com'替换为实际的Starknet节点URL。
  2. API端点/api/v1/accounts/$accountAddress是一个假设的API端点,你需要根据实际的Starknet节点API文档进行调整。
  3. 账户地址:示例中的账户地址是虚构的,你需要替换为实际的Starknet账户地址。

结论

上述代码展示了如何在Flutter应用中通过HTTP请求与Starknet节点进行基本的交互。根据Starknet节点的API文档,你可以扩展这个基础代码来实现更多的功能,如交易发送、合约部署等。由于Starknet是一个相对较新的技术,相关的生态和库可能还在不断发展中,因此建议定期查看最新的文档和社区资源。

回到顶部