2个版本
0.1.16-alpha.0 | 2023年4月2日 |
---|---|
0.1.12-alpha.0 | 2023年3月3日 |
#38 in #inter-process
用于 bitcoin-top
400KB
1K SLoC
Rust包描述: bitcoin-ipc
这个包是将相应的比特币C++代码库直接翻译成Rust的。因此,一些函数体可能仍在翻译过程中。
bitcoin-ipc
包包含在比特币系统中进行进程间通信(IPC)的功能。它提供了一个连接到其他进程并与其通信的接口,以及在需要时生成新进程。该包还包括用于管理IPC上下文和异常的实用程序。
此包的一个重要组成部分是 CapnpProtocol
结构体,它实现了比特币IPC的Cap'n Proto序列化协议。此协议提供了一种有效的方法来序列化和反序列化进程间通信中的数据,允许不同的进程快速轻松地交换信息。
Ipc
和 Process
结构体也是此包的重要组件,提供了连接和管理外部进程的功能。Ipc
结构体提供了一个连接到现有IPC端点的接口,而 Process
结构体允许生成和管理新进程。
最后,Exception
结构体提供了一种处理IPC操作过程中可能发生的异常的方法。
虽然 bitcoin-ipc
包中可能不涉及任何特定的数学方程或概念,但它提供的功能对于促进比特币系统中的进程间通信至关重要,允许有效地交换数据和不同进程之间的协调。
20> 什么是Cap-n Proto?为什么我们使用它?
Cap'n Proto是由Cloudflare的Kenton Varda开发的高性能、语言无关的序列化和RPC协议。它最初是为Cloudflare的DDoS保护服务开发的,但现在在许多不同的应用程序中得到广泛应用。
Cap'n Proto 设计得既快速又高效,重点关注最小化与序列化和反序列化相关的开销。它使用一种既紧凑又高效的二进制格式,允许系统之间更快地传输数据。此外,Cap'n Proto 支持直接内存映射,这使得数据可以直接从内存中访问,无需复制或解析。
在比特币系统的背景下,Cap'n Proto 被用作进程间通信(IPC)的序列化和通信协议。比特币系统使用多个进程,例如钱包进程和守护进程,而 Cap'n Proto 提供了一种快速高效的方式,使这些进程能够相互通信。这对于可扩展性和性能至关重要,因为它允许系统的不同部分在不同的机器或 CPU 上运行,同时仍然能够快速高效地通信。
21> 我们为什么选择它而不是其他序列化协议?
Cap'n Proto 在时间和空间复杂度方面设计得非常高效,这使得它在性能是主要关注点的情况下非常适合使用。Cap'n Proto 相比其他序列化协议的一些关键优势包括
-
极快:Cap'n Proto 设计得极快,无论是编码还是解码。其设计使其能够避免与其他序列化协议相关的许多开销,如内存分配和复制。
-
低内存开销:Cap'n Proto 使用零复制设计,这意味着它可以不分配任何额外的内存来序列化数据,除了数据本身所需的内存。这使得它在内存使用是关注点的场景中非常适合。
-
基于模式:Cap'n Proto 是基于模式的,这意味着它包括对正在序列化的数据的正式定义。这使得编码和反编码更加高效,以及更好的错误检查和验证。
-
互操作性:Cap'n Proto 是设计成语言和平台无关的,这意味着它可以用来在不同的语言和平台之间序列化数据。这使得它在系统的不同部分可能用不同的语言编写或在不同的平台上运行时成为一个好的选择。
22> 在比特币的背景下,我们如何在 IPC 中使用它?
在比特币的背景下,IPC(进程间通信)用于涉及比特币系统的不同进程之间的通信。具体来说,IPC 用于使比特币客户端(bitcoind)与其他进程,如比特币 GUI、比特币 RPC 和其他与比特币系统交互的应用程序之间的通信成为可能。
例如,比特币 GUI 通过 IPC 与 bitcoind 进程通信,以检索有关区块链状态的信息并启动交易。同样,比特币 RPC(远程过程调用)协议使用 IPC 允许外部应用程序与比特币客户端交互,例如检索有关区块链状态的信息、发送和接收交易以及查询挖矿活动的状态。
总的来说,IPC 是比特币系统的一个重要组成部分,因为它允许不同的进程相互通信和协调,从而实现了一系列的比特币应用程序和用例。
23> 比特币使用了哪些 IPC 技术?它们是如何工作的?
比特币使用各种 IPC 技术使系统的不同组件能够相互通信。以下是一些使用的技术及其工作方式
-
Unix 域套接字:Unix 域套接字是一种进程间通信(IPC)机制,允许在同一台机器上的进程之间进行通信。比特币使用 Unix 域套接字允许 bitcoind 进程和其他进程,如 bitcoin-cli,相互通信。
-
JSON-RPC:JSON-RPC是一种使用JSON编码的远程过程调用(RPC)协议。比特币使用JSON-RPC通过HTTP或Unix域套接字,允许外部应用程序与bitcoind通信。这就是比特币钱包和其他应用程序如何向bitcoind进程发送命令以执行各种任务,例如发送交易或查询区块链的方式。
-
ZeroMQ:ZeroMQ是一个高性能的消息库,支持广泛的消息模式。比特币使用ZeroMQ允许系统的不同组件发布和订阅各种事件。例如,当接收到新的交易或区块时,内存池和区块组件可以发布事件,而钱包或区块浏览器等其他组件可以订阅这些事件,以跟踪网络上的发生情况。
总的来说,IPC是比特币系统的重要组成部分,允许不同的组件之间相互通信,并协同工作以维护区块链的完整性。
24> 在比特币的背景下,Unix域套接字是如何工作的?
在比特币的背景下,Unix域套接字被用作比特币守护进程(bitcoind
)与其他进程(如比特币钱包或其他与比特币网络交互的应用程序)之间的进程间通信(IPC)方式。
Unix域套接字提供了一种快速、高效且安全的方式,在运行在同一台机器上的进程之间传输数据,而不需要网络通信。它们作为文件系统中的特殊文件实现,可以像普通文件一样读取和写入。
当比特币守护进程启动时,它会在一个已知位置创建一个Unix域套接字文件,通常是/tmp/bitcoin.sock
。然后,其他进程可以连接到这个套接字,使用比特币核心JSON-RPC API发送命令并接收响应。此API允许应用程序与比特币网络交互,发送和接收比特币交易,并查询区块链数据。
要连接到比特币守护进程的Unix域套接字,应用程序通常使用socket()
系统调用创建一个套接字文件描述符,然后使用connect()
系统调用连接到守护进程。一旦连接,应用程序可以通过将JSON-RPC消息写入套接字来向守护进程发送命令,并通过从套接字读取来接收响应。
Unix域套接字是Unix系统上常用的IPC机制,由于它们的效率和安全性优势,在比特币生态系统中得到了广泛使用。
25> 那ZeroMQ呢?它在比特币中是如何使用的?
ZeroMQ是比特币系统中用于进程间通信的另一个消息库。它提供了一种高级消息API,简化了复杂消息模式(如发布/订阅、请求/回复和推送/拉取)的实现。
在比特币系统中,ZeroMQ被各种组件用于相互通信,例如比特币核心守护进程和需要与其交互的外部应用程序。例如,外部应用程序可以使用ZeroMQ接收关于新区块或交易的实时通知,或从比特币核心守护进程请求特定数据。
ZeroMQ使用套接字在进程之间建立通信通道。这些套接字可以配置为使用各种消息模式,如发布/订阅、请求/回复和推送/拉取。一旦两个进程之间建立连接,它们就可以使用为套接字配置的消息模式相互发送和接收消息。
在比特币的情况下,通常使用ZeroMQ与发布/订阅模式,其中发布者进程(如比特币核心守护进程)向订阅者(如外部应用程序)发送消息,这些订阅者已订阅特定主题。当在该主题上发布新消息时,所有订阅的进程都会接收到该消息。这允许进程之间进行高效灵活的通信,而无需使用复杂的自定义消息协议。
依赖项
~104MB
~872K SLoC