1个不稳定版本

0.1.0 2024年4月11日

#2918 in 魔法豆

MITGPL-3.0 许可证

1MB
25K SLoC

Raiden.rs

CircleCI codecov

使用Rust编写的非官方Raiden客户端实现

Raiden

为以太坊提供快速、低成本、可扩展的代币转账

雷登网络是一个链下扩展解决方案,可以实现几乎即时、低费用和可扩展的支付。它与以太坊区块链相辅相成,并可与任何ERC20兼容的代币一起工作。Raiden项目仍在进行中。其目标是研究状态通道技术,定义协议并开发参考实现。

关于本项目

本项目旨在实现Raiden协议作为一组框架组件,可以组合起来编写自己的Raiden兼容客户端,以实现不同的目的。此类客户端的示例可以是去中心化交易所、机器人等。

在本仓库中,您将找到的实现示例和文档将在实现完成后尽快提供。

文档

如果您是Raiden的新手,请随时访问官方Raiden文档,了解其是什么以及如何工作。

本项目使用Rust在单独的crates中实现了Raiden功能。

  • 原语:定义了各种原始数据类型和实用工具。
  • 状态机:这是最重要的crate,它通过状态变化处理完整的链状态及其转换。
  • 区块链:实现了各种以太坊特定功能,例如与链上合约的交互、签名和恢复以及将以太坊事件解码为状态变化。
  • 路径查找:实现了与路径查找服务交互的方式,以检索付款路线。
  • 网络:实现了Raiden协议消息和矩阵网络集成,以在节点之间通过有线交换消息。
  • 转换:充当中间人角色,处理所有传入的消息,并将这些消息作为状态变化分发到状态机,同时处理状态机产生的结果事件,以便在网络层发送。
  • API:一个高级API包,允许您与Raiden的组件交互,以触发各种Raiden特定功能,例如打开/关闭通道、存款与取款以及发起支付等。

代码bin目录提供了如何使用上述组件的示例,以将它们链接在一起。

  • Raiden客户端:使用所有上述包创建一个完全功能的Raiden客户端。
  • 状态重放器:使用状态机包重放Raiden节点存储中的状态变化以重新创建最新的链状态。这对于调试非常有用!
  • 代币操作:使用区块链包与Raiden代币合约进行交互。

Raiden.rs与官方Python客户端。

Raiden.rs的设计理念是具有不同的框架组件。这些组件可以混合匹配来构建针对您特定用例的Raiden功能,而Python客户端只能用作全节点,提供REST API以与单个以太坊账户上的节点交互。提供的REST API限制了在Raiden协议之上可以实施的功能。例如,假设您正在实施一个托管打赏机器人,用户相互发送打赏或小额支付(这是一个非常流行的有趣项目,几乎为每个存在的区块链都构建过)。对于您的用例,这意味着您的服务必须管理多个账户。您不必为每个客户端运行单个全节点,而可以实施单个节点,该节点处理多个账户。实现它的方法是

  • 每个账户都会有自己的状态机存储。
  • 当用户A从用户B发起支付时,两个状态机都会被加载到内存中。
  • 用户A的支付(ActionInitInitiator状态变化)将被分发到用户A的状态机。
  • A的状态机事件(SendLockedTransfer)不需要通过网络发送,而是内部转换为状态变化以进入B的状态机。
  • 在这种情况下,您自定义客户端提供的API将是通用的多账户API。

其他功能和自定义功能也是可能的,例如实施付费墙、机器人和支付服务。

Raiden.rs内部是如何工作的?

Raiden.rs是用Rust编写的,强调性能、类型安全和并发。它强制执行内存安全性——确保所有引用都指向有效的内存——而不需要使用垃圾收集器或引用计数,这在其他内存安全语言中是必需的。

此外,Raiden.rs被设计为异步运行,其底层由Tokio运行时提供支持。Tokio运行时在多线程运行时中处理运行不同的异步任务,这使得Raiden更具可扩展性。然而,为了保证不存在竞态条件,Raiden客户端将状态机包装在单个线程锁定库parking_lot中,这意味着需要更改状态机的状态变化的多个线程中的异步任务只能在没有其他任务持有锁的情况下进行。

之前提到的 区块链 crate 使用了 rust-web3,这也是一个与 tokio 兼容的库,它提供了与链上合约交互的功能,用于查询数据和提交交易。这个 crate 在 Raiden.rs 中被大量使用。

使用方法

安装 Rust

使用 rustup(推荐方法)

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

克隆仓库

git clone https://github.com/rakanalh/raiden.rs.git

构建 Raiden 客户端

cd raiden.rs
cargo build --release -p raiden

调用帮助命令以查看所有可用选项

./target/release/raiden --help

在本地测试链上运行 Raiden

export Address="0x551a3Ac81ca6c1780f8cD378dB33373f259D7200"

./target/release/raiden
  --chain-id 4321
  --datadir /path/to/datadir
  --keystore-path /path/to/keystore
  --address $Address
  --password-file /path/to/password_file.txt
  --eth-rpc-endpoint https://127.0.0.1:8545
  --eth-rpc-socket-endpoint ws://127.0.0.1:8546
  --pathfinding-service-address https://127.0.0.1:6000
  --matrix-server https://127.0.0.1:8008
  --log-config debug
  --api-address 127.0.0.1:3000
  --default-settle-timeout 40
  --default-reveal-timeout 20

依赖项

~83MB
~1.5M SLoC