国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

使用 Async Rust 構(gòu)建簡單的 P2P 節(jié)點(diǎn)

這篇具有很好參考價(jià)值的文章主要介紹了使用 Async Rust 構(gòu)建簡單的 P2P 節(jié)點(diǎn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

使用 Async Rust 構(gòu)建簡單的 P2P 節(jié)點(diǎn)

P2P 簡介

  • P2P:peer-to-peer
  • P2P 是一種網(wǎng)絡(luò)技術(shù),可以在不同的計(jì)算機(jī)之間共享各種計(jì)算資源,如 CPU、網(wǎng)絡(luò)帶寬和存儲(chǔ)。
  • P2P 是當(dāng)今用戶在線共享文件(如音樂、圖像和其他數(shù)字媒體)的一種非常常用的方法。
    • Bittorrent 和 Gnutella 是流行的文件共享 p2p 應(yīng)用程序的例子。以及比特幣和以太坊等區(qū)塊鏈網(wǎng)絡(luò)。
    • 它們不依賴中央服務(wù)器或中介來連接多個(gè)客戶端。
    • 最重要的是,它們利用用戶的計(jì)算機(jī)作為客戶端和服務(wù)器,從而將計(jì)算從中央服務(wù)器上卸載下來。
  • 傳統(tǒng)的分布式系統(tǒng)使用 Client-Server 范式來部署
  • P2P 是另一種分布式系統(tǒng)
    • 在 P2P 中,一組節(jié)點(diǎn)(或?qū)Φ赛c(diǎn),Peer)彼此直接交互以共同提供公共服務(wù),而無需中央?yún)f(xié)調(diào)器或管理員
    • P2P 系統(tǒng)中的每個(gè)節(jié)點(diǎn)(或 Peer)都可以充當(dāng)客戶端(從其他節(jié)點(diǎn)請(qǐng)求信息)和服務(wù)器(存儲(chǔ)/檢索數(shù)據(jù)并響應(yīng)客戶端請(qǐng)求執(zhí)行必要的計(jì)算)。
    • P2P 網(wǎng)絡(luò)中的所有節(jié)點(diǎn)不必完全相同,一個(gè)關(guān)鍵特征將 Client-Server 網(wǎng)絡(luò)與 P2P 網(wǎng)絡(luò)區(qū)分開來:缺乏具有唯一權(quán)限的專用服務(wù)器。在開放、無許可的 P2P 網(wǎng)絡(luò)中,任何節(jié)點(diǎn)都可以決定提供與 P2P 節(jié)點(diǎn)相關(guān)的全部或部分服務(wù)集。

P2P 的特點(diǎn)

  • 與 Client-Server 網(wǎng)絡(luò)相比,P2P 網(wǎng)絡(luò)能夠在其上構(gòu)建不同類別的應(yīng)用程序,這些應(yīng)用程序是無許可、容錯(cuò)和抗審查的。
    • 無許可:因?yàn)閿?shù)據(jù)和狀態(tài)是跨多個(gè)節(jié)點(diǎn)復(fù)制的,所以沒有服務(wù)器可以切斷客戶機(jī)對(duì)信息的訪問。
    • 容錯(cuò)性:因?yàn)闆]有單點(diǎn)故障,例如中央服務(wù)器。
    • 抗審查:如區(qū)塊鏈等網(wǎng)絡(luò)。
    • P2P 計(jì)算還可以更好地利用資源。

P2P 的復(fù)雜性

  • 構(gòu)建 P2P 系統(tǒng)要比傳統(tǒng) Client-Server 的系統(tǒng)復(fù)雜
    • 傳輸:P2P 網(wǎng)絡(luò)中的每個(gè) Peer 都可以使用不同的協(xié)議,例如HTTP(s)、TCP、UDP等。
    • 身份:每個(gè) Peer 都需要知道其想要連接并發(fā)送消息的 Peer 的身份。
    • 安全性:每個(gè) Peer 都應(yīng)該能夠以安全的方式與其他 Peer 通信,而不存在第三方攔截或修改消息的風(fēng)險(xiǎn)等。
    • 路由:每個(gè) Peer 可以通過各種路由(例如數(shù)據(jù)包在 IP 協(xié)議中的分布方式)從其他 Peer 接收消息,這意味著如果消息不是針對(duì)自身的,則每個(gè) Peer 都應(yīng)該能夠?qū)⑾⒙酚傻狡渌?Peer。
    • 消息傳遞:P2P 網(wǎng)絡(luò)應(yīng)該能夠發(fā)送點(diǎn)對(duì)點(diǎn)消息或組消息(以發(fā)布/訂閱模式)。

