HolePounch学习

  • maodaishan
  • 更新于 2024-03-10 10:59
  • 阅读 1014

HolePounch是一个组建p2p dapp的有力工具。 本文主要来自官方文档的翻译

<!--StartFragment-->

本文主要来自对HolePounch官方文档的翻译和摘取,时间:2023.12

HolePunch由一些工具组成。

下面的基础模块黑色,辅助模块绿色,工具褐色。

模块介绍:

HyperSwarm能够让声明一个同样“topic"的节点连接起来。hyperDHT能让它们直接连接起来,即使这些节点在各自的局域网里有各种NAT(名字转换)。节点通过pubkey标识,而不是ip。所以这些节点即使在不同的网络间移动,也能被正确标识和连接。需要注意,如果client或server中一方位于随机NAT(randomizing NATs),那就不能建立连接,因为此时连接需要由三方转发,HyperSwarm自身不做转发。例如keet自己实现了一个转发系统,能让其他的call参与者(如视频通话)进行转发,call的参与者越多,连接越牢固)。

下面的例子都是有代码的,代码就略了。

HyperDHT:

是基于Kademlia(也就是ETH, IPFS用的p2p)开发的。使用多种技术尽量保证节点之间的连接性。以公钥标记节点并寻址,而不是以IP。

首先来尝试基于HyperDHT的,CLI的聊天app。client节点可以通过server节点的pubkey来连接和聊天。server创建密钥对,然后启动server,监听公钥。把公钥发给client。client启动服务,公钥作为参数,这样client就和server能连接上,发送信息了。

HyperSwarm:

让你能够以"topic"为目标发现并连接到节点。

很多时候,更希望通过一个”topic“来连接多个节点。HyperSwam在HyperDHT之上抽象了更高级的接口。你可以”join“一个topic,可以自动发现节点,可以断线时自动重连。上个例子里有client和server,这个例子里要启动两个peer,加入同一个topic。首先在一个终端里运行代码,它会从参数中读取topic,没有的话就随机产生一个,并打印出来。然后在其他终端里运行代码,入参是刚才启动的topic,这样当在一个终端里打字时,其他终端都能看到。这里注意这些terminal并没有主次之分,大家都一样的join了同一个topic。

HyperCore:

安全,去中心化的,append-only的log,用来分享大型数据集,实时流数据。

HyperCore只能被它的发布者更新。更新是通过一个私钥来签署的。HyperCore可以被分享给多个人读取。与BitTorrent不同的是,它发布后可以append修改,每当新块发布时,receiver 节点都能收到更新通知。

上面HyperSwarm的例子里,大家必须同时在线才能看到彼此的消息。消息没有被保存,只要关闭程序,消息就没了。HyperCore可以解决这个问题。HyperCore是专门设计用来保存大量数据,或者实时数据流的,append-only的log系统。

让我们用HyperCore为如上系统增加两个功能:

  1. HyperCore的owner可以任何时候向其添加msg,当它上线的时候,Reader们就可以通过HyperWarm获取到这些数据。
  2. 可以有多个reader,owner可以给每个reader两个key:\ core.key用来授权reader读msg\ core.discoverKey用来让reader发现owner。这个其实就是HyperSwarm里的topic而已。

CoreStore:

是HyperCore的工厂,用于管理大量命名的HyperCore。被设计用来高效地存储和发布很多有连接的HyperCore.

HyperCore可以存储一个"log",我们经常用CoreStore来组织存储多个log。例如用一个文件来管理整个项目中的“key",这些key每个都是一个HyperCore,来完成不同的功能。

HyperBee

基于HypreCore的,append-only的B树,实现了key/value对保存的api,可以原子批量操作,可以创建排序的iterator。它是通过包装HyperCore实现的。

例如在上面例子之上扩展,writter本地有100k数据字典的文件,它可以把这个字典存入HyperBee,用这个HyperBee生成CoreStore,用HyperSwarm把它广播到监听网络里。监听者可以获取CoreStore实例,然后本地化HyperBee,就可以获得这些数据字典了。HyperBee可以不把所有数据都下载过来,可以只下载被query到的数据。

HyperDrive:

HyperDrive是个实时的分布式文件系统。它也是包装HyperCore实现的。它里面保存了两个HyperCore,一个用来保存文件信息index,另一个用来保存文件内容。

我们可以把一个本地文件夹镜像给HyperDrive,然后把它发布给reader节点。当我们往本地镜像文件夹增删改文件时,这些修改就会被同步发布到reader。MirrorDrive和LocalDrive这两个工具可以处理本地文件系统和HyperDrive之间的交互。

AutoBase

开发中的功能,它可以自动把多个causally-linked HyperCore rebase成一个线性的HyperCore。它可以用于把高级的数据结构(如HyperBee)转换成multi-writer(多人可写的)数据结构。例如Keet的聊天室就是用这个实现的。

LocalDrive

一个文件系统API工具,用来把本地文件镜像到HyperDrive,或者反之。

MirrorDrive:

把一个HyperDrive或localDrive映射为另一个。

SecretStream:

用于在HyperSwarm里安全地在两个节点间创建连接。可以作为独立的模块在两方之间建立加密通信。支持作为普通的读写的标准Stream,或基于libsodium's 的SecretStream的加密transaction传输。

Compact Encoding

一堆encoder/decoder,可以快速,小巧地进行解析和序列化等。

ProtoMux

多种Stream上面的,面向消息的协议。比如channel操作,在channel上发消息等。

HyperShell

一个在多个shell间p2p, end-to-end连接的命令行终端

HyperTele

基于HyperDHT的瑞士军刀工具。可以创建各种server,client的JSON的配置等。

HyperBeam

网络上端到端的加密的pipeline。为HyperSwarm实现Noise和加密通信。

HyperSSH

基于HyperDHT的ssh实现

Drive

对LocalDrive或HyperDrive进行下载,做种,Mirror操作的命令行工具。

Keet

  1. 用户创建密钥对并发布公钥至p2p网络(HyperSwarm)。
  2. 使用这个公钥,其他用户可以定位,并且(如果被授权)连接到你的节点,这称为distributed hole punching,这可以在没有中心化服务器的情况下完成。
  3. Keet使用网络中多个节点的部分信息来保证隐私(意思是在两方或多方通话中能够构建加密信道吧?)
  4. 一旦节点之间建立了连接,它们可以互相privately,安全地,直接交换数据,不通过任何中心服务器。
  5. 当你在keet里发消息时,不用特意去发给哪个节点。每个收到它的节点都会帮你转发,并且可以验证消息来自于你
  6. 当你下线了,所有的节点都会继续按你的意图帮你处理消息(serve your messages on your behalf.)。Keet整体上是以去中心化方式运行的,没有中心服务器。全部加密,隐私,只与你想要联系的人分享数据。

<!--EndFragment-->

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
maodaishan
maodaishan
0xee37...1912
江湖只有他的大名,没有他的介绍。