p2p、分布式,区块链笔记: 通过libp2p的Kademlia网络协议实现kv-store

DHT 分布式哈希表 (Kademlia) 和一致性哈希 S/Kademlia 提出以上切实可行的解决方案,使得原有的 Kademlia 更具弹性。首先,通过结合公钥密码术使用加密谜题来限制 nodeId 生成。此外,我们通过兄弟列表扩展 Kademlia 路由表。这降低了桶分裂算法的复杂性,并允许 DHT 以安全复制的方式存储数据。最后,提出了一种查找算法,该算法使用多条不相交路径来提高查找成功率。 阅读详情

Kademlia 网络协议

  • Kademlia 是一种分布式哈希表协议和算法,用于构建去中心化的对等网络,核心思想是通过分布式的网络结构来实现高效的数据查找和存储。在这个学习项目里,Kademlia 作为 libp2p 中的 NetworkBehaviour的组成。

  • 以下这些函数或方法是根据 Kademlia 网络协议设计的,它们实现了基本的网络操作,包括获取数据记录、获取数据提供者、存储数据记录和开始提供数据等功能(这里只展示了项目中用到的函数,常用函数可以看libp2p Kademlia DHT 规范,更多函数可见如下图中的源码部分)。

在这里插入图片描述

1. get_record

kademlia.get_record(key, Quorum::One);
  • 作用: 从 Kademlia 网络中获取与指定 key 相关的记录。
  • 参数:
    • key: 要获取记录的键。
    • Quorum::One: 获取记录时所需的一致性要求,这里是指只需要从一个节点获取记录即可。
  • 实现逻辑:
    • 根据 Kademlia 协议,节点首先根据 key 计算出其对应的 K-bucket 或者具体的节点 ID,然后向网络中查找负责该 key 的节点。
    • 节点通过网络查询和消息传递机制,从负责节点处获取存储的记录。
    • 返回获取到的记录或者执行相应的处理逻辑。

2. get_providers

kademlia.get_providers(key);
  • 作用: 获取能够提供与指定 key 相关数据的节点信息(即数据的提供者)。
  • 参数:
    • key: 要获取提供者信息的数据的键。
  • 实现逻辑:
    • 类似于 get_record,节点根据 key 计算出其对应的 K-bucket 或者节点 ID。
    • 节点向网络发送查询请求,询问哪些节点能够提供与 key 相关的数据。
    • 返回能够提供数据的节点列表或者执行相应的处理逻辑。

3. put_record

let record = Record {
    key,
    value,
    publisher: None,
    expires: None,
};
kademlia.put_record(record, Quorum::One).expect("Failed to store record locally.");
  • 作用: 将指定的记录存储到 Kademlia 网络中。
  • 参数:
    • record: 包含要存储的数据信息的记录对象,包括 key(键)、value(值)、publisher(发布者,可能为空)、expires(过期时间,可能为空)等字段。
    • Quorum::One: 存储记录时的一致性要求,这里是指只需要将记录存储在一个节点即可。
  • 实现逻辑:
    • 节点根据 key 计算出对应的 K-bucket 或节点 ID。
    • 节点将 record 发送给负责存储该 key 的节点,并根据指定的一致性要求存储副本。
    • 返回存储成功或失败的结果,或者执行相应的处理逻辑。

4. start_providing

kademlia.start_providing(key).expect("Failed to start providing key");
  • 作用: 在 Kademlia 网络中开始提供指定 key 的数据。
  • 参数:
    • key: 要开始提供的数据的键。
  • 实现逻辑:
    • 节点将 key 注册为它可以提供的数据标识。
    • 当其他节点查询或需要该 key 的数据时,该节点将响应并提供相应的数据。
    • 返回启动提供成功或失败的结果,或者执行相应的处理逻辑。

kv数据库主体代码及注释

use async_std::io;
use futures::{prelude::*, select};
use libp2p::kad::record::store::MemoryStore;
use libp2p::kad::{
    record::Key, AddProviderOk, Kademlia, KademliaEvent, PeerRecord, PutRecordOk, QueryResult,
    Quorum, Record,
};
use libp2p::{
    development_transport, identity,
    mdns::{Mdns, MdnsConfig, MdnsEvent},
    swarm::SwarmEvent,
    NetworkBehaviour, PeerId, Swarm,
};
use std::error::Error;