P2P 的要求 - 傳輸

  • TCP/IP 和 UDP 協(xié)議無處不在,在編寫網(wǎng)絡(luò)應(yīng)用程序時(shí)非常流行。但還有其他更高級(jí)別的協(xié)議,如 HTTP(TCP上分層)和 QUIC(UDP上分層)。
  • P2P 網(wǎng)絡(luò)中的每個(gè) Peer 都應(yīng)該能夠啟動(dòng)到另一個(gè)節(jié)點(diǎn)的連接,并且由于網(wǎng)絡(luò)中 peer 的多樣性,能夠通過多個(gè)協(xié)議監(jiān)聽傳入的連接。

P2P 的要求 - Peer 身份

  • 與 web 開發(fā)領(lǐng)域不同,在 web 開發(fā)領(lǐng)域中,服務(wù)器由唯一的域名標(biāo)識(shí)(例如 www.rust-lang.org,然后使用域名服務(wù)將其解析為服務(wù)器的IP地址)
  • P2P 網(wǎng)絡(luò)中的節(jié)點(diǎn)需要唯一身份,以便其他節(jié)點(diǎn)可以訪問它們。
  • P2P 網(wǎng)絡(luò)中的節(jié)點(diǎn)使用公鑰和私鑰對(duì)(非對(duì)稱公鑰加密)與其他節(jié)點(diǎn)建立通信。
    • P2P 網(wǎng)絡(luò)中的節(jié)點(diǎn)的身份稱為 PeerId,是節(jié)點(diǎn)公鑰的加密散列。

P2P 的要求 - 安全

  • 加密密鑰對(duì)和 PeerId 使節(jié)點(diǎn)能夠與它的 peers 建立安全、經(jīng)過身份驗(yàn)證的通信通道。但這只是安全的一個(gè)方面。
  • 節(jié)點(diǎn)還需要實(shí)現(xiàn)授權(quán)框架,該框架為哪個(gè)節(jié)點(diǎn)可以執(zhí)行何種操作建立規(guī)則。
  • 還有需要解決的網(wǎng)絡(luò)級(jí)安全威脅,如 sybil 攻擊(其中一個(gè)節(jié)點(diǎn)運(yùn)營商利用不同身份啟動(dòng)大量節(jié)點(diǎn),以獲得網(wǎng)絡(luò)中的優(yōu)勢地位)或 eclipse 攻擊(其中一組惡意節(jié)點(diǎn)共謀以特定節(jié)點(diǎn)為目標(biāo),使后者無法到達(dá)任何合法節(jié)點(diǎn))。

P2P 的要求 - Peer 路由

  • P2P 網(wǎng)絡(luò)中的節(jié)點(diǎn)首先需要找到其他 peer 才能進(jìn)行通信。這是通過維護(hù) peer 路由表來實(shí)現(xiàn)的,該表包含對(duì)網(wǎng)絡(luò)中其他 peer 的引用。
  • 但是,在具有數(shù)千個(gè)或更多動(dòng)態(tài)變化的節(jié)點(diǎn)(即節(jié)點(diǎn)加入和離開網(wǎng)絡(luò))的 P2P 網(wǎng)絡(luò)中,任何單個(gè)節(jié)點(diǎn)都難以為網(wǎng)絡(luò)中的所有節(jié)點(diǎn)維護(hù)完整而準(zhǔn)確的路由表。Peer 路由使節(jié)點(diǎn)能夠?qū)⒉皇墙o自己準(zhǔn)備的消息路由到目標(biāo)節(jié)點(diǎn)。

P2P 的要求 - 消息

  • P2P 網(wǎng)絡(luò)中的節(jié)點(diǎn)可以向特定節(jié)點(diǎn)發(fā)送消息,但也可以參與廣播消息協(xié)議。
    • 例如,發(fā)布/訂閱,其中節(jié)點(diǎn)注冊(cè)對(duì)特定主題的興趣(訂閱),發(fā)送該主題消息的任何節(jié)點(diǎn)(發(fā)布)都由訂閱該主題的所有節(jié)點(diǎn)接收。這種技術(shù)通常用于將消息的內(nèi)容傳輸?shù)秸麄€(gè)網(wǎng)絡(luò)。

P2P 的要求 - 流多路復(fù)用

  • 流多路復(fù)用(Stream multiplexing)是通過公共通信鏈路發(fā)送多個(gè)信息流的一種方法。
  • 在 P2P 的情況下,它允許多個(gè)獨(dú)立的“邏輯”流共享一個(gè)公共 P2P 傳輸層。
    • 當(dāng)考慮到一個(gè)節(jié)點(diǎn)與不同 peers 具有多個(gè)通信流的可能性,或者兩個(gè)遠(yuǎn)程節(jié)點(diǎn)之間也可能存在多個(gè)并發(fā)連接的可能性時(shí),這一點(diǎn)變得很重要。
    • 流多路復(fù)用有助于優(yōu)化 peer 之間建立連接的開銷。

