Flutter IPFS交互插件ipfs_http_rpc的使用

Flutter IPFS交互插件ipfs_http_rpc的使用

特性

  • 包含所有在参考文档中列出的HTTP RPC命令。
  • 实验性的命令也被添加。
  • 所有命令都有文档并且易于访问。
  • 标准化的响应。

使用方法

import 'package:ipfs_http_rpc/ipfs.dart';

// 可以直接通过Ipfs()或获取Ipfs的单例实例来使用。
Ipfs ipfs = Ipfs();

// 默认情况下,ipfs.url设置为"http://127.0.0.1:5001/api/v0"。可以通过工厂构造函数或手动设置进行更改。
Ipfs(url: "https://my-ipfs-endpoint/api/v0");
ipfs.url = "https://my-ipfs-endpoint/api/v0";

访问所有命令并保证响应

// 成功的请求
Map<String, dynamic> response = await ipfs.add(path: "/my/local/file.txt", wrapWithDirectory: true);

// response = {
//     "StatusCode": "200",
//     "StatusMessage": "OK"
//     "Name": "file.txt",
//     "Hash": "QmRDebtk...",
//     "Size": "281",
// }
// 失败的请求
Map<String, dynamic> response = await ipfs.filestore.ls();

// response = {
//     StatusCode: 500,
//     StatusMessage: Internal Server Error,
//     Message: filestore is not enabled, see https://git.io/vNItf,
//     Code: 0, 
//     Type: error
// }

某些命令(如ipfs refs)理论上可以从ipfs.refs()调用。然而,由于该命令还包含子命令(如ipfs refs local),只能通过ipfs.refs.self()来解决命名冲突:

// 不会工作
ipfs.refs();    
ipfs.refs.local();

// 可以正常工作
ipfs.refs.self();
ipfs.refs.local();

这同样适用于其他命令和子命令(如bootstrapdiag等)。

完整示例Demo

// 忽略对文件打印的警告
import 'package:ipfs_http_rpc/ipfs.dart';

void main() async {
  // 默认值为: Ipfs(url: "http://127.0.0.1:5001/api/v0")。
  Ipfs ipfs = Ipfs();

  // 添加一个本地存储的文件。
  Map<String, dynamic> response = await ipfs.add(path: "example/file.txt");

  // 如果成功,响应将包含"Hash"键,但也可以根据命令检查"StatusMessage"或其他键。
  if (response.containsKey("Hash")) {
    final fileName = response["Name"];
    final fileHash = response["Hash"];

    print("成功将文件'$fileName'添加到IPFS!");
    print("文件的哈希值为$fileHash");

    // 尝试读取文件的内容。
    print(await ipfs.cat(path: "/ipfs/$fileHash"));

    // 应输出:
    // {StatusCode: 200, StatusMessage: OK, Text: <文件内容>}
  } else {
    print("无法将文件添加到IPFS。");
    print("响应: $response");
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用ipfs_http_rpc插件与IPFS(InterPlanetary File System)进行交互的代码示例。这个插件允许你通过HTTP RPC与IPFS节点进行通信。

首先,确保你已经在pubspec.yaml文件中添加了ipfs_http_rpc依赖:

dependencies:
  flutter:
    sdk: flutter
  ipfs_http_rpc: ^x.y.z  # 请替换为最新版本号

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

接下来,是一个完整的Flutter应用示例,展示了如何使用ipfs_http_rpc插件来添加文件到IPFS、获取文件的哈希值以及从IPFS中检索文件内容。

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

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

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

class _MyAppState extends State<MyApp> {
  String? fileHash;
  String? fileContent;
  IPFS? ipfs;

  @override
  void initState() {
    super.initState();
    // 初始化IPFS客户端,这里假设你的IPFS节点运行在本地默认端口5001
    ipfs = IPFS('http://localhost:5001');
  }

  Future<void> addFileToIPFS() async {
    // 读取文件内容(这里假设你有一个字符串作为文件内容)
    String fileData = "Hello, IPFS!";
    
    // 将文件添加到IPFS
    var response = await ipfs!.add(fileData);
    
    // 获取文件的哈希值
    setState(() {
      fileHash = response.first.hash;
    });
    
    print("File added with hash: $fileHash");
  }

  Future<void> getFileFromIPFS() async {
    if (fileHash == null) {
      print("No file hash available to fetch file.");
      return;
    }
    
    // 从IPFS中获取文件内容
    var response = await ipfs!.cat(fileHash!);
    
    setState(() {
      fileContent = String.fromCharCodes(response);
    });
    
    print("File content retrieved: $fileContent");
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('IPFS Flutter Demo'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text('File Hash:'),
              if (fileHash != null)
                Text(fileHash!),
              SizedBox(height: 16),
              ElevatedButton(
                onPressed: addFileToIPFS,
                child: Text('Add File to IPFS'),
              ),
              SizedBox(height: 16),
              if (fileHash != null)
                ElevatedButton(
                  onPressed: getFileFromIPFS,
                  child: Text('Get File from IPFS'),
                ),
              SizedBox(height: 16),
              if (fileContent != null)
                Text('File Content:\n$fileContent'),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们首先初始化了IPFS客户端,指定了IPFS节点的HTTP RPC地址(这里假设为http://localhost:5001)。
  2. addFileToIPFS函数将一个字符串文件添加到IPFS,并获取其哈希值。
  3. getFileFromIPFS函数使用之前获取的哈希值从IPFS中检索文件内容。
  4. UI部分包含两个按钮,一个用于添加文件,另一个用于获取文件(如果哈希值存在)。

请确保你的IPFS节点正在运行,并且你能够访问指定的HTTP RPC端口。如果IPFS节点不在本地运行,你需要将IPFS客户端的初始化地址更改为你的IPFS节点的实际地址。

回到顶部