#[async_std::main]
async fn main() -> Result<(), Box<dyn Error>> {
    env_logger::init();

    //  创建本地密钥,本地peer id和传输控制组件
    let local_key = identity::Keypair::generate_ed25519();
    let local_peer_id = PeerId::from(local_key.public());
    let transport = development_transport(local_key).await?;

    // 事件行为控制
    // We create a custom network behaviour that combines Kademlia and mDNS.
    #[derive(NetworkBehaviour)]// https://docs.rs/libp2p/latest/libp2p/swarm/trait.NetworkBehaviour.html
    #[behaviour(out_event = "MyBehaviourEvent")]//这个 "MyBehaviourEvent" 定义在下边的代码中
    // NetworkBehaviour这个trait将对所描述的结构体中的每个成员依次进行操作,例如 NetworkBehavior::poll它将首先轮询第一个结构成员,直到返回poll::Pending,然后再转到后面的成员。
    // 关于 #[behaviour(out_event = "MyBehaviourEvent")]中的out_event :The final out event. If we find a `#[behaviour(out_event = "Foo")]` attribute on the struct, we set `Foo` as the out event. Otherwise we use `()`.
    struct MyBehaviour {
        kademlia: Kademlia<MemoryStore>,
        mdns: Mdns,
    }


    #[allow(clippy::large_enum_variant)] //  #[allow()为Lint语法属性检查控制,https://doc.rust-lang.org/reference/attributes/diagnostics.html#lint-check-attributes    //关于large_enum_variant 详见https://rust-lang.github.io/rust-clippy/master/index.html#/large_enum_variant
    enum MyBehaviourEvent {
        Kademlia(KademliaEvent),
        Mdns(MdnsEvent),
    }
    // 实现(impl)块,用于为类型KademliaEvent实现了From trait,使其能够被转换为类型MyBehaviourEvent。
    impl From<KademliaEvent> for MyBehaviourEvent {
        fn from(event: KademliaEvent) -> Self {
            MyBehaviourEvent::Kademlia(event)
        }
    }
    // 实现(impl)块,用于为类型  MdnsEvent   实现了From trait,使其能够被转换为类型MyBehaviourEvent。
    impl From<MdnsEvent> for MyBehaviourEvent {
        fn from(event: MdnsEvent) -> Self {
            MyBehaviourEvent::Mdns(event)
        }
    }

    // Create a swarm to manage peers and events.
    let mut swarm = {
        // Create a Kademlia behaviour.
        let store = MemoryStore::new(local_peer_id);
        let kademlia = Kademlia::new(local_peer_id, store);
        let mdns = Mdns::new(MdnsConfig::default()).await?;
        let behaviour = MyBehaviour { kademlia, mdns };
        Swarm::new(transport, behaviour, local_peer_id)
    };

    // 从命令行读取指令并赋值给可变变量"stdin"
    let mut stdin = io::BufReader::new(io::stdin()).lines().fuse();

    // Listen on all interfaces and whatever port the OS assigns.
    swarm.listen_on("/ip4/0.0.0.0/tcp/0".parse()?)?;

    // Kick it off.
    loop {
        select! {
            line = stdin.select_next_some() => handle_input_line(&mut swarm.behaviour_mut().kademlia, line.expect("Stdin not to close")),
            event = swarm.select_next_some() => match event { // swarm.select_next_some() 是一个方法,用于从一个事件流中获取下一个事件,后续送到match进行匹配
                SwarmEvent::NewListenAddr { address, .. } => {//当发生新的监听地址事件时
                    println!("Listening in {:?}", address);
                },
                SwarmEvent::Behaviour(MyBehaviourEvent::Mdns(MdnsEvent::Discovered(list))) => {// 发生mDNS服务发现事件时
                    for (peer_id, multiaddr) in list {
                        swarm.behaviour_mut().kademlia.add_address(&peer_id, multiaddr);
                    }
                }
                SwarmEvent::Behaviour(MyBehaviourEvent::Kademlia(KademliaEvent::OutboundQueryCompleted { result, ..})) => {// 当发出的 Kademlia 查询完成时
                    handle_query_result(&result);
                }
                _ => {} // 通配符模式,执行一个空的代码块
            }
        }
    }
}