注意:多路復(fù)用在后端服務(wù)開發(fā)中很常見,其中客戶端可以與服務(wù)器建立底層網(wǎng)絡(luò)連接,然后通過底層網(wǎng)絡(luò)連接多路復(fù)用不同的流(每個(gè)流具有唯一的端口號(hào))。

Libp2p

  • libp2p 是一個(gè)由協(xié)議、規(guī)范和庫組成的模塊化系統(tǒng),它支持 P2P 應(yīng)用程序的開發(fā)。
  • 它目前支持三種語言:JS、Go、Rust
    • 未來將支持 Haskell、Java、Python等
  • 它被許多流行的項(xiàng)目使用,例如:IPFS、Filecoin 和 Polkadot 等。

Libp2p 的主要模塊

  • 傳輸(Transport):負(fù)責(zé)從一個(gè) peer 到另一個(gè) peer 的數(shù)據(jù)的實(shí)際傳輸和接收
  • 身份(Identity):libp2p 使用公鑰密鑰(PKI)作為 peer 節(jié)點(diǎn)身份的基礎(chǔ)。使用加密算法為每個(gè)節(jié)點(diǎn)生成唯一的 peer id。
  • 安全(Security):節(jié)點(diǎn)使用其私鑰對(duì)消息進(jìn)行簽名。節(jié)點(diǎn)之間的傳輸連接可以升級(jí)為安全的加密通道,以便遠(yuǎn)程 peer 可以相互信任,并且沒有第三方可以攔截它們之間的通信。
  • Peer 發(fā)現(xiàn)(Peer Discovery):允許 peer 在 libp2p 網(wǎng)絡(luò)中查找并相互通信。
  • Peer 路由(Peer Routing):使用其他 peer 的知識(shí)信息來實(shí)現(xiàn)與 peer 節(jié)點(diǎn)的通信。
  • 內(nèi)容發(fā)現(xiàn)(Content Discovery):在不知道哪個(gè) peer 節(jié)點(diǎn)擁有該內(nèi)容的情況下,允許 peer 節(jié)點(diǎn)從其他 peer 節(jié)點(diǎn)獲取部分內(nèi)容。
  • 消息(Messaging):其中發(fā)布/訂閱:允許向?qū)δ硞€(gè)主題感興趣的一組 peer 發(fā)送消息。

P2P 節(jié)點(diǎn)的身份

P2P Node

PeerId: 12d3k.....

~/rust via ?? base
? cargo new p2p
     Created binary (application) `p2p` package

~/rust via ?? base
? cd p2p

p2p on  master [?] via ?? 1.67.1 via ?? base
? c  # code .

p2p on  master [?] via ?? 1.67.1 via ?? base
?


公鑰和私鑰

  • 加密身份使用公鑰基礎(chǔ)設(shè)施(PKI),廣泛用于為用戶、設(shè)備和應(yīng)用程序提供唯一身份,并保護(hù)端到端通信的安全。
  • 它的工作原理是創(chuàng)建兩個(gè)不同的加密密鑰,也稱為由私鑰和公鑰組成的密鑰對(duì),它們之間具有數(shù)學(xué)關(guān)系。
  • 密鑰對(duì)有著廣泛的應(yīng)用,但在 P2P 網(wǎng)絡(luò)中
    • 節(jié)點(diǎn)使用密鑰對(duì)彼此進(jìn)行身份識(shí)別和身份驗(yàn)證。
    • 公鑰可以在網(wǎng)絡(luò)中與其他人共享,但決不能泄漏節(jié)點(diǎn)的私鑰。

公鑰和私鑰的例子 - 訪問傳統(tǒng)的服務(wù)器

  • 如果您想連接到數(shù)據(jù)中心的遠(yuǎn)程服務(wù)器(使用SSH),用戶可以生成密鑰對(duì)并在遠(yuǎn)程服務(wù)器上配置公鑰,從而授予用戶訪問權(quán)限。
  • 但遠(yuǎn)程服務(wù)器如何知道哪個(gè)用戶是該公鑰的所有者?
    • 為了實(shí)現(xiàn)這一點(diǎn),當(dāng)連接(通過SSH)到遠(yuǎn)程服務(wù)器時(shí),用戶必須指定私鑰(與存儲(chǔ)在服務(wù)器上的公鑰關(guān)聯(lián)的)。
    • 私鑰從不發(fā)送到遠(yuǎn)程服務(wù)器,但SSH客戶端(在本地服務(wù)器上運(yùn)行)使用用戶的私鑰向遠(yuǎn)程SSH服務(wù)器進(jìn)行身份驗(yàn)證。

