提供一个使用IPFS协议和工具与分布式Web进行交互的Dapp

来源:联萤萤得星际  作者:Gorka Ludlow  时间:2019-01-18

  2017年9月,我在Citrusbyte的团队开始了分布式应用程序的研究项目。我们设定了构建Vine-GIF共享应用程序分布式Vine的克隆版:

  Vine(/vaɪn/)是一种简短的视频托管服务,用户可以共享六秒钟的循环视频剪辑。
Vine @ Wikipedia

什么是分布式网络?

  回顾一下,分布式Web

  是一个坚实,可靠,私密和有趣的网站

  将是当前网络的演变,将解决我们当前云计算范例的许多不足之处

  将翻转数据所有权和相关的权力,将数据从大公司货币化到用户

  分布式网络将依赖于两个参与者:对等/节点和分布式应用。

点对点/节点到节点(P2P)

  分布式Web依赖于直接连接到其他设备的设备,这些设备可以称为对等设备或节点。任何使用过BitTorrent的人都已经体验过分布式网络。与从YouTube下载单个大型视频不同,可以同时从多个对等方下载小块目标文件。

分布式应用程序(DAPPS)

  分布式应用程序是基于这种新的分布式协议栈构建的应此类应用程序直接与网络中的其他对等方/客户端通信,并可存储它们在本地生成的大多数数据。

  这意味着在分布式Web中,数据与应用程序分开存在,因此网络效果不属于单个实体。我们拥有自己的数据,如果一个应用程序开始做我们不喜欢的事情,有人可以创建一个使用相同数据来解决问题的新应用程序。类似于电子邮件客户端的工作方式 - 相同的数据,不同的界分布式Web中的数据可以是私有的:Dapps可以选择永不在第三方服务器上存储数据。

区块链怎么样?

  如果您想知道Blockchain如何适应所有这些,答案是它是可选的。

  区块链通过可审计的分布式分类账为我们提供分布式共识。客户端服务器应用程序需要服务器端处理 - 数据验证,金融交易,任何类型的作弊预防 - 达普需要分布式共识。区块链是我们可以用来在不受信任的同伴网络之间调解可信交互的工具。

  然而,一些简单的Dapps不需要任何作弊预防。这样的Dapps可以在没有区块链的情况下建造。

规划我们的Dapp

  回顾一下,我们知道我们想建立一个Dapp。这意味着(在高层次上):

  每个节点都应该有自己的本地数据流

  用户应该能够在他们的个人流中创建新文件(在我们的例子中是GIF)

  其他节点应该能够使用来自流的数据 - 类似于BitTorrent帮助将内容重新分发到其他节点

  此外,我们为Dapp设计了一些其他设计目标:

  1. 没有下载的应用程序:我们的应用程序必须完全在浏览器中运行,而不是需要单独安装

  2. 没有集中化:我们的应用程序必须在完全分散的点对点范例中工作,不依赖于集中式服务器来实现任何功能

  这限制了我们一点。虽然Vine创建的视频文件使用Vine自己的专有视频格式,但我们的应用程序根本无法使用视频文件。我们必须拍摄并分享GIF。GIF格式虽然效率很低,但却受到普遍支持,而不同的浏览器会以不同的格式创建视频。由于我们不想使用集中式服务器对文件进行转码,因此我们不得不使用GIF。

这个调查

  我们知道要寻找什么:

  在对等体之间以P2P方式共享数据。

  维护对等体之间的共享数据结构。

  从发布新内容的同行接收实时更新。

  脱机第一功能:脱机工作(或处于间歇连接状态)。

  能够在设备重新联机时发布本地更新并同步远程更新。

  我们知道我们不需要实施最低级别的细节;许多团队已经在努力工作,为分布式Web奠定了一段时间的基础。他们在工作中投入了大量的资源,时间和情感。我们感谢他们所做的一切,并希望建立它,而不是重塑它。

  以下是我们为分布式Web构建协议和工具的项目。

