TLDR:
- Solcial 旨在为用户提供最接近 Web2 社交媒体平台的体验,同时利用 Web3 技术。
- 任何基于区块链的平台面临的一个障碍是用户费用。 为了在维护隐私和共识的同时消除非代币操作的用户费用,Solcial 正在构建一个点对点 (P2P) 层,该层锚定在 Solana 并建立在 libp2p 之上。通过自我传递内容(提要、点赞、等等) -托管和点对点复制。
- 我们还开发了一种特殊类型的按钮,它与典型的桌面或移动应用程序共享相同的外部协议,并具有额外的优化功能,旨在处理数以万计的并发点对点应用程序,称为信标节点。 信标节点本质上是固定服务的集合,可以使用户的内容保持离线并提供给其他用户; 所有用户内容都存储在 IPFS 上,并通过 P2P 层访问,无需依赖审查服务器或网关。
介绍
这是一系列笔记中的第一篇,描述了 Solcial 协议的内部运作如何赋予其独特的抗审查特性,同时保持良好的数据交换性能。
本文重点介绍了 P2P 的工作原理,虽然本文是针对技术含量更高的读者,但我们仍然希望技术含量较低的 Solcial 追随者仍能在协议背后的技术中找到价值。
网络结构
节点通过公共互联网进行通信,使用 HyperView (1) 协议的修改版本形成特定于社交网络的覆盖网络。
每个节点维护一系列 Log2(N)+1 大小的活动对等点,其中 N 是整个网络的估计大小。 N 的值是通过查找注册到更新的用户帐户数量从区块链中得出的,并随着用户数量的增加而定期更新。与活动对等点的连接是稳定的、双向的和持久的,并且是它们在通话或任何其他 p2p 活动期间直接通信的节点。每个节点还维护一个大小为 6* (Log2(N) + 1) 的被动对等点列表,用作备用对等点,以防任何主动对等点断开连接或无响应。.活动对等连接的底层协议是带有 NOISE 加密的 QUIC(2),全部由 libp2p(3) 提供。
NAT 穿越是使用三种方法实现的,这三种方法取决于对等网络的网络环境。 第一种方法是尽可能使用 IPv6 而不是 IPv4,因为在这种情况下不需要 NAT,但统计上只有不到 40% 的 Internet 使用 IPv6(4)。
回退机制是通过使用 libp2p 的身份协议的 AutoNAT 向网络中的其他节点询问我们机器的显示地址。该地址由 NAT 后面的对等方初始化,已经通过他们的路由器注册到目标机器,但是在某些情况下这不起作用,那么我们又要选择第三个也是最可靠但昂贵的。
第三种选择是使用relay(5) 协议,libp2p 电路通过一个中间节点在NAT 后面的两个对等方之间转发数据包来模仿TURN(6) 协议的操作。这个角色可以由信令节点和一些具有公共 IP 的对等方选择作为具有配置限制的中继。更多关于本文后面的信号按钮的信息。
对等识别
使用他们的公钥以 multihash(7) 的形式识别对等点,该公钥等于他们在 Solcial 链上合约中注册的 Solana 钱包地址的公钥。 假设某个公共对等 ID 的唯一方法是拥有 ED25519 密钥对的密钥。
该密钥对还用于为在对等点之间传递的所有消息建立加密通道,以及验证可能由钱包所有者生成的消息的真实性的一种方式。
叠加成员资格
具有未在链上注册的公钥的节点将不允许加入 HyparView 网络覆盖,因此会自动被排除在 Solcial 点对点网络之外。
所有想要加入 Solcial p2p 的对等点都将向 topic/solcial/public 上的引导节点之一发送 JOIN 消息(其中一些引导节点也是信令节点)。 在 HyparView 中包含主题是我们对原始帖子的修改之一。
任何从对等点接收到 JOIN 请求的节点将首先验证链上是否存在多哈希并与 Solcial 帐户关联,然后向其中一个活动对等点发送 FORWARDJOIN 消息。其活动随机游走设置为 3,他们轮流将该消息传播给所有活动的对等方,将当前的跳数增加一,直到达到 3 跳。这是一种减轻针对引导节点的 DDoS 攻击的手段,也是一种有效的去中心化技术,可以尽可能地分散和随机化节点之间的连接。
第一个 JOIN 接收者 3 步内的任何节点都会向原始 JOIN 请求者发送 NEIGHBOR 消息,以在它们之间建立活动的持久连接。
每隔 15 秒,节点会周期性地向一个随机的主动节点广播一条 SHUFFLE 消息,其中包含其主动和被动节点的随机样本,并将消息的随机游走持续时间设置为 4。这样可以确保网络中的所有节点始终拥有每当他们的任何对等方无响应或明确断开连接时,他们可以将有关其他对等方的新信息存储在其被动视图中以进行网络修复。
有效的谈话
只有活跃的对等方参与在其他对等方之间传播消息。活跃的点对点应用程序在公共互联网上形成一个覆盖网络,节点之间的连接图中存在循环。为了在网络上的对等点之间实现高效的消息交谈,我们首先需要最小化对等点之间重复消息的传播,其次,找到消息的最佳路径。
这是通过使用流行广播树(8)算法来实现的,该算法形成对等点之间的最小生成树,通过将对等点划分为一组急切推送和惰性推送节点。 Eager-push 节点总是在任何节点收到转发的消息后立即收到。
惰性按钮每 500 毫秒定期接收当前节点看到的一堆消息 ID。每当一个节点观察到延迟推送批处理中有一个没有从其上游父节点接收到的消息 id 时,它就会重建(GRAFT)连接并恢复其活动推送状态。.这形成了最小生成树修复机制,以防其中一个节点发生故障并形成离散图。 Graft 消息恢复完整的网络连接。
每当发现接收到的消息与之前从活动节点接收到的消息重复时,到该节点的连接被视为图中的一个循环并转换为惰性。-通过发送 PRUNE 消息进行推送。
另一种丢弃活动连接并用惰性列表中的连接替换它的情况是,当我们观察到消息通过惰性节点到达我们的跳数比来自热切活动对等点的消息少 4 步时。这构成了广播树优化算法。
内容传播
前几节中描述的通过 p2p 协议传播的消息是 IPFS Bitswap(9) 消息,其 CID 为 Solcial 用户生成内容的 CID。为了更好地理解 Bitswap 和 IPFS 在 Solcial 中是如何使用的,我们先来描述一下用户配置文件的结构。
网络上的每个用户帐户都有一个称为配置文件索引的东西。该索引指示其内容的最新版本的 CID。索引是一个一致的序列 CRDT,最终形成账户执行操作的不可变日志。
记录索引可以被认为是一个链表,其中每个元素表示前一个元素的 CID,并且只有当它由帐户所有者的私钥签名时,它才会被对等点作为序列中的下一个元素接受。以这种格式编码的已发布个人资料提要的高级逻辑示例如下所示:
{
“author”: “12D3KooWSoeYKbpkb5UoL2T5eiomWRHdxR9cPC4tk11gKU89fFwT”,
“prev”: “QmYtUc4iTCbbfVSDNKvtQqrfyezPPnFvE33wFmutw9PBBk”,
“action”: “append-feed-post”,
“timestamp”: “2022–01–11T15:58Z”,
“params”: {
“content”: “QmV8cfu6n4NT5xRr2AHdKxFMTZEJrA44qgrBCr739BN9Wb”
“enckey”: “z2DhMLJmV8kNQm6zeWUrXQKtmzoh6YkKHSRxVSibscDQ7nq”
},
“signature”: “2Lpnvt23H6qHswCNPmwCCUSas7YNP[…]jV1dC9qdNPR4zDqsCuBX”
}
这样的条目有自己的 CID,并作为 HyparView/solcial/content 覆盖主题的 IPFS PB-DAG (10) 对象进行广播。通过递归查询用户可以获得完整内容和帐户历史记录的关联 CID,此条目链接到前一个条目和任何其他资产。
如果资产的签名与作者的公钥匹配,则该对象首先由任何对等方断言。如果签名验证失败,发送方对等方将因违反协议而被永久禁止进入当前节点。成功的签名验证会将内容传播给对此帐户生成的内容感兴趣的所有其他对等方。
当对等点收到这样的 CID 时,会将其添加到作者的活动日志中。作者执行的所有操作的总和构成了记录的当前状态。
默认情况下,每个按钮都会固定并播种自己的帐户内容和朋友内容。我们正在构建一些特殊的节点,作为我们称为信号节点的基础设施的一部分,它们就像普通用户的节点一样,除了他们对你的东西感兴趣。每个人,并作为一种特定于社交的在所有播种机当前离线的情况下,所有内容的 IPFS 固定服务。将它们视为每个人的朋友的按钮。网络可以在没有它们的情况下运行,但它们提供了额外的内容可用性层。
阅读权限
Solcial p2p 覆盖上的每个人都可以通过将 IWANT 和 IHAVE Bitswap 消息广播到具有帐户顶级根索引的 CID 的主题/solcial/内容来查询、下载和提供任何用户内容,然后递归地请求所有关联的 CID。
帐户的初始同步或获取帐户的最新条目是通过向 /solcial/sync 主题广播 HEAD 消息来实现的,其中其他对等方是播种者(包括节点。信令)以最新内容的 CID 响应他们知道。用户句柄和用户公钥之间的转换是通过查询 Solana 区块链来完成的。
上一个条目字段可用于解决冲突的 HEAD 并决定最近的条目。
写作权
为了能够写入帐户日志,用户必须拥有与其帐户 ID 对应的 ED25519 密钥对的私钥。 通过拥有该密钥,用户可以创建他们附加到日志中的条目的有效签名,该签名不会被网络上的其他对等方拒绝。
特权内容访问
某些用户发布的内容仅对选定的一组收件人可用,例如 1 级或 2 级订阅提要。这些帖子首先使用 AES-256 加密密钥进行加密。对称性。该密钥的事务密钥附加到原始帖子中的内容元数据。
密钥通过在与 libp2p 连接期间建立的 NOISE 加密通道传播到符合条件的对等点的随机子集。帖子作者可以选择允许信令节点也参与此密钥交换方案,以使所有用户的过程几乎是即时的,但如果他们认为他们的内容非常敏感,则不需要这样做。当合格的用户想要解密内容时,他们会使用加密密钥的散列向 overlay/solcial/keyexchange 主题发送 GETKEY 消息。
所有在线拥有该密钥的对等方将通过查询区块链并验证用户是否持有访问内容所需的令牌来检查对等方是否有资格接收该密钥。成功验证后,使用绕过 gossip 协议的直接 quic/noise 连接将密钥传输到请求对等方。
平台支持
这种用于抗审查内容的点对点协议仅适用于桌面和移动设备,不适用于 Web 界面。 这是由于浏览器限制。 浏览器本质上被设计为托管内容的消费者,它们的安全模型禁止接受来自其他机器的随机连接。
基本工程是使用 Rust、libp2p 实现的,并带有 React Native 和 Tauri(11) 的链接。
*解释
[1] Leitao, Joao, José Pereira, 和 Luis Rodrigues. “HyParView: A membership protocol for reliable gossip-based broadcast.”
[2] https://en.wikipedia.org/wiki/QUIC
[3] https://libp2p.io/
[4] https://www.google.com/intl/en/ipv6/statistics.html
[5] https://docs.libp2p.io/concepts/circuit-relay/
[6] https://datatracker.ietf.org/doc/html/rfc5766
[7] https://docs.libp2p.io/reference/glossary/#multihash
[8] Leitao, Joao, Jose Pereira, 和 Luis Rodrigues. “Epidemic broadcast trees.” 2007 26th IEEE International Symposium on Reliable Distributed Systems (SRDS 2007). IEEE, 2007.
[9] https://docs.ipfs.io/concepts/bitswap/
[10] https://github.com/ipld/ipld/blob/master/specs/codecs/dag-pb/spec.md
[11] https://tauri.studio/
关于Solcial
Solcial 是一个去中心化的社交网络,旨在通过允许彼此交互而无需担心审查并允许内容创建者根据市场价值获得公平奖励,从而赋予用户 Web3 的力量。
接触
Telegram: https://t.me/solcial
Discord: https://discord.gg/3EpaAbcRPp
Twitter: https://twitter.com/solcialofficial
Blog: https://blog.solcial.io/
Web: https://solcial.io
Email: [email protected]
Links: https://linktr.ee/solcial