Cmake

把 cmake 的路徑添加到 PATH

~ via ?? base
? cmake
Usage

  cmake [options] <path-to-source>
  cmake [options] <path-to-existing-build>
  cmake [options] -S <path-to-source> -B <path-to-build>

Specify a source directory to (re-)generate a build system for it in the
current working directory.  Specify an existing build directory to
re-generate its build system.

Run 'cmake --help' for more information.


~ via ?? base
?
use libp2p::{identity, PeerId};

#[tokio::main]
async fn main() {
    let new_key = identity::Keypair::generate_ed25519();
    let new_peer_id = PeerId::from(new_key.public());

    println!("New Peer ID is: {:?}", new_peer_id);
    // New Peer ID is: PeerId("12D3KooWF9nTF7cBU63Ac6ZEnvgzisRqjLwkc8BdM56Axxxxxxxx")
}

多地址(Multiaddresses)

  • 在 libp2p 中,peer 的身份在其整個(gè)生命周期內(nèi)都是穩(wěn)定且可驗(yàn)證的。
  • 但 libp2p 區(qū)分了 peer 的身份和位置。
    • peer 的身份是 peer id。
  • peer 的位置是可以到達(dá)對(duì)方的網(wǎng)絡(luò)地址。
    • 例如,可以通過 TCP、websockets、QUIC 或任何其他協(xié)議訪問 peer。
    • libp2p 將這些網(wǎng)絡(luò)地址編碼成一個(gè)自描述格式,它叫做 multiaddress(multiaddr)。
    • 因此,在 libp2p中,multiaddress 表示 peer 的位置。

多地址

  • 當(dāng) p2p 網(wǎng)絡(luò)上的節(jié)點(diǎn)共享其聯(lián)系信息時(shí),它們會(huì)發(fā)送一個(gè)保護(hù)網(wǎng)絡(luò)地址和 peer id 的多地址(multiaddress)。
  • 節(jié)點(diǎn)多地址的 peer id 表示如下:
    • /p2p/12D3KooWBu3fmjZgSmLkQ2p...
  • 多地址的網(wǎng)絡(luò)地址表示如下:
    • /ip4/192.158.1.23/tcp/1234
  • 節(jié)點(diǎn)的完整地址就是 peer id 和網(wǎng)絡(luò)地址的組合:
    • /ip4/192.158.1.23/tcp/1234/p2p/12D3KooWBu3fmjZgSmLkQ2p...

Swarm 和網(wǎng)絡(luò)行為

  • Swarm 是 libp2p 中給定 P2P 節(jié)點(diǎn)內(nèi)的網(wǎng)絡(luò)管理器模塊。
  • 它維護(hù)從給定節(jié)點(diǎn)到遠(yuǎn)程節(jié)點(diǎn)的所有活動(dòng)和掛起連接,并管理已打開的所有子流的狀態(tài)。

Swarm 的結(jié)構(gòu)和上下文環(huán)境

  • Swarm 代表了一個(gè)低級(jí)接口,并提供了對(duì) libp2p 網(wǎng)絡(luò)的細(xì)粒度控制。Swarm 是使用傳輸、網(wǎng)絡(luò)行為和節(jié)點(diǎn) peer id 的組合構(gòu)建的。
  • 傳輸(Transport)會(huì)指明如何在網(wǎng)絡(luò)上發(fā)送字節(jié),而網(wǎng)絡(luò)行為會(huì)指明發(fā)送什么字節(jié),發(fā)送給誰。
    • 多個(gè)網(wǎng)絡(luò)行為可以與單個(gè)運(yùn)行節(jié)點(diǎn)相關(guān)聯(lián)。
  • 需要注意的是,同一套代碼在 libp2p 網(wǎng)絡(luò)的所有節(jié)點(diǎn)上運(yùn)行,這與客戶端和服務(wù)器具有不同代碼庫的 Client-Server 模型不同。

問題解決:

https://stackoverflow.com/questions/52225498/strange-error-cannot-use-the-operator-in-a-function-that-returns

代碼

use libp2p::futures::StreamExt; // 異步流有關(guān)
use libp2p::swarm::{DummyBehaviour, Swarm, SwarmEvent};
use libp2p::{identity, PeerId};
use std::error::Error;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    let new_key = identity::Keypair::generate_ed25519();
    let new_peer_id = PeerId::from(new_key.public());
    println!("New Peer ID is: {:?}", new_peer_id);
    let behaviour = DummyBehaviour::default(); // 創(chuàng)建 網(wǎng)絡(luò)行為
    let transport = libp2p::development_transport(new_key).await?; // 使用密鑰對(duì)創(chuàng)建傳輸
    let mut swarm = Swarm::new(transport, behaviour, new_peer_id); // 創(chuàng)建Swarm
    swarm.listen_on("/ip4/0.0.0.0/tcp/0".parse()?)?;

    loop {
        match swarm.select_next_some().await {
            SwarmEvent::NewListenAddr { address, .. } => {
                println!("Listening on local Address {:?}", address)
            }
            _ => {}
        }
    }
}