IPFS

  一种点对点超媒体协议,使网络更快,更安全,更开放。

  它可以高效地分发大量数据。

  它提供了零重复数据的机制,可以节省存储成本。

  它提供历史版本控制(如git),可以轻松设置弹性网络以镜像数据。

  它仍然忠实于开放和平面网络的原始愿景,并提供可以构建使该愿景成为现实的应用程序的技术。

  它支持创建具有多种弹性的网络,无论是否具有Internet骨干网连接,都可实现持久可用性。

  它旨在取代HTTP并为我们所有人构建更好的网络。

数据项目

  Dat是分布式数据共享工具。

  分布式同步:Dat直接在设备之间同步和流式传输数据,使您可以控制数据的位置。

  高效存储:在版本之间对数据进行重复数据删除,从而降低带宽成本并提高速度。

  数据保存:Dat使用安全寄存器和最先进的加密技术来确保数据的可靠性,存档和保留。

安全的SCUTTLEBUTT

  Secure Scuttlebutt是一个不可伪造的仅附加源的数据库,针对对等协议的高效复制进行了优化。

  它提供了用于创建订阅源,向该订阅源发布消息,验证订阅源是由其他人创建,以及在订阅源之间传送消息的工具。不可伪造意味着只有Feed的所有者才能修改该Feed,这是通过数字签名强制执行的。

  它对于对等应用程序很有用。

  它可以轻松加密消息。

BLOCKSTACK

  Blockstack是一个新的分散式互联网,用户拥有自己的数据和应用程序在本地运行。

  拥有你的数据。它在您的设备上保留并加密,然后再在云中备份。这消除了对第三方盲目信任的需要,并使您更容易保证数据安全。

  拥有你的应用程序。应用程序通过安全的域名系统加载并在您的设备上运行。独立于第三方会让您更安全。

  拥有你的身份。您的数字密钥可以无缝生成并保存在您的设备上。这使您可以在应用程序之间自由移动并控制您的在线体验。

ZERONET

  使用比特币加密和BitTorrent网络的开放,免费和不可测试的网站。

  实时更新的网站。

  无密码基于BIP32的授权:您的帐户受到与您的比特币钱包相同的加密保护。

  具有P2P数据同步的内置SQL服务器:允许更轻松的站点开发和更快的页面加载时间。

最终,我们选择与IPFS合作。

  对于任何感兴趣的人,这是我们最初的研究文件:丛林研究。

  我的同事Chad邀请我试用IPFS PubSub Room演示。我们能够使用分布式Web作为骨干互相聊天 - 我很震惊,它正在工作!

  然后我们尝试了一些黑客攻击:我们克隆了js-ipfs回购并调整了他们的示例,看看我们是否可以通过他们的网络发布和分享我们的GIF。有效!

  我们找到了一个网络,提供了我们可以用于实验的工具。

奠定基础

  我们开始使用Dapp的基本步骤:

设置IPFS节点实例

  const node = new IPFS({ repo: String(Math.random() Date.now()) })node.once('ready', () => { console.log('IPFS node is ready') })

将文件添加到网络

  const gifSrc = 'GIF’s data url in a variable'const res = await node.files.add(Buffer.from(gifSrc))

  在这里,res[0].hash保存您提交的文件的IPFS唯一标识符。要测试刚刚添加的文件:https://ipfs.io/ipfs/${res[0].hash}

从网络中获取文件

  const stream = await node.files.cat(res[0].hash)

  在这里,stream保存最初添加的值,如GIF的数据URL。如何res[0].hash最终消费节点而不仅仅是生产节点是读者的练习。

在网络中查找同伴

  需要一个实验性功能来实现这一目标:

  const node = new IPFS({ repo: String(Math.random() Date.now()), EXPERIMENTAL: { pubsub: true }})node.once('ready', () => { const room = Room(ipfs, 'ipfs-pubsub-demo') room.on('peer joined', peer => console.log(`We found a peer: ${peer}`)) room.on('peer left', peer => console.log(`A peer left: ${peer}`))}))

  加入同一房间的任何两个节点都可以交换消息。

  // receiveroom.on('message', msg => console.log(`Got a message from ${msg.from}: ${msg.data.toString()}`))// broadcastroom.broadcast('Every peer in the room will receive this message')

