Flutter以太坊交互插件ledger_ethereum的使用

Flutter以太坊交互插件ledger_ethereum的使用

ledger_ethereum

一个支持与Ledger Nano X设备及兼容EVM链的应用程序进行通信的Flutter插件。

Avacus上完全支持,因此您可以获得最佳体验。

请随意使用,并且如果有任何问题请不要犹豫提交问题。

开始使用

安装

通过pub.dev安装此包的最新版本:

ledger_ethereum: ^latest-version

有关与Ledger Flutter包集成的文档,请参阅这里

设置

创建一个新的EthereumLedgerApp实例,并传递您的Ledger对象的一个实例。

final app = EthereumLedgerApp(ledger);

使用方法

获取账户

获取连接到应用程序的Ledger设备上的账户列表。

final accounts = await app.getAccounts(device);

签名个人消息

对个人消息进行签名。

final signature = await app.signPersonalMessage(
    device,
    messageInBytes, // 消息字节数据
);

签名类型化数据

根据EIP-712规范对类型化数据进行签名。

final signature = await app.signEIP712Message(
    device,
    messageInJson, // 消息JSON数据
);

签名交易

对交易进行签名。

final transactionInBytes = TransactionHandler.encodeTx(transaction, chainId); // 将交易编码为字节数组
final signature = await app.signTransaction(
    device,
    transactionInBytes,
);

示例代码

以下是一个完整的示例,展示了如何使用ledger_ethereum插件进行账户查询、签名个人消息、签名类型化数据和签名交易。

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Ledger Ethereum Demo')),
        body: Center(child: MyWidget()),
      ),
    );
  }
}

class MyWidget extends StatefulWidget {
  [@override](/user/override)
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  String _message = '';
  String _signature = '';

  final EthereumLedgerApp app = EthereumLedgerApp(Ledger());

  Future<void> getAccounts() async {
    try {
      final accounts = await app.getAccounts(device);
      setState(() {
        _message = '已获取账户: ${accounts.join(", ")}';
      });
    } catch (e) {
      setState(() {
        _message = '获取账户时出错: $e';
      });
    }
  }

  Future<void> signPersonalMessage() async {
    try {
      final signature = await app.signPersonalMessage(
          device,
          utf8.encode("Hello, Ledger!"), // 消息字节数据
      );
      setState(() {
        _signature = '已签名的消息: $signature';
      });
    } catch (e) {
      setState(() {
        _signature = '签名时出错: $e';
      });
    }
  }

  Future<void> signEIP712Message() async {
    try {
      final signature = await app.signEIP712Message(
          device,
          {"domain": {"chainId": 1, "name": "Ether Mail", "version": "1"}, "message": {"contents": "Hello, Ledger!"}, "primaryType": "Mail"}, // 消息JSON数据
      );
      setState(() {
        _signature = '已签名的消息: $signature';
      });
    } catch (e) {
      setState(() {
        _signature = '签名时出错: $e';
      });
    }
  }

  Future<void> signTransaction() async {
    try {
      final transactionInBytes = TransactionHandler.encodeTx(transaction, chainId); // 将交易编码为字节数组
      final signature = await app.signTransaction(
          device,
          transactionInBytes,
      );
      setState(() {
        _signature = '已签名的交易: $signature';
      });
    } catch (e) {
      setState(() {
        _signature = '签名时出错: $e';
      });
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        ElevatedButton(
          onPressed: getAccounts,
          child: Text('获取账户'),
        ),
        SizedBox(height: 20),
        Text(_message),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: signPersonalMessage,
          child: Text('签名个人消息'),
        ),
        SizedBox(height: 20),
        Text(_signature),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: signEIP712Message,
          child: Text('签名类型化数据'),
        ),
        SizedBox(height: 20),
        Text(_signature),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: signTransaction,
          child: Text('签名交易'),
        ),
        SizedBox(height: 20),
        Text(_signature),
      ],
    );
  }
}

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

1 回复

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


ledger_ethereum 是一个用于在 Flutter 应用中与 Ledger 硬件钱包进行交互的插件,主要用于与以太坊区块链进行交互。通过该插件,你可以连接到 Ledger 设备、签名交易、查询余额等。

以下是 ledger_ethereum 插件的基本使用步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 ledger_ethereum 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  ledger_ethereum: ^latest_version

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

2. 初始化插件

在 Flutter 应用中初始化 ledger_ethereum 插件:

import 'package:ledger_ethereum/ledger_ethereum.dart';

final ledgerEthereum = LedgerEthereum();

3. 连接到 Ledger 设备

使用 connect 方法连接到 Ledger 设备:

final device = await ledgerEthereum.connect();

device 是一个 LedgerDevice 对象,表示连接的 Ledger 设备。

4. 获取以太坊地址

通过 Ledger 设备获取以太坊地址:

final address = await device.getAddress();
print('Ethereum Address: $address');

5. 签名交易

使用 Ledger 设备签名以太坊交易:

final transaction = Transaction(
  to: '0xRecipientAddress',
  value: BigInt.from(1000000000000000000), // 1 ETH in wei
  gasLimit: BigInt.from(21000),
  gasPrice: BigInt.from(20000000000),
  nonce: 0,
);

final signedTransaction = await device.signTransaction(transaction);
print('Signed Transaction: $signedTransaction');

6. 查询余额

你可以使用 web3dart 或其他以太坊库来查询地址的余额:

import 'package:web3dart/web3dart.dart';

final web3 = Web3Client('https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID', http.Client());

final balance = await web3.getBalance(EthereumAddress.fromHex(address));
print('Balance: $balance');

7. 断开连接

当你完成操作后,断开与 Ledger 设备的连接:

await device.disconnect();
回到顶部