Cargo.toml

[package]
name = "p2p"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
libp2p = "0.46.1"
tokio ={ version = "1.19.2", features = ["full"]}

運(yùn)行

p2p on  master [?] is ?? 0.1.0 via ?? 1.67.1 via ?? base 
? cargo run
   Compiling p2p v0.1.0 (/Users/qiaopengjun/rust/p2p)
    Finished dev [unoptimized + debuginfo] target(s) in 3.17s
     Running `target/debug/p2p`
New Peer ID is: PeerId("12D3KooWEzm5roUNjRgY2NfvFQBRhfYjRLsBQaDnDHdTBArhG3Qz")
Listening on local Address "/ip4/127.0.0.1/tcp/51422"
Listening on local Address "/ip4/192.168.0.100/tcp/51422"


p2p on  master [?] is ?? 0.1.0 via ?? 1.67.1 via ?? base 
? cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.15s
     Running `target/debug/p2p`
New Peer ID is: PeerId("12D3KooWEqEEHHZYTv3QeEMjGdyy5HrW2u43oPGDyfj118QRGDcA")
Listening on local Address "/ip4/127.0.0.1/tcp/51426"
Listening on local Address "/ip4/192.168.0.100/tcp/51426"

在 peer 節(jié)點(diǎn)之間交換 ping 命令

use libp2p::futures::StreamExt; // 異步流有關(guān)
use libp2p::ping::{Ping, PingConfig};
use libp2p::swarm::{Swarm, SwarmEvent};
use libp2p::{identity, Multiaddr, PeerId};
use std::error::Error;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    let new_key = identity::Keypair::generate_ed25519();
    let new_peer_id = PeerId::from(new_key.public());
    println!("New Peer ID is: {:?}", new_peer_id);

    let transport = libp2p::development_transport(new_key).await?; // 使用密鑰對(duì)創(chuàng)建傳輸
    let behaviour = Ping::new(PingConfig::new().with_keep_alive(true)); // 創(chuàng)建 網(wǎng)絡(luò)行為
    let mut swarm = Swarm::new(transport, behaviour, new_peer_id); // 創(chuàng)建Swarm
    swarm.listen_on("/ip4/0.0.0.0/tcp/0".parse()?)?;

    // 本地節(jié)點(diǎn)向遠(yuǎn)程節(jié)點(diǎn)發(fā)出連接  從命令行輸入的參數(shù)取出
    if let Some(remote_peer) = std::env::args().nth(1) {
        let remote_peer_multiaddr: Multiaddr = remote_peer.parse()?;
        swarm.dial(remote_peer_multiaddr)?;
        println!("Dialed remote peer: {:?}", remote_peer); // 打印遠(yuǎn)程地址
    }

    loop {
        match swarm.select_next_some().await {
            SwarmEvent::NewListenAddr { address, .. } => {
                println!("Listening on local Address {:?}", address)
            }
            SwarmEvent::Behaviour(event) => println!("Event received from peer is {:?}", event),
            _ => {}
        }
    }
}

運(yùn)行

p2p on  master [?] is ?? 0.1.0 via ?? 1.67.1 via ?? base took 17m 31.5s 
? cargo run
   Compiling p2p v0.1.0 (/Users/qiaopengjun/rust/p2p)
    Finished dev [unoptimized + debuginfo] target(s) in 2.35s
     Running `target/debug/p2p`
New Peer ID is: PeerId("12D3KooWEnxeFEWM3fvcNw8HV1tWojkmTaNVhrQfhPgL2REnngBS")
Listening on local Address "/ip4/127.0.0.1/tcp/51574"
Listening on local Address "/ip4/192.168.0.100/tcp/51574"
Event received from peer is Event { peer: PeerId("12D3KooWCEnQmgt6o5q9no2EfbpCU1xtyRFgRHjWJTiFdC3PTjB8"), result: Ok(Pong) }
Event received from peer is Event { peer: PeerId("12D3KooWCEnQmgt6o5q9no2EfbpCU1xtyRFgRHjWJTiFdC3PTjB8"), result: Ok(Ping { rtt: 193.542μs }) }


p2p on  master [?] is ?? 0.1.0 via ?? 1.67.1 via ?? base took 17m 3.0s 
? cargo run /ip4/127.0.0.1/tcp/51574               
    Finished dev [unoptimized + debuginfo] target(s) in 0.15s
     Running `target/debug/p2p /ip4/127.0.0.1/tcp/51574`
