5 个版本 (3 个破坏性更新)
0.4.0 | 2022年11月5日 |
---|---|
0.3.0 | 2022年9月26日 |
0.2.1 | 2021年1月30日 |
0.2.0 | 2021年1月21日 |
0.1.0 | 2020年8月5日 |
#2378 在 魔力豆
每月55次 下载
在 5 个crate中使用(直接使用3个)
480KB
10K SLoC
nakamoto
Nakamoto 是一个在 Rust 中实现的隐私保护比特币轻客户端,注重低资源消耗、模块化和安全性。
项目的愿景是构建一组针对轻客户端功能的库,易于嵌入任何程序和任何平台,无论是移动端还是桌面端。项目的小型 CPU、内存和代码占用是由于其高效的运行时和最小依赖集而实现的。实现语言 Rust 打开了其他语言(例如 Swift、Python、Java)编写的程序通过外部函数接口(FFI)直接绑定到它的可能性。
[dependencies]
nakamoto = "0.4.0"
设计
Nakamoto 被拆分为几个 crate,每个 crate 都处理轻客户端协议的不同方面。虽然这些 crate 被设计成一起使用,但由于它们之间存在明确的边界,并且使用了 traits,因此交换实现变得非常简单。从高层次来看,我们有
nakamoto-client
:核心轻客户端库nakamoto-p2p
:协议状态机实现nakamoto-chain
:区块存储和分叉选择逻辑nakamoto-net
:由反应器实现使用的网络原语nakamoto-net-poll
:默认的 poll-基于网络后端nakamoto-common
:所有 crate 使用的公共功能nakamoto-node
:一个独立的轻客户端守护进程nakamoto-wallet
:基于以上crate构建的一个非常基础的仅查看钱包
有关上述内容的概述,请参阅docs
文件夹中的架构图。
状态
虽然该项目仍处于起步阶段,但基本功能已经实现。Nakamoto能够发现对等节点、下载和验证最长链并处理分叉,同时实现了完整的头部验证协议。
客户端块过滤(BIP 157/158)已实现并运行。请参阅nakamoto-wallet
了解如何使用它的示例。
自Bitcoin Core v26.0以来可用的点对点层加密(BIP 324),也将在Nakamoto中很快实现。
最后,将实现C FFI,以使其易于将客户端嵌入移动应用程序中。
尽管将逐步添加钱包功能,但这不是本项目的重点,该项目位于钱包一级之下。
项目目标
-
高保证:应使用现代技术如属性和基于模型的测试、离散事件模拟和模糊测试对库进行彻底测试。这些方法受益于I/O和协议逻辑的清晰分离,并且已被证明比单元测试可以捕获更多错误。
-
安全性:作为可能进入钱包实现的库,主要目标是安全性和可审计性。因此,我们尽量减少总依赖性足迹,保持代码易于阅读,并禁止任何不安全代码。
-
效率:区块链同步应尽可能高效,以低内存、磁盘和带宽开销为目标。我们针对资源受限的环境,如移动设备。
-
隐私:当可能时,应采用保护隐私的技术。应使用客户端块过滤(BIP 157/158)而不是布隆过滤器(BIP 37),以确保用户隐私并提供审查抵制。
运行测试
cargo test --all
运行守护进程
cargo run --release -p nakamoto-node -- --testnet
贡献
如果您想为Nakamoto的开发做出贡献,请与我们联系!否则,请阅读贡献指南。
捐赠
为了资助项目并确保其持续的开发和维护,您在以下地址的比特币支持将受到赞赏
bc1qa47tl4vmz8j82wdsdkmxex30r23c9ljs84fxah
动机
观察那些对轻客户端不友好的生态系统——例如以太坊——我们看到,绝大多数用户在网络上进行交易时被迫信任第三方。这与区块链的理念和raison d'être完全相反,并且带来了巨大的安全和隐私风险。不幸的是,这是由于在协议层面以及可用实现方面对轻客户端的支持不足。轻客户端对于普通用户能够安全地与像以太坊或比特币这样的网络接口是必要的。
为此,Nakamoto被视为一个客户端,可以在任何移动设备上高效运行,在给定约束条件下实现最高标准的隐私和安全。
许可
在MIT许可下发布。© 2020 Alexis Sellier (https://cloudhead.io)
lib.rs
:
Nakamoto的 peer-to-peer 库。
p2p
crate实现了核心协议状态机。它可以在fsm模块下找到。
Nakamoto对点对点协议的实现是I/O-free。核心逻辑以状态机形式实现,具有输入和输出以及一个不执行任何网络I/O的步骤函数。
这样做的原因是为了使协议代码易于阅读和测试。没有I/O操作可以最小化协议中可能出现的错误状态和错误处理代码,并允许实现一个完全确定的协议。这意味着失败的测试可以始终重现,并且可以达到100%的测试覆盖率。
为了实现这一点,网络I/O的处理被清晰地分离到一个网络reactor中。请参考nakamoto-net-poll
crate以获取reactor的示例。
依赖项
~9MB
~124K SLoC