#plot #space #spartan #subspace #blockchain #read #farmer

nightly app spartan-farmer

这是一个为Subspace简化版Spartan证明空间变体的裸骨农民。

5个不稳定版本

0.3.0 2021年8月1日
0.2.1 2021年5月30日
0.2.0 2021年5月9日
0.1.1 2021年5月9日
0.1.0 2021年4月25日

#subspace 中排名 4

MIT/ApacheLGPL-3.0+

72KB
1.5K SLoC

spartan-farmer

Subspace网络区块链的证明概念农民

概述

注意: 代码未经审计,不可用于生产环境,使用风险自负。

此存储库是一个农民的实现,旨在与实现Spartan证明容量(PoC)共识的单独客户端一起工作。PoC是一个基于磁盘空间的共识的通用术语,包括空间证明、存储、时空和复制。农民在证明工作区块链中类似于矿工,但它不是浪费CPU周期,而是浪费磁盘空间。此代码的大部分基于我们早期的实现subspace-core-rust

此工作得到了Web 3 Foundation资助,用于开发Substrate框架的PoC共识。它专门设计用于与基于substrate-node-template的substrate客户端spartan-client一起使用。

Spartan是实现将Subspace作为Polkadot网络上的一条平行链的更大目标的垫脚石。Subspace是一个证明存储区块链,解决了农民的困境,了解更多请阅读我们的白皮书

关于绘图的一些注意事项

绘图时间

绘图时间大致与主机系统的核心数量和时钟速度成正比。平均而言,创建1GB绘图需要约1分钟,创建1TB绘图需要约18小时,但这些数字将取决于所使用的系统。这很大程度上独立于使用的存储介质(即HDD、SATA SSD、NVME SSD),因为它主要是一个CPU密集型任务。

磁盘磨损

某些PoC协议需要在磁盘上多次遍历才能绘图。例如,一个100GB的绘图实际上可能消耗几个TB的写入,并缩短磁盘的预期使用寿命。在Spartan中不是这样。绘图在启动时单次遍历创建。

存储开销

除了图表外,还使用RocksDB在磁盘上存储了一个小的二叉搜索树(BST)。这大约增加了1%的存储开销。因此,创建一个1GB的图表实际上会消耗大约1.01GB的存储空间。

使用Docker运行

使用spartan-farmer最简单的方法是使用容器镜像

docker volume create spartan-farmer
docker run --rm -it --mount source=spartan-farmer,target=/var/spartan subspacelabs/spartan-farmer --help

spartan-farmer是存储图表和身份的卷,它只需要创建一次。

手动安装和运行

除了Docker,您还可以通过使用cargo编译来本地安装spartan-farmer。

注意:目前这只能在Mac和Linux上工作,不支持Windows。

如果您之前尚未安装gmp_mpfr_sys crate,请按照以下说明进行操作。

Linux上的RocksDB需要LLVM/Clang

sudo apt-get install llvm clang

然后使用Cargo安装framer

cargo +nightly install spartan-farmer

注意:上述命令目前需要nightly编译器,如果您还没有安装,请确保安装它

rustup toolchain install nightly

使用方法

此处假设您已安装本地二进制文件,但也可以轻松地将它们适配到使用Docker。

使用--help来查找所有可用命令及其选项

spartan-farmer --help

创建新的图表

spartan-farmer plot <optional parameters> <piece-count> <seed>

这将创建一个1GB的图表

spartan-farmer plot 256000 test

有关所有支持的选项,请检查帮助

spartan-farmer plot --help

默认情况下,图表将写入操作系统特定的本地数据目录。

Linux
$XDG_DATA_HOME or                   /home/alice/.local/share
$HOME/.local/share 

macOS
$HOME/Library/Application Support   /Users/Alice/Library/Application Support

Windows
{FOLDERID_LocalAppData}             C:\Users\Alice\AppData\Local

启动农民

RUST_LOG=debug spartan-farmer farm

这将连接到本地节点,并尝试在每次槽通知时解决。

注意:在启动农民之前,您需要运行一个spartan-client节点,否则它将无法启动

设计

农民有两种模式:绘图和耕作。

绘图

  1. 从简短的种子创建一个创世块。
  2. 生成一个新的Schnorr密钥对,农民ID从公钥推导出来。
  3. 通过应用时间不对称的SLOTH排列来创建新的编码encode(genesis_piece, farmer_id, plot_index)
  4. 每个编码直接写入磁盘。
  5. 为每个编码创建一个承诺或标签,作为hmac(encoding, salt)存储在二叉搜索树(BST)中。

此过程目前在四核机器上每TiB大约需要36小时,但对于1 GiB绘图,应该只需要几秒钟到几分钟。

解决

一旦绘图完成,农民可以加入网络并参与共识。

  1. 连接到客户端并通过JSON-RPC订阅slot_notifications
  2. 给定全局挑战作为hash(epoch_randomness || slot_index)SOLUTION_RANGE
  3. 推导出本地挑战为hash(global_challenge || farmer_id)
  4. 在BST中查询与本地挑战最接近的标签。
  5. 如果它在SOLUTION_RANGE内,则返回一个SOLUTION,否则返回None

依赖关系

~68MB
~1.5M SLoC