New Peer ID is: PeerId("12D3KooWCEnQmgt6o5q9no2EfbpCU1xtyRFgRHjWJTiFdC3PTjB8")
Dialed remote peer: "/ip4/127.0.0.1/tcp/51574"
Listening on local Address "/ip4/127.0.0.1/tcp/51582"
Listening on local Address "/ip4/192.168.0.100/tcp/51582"
Event received from peer is Event { peer: PeerId("12D3KooWEnxeFEWM3fvcNw8HV1tWojkmTaNVhrQfhPgL2REnngBS"), result: Ok(Pong) }
Event received from peer is Event { peer: PeerId("12D3KooWEnxeFEWM3fvcNw8HV1tWojkmTaNVhrQfhPgL2REnngBS"), result: Ok(Ping { rtt: 192.584μs }) }
Event received from peer is Event { peer: PeerId("12D3KooWEnxeFEWM3fvcNw8HV1tWojkmTaNVhrQfhPgL2REnngBS"), result: Ok(Ping { rtt: 448.375μs }) }

發(fā)現(xiàn) peer

  • mDNS 是由 RFC 6762(datatracker.ietf.org/doc/html/rfc6762)定義的協(xié)議,它將主機(jī)名解析為 IP 地址。
    • 在 libp2p 中,它用于發(fā)現(xiàn)網(wǎng)絡(luò)上的其他節(jié)點(diǎn)。
  • 在 libp2p 中實(shí)現(xiàn)的網(wǎng)絡(luò)行為 mDNS 將自動(dòng)發(fā)現(xiàn)本地網(wǎng)絡(luò)上的其他 libp2p 節(jié)點(diǎn)。
use libp2p::{
    futures::StreamExt, // 異步流有關(guān)
    identity,
    mdns::{Mdns, MdnsConfig, MdnsEvent},
    swarm::{Swarm, SwarmEvent},
    PeerId,
};
use std::error::Error;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    let new_key = identity::Keypair::generate_ed25519();
    let new_peer_id = PeerId::from(new_key.public());
    println!("New Peer ID is: {:?}", new_peer_id);

    let transport = libp2p::development_transport(new_key).await?; // 使用密鑰對(duì)創(chuàng)建傳輸

    let behaviour = Mdns::new(MdnsConfig::default()).await?; // 創(chuàng)建網(wǎng)絡(luò)行為

    let mut swarm = Swarm::new(transport, behaviour, new_peer_id); // 創(chuàng)建Swarm
    swarm.listen_on("/ip4/0.0.0.0/tcp/0".parse()?)?;

    loop {
        match swarm.select_next_some().await {
            SwarmEvent::NewListenAddr { address, .. } => {
                println!("Listening on local Address {:?}", address)
            }
            SwarmEvent::Behaviour(MdnsEvent::Discovered(peers)) => {
                for (peer, addr) in peers {
                    println!("discovered {} {}", peer, addr);
                }
            }
            SwarmEvent::Behaviour(MdnsEvent::Expired(expired)) => {
                for (peer, addr) in expired {
                    println!("expired {} {}", peer, addr);
                }
            }

            _ => {}
        }
    }
}

運(yùn)行文章來源地址http://www.zghlxwxcb.cn/news/detail-453376.html

p2p on  master [?] is ?? 0.1.0 via ?? 1.67.1 via ?? base took 7m 50.0s 
? cargo run
   Compiling p2p v0.1.0 (/Users/qiaopengjun/rust/p2p)
    Finished dev [unoptimized + debuginfo] target(s) in 2.46s
     Running `target/debug/p2p`
New Peer ID is: PeerId("12D3KooWNn7jV9VWPf4nH1MtABEjoTL1hp61C5m1SXA91nWyKtfv")
Listening on local Address "/ip4/127.0.0.1/tcp/51717"
Listening on local Address "/ip4/192.168.0.100/tcp/51717"
discovered 12D3KooWNkA9WyKhPBhJ8CNN9P11qgE9r4ZP1VbMyxM3DvUXkRxd /ip4/192.168.0.100/tcp/51718
discovered 12D3KooWNkA9WyKhPBhJ8CNN9P11qgE9r4ZP1VbMyxM3DvUXkRxd /ip4/127.0.0.1/tcp/51718
discovered 12D3KooWG9pdAXdJXQKF3KAMLfJVCbXcoxWzkQWFym3sCynUxsrF /ip4/192.168.0.100/tcp/51721
discovered 12D3KooWG9pdAXdJXQKF3KAMLfJVCbXcoxWzkQWFym3sCynUxsrF /ip4/127.0.0.1/tcp/51721