// 下面是两个辅助函数,一个根据不同的查询结果类型执行不同的逻辑,另一个处理从命令行输入的命令
fn handle_query_result(result: &QueryResult) {
    match result {
     ...
    }
}

fn handle_input_line(kademlia: &mut Kademlia<MemoryStore>, line: String) {
    let mut args = line.split(' ');

    match args.next() {
    ...
    }
}

两个辅助函数

处理从命令行输入的命令

  • 这段 Rust 代码定义了一个函数 handle_input_line,用于处理从命令行读取的输入 line,并根据命令执行相应的操作。函数通过分割输入行来解析命令和参数,处理缺少参数的错误情况,并根据命令调用传入的 Kademlia 网络实例 (kademlia) 的相应方法。
fn handle_input_line(kademlia: &mut Kademlia<MemoryStore>, line: String) {
    // 将输入行按空格分割为多个参数
    let mut args = line.split(' ');

    // 匹配第一个参数(命令)
    match args.next() {
        Some("GET") => {
            // 如果命令是 "GET"
            let key = {
                // 尝试获取下一个参数作为键
                match args.next() {
                    Some(key) => Key::new(&key), // 从字符串创建 Key 对象
                    None => {
                        // 如果未提供键,则打印错误并从函数返回
                        eprintln!("缺少键");
                        return;
                    }
                }
            };
            // 调用 Kademlia 网络的 get_record 方法,传入指定的键和 Quorum::One
            kademlia.get_record(key, Quorum::One);
        }
        Some("GET_PROVIDERS") => {
            // 如果命令是 "GET_PROVIDERS"
            let key = {
                // 尝试获取下一个参数作为键
                match args.next() {
                    Some(key) => Key::new(&key), // 从字符串创建 Key 对象
                    None => {
                        // 如果未提供键,则打印错误并从函数返回
                        eprintln!("缺少键");
                        return;
                    }
                }
            };
            // 调用 Kademlia 网络的 get_providers 方法,传入指定的键
            kademlia.get_providers(key);
        }
        Some("PUT") => {
            // 如果命令是 "PUT"
            let key = {
                // 尝试获取下一个参数作为键
                match args.next() {
                    Some(key) => Key::new(&key), // 从字符串创建 Key 对象
                    None => {
                        // 如果未提供键,则打印错误并从函数返回
                        eprintln!("缺少键");
                        return;
                    }
                }
            };
            let value = {
                // 尝试获取下一个参数作为值
                match args.next() {
                    Some(value) => value.as_bytes().to_vec(), // 将值转换为字节向量
                    None => {
                        // 如果未提供值,则打印错误并从函数返回
                        eprintln!("缺少值");
                        return;
                    }
                }
            };
            // 创建一个包含指定键、值及可选字段的 Record 对象
            let record = Record {
                key,
                value,
                publisher: None,
                expires: None,
            };
            // 在 Kademlia 网络中以 Quorum::One 一致性存储记录
            kademlia
                .put_record(record, Quorum::One)
                .expect("本地存储记录失败。");
        }
        Some("PUT_PROVIDER") => {
            // 如果命令是 "PUT_PROVIDER"
            let key = {
                // 尝试获取下一个参数作为键
                match args.next() {
                    Some(key) => Key::new(&key), // 从字符串创建 Key 对象
                    None => {
                        // 如果未提供键,则打印错误并从函数返回
                        eprintln!("缺少键");
                        return;
                    }
                }
            };
            // 在 Kademlia 网络中开始提供指定的键
            kademlia
                .start_providing(key)
                .expect("启动提供键失败");
        }
        _ => {
            // 如果命令不匹配预期的任何命令
            eprintln!("期望命令为 GET、GET_PROVIDERS、PUT 或 PUT_PROVIDER");
        }
    }

根据不同的查询结果类型执行不同的逻辑

fn handle_query_result(result: &QueryResult) {
    match result {
        QueryResult::GetProviders(Ok(ok)) => {
            for peer in &ok.providers {
                println!(
                    "Peer {:?} provides key {:?}",
                    peer,
                    std::str::from_utf8(ok.key.as_ref()).unwrap()
                );
            }
        }
        QueryResult::GetProviders(Err(err)) => {
            eprintln!("Failed to get providers: {:?}", err);
        }
        QueryResult::GetRecord(Ok(ok)) => {
            for PeerRecord {
                record: Record { key, value, .. },
                ..
            } in &ok.records
            {
                println!(
                    "Got record {:?} {:?}",
                    std::str::from_utf8(key.as_ref()).unwrap(),
                    std::str::from_utf8(&value).unwrap(),
                );
            }
        }
        QueryResult::GetRecord(Err(err)) => {
            eprintln!("Failed to get record: {:?}", err);
        }
        QueryResult::PutRecord(Ok(PutRecordOk { key })) => {
            println!(
                "Successfully put record {:?}",
                std::str::from_utf8(key.as_ref()).unwrap()
            );
        }
        QueryResult::PutRecord(Err(err)) => {
            eprintln!("Failed to put record: {:?}", err);
        }
        QueryResult::StartProviding(Ok(AddProviderOk { key })) => {
            println!(
                "Successfully put provider record {:?}",
                std::str::from_utf8(key.as_ref()).unwrap()
            );
        }
        QueryResult::StartProviding(Err(err)) => {
            eprintln!("Failed to put provider record: {:?}", err);
        }
        _ => {}
    }
}

fn handle_input_line(kademlia: &mut Kademlia<MemoryStore>, line: String) {
    let mut args = line.split(' ');

    match args.next() {
        Some("GET") => {
            let key = {
                match args.next() {
                    Some(key) => Key::new(&key),
                    None => {
                        eprintln!("Expected key");
                        return;
                    }
                }
            };
            kademlia.get_record(key, Quorum::One);
        }
        Some("GET_PROVIDERS") => {
            let key = {
                match args.next() {
                    Some(key) => Key::new(&key),
                    None => {
                        eprintln!("Expected key");
                        return;
                    }
                }
            };
            kademlia.get_providers(key);
        }
        Some("PUT") => {
            let key = {
                match args.next() {
                    Some(key) => Key::new(&key),
                    None => {
                        eprintln!("Expected key");
                        return;
                    }
                }
            };
            let value = {
                match args.next() {
                    Some(value) => value.as_bytes().to_vec(),
                    None => {
                        eprintln!("Expected value");
                        return;
                    }
                }
            };
            let record = Record {
                key,
                value,
                publisher: None,
                expires: None,
            };
            kademlia
                .put_record(record, Quorum::One)
                .expect("Failed to store record locally.");
        }
        Some("PUT_PROVIDER") => {
            let key = {
                match args.next() {
                    Some(key) => Key::new(&key),
                    None => {
                        eprintln!("Expected key");
                        return;
                    }
                }
            };

            kademlia
                .start_providing(key)
                .expect("Failed to start providing key");
        }
        _ => {
            eprintln!("expected GET, GET_PROVIDERS, PUT or PUT_PROVIDER");
        }
    }
}

运行示例

PS C:\Users\kingchuxing\Documents\learning-libp2p-main\rust> cargo run --example 04-kv-store
Listening in "/ip4/172.23.118.182/tcp/65055"
Listening in "/ip4/192.168.0.104/tcp/65055"
Listening in "/ip4/127.0.0.1/tcp/65055"
GET 123
Failed to get record: NotFound { key: Key(b"123"), closest_peers: [] }
PUT 123
缺少值
PUT 123 123456789
Failed to put record: QuorumFailed { key: Key(b"123"), success: [], quorum: 1 }
GET 123     
Got record "123" "123456789"
PUT_PROVIDER 234 //输入提供者
Successfully put provider record "234"
GET_PROVIDERS 234 //获取提供者
Peer PeerId("12D3KooWB7CFnrmeH5gzRxA4CYR2YTg2K3NMvNHP5dWDPFwAHY38") provides key "234"
GET 234
Failed to get record: NotFound { key: Key(b"234"), closest_peers: [] }
Kademlia协议原理简介(中文版).zip 这是中文版的Kad协议原理的介绍。Kademlia协议(以下简称Kad)是美国纽约大学的PetarP. Maymounkov和David Mazieres. 在2002年发布的一项研究结果《Kademlia: A peerto -peer information system based on the XOR metric》。简单的说,Kad 是一种分布式哈希表(DHT)技术,不过和其他 DHT 实现技术比较,如 Chord、CAN、Pastry 等,Kad 通过独特的以异或算法(XOR)为距离度量基础,建立了一种 全新的 DHT 拓扑结构,相比于其他算法,大大提高了路由查询速度。 立即下载

相关推荐

kademlia:kademlia路由协议的简单实现

概述 kademlia DHT 协议在 Java 中的可定制实现。 建造 Kademlia 使用带有 java 插件的 gradle 进行典型的 java 构建操作,典型的 gradle 工作流将构建这个项目。 以下是对一些特质的解释。 在尝试使用这个库之前阅读它们。 dfuntesting 依赖 暂时kademlia直接依赖dfuntest库进行测试。 不幸的是,它没有在任何地方发布,目前只是 Github 上的一个项目。 这将在未来改变,但现在需要将它包含到 gradle 多项目构建中。 假设 kademlia 存储库位于workspace/kademlia并且它是当前目录,请运行以下命令: cd ../ 从 github 的gregorias/dfuntesting克隆gregorias/dfuntesting touch settings.gradle; echo < "in

Kademlia协议

Kademlia是一种分布式哈希表(DHT),是第三代对等网络的节点动态管理和路由协议。 构建网络拓扑 Kad网络中的每个节点都会被分配唯一的节点ID,一般是160bit的二进制数。节点之间可以计算距离,节点距离以节点ID的XOR值度量: 因此,节点之间的距离越近,意味着节点ID的公共前缀越长。节点之间的距离以节点的最长公共前缀(cpl)为度量,cpl越大,表示两个节点越接近,例如节点 基于此,一个完整的网络空间可以被表示成为一颗如下图所示的二叉树,树的叶子节点代表网络节点,下图演示了使用3bit作为

Touale的博客 1896

Kademlia协议简介

Kad 是一种分布式哈希表(DHT)技术,不过和其他 DHT 实现技术比较,如Chord、CAN、Pastry 等,Kad 通过独特的以异或算法(XOR)为距离度量基础,建立了一种 全新的DHT 拓扑结构,相比于其他算法,大大提高了路由查询速度

Kademlia协议学习总结

0,本文主要涉及 主要为Kademlia协议学习笔记,以及个人的理解总结。 1,Kademlia几个关键点 1 网络逻辑结构 2 节点结构 3 RPC协议 4 节点加入移除更新算法 5 节点查询算法(包括路由算法,距离算法) 2,基本概念简介 分布式散列表(DHT),用来将一个关键值(key)的集合分散到所有在分布式系统中的节点,并且可以有效地将消息转送到唯一一个拥有查询者提供的关键值的...

ZBH的博客 1106

【OpenBMC 系列】4.启动流程 使用qume模拟ast2600-evb

1.安装openbmc适配的qume 2.启动bmc 3.使用bmc web

AiFool的博客 4459

ITK-snap医学图像标注方法(超级详细)——保姆级

医学3D图像标注方法,非常详细,保姆级

jialiyk的博客 3万+

以太坊 p2p网络——kademlia协议(一)

    Kademlia协议(以下简称Kad),是一种分布式哈希表(DHT,Distributed Hash Table)技术,不过和其他DHT实现技术比较,如Chord、CAN、Pastry等,Kad通过独特的以异或算法(XOR)为距离度量基础,建立了一种全新的DHT拓扑结构,相比于其他算法,大大提高了路由查询速度。     在Kademlia网络中,所有信息均以的哈希表条目形式加 以存储,这...

The future is already here it's just not evenly distributed。 3096

10分钟上手YOLOv11:最强姿态估计模型来了,代码开源,效果炸裂!

【10分钟玩转YOLOv11实时姿态估计】🚀 YOLOv11作为YOLO家族最新成员,在速度、精度和易用性上全面升级,尤其适用于姿态估计等复杂视觉任务。本文带您快速掌握: 1️⃣ 核心概念:姿态估计即识别人体17个关键点(如关节部位)并连接成数字骨架,是智能健身、体感游戏等应用的基础。 2️⃣ 技术优势: 超轻量级(最小仅2.9M参数) 极速推理(GPU仅1.7ms) 高精度(COCO mAP@50-95达50%) 3️⃣ 三步实操: ① 安装:pip install ultralytics ② 准备人物

weixin_41246802的博客 1787

易懂分布式 | Kademlia算法

近年来,区块链技术(部分人更愿意称之为分布式账本技术)的走红将分布式技术的概念带入大众的视野。区块链技术之所以备受追捧,一方面是其展现了一种在计算机的辅助下,人类可以以无中心、无权威、无层级的方式来进行社会协作的美妙前景;另一方面,从物理上可论证,分布式的简单协议,比中心化的复杂协议更为高效。分布式技术似乎能够在带来公平的同时,还带来效率。 要理解分布式技术并不困难,因为分布式技术并不高深,但其设计上往往巧妙得令人拍手称赞。 本文介绍一种常见而巧妙的分布式技术,Kademlia算法。 Kademlia

原创学无止尽 899

UG NX与PLC-1500的在环虚拟测试

TIA、PLCSIM、NetToPLCsim、KEPServerEX以及UG NX的在环虚拟测试

lvtlvtlvtlvt的博客 4218

【AUTOSAR SystemServices】深入解析StbM模块:功能定义、工作原理与代码实现

STBM模块:AUTOSAR同步时基管理核心解析 STBM(同步时基管理器)是AUTOSAR标准中实现车载系统时间同步的关键模块,主要功能包括: 时间基准管理:支持全局时基、偏移时基和纯本地时基三种类型,通过StbM_SetGlobalTime和StbM_SetOffset实现主从节点同步。 校正机制:采用偏移校正和速率校正算法(PPM级精度)补偿时钟偏差,确保多ECU时间一致性。 事件处理:监控时间跳变和超时事件,通过回调机制通知上层应用。 典型应用:用于CAN/Ethernet总线同步、时间触发调度及诊

1458

Kademlia Emule协议分析及和Bt协议的比较

Kademlia 是个 Petar Maymounkov 与 David Mazières 所设计的点对点 (P2P) 重叠网络传输协议,以达成非集中式的点对点 (P2P) 电脑网络。它规制了网络的结构及规范了节点间的通讯和交换资讯的方式。Kademlia 节点间使用传输通讯协定 UDP (请见OSI模型) 沟通。Kademlia 节点借以实作分布式杂凑表 (DHT,distributed

P2P 研究 思考 3734

R语言中的summarise函数和mutate函数用于计算分组占比。下面是关于这两个函数的详细介绍以及相应的源代码示例:

R语言中的summarise函数和mutate函数用于计算分组占比。

CodeByte的博客 1182

【go-libp2p源码剖析】DHT Kademlia 迭代查询

文章目录简介主要结构时序图函数说明runLookupWithFollowuprunQueryrunrecordPeerIsValuableconstructLookupResultspawnQueryqueryPeerdialPeerupdateStateisReadyToTerminateisLookupTerminationGetClosestNInStates 简介 query是整个dht的核心 主要结构 // query represents a single DHT query. type qu

KK下山去买菜 1737

LVS 负载均衡面试题及参考答案

什么是 LVS 负载均衡?它的主要作用是什么? LVS(Linux Virtual Server)是一个基于 Linux 内核的开源负载均衡项目。它通过将请求流量按照一定的算法分发到后端的多个真实服务器(Real Server)上,从而实现负载均衡的功能。 从原理上来说,LVS 工作在网络层和传输层之间。当客户端发起请求时,请求首先到达 LVS 服务器,LVS 会根据预先设定的规则和算法,比如轮询(Round - Robin)、加权轮询(Weighted Round - Robin)、最少连

大模型大数据攻城狮的专栏 1469

使用Matlab实现海洋监视雷达检测仿真

海洋监视雷达是一项重要的海洋探测技术,可以用于海上船只、飞机、潜艇等目标的探测和监视,具有广泛的应用价值。本篇文章将介绍如何使用Matlab进行海洋监视雷达的检测仿真,并提供相应的源代码。本篇文章提供了利用Matlab进行海洋监视雷达检测仿真的基本思路和代码实现。读者可以根据自己的需求进行修改和优化,以适应不同的应用场景。使用Matlab实现海洋监视雷达检测仿真。

2301_78484069的博客 448

js-libp2p-kad-dht:为libp2p提供高效Kad-DHT实现

js-libp2p-kad-dht:为libp2p提供高效Kad-DHT实现 项目介绍 js-libp2p-kad-dht 是一个为 libp2p 网络提供 Kad-DHT(Kademlia Distributed Hash Table)实现的JavaScript库。Kad-DHT 是一种分布式哈希表协议,用于在点对点网络中实现节点和内容之间的路由。该库作为libp2p的重要组成部分,支持节点查找...

gitblog_00838的博客 667

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

P2P网络-kademlia协议

提及去中心化区块链,P2P网络作为区块链系统的核心组件必然是每个区块链开发者应当了解的。本文旨在通过重点介绍以太坊P2P网络的Kademlia协议,抛砖引玉,希望有不同见解的读者在评论区做更深入的交流。

qq_34623248的博客 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

libp2p 快速开始

Libp2p是一个模块化的网络栈,通过将各种传输和P2P协议结合在一起,使得开发人员很容易构建大型、健壮的P2P网络。

西京刀客 4918

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

kademlia算法学习(区块链P2P网络设计)

如今很多P2P网络的实现都采用DHT的方式实现查找,其中Kademlia(简称Kad)算法由于其简单性、灵活性、安全性成为主流的实现方式。下面我们就来详细分析这个应用于比特币和以太坊P2P网络中的Kad算法。 1、节点的距离 Kad网络中每个节点都有一个160bit的ID值作为标志符,Key也是一个160bit的标志符,每一个加入Kad网络的节点都会被分配一个160bit的节点ID(nod...

跨链技术践行者 1万+

libp2p服务发现之 Multicast DNS(mDNS)

在libp2p中,mDNS和Kademlia DHT都是用于节点发现和连接管理的技术。当一个节点需要加入libp2p网络时,它可以通过mDNS和Kademlia DHT查找和连接其他节点,以建立对等网络。具体来说,mDNS通常用于在局域网中查找其他节点,而Kademlia DHT则是在广域网中查找其他节点。

西京刀客 3243

【go-libp2p源码剖析】DHT Kademlia协议消息处理

文章目录简介Protobuf结构定义Protobuf消息组装、发送(客户端)dht.getValueSingle(dht.go)dht.putValueToPeer(dht.go)dht.findProvidersSingle(dht.go)dht.findPeerSingle(dht.go)dht.Ping(dht.go)dht.Provide(routing.go)Protobuf消息发送Protobuf消息解码处理(服务端)handleFindPeerhandlePinghandleGetValueh

KK下山去买菜 2026

eMule中的分布式哈希表技术: Kademlia

前两天在网上看到世界知名的电骡服务器Razorback 2被查封、4人被拘禁的消息,深感当前做eMule / BitTorrent等P2P文件交换软件的不易。以分布式哈希表方式(DHT,Distributed Hash Table)来代替集中索引服务器可以说是目前可以预见到的为数不多的P2P软件发展趋势之一,比较典型的方案主要包括:CAN、CHORD、Tapestry、Pastry、Kademli...

weixin_34413357的博客 302

通俗讲解 Kademlia 原理

我这好久没有学术性的文章出现了。。翻看了下日志,最早的是07年发表的做PCB电路板的日志,之后是08年PHP网页制作,之后是09年C# 的GPS定位软件(虽然自己都没怎么用过。。。) 今天就通俗介绍一下一个最常用,最简洁,最实用P2P的索引算法---Kademlia协议(简称 Kad)。 使用BT 的同学经常会发现DHT这个缩写,使用电驴的同学就会发现KAD缩写。 DHT的全称叫哈希表(Dist

black0591 9130

Kademlia 协议原理简介

Kademlia 协议原理简介 (k7mmx@tom.com)一、前言  Kademlia协议(以下简称Kad)是美国纽约大学的PetarP. Maymounkov和DavidMazieres.在2002年发布的一项研究结果《Kademlia: A peerto -peer information systembased onthe XOR metric》。  简单的说,Kad 是一种

dozec(豆子)的专栏^^面朝大海,春暖花开 1339
上一篇: Rust学习笔记007:Trait --- Rust的“接口”
下一篇: 生物化学笔记:电阻抗基础+电化学阻抗谱EIS+电化学系统频率响应分析
FakeOccupational
博客等级 码龄6年 2万+粉丝 1727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值