{"content":{"title":"HolePounch学习","body":"<!--StartFragment-->\r\n\r\n本文主要来自对HolePounch官方文档的翻译和摘取，时间：2023.12\r\n\r\nHolePunch由一些工具组成。\r\n\r\n下面的基础模块黑色，辅助模块绿色，工具褐色。\r\n\r\n## **模块介绍：**\r\n\r\nHyperSwarm能够让声明一个同样“topic\"的节点连接起来。hyperDHT能让它们直接连接起来，即使这些节点在各自的局域网里有各种NAT(名字转换)。节点通过pubkey标识，而不是ip。所以这些节点即使在不同的网络间移动，也能被正确标识和连接。需要注意，如果client或server中一方位于随机NAT(randomizing NATs)，那就不能建立连接，因为此时连接需要由三方转发，HyperSwarm自身不做转发。例如keet自己实现了一个转发系统，能让其他的call参与者（如视频通话）进行转发，call的参与者越多，连接越牢固）。\r\n\r\n下面的例子都是有代码的，代码就略了。\r\n\r\n**HyperDHT**:\r\n\r\n是基于[Kademlia](https://pdos.csail.mit.edu/\\~petar/papers/maymounkov-kademlia-lncs.pdf)（也就是ETH, IPFS用的p2p）开发的。使用多种技术尽量保证节点之间的连接性。以公钥标记节点并寻址，而不是以IP。\r\n\r\n首先来尝试基于HyperDHT的，CLI的聊天app。client节点可以通过server节点的pubkey来连接和聊天。server创建密钥对，然后启动server，监听公钥。把公钥发给client。client启动服务，公钥作为参数，这样client就和server能连接上，发送信息了。\r\n\r\n**HyperSwarm**:\r\n\r\n让你能够以\"topic\"为目标发现并连接到节点。\r\n\r\n很多时候，更希望通过一个”topic“来连接多个节点。HyperSwam在HyperDHT之上抽象了更高级的接口。你可以”join“一个topic，可以自动发现节点，可以断线时自动重连。上个例子里有client和server，这个例子里要启动两个peer，加入同一个topic。首先在一个终端里运行代码，它会从参数中读取topic，没有的话就随机产生一个，并打印出来。然后在其他终端里运行代码，入参是刚才启动的topic，这样当在一个终端里打字时，其他终端都能看到。这里注意这些terminal并没有主次之分，大家都一样的join了同一个topic。\r\n\r\n**HyperCore**:\r\n\r\n安全，去中心化的,append-only的log，用来分享大型数据集，实时流数据。\r\n\r\nHyperCore只能被它的发布者更新。更新是通过一个私钥来签署的。HyperCore可以被分享给多个人读取。与BitTorrent不同的是，它发布后可以append修改，每当新块发布时，receiver 节点都能收到更新通知。\r\n\r\n上面HyperSwarm的例子里，大家必须同时在线才能看到彼此的消息。消息没有被保存，只要关闭程序，消息就没了。HyperCore可以解决这个问题。HyperCore是专门设计用来保存大量数据，或者实时数据流的，append-only的log系统。\r\n\r\n让我们用HyperCore为如上系统增加两个功能：\r\n\r\n1. HyperCore的owner可以任何时候向其添加msg，当它上线的时候，Reader们就可以通过HyperWarm获取到这些数据。\r\n2. 可以有多个reader，owner可以给每个reader两个key：\\\r\n   core.key用来授权reader读msg\\\r\n   core.discoverKey用来让reader发现owner。这个其实就是HyperSwarm里的topic而已。\r\n\r\n**CoreStore**:\r\n\r\n是HyperCore的工厂，用于管理大量命名的HyperCore。被设计用来高效地存储和发布很多有连接的HyperCore.\r\n\r\nHyperCore可以存储一个\"log\"，我们经常用CoreStore来组织存储多个log。例如用一个文件来管理整个项目中的“key\"，这些key每个都是一个HyperCore，来完成不同的功能。\r\n\r\n**HyperBee**：\r\n\r\n基于HypreCore的，append-only的B树，实现了key/value对保存的api，可以原子批量操作，可以创建排序的iterator。它是通过包装HyperCore实现的。\r\n\r\n例如在上面例子之上扩展，writter本地有100k数据字典的文件，它可以把这个字典存入HyperBee，用这个HyperBee生成CoreStore，用HyperSwarm把它广播到监听网络里。监听者可以获取CoreStore实例，然后本地化HyperBee，就可以获得这些数据字典了。HyperBee可以不把所有数据都下载过来，可以只下载被query到的数据。\r\n\r\n**HyperDrive**:\r\n\r\nHyperDrive是个实时的分布式文件系统。它也是包装HyperCore实现的。它里面保存了两个HyperCore，一个用来保存文件信息index，另一个用来保存文件内容。\r\n\r\n我们可以把一个本地文件夹镜像给HyperDrive，然后把它发布给reader节点。当我们往本地镜像文件夹增删改文件时，这些修改就会被同步发布到reader。MirrorDrive和LocalDrive这两个工具可以处理本地文件系统和HyperDrive之间的交互。\r\n\r\n**AutoBase**：\r\n\r\n开发中的功能，它可以自动把多个causally-linked HyperCore rebase成一个线性的HyperCore。它可以用于把高级的数据结构（如HyperBee）转换成multi-writer（多人可写的）数据结构。例如Keet的聊天室就是用这个实现的。\r\n\r\n**LocalDrive**：\r\n\r\n一个文件系统API工具，用来把本地文件镜像到HyperDrive，或者反之。\r\n\r\n**MirrorDrive**:\r\n\r\n把一个HyperDrive或localDrive映射为另一个。\r\n\r\n**SecretStream**:\r\n\r\n用于在HyperSwarm里安全地在两个节点间创建连接。可以作为独立的模块在两方之间建立加密通信。支持作为普通的读写的标准Stream，或基于libsodium's 的SecretStream的加密transaction传输。\r\n\r\n**Compact Encoding**\r\n\r\n一堆encoder/decoder，可以快速，小巧地进行解析和序列化等。\r\n\r\n**ProtoMux**\r\n\r\n多种Stream上面的，面向消息的协议。比如channel操作，在channel上发消息等。\r\n\r\n**HyperShell**\r\n\r\n一个在多个shell间p2p, end-to-end连接的命令行终端\r\n\r\n**HyperTele**\r\n\r\n基于HyperDHT的瑞士军刀工具。可以创建各种server,client的JSON的配置等。\r\n\r\n**HyperBeam**\r\n\r\n网络上端到端的加密的pipeline。为HyperSwarm实现Noise和加密通信。\r\n\r\n**HyperSSH**\r\n\r\n基于HyperDHT的ssh实现\r\n\r\n**Drive**\r\n\r\n对LocalDrive或HyperDrive进行下载，做种，Mirror操作的命令行工具。\r\n\r\n## **Keet**\r\n\r\n1. 用户创建密钥对并发布公钥至p2p网络（HyperSwarm）。\r\n2. 使用这个公钥，其他用户可以定位，并且（如果被授权）连接到你的节点，这称为distributed hole punching，这可以在没有中心化服务器的情况下完成。\r\n3. Keet使用网络中多个节点的部分信息来保证隐私（意思是在两方或多方通话中能够构建加密信道吧？）\r\n4. 一旦节点之间建立了连接，它们可以互相privately，安全地，直接交换数据，不通过任何中心服务器。\r\n5. 当你在keet里发消息时，不用特意去发给哪个节点。每个收到它的节点都会帮你转发，并且可以验证消息来自于你\r\n6. 当你下线了，所有的节点都会继续按你的意图帮你处理消息（serve your messages on your behalf.）。Keet整体上是以去中心化方式运行的，没有中心服务器。全部加密，隐私，只与你想要联系的人分享数据。\r\n\r\n<!--EndFragment-->"},"author":{"user":"https://learnblockchain.cn/people/13806","address":null},"history":null,"timestamp":1710039551,"version":1}