p2p on  master [?] is ?? 0.1.0 via ?? 1.67.1 via ?? base took 7m 10.2s 
? cargo run                         
    Finished dev [unoptimized + debuginfo] target(s) in 0.15s
     Running `target/debug/p2p`
New Peer ID is: PeerId("12D3KooWNkA9WyKhPBhJ8CNN9P11qgE9r4ZP1VbMyxM3DvUXkRxd")
Listening on local Address "/ip4/127.0.0.1/tcp/51718"
Listening on local Address "/ip4/192.168.0.100/tcp/51718"
discovered 12D3KooWNn7jV9VWPf4nH1MtABEjoTL1hp61C5m1SXA91nWyKtfv /ip4/192.168.0.100/tcp/51717
discovered 12D3KooWNn7jV9VWPf4nH1MtABEjoTL1hp61C5m1SXA91nWyKtfv /ip4/127.0.0.1/tcp/51717
discovered 12D3KooWG9pdAXdJXQKF3KAMLfJVCbXcoxWzkQWFym3sCynUxsrF /ip4/192.168.0.100/tcp/51721
discovered 12D3KooWG9pdAXdJXQKF3KAMLfJVCbXcoxWzkQWFym3sCynUxsrF /ip4/127.0.0.1/tcp/51721

p2p on  master [?] is ?? 0.1.0 via ?? 1.67.1 via ?? base 
? cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.16s
     Running `target/debug/p2p`
New Peer ID is: PeerId("12D3KooWG9pdAXdJXQKF3KAMLfJVCbXcoxWzkQWFym3sCynUxsrF")
Listening on local Address "/ip4/127.0.0.1/tcp/51721"
Listening on local Address "/ip4/192.168.0.100/tcp/51721"
discovered 12D3KooWNkA9WyKhPBhJ8CNN9P11qgE9r4ZP1VbMyxM3DvUXkRxd /ip4/192.168.0.100/tcp/51718
discovered 12D3KooWNkA9WyKhPBhJ8CNN9P11qgE9r4ZP1VbMyxM3DvUXkRxd /ip4/127.0.0.1/tcp/51718
discovered 12D3KooWNn7jV9VWPf4nH1MtABEjoTL1hp61C5m1SXA91nWyKtfv /ip4/192.168.0.100/tcp/51717
discovered 12D3KooWNn7jV9VWPf4nH1MtABEjoTL1hp61C5m1SXA91nWyKtfv /ip4/127.0.0.1/tcp/51717



