技术解码 | 如何跨平台使用IPFS Lite?
本文由IPFS原力区收集译制,版权所属原作者

摘要
IPFS Lite是一个仅提供与IPFS网络交互的基本功能的库:创建新数据和获取现有数据。 对于希望直接在其代码、应用程序中嵌入IPFS功能的应用程序来说,IPFS Lite是一个不错的选择。 Textile越来越依赖IPFS Lite,因此我们希望提供一些新的IPFS Lite库,以在Textile运行的所有平台(JavaScript,Android和iOS)上启用相同的API。 我们将继续开发并围绕这些库来构建,但也希望尽早开放它们,以便其他人可以尝试,并提供反馈,帮助我们使它们变得更好,更快,更轻巧。
在Textile,我们已经在移动端和浏览器端的基础设置中研究IPFS有一段时间了…并且我们与许多开发人员进行了合作,试图优化人们如何在IPFS和Textile之上构建。我们一次又一次注意到的一件事——99%的时间里,在IPFS上构建的开发人员希望通过最少的设置或工作从网络添加和获取文件。他们希望IPFS像一个简单的本地数据库。大多数情况下,浏览器或移动DApp仅需要能够通过IPFS网络,添加和获取少量的数据。即,输入IPFS Lite。
IPFS Lite从Go库开始,为基于IPLD的应用程序能与IPFS网络进行交互提供了最低限度的功能。就如同HéctorSanjuán,SamuliPöyhtäri和Pedro Teixeira的论文以及IPFS Cluster项目中所描述的一样,它是基于Merkle-CRDT的分布式数据库的核心组件。该API很简单,也易于在其他应用中使用/嵌入(默认情况下只有少数方法)。我们发现自己越来越多地寻求IPFS Lite,并决定让更多的开发人员可以使用它。
今天,我们发布了一组新的IPFS Lite库。现在,你可以在浏览器,Android,iOS或桌面上(通过原始的Go库)尝试IPFS Lite 。我们从简单开始,希望以此跨平台版本来评估兴趣并早日获得反馈。我们的目标是当“完全加载”可以支持大多数默认的IPFS核心API时,能提供一种可高度扩展的IPFS实现,。如果你对应包括和不应该包括的内容有任何意见,请让我们知道或发送PR!
浏览器/ Nodejshttps://github.com/textileio/js-ipfs-lite
Androidhttps://github.com/textileio/android-ipfs-lite
iOShttps://github.com/textileio/ios-ipfs-lite
gRPChttps://github.com/textileio/grpc-ipfs-lite/
库在行动
为了让你了解如何在自己的应用中使用这些新库,下面有每个库的汇总,同时还附带一些简单的跨平台示例。你可以通过这些了解API。
Javascript
Js-IPFS-lite以原始Go实现的直接端口开始,完全用Typescript来书写。它后续已经发展到某种程度,但是动作域上仍然非常相似。默认情况下,一个lite Peer是要求开发人员提供一个数据库来存储本地IPLD块的(这可以是用于临时对等体的内存,可以是基于leveldb的持久性存储等等),以及一个Libp2p的主机/客户端。实际上,该库提供了许多帮助者功能(例如setupLibP2PHost),来初始化数据库,以及使Libp2p主机变得更加容易,其默认值适用于Nodejs或浏览器(基于js-ipfs的默认值)。
这个库的大小已经不到js-ipfs的一半,而且大多数核心API都没有公开……其中很多都是在后台提供的。我们将迅速努力,进一步减小尺寸(我们尚未应用许多优化措施),也会将更多这些核心API公开,作为单独、可插入模块。同时,我们已经发现减少加载时间可带来更出色的浏览器体验。如果你热衷于贡献但不精通Typescript,也没什么大不了的话,只要提交PR,我们都将为你提供帮助!
构建
let { Peer, BlockStore, setupLibP2PHost } = require(‘@textile/ipfs-lite’)
// Use any interface-datastore compliant store
let { MemoryDatastore } = require(‘interface-datastore’)
let store = new BlockStore(new MemoryDatastore())
let host = await setupLibP2PHost() // Accepts all libp2p config options
let lite = new Peer(store, host)
新增文件
// Simple Nodejs example using async/await
let fs = require(‘fs’)
let source = [{
path: ‘secret_plans’,
content: fs.createReadStream(‘secret_plans.txt’)
}]
let cid = await lite.addFile(source)
获取节点
你也可以获取文件或者浏览网络上的IPLD节点。在这里,我们可以探索Project Apollo Archives:
// Mostly end-to-end browser example using Promises…
let CID = require(‘cids’)
let cid = new CID(‘QmSnuWmxptJZdLJpKRarxBMS2Ju2oANVrgbr2xWbie9b2D’)
setupLibP2PHost().then(host => {
let litePeer = new Peer(store, host)
litePeer.start().then(() => {
litePeer.get(cid).then(block => {
block.Links.forEach(link => {
console.log(link.Name + ‘: ‘ + link.Hash.toString())
})
})
})
})
输出
README.txt: QmP8jTG1m9GSDJLCbeWhVSVgEzCPPwXRdCRuJtQ5Tz9Kc9
_Metadata.json: QmWXShtJXt6Mw3FH7hVCQvR56xPcaEtSj4YFSGjp2QxA4v
albums: QmUh6QSTxDKX5qoNU1GoogbhTveQQV9JMeQjfFVchAtd5Q
apolloarchivr.py: QmU7gJi6Bz3jrvbuVfB7zzXStLJrTHf6vWh8ZqkCsTGoRC
build_frontend_index.py: QmRSxRRu9AoJ23bxb2pFeoAUFXMAdki7RZu2T7e6zHRdu6
frontend: QmeQtZfwuq6aWRarY9P3L9MWhZ6QTonDe9ahWECGBZjyEJ
Android
对于android-ipfs-lite,它几乎是相同的API,拥有从IPFS上添加和检索文件的简单方法。当前的实现不需要开发人员提供自己的数据库,而是使用简单的嵌入式数据库来管理一个应用的数据和节点。
新增文件
// Synchronous
File file = openFile(“secret_plans”);
byte[] bytes = Files.readAllBytes(file.toPath());
String cid = litePeer.addFileSync(bytes);
// Asynchronous
litePeer.addFile(bytes, resultHandler);
获取节点
String cid = “QmSnuWmxptJZdLJpKRarxBMS2Ju2oANVrgbr2xWbie9b2D“;
litePeer.getNode(
cid,
new Peer.ResolveNodeHandler() {
public void onNext(Node node) {
List<Link> links = node.getLinksList();
for (int i = 0; i < links.size(); i++) {
String name = links.get(i).getName();
String address = links.get(i).getCid();
logger.log(Level.INFO, name + “: “ + address);
}
}
…
}
);
输出
README.txt: QmP8jTG1m9GSDJLCbeWhVSVgEzCPPwXRdCRuJtQ5Tz9Kc9
_Metadata.json: QmWXShtJXt6Mw3FH7hVCQvR56xPcaEtSj4YFSGjp2QxA4v
albums: QmUh6QSTxDKX5qoNU1GoogbhTveQQV9JMeQjfFVchAtd5Q
apolloarchivr.py: QmU7gJi6Bz3jrvbuVfB7zzXStLJrTHf6vWh8ZqkCsTGoRC
build_frontend_index.py: QmRSxRRu9AoJ23bxb2pFeoAUFXMAdki7RZu2T7e6zHRdu6
frontend: QmeQtZfwuq6aWRarY9P3L9MWhZ6QTonDe9ahWECGBZjyEJ
iOS
iOS的实现类似于Android。你可以在IPFS上添加和获取文件,也可以从网络查询节点。还有一些遗留的工作需要去做,以允许将节点添加到网络并确保所有API在适用的情况下都使用有效的数据流和异步APIs。 新增文件
NSString *path = [[NSBundle mainBundle] pathForResource:@”test” ofType:@”jpeg”];
NSInputStream *input = [[NSInputStream alloc] initWithFileAtPath:path];
[IpfsLiteApi.instance addFileWithParams:[[AddParams alloc] init] input:input completion:^(Node *node, NSError *error) {
if (error) {
// handle the error
} else {
// node represents the file now that it’s been addded to IPFS
}
}];
获取节点
[IpfsLiteApi.instance getNodeForCid:@”QmSnuWmxptJZdLJpKRarxBMS2Ju2oANVrgbr2xWbie9b2D”completion:^(Node *node, NSError *error) {
for (Link *link in node.linksArray) {
NSLog(@”%@ : %@”, link.name, link.cid);
}
}];
输出
README.txt : QmP8jTG1m9GSDJLCbeWhVSVgEzCPPwXRdCRuJtQ5Tz9Kc9
_Metadata.json : QmWXShtJXt6Mw3FH7hVCQvR56xPcaEtSj4YFSGjp2QxA4v
albums : QmUh6QSTxDKX5qoNU1GoogbhTveQQV9JMeQjfFVchAtd5Q
apolloarchivr.py : QmU7gJi6Bz3jrvbuVfB7zzXStLJrTHf6vWh8ZqkCsTGoRC
build_frontend_index.py : QmRSxRRu9AoJ23bxb2pFeoAUFXMAdki7RZu2T7e6zHRdu6
frontend : QmeQtZfwuq6aWRarY9P3L9MWhZ6QTonDe9ahWECGBZjyEJ
—END—
本文由IPFS原力区编译,原文链接:https://blog.textile.io/javascript-ios-android-grpc-ipfs-lite/
【IPFS原力区】
价值观:价值 共建 共享 荣耀
总部位于上海,聚集基于分布式网络&存储的众多技术大咖和爱好者,深耕基于 IPFS 的商业生态建设和社区发展。
每周二举办“分布式存储网络”主题沙龙,聚集了众多技术大咖和 IPFS 爱好者,通过持续输出全面、精细、优质的IPFS咨询和技术支持,将生态中的爱好者转化为IPFS支持者和参与者,共建IPFS生态的健康发展。