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
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节点,否则它将无法启动
设计
农民有两种模式:绘图和耕作。
绘图
- 从简短的种子创建一个创世块。
- 生成一个新的Schnorr密钥对,农民ID从公钥推导出来。
- 通过应用时间不对称的SLOTH排列来创建新的编码
encode(genesis_piece, farmer_id, plot_index)
- 每个编码直接写入磁盘。
- 为每个编码创建一个承诺或标签,作为
hmac(encoding, salt)
存储在二叉搜索树(BST)中。
此过程目前在四核机器上每TiB大约需要36小时,但对于1 GiB绘图,应该只需要几秒钟到几分钟。
解决
一旦绘图完成,农民可以加入网络并参与共识。
- 连接到客户端并通过JSON-RPC订阅
slot_notifications
。 - 给定全局挑战作为
hash(epoch_randomness || slot_index)
和SOLUTION_RANGE
。 - 推导出本地挑战为
hash(global_challenge || farmer_id)
。 - 在BST中查询与本地挑战最接近的标签。
- 如果它在
SOLUTION_RANGE
内,则返回一个SOLUTION
,否则返回None
。
依赖关系
~68MB
~1.5M SLoC