到了這里,關(guān)于使用 Async Rust 構(gòu)建簡單的 P2P 節(jié)點(diǎn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 無需服務(wù)器:Android 應(yīng)用中使用 P2P 技術(shù)進(jìn)行局域網(wǎng)內(nèi)設(shè)備通信

    隨著局域網(wǎng)內(nèi)設(shè)備數(shù)量的不斷增加和不斷演化的 IoT 技術(shù),設(shè)備之間的互聯(lián)變得越來越重要。對(duì)于許多 Android 應(yīng)用程序而言,這樣的互聯(lián)性是必不可少的,需要使用一些技術(shù)來實(shí)現(xiàn)跨設(shè)備的通信。P2P 技術(shù)(點(diǎn)對(duì)點(diǎn)技術(shù))已證明是一種非常成功的通信技術(shù),可以實(shí)現(xiàn)在局域網(wǎng)內(nèi)

    2024年02月14日
    瀏覽(21)
  • P2P通信基本原理

    P2P通信基本原理

    在數(shù)字世界的脈絡(luò)中,點(diǎn)對(duì)點(diǎn)(P2P)技術(shù)如同一條悄無聲息的河流,流經(jīng)信息的每個(gè)角落,連接著世界各地的計(jì)算機(jī)和設(shè)備。這種去中心化的網(wǎng)絡(luò)模型,不僅打破了傳統(tǒng)的客戶端-服務(wù)器架構(gòu)的界限,還賦予了數(shù)據(jù)傳輸一種前所未有的自由和效率。通過P2P,每個(gè)參與者既是消費(fèi)

    2024年04月16日
    瀏覽(21)
  • 區(qū)塊鏈——p2p網(wǎng)絡(luò)模型

    ? ? ? ? 通常情況下,一個(gè)區(qū)塊鏈系統(tǒng)的P2P網(wǎng)絡(luò)層主要由以下幾部分組成。 ????????覆蓋網(wǎng)絡(luò)可以根據(jù)其對(duì)應(yīng)覆蓋圖的性質(zhì)分為兩類: 無結(jié)構(gòu)化覆蓋網(wǎng)絡(luò) 和 結(jié)構(gòu)化覆蓋網(wǎng)絡(luò) 。無結(jié)構(gòu)化覆蓋網(wǎng)絡(luò)通?;陔S機(jī)圖來建立節(jié)點(diǎn)隨機(jī)從覆蓋網(wǎng)絡(luò)中選取節(jié)點(diǎn)作為鄰居;而結(jié)構(gòu)化覆蓋

    2024年04月27日
    瀏覽(24)
  • P2P協(xié)議的傳輸藝術(shù)

    P2P協(xié)議的傳輸藝術(shù)

    TP 采用兩個(gè) TCP 連接來傳輸一個(gè)文件。 控制連接:服務(wù)器以被動(dòng)的方式,打開眾所周知用于 FTP 的端口 21,客戶端則主動(dòng)發(fā)起連接。該連接將命令從客戶端傳給服務(wù)器,并傳回服務(wù)器的應(yīng)答。常用的命令有:list——獲取文件目錄;reter——取一個(gè)文件;store——存一個(gè)文件。

    2024年02月07日
    瀏覽(17)
  • P2P 網(wǎng)絡(luò),PING程序。

    沒有廢話,直接上版本號(hào)和代碼,以及講解。 crate 版本號(hào) libp2p 0.52.1 tokio 1.30.0 Peer-to-Peer是一種網(wǎng)絡(luò)技術(shù)。一種點(diǎn)對(duì)點(diǎn)的通訊技術(shù)。沒有client-service概念。 在P2P網(wǎng)絡(luò)中,節(jié)點(diǎn)標(biāo)識(shí)被成為PeerId。

    2024年02月12日
    瀏覽(22)
  • 區(qū)塊鏈核心技術(shù)-P2P網(wǎng)絡(luò)

    點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)是區(qū)塊鏈中核心的技術(shù)之一,主要關(guān)注的方面是為區(qū)塊鏈提供一個(gè)穩(wěn)定的網(wǎng)絡(luò)結(jié)構(gòu),用于廣播未被打包的交易(交易池中的交易)以及共識(shí)過的區(qū)塊,部分共識(shí)算法也需要點(diǎn)對(duì)點(diǎn)的網(wǎng)絡(luò)支撐(如PBFT),另外一個(gè)輔助功能,如以太坊的消息網(wǎng)絡(luò),也需要點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)的

    2023年04月17日
    瀏覽(23)
  • 區(qū)塊鏈入門系列之P2P

    區(qū)塊鏈入門系列之P2P

    區(qū)塊鏈基本概念和名詞解釋 P2P 共識(shí)算法 梅克爾-帕特里夏樹 從零開始搭建區(qū)塊鏈 為什么前面講過P2P的概念了這里還要單獨(dú)起一篇文章來講解,因?yàn)榍懊嬷皇侵v解了P2P的基本概念,即各網(wǎng)絡(luò)節(jié)點(diǎn)間是直接或間接連接起來的。但這里面還涉及到很多網(wǎng)絡(luò)知識(shí),如果不清楚,是沒

    2023年04月19日
    瀏覽(27)
  • P2P DMA發(fā)展全景分析解讀

    P2P DMA(Peer-to-Peer Direct Memory Access)技術(shù)是一種允許連接到PCIe總線上的不同設(shè)備之間直接進(jìn)行數(shù)據(jù)交換的機(jī)制,無需通過CPU和系統(tǒng)內(nèi)存中轉(zhuǎn)。這一特性極大地提升了數(shù)據(jù)傳輸效率,減少了CPU負(fù)載,并在特定場景下優(yōu)化了系統(tǒng)性能。 歷史和發(fā)展: P2P DMA的概念早在NVMe SSD和RDMA技

    2024年01月21日
    瀏覽(25)
  • Android12 P2P 初始化

    目錄 ?學(xué)習(xí)資料:Android Miracast 投屏 1. 開機(jī)log 2.?WifiP2pService 啟動(dòng)

    2024年02月06日
    瀏覽(48)
  • OSPF的P2P和Broadcast

    OSPF的P2P和Broadcast

    OSPF(開放最短路徑優(yōu)先)協(xié)議中存在P2P(點(diǎn)對(duì)點(diǎn))和BROADCAST(廣播多路訪問)兩種網(wǎng)絡(luò)類型,主要是為了適應(yīng)不同類型的網(wǎng)絡(luò)環(huán)境和需求。具體分析如下: **P2P(點(diǎn)對(duì)點(diǎn))網(wǎng)絡(luò)類型**: 1. **適用于**:當(dāng)數(shù)據(jù)鏈路層協(xié)議為PPP(點(diǎn)對(duì)點(diǎn)協(xié)議)或HDLC(高級(jí)數(shù)據(jù)鏈路控制協(xié)議)時(shí),

    2024年04月14日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包