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为如上系统增加两个功能:
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操作的命令行工具。
<!--EndFragment-->
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!