同步共享数据结构

  在应用程序之间拥有共享数据结构(客户端应用程序可以是前端或后端 - 甚至是它们的混合)可能是一件棘手的事情。对我们来说幸运的是,一个名为YJSexists的工具,负责同步和计算数据的更新状态。

  更好的是,存在一个与YJS一起工作并与IPFS集成的模块:y-ipfs-connector。正确的目标:

  import Y from 'yjs'import yIPFSConnector from 'y-ipfs-connector'import yMemory from 'y-memory'import yArray from 'y-array'Y.extend(yMemory, yArray, yIPFSConnector)// create IPFS node instancesconst ipfs = new IPFS({ EXPERIMENTAL: { pubsub: true // need this to work }})const y = await Y({ db: { name: 'memory' }, connector: { name: 'ipfs', // use the IPFS connector ipfs: ipfs, // instance from above room: 'ipfs-shared-data-structure-demo', }, share: { list: 'Array' }})

  y.share.list现在保存共享数据结构(在这种情况下为数组)。为了添加或删除数组,任何对等方都可以使用相应的方法:

  y.share.list.push(['data to be inserted'])y.share.list.delete(indexToBeDeleted)

  要接收更新,同行需要观察对象:

  y.share.list.observe(() => { // when this method is executed, // the updated and computed state of the array can be accesed via y.share.list.toArray()})

  奠定了基础。是时候深入了解Dapp产品设计挑战了。

思维转变:无需身份验证的社区

  事情正在为我们努力!(大多数情况。我已经发布了一篇关于我们在途中遇到的一些龙的单独帖子;如果你想要血淋淋的细节,请查看它。)

  到目前为止我们取得的成就:

  拍摄GIF(事实证明这很有趣)

  在本地存储GIF

  将GIF添加到IPFS网络

  从IPFS网络中检索GIF

  在命名空间中将对等连接在一起

  同一个房间里的同伴们为他们的出版物共享一个类似阵列的结构

  对等方正在接收插入/删除发布到共享阵列中的其他对等方的实时更新

  大约在这个时候,Sam加入了我们的团队并设计了初始线框,帮助我们思考应用程序外观和功能的细节。后来Sarah加入了团队,并继续设计一个美丽的产品 - 我们喜欢它,迫不及待地想把它变为现实。我们的分布式Web实验可能感觉像一个真正的应用程序而不是玩具。

  在这一点上,我们遇到了挑战:我们还没有引入用户身份层。任何同行都可以删除任何由其他人发布的出版物甚至出版物。用户身份层是我们待办事项列表中即将推出的项目,但我们必须做出选择:我们要么研究如何实现用户身份层,要么使用我们提出的方法在应用程序的UI上工作至今。

  我们发现了许多用于构建用户身份的现有库/协议:MetaMask,Blockstack和SSB。分布式身份是一个引人入胜的话题。

  但最终,我们认为实施身份对我们的时间表来说风险太大。我们希望确保快速运送最小的可行产品。

  尽管如此,我们还是必须让匿名用户能够创建不会污染其他人的应用体验的内容。我们必须让用户控制他们在Thicket中看到和创建的数据。

  我们的解决方案:社区。

  丛林社区很好地反映了现实世界的社区。在丛林中,社区是一组同伴,他们共享社区内容的资源和责任。每个成员下载所有内容并将其存储在本地(共享磁盘空间资源),并将此类内容重新分发给任何其他获取内容的对象(共享带宽资源)。每个成员都负责发布到社区和从社区中删除的内容,并且必须注意他们允许加入社区的新成员。

  在丛林中,如果您是社区的一员,您并不孤单,社区就会退缩:您发布到社区的任何内容都会被下载并存储在其他成员的设备上。当您离线时,新邀请的社区成员仍然可以从打开该应用的任何其他社区成员处获取您的内容。

灌木丛后续步骤

  提供一个使用IPFS协议和工具与分布式Web进行交互的Dapp

  这个过程始于我们研究分布式Web的工具和协议的想法,最后我们提供了一个Dapp,它使用IPFS的协议和工具与分布式Web进行交互。

  该研究实验可以作为未来分散社交网络工作的起点。我们迈出了第一步,发现了一些问题,并找出了如何使用我们选择的工具。现在,您可以继续为分布式Web构建图层:Thicket。

您可能喜欢
Copyright © 2017 iIPFS.cn IPFS/FileCoin资讯站