乐趣区

【Filecoin源码仓库全解析】第四章:存储需求方(用户)的配置操作

欢迎大家来到第四章,经过前章【Filecoin 源码仓库全解析】第三章(下):存储提供方(矿工)的配置操作的内容阅读后,我们应该会对 Filecoin 市场机制中的矿工对象有了更详细的认知,对矿工事务的生命周期有了具象化地理解。
本章,我们将重点介绍存储需求方(用户)的配置操作,并反过来验证第三章中存储矿工后续挖取新块的过程,帮助大家融会贯通,并在工程上验证整个挖矿行为的生命周期。
4.1 存储需求方(用户)
我们在 3.2 章节中,描述了 Filecoin 体系下的各个身份和角色,其中,存储客户(Storage clients)定位为想存储数据的需求方用户,也是 Filecon 所期望构建的双边市场中十分重要的一环,类比滴滴打车的乘车者。
Filecoin 存储市场(上帝)将以公开透明的方式,搭建一个被记录在链上的订单池,供所有存储需求方(客户)选择和匹配存储提供方(矿工)。
4.2 导入数据资源并获取 CID
在 Filecoin 存储网络之上,我们需要先将所存数据导入自身 Filecoin 节点客户端,并按照与 IPFS 很类似(应该是复用了)的处理流程进行了文件切片、散列处理和 DAG 建立,并生成子文件索引和内容 ID(即:CID,在 2.2 章详细介绍过)。
4.2.1 导入文本
echo “Hi my name is jialesoho”> jialesoho.txt

export CID=`go-filecoin client import ./jialesoho.txt`

# 反向验证是否成功导入
go-filecoin client cat $CID
4.2.2 导入图片
export CID=`go-filecoin client import ~/Desktop/your_test_img.jpg`

go-filecoin client cat $CID > image.png && open image.png
4.2.3 导入视频
export CID=`go-filecoin client import ~/Desktop/your_test_video.mp4`

4.3 查看 Ask 订单池
在 3.5 章节中,我们模拟了矿工角色,并成功发送了 ask 订单至 Filecoin 存储市场之中,这里,我们再启动一台机器模拟用户节点,对全网的 Ask 订单池进行查询,并根据存储端(矿工)报价选择交易对象:
go-filecoin client list-asks –enc=json | jq

执行上述命令,遍历订单池后,会得到形如下方的 json 对象,解释一下每个字段意义:
{

“Miner”: “fcqllepeqmcq9qnjff3rqfaz02ks8dvmandx4sa2d”,// 矿工 ID
“Price”: “2.5”,// 价格,单位 FIL/byte/block
“Expiry”: 588,// 多少区块高度后订单过期
“ID”: 0,// 同一个矿工 ID 可能具备多个 Ask 订单,用 ID 区分
“Error”: null//
}

如果需要在终端中依赖矿工 ID 来进行 control+ F 快速选定,建议直接键入 go-filecoin client list-asks
4.4 选订存储协议
当我们在 Ask 订单池上选定好心仪的订单和矿工 ID 后,便可通过如下指令签约了:
go-filecoin client propose-storage-deal <miner> <data> <ask> <duration>

miner:心仪的矿工 ID 信息
data:4.2 中所存数据的 CID 信息
ask:同一个矿工 ID 可能具备多个 Ask 订单,此数据在订单池中可查
duration:持续存储所经历的区块个数(平均 30s 一个新块产生,一天有效期大约需 2880 个新块)

注意:

因为是自己给自己灌数据,所以小编测试使用的是自己搭建的存储矿工节点,minerID:fcqllepeqmcq9qnjff3rqfaz02ks8dvmandx4sa2d,对应节点名称:jialesohoHK
小编资源有限,尽量保证这台机器(还是友商好心赞助的)能稳定在线,并将本节点所获取的所有 Mock FIL 收益用以长期创建 Ask 订单,便于大家可以直接接入测试,不需要再自己模拟一个存储端(矿工)机器了(经济下行,能帮大家省一些是一些)。

如下图所示,若选定存储协议成功,将直接更新订单状态为 accepted,并返回 DealID。

问题与勘误
如上图所示,大部分朋友可能会遇到:
Error: error creating payment: context deadline exceeded
这边小编复现了这个场景,并针对这个问题,和一些热心的读者交流(感谢詹总,东方风来、chinmusic),分析了一些可能造成的原因和解决方案,大家可以对号入座试试:
1)检查是否 FIL 金额足够
用户子弹不够 … 自然无法支付订单 …,请检查余额,或者不要传太大的数据,注意单价是按照 byte (FIL/byte/block) 来计算。
2)检查矿工节点状态
确保矿工节点在线,且是 mining 状态。
3)检查 P2P 连接状态
Filecoin 体系中,节点网络与 IPFS 节点网络拓扑类似,每一个节点的邻居集群是有限的,通过彼此的邻居来间接建立联系是很常见的,因此,很有可能矿工节点和用户节点彼此并不直接相连,而需要吐槽的是,在测试网阶段,官方建议我们在确保矿工节点在线的同时,也需要直接将两个节点相连接。
我们可以通过 minerAddrsID 来搜索矿工节点 ID,并通过节点 ID 搜索其网络地址 multiAddrs,并直接建立 P2P 连接操作如下:
export peerID=`go-filecoin addresss lookup minerID`

export multiAddrs=`go-filecoin swarm findpeer $peerID`

go-filecoin swarm connect $multiAddrs

注意:
目前测试网的出块收益是直接划到 worker 矿工账户下的,而我们看到,通过刚才上方描述的 p2p 连接过程,是可以通过 worker 矿工的 minerAddrsID 层层索引到对方节点的 IP 地址,这对于收益方是存在相当大的安全隐患。
这不,官方这段时间就做了如下调整,未来,将出块收益直接划到 owner 账户下,账户 ID 并不用暴露在交易市场中,提高了账户的安全性。
5)确保所存单份数据大小小于扇区容量
如果是 devnet-user,小于单个扇区所分配的 256MB 即可。
6)清空消息池
go-filecoin mpool ls | xargs -L1 go-filecoin mpool rm
具体缘由可追踪此 issue:https://github.com/filecoin-p…
4.5 发送数据并建立微支付通道
当我们使用 go-filecoin client propose-storage-deal <miner> <data> <ask> <duration> 接受订单后,用户节点将与存储端矿工节点建立微支付传输通道(防止单点故障,尽可能保证双方权益),即:传输百分之多少的 piece 数据,才支付对应百分之多少的 FIL 金额,这种微支付过程相当于把一手交钱一手交货这件事又做到了极致,拆分得更细小了,一直到最终整个文件传输完成。我们可以来看一下微支付中每个细分 Payments 的接口实现:
type Payments interface {
// 建立每个 pieceID 所对应的微支付事务
Setup(target Address, piece Cid, value TokenAmount) ID
// 生成链上支付凭证
MakeVouchers(id ID, start, end BlockHeight, count int) []Voucher
// 异常后恢复支付凭证
RedeemVoucher(v Voucher, proof Proof)
}
同时,为了防止女巫攻击,Filecoin 中节点与节点之间的数据传输,也会使用到 IPFS 中的 bitswap 模块(信用分系统)来过滤恶意节点和作弊节点。
之后,存储端矿工节点会在一定时间间隔(可配置,默认为 120 秒)自动启动密封(seal)过程,即:获取之前微支付通道中暂存区域的所有数据,并将其密封到矿工的承诺存储区域中。此时,订单状态将转为 staged。注意,此过生成 PoRep 和 PoSt 的生成,比较耗存储端矿工机器资源:

在密封完成并且矿工在链上生成凭证信息后,订单状态将移至 posted。
我们可以通过 go-filecoin client query-storage-deal <dealID> 来查询订单状态,也可以通过 go-filecoin client payments <dealID> 来查询这笔订单的链上凭证信息:
如下图所示:
4.6 在仪表盘中回看存储端状态
登录 Filecoin 网络仪表盘:http://user.kittyhawk.wtf:8010/
由于在第一章中,我们对存储端矿工节点设置了心跳链接,存储端矿工节点的数据信息会不间断地同步至 Filecoin 全网监控仪表盘上:

搜索了一下 jialesohoHK,找到了我们的存储端矿工节点信息,值得关注得是 StoragePower 与 ProvenStorage 两个参数此时都有了数值,我们的存储端矿工节点此时拥有了自己的算力:0.05%,即参与新块的生成的权益概率为万分之五,此值计算与存储量证明(Proof of Storage)逻辑强相关。
有机器资源多的朋友,可以在测试过程中增加存储交易订单成单量,从而拉高 ProvenStorage 数值,进而提高 StoragePower 算力,这样,后续参与出块的概率将大大增加。
同时,仪表盘也带给了我们许多其他统计,例如:近 30 天,IPFSMain(星际大陆团队)是测试矿工的主力军(有资源真心好),并且算力增长集中在 2 月 18-20 号左右,出块率提升显著,为优秀的中国矿工团队点赞!
扩展:PoSt 与 PoRep 的生命周期这块还没深挖,后面值得单独开章节研究,这里留个口子。

至此,我们也通过工程操作,反向验证了第三章中所描述的存储矿工生命周期。
我们将在下一章《【Filecoin 源码仓库全解析】第五章:检索服务(矿工)的配置操作》中介绍与存储市场并驾齐驱而又息息相关的检索市场,以及检索服务(矿工)的基本配置操作。
参考文献:

https://github.com/filecoin-p…
https://github.com/filecoin-p…

往期系列文章回顾:
【Filecoin 源码仓库全解析】第一章:搭建 Filecoin 测试节点【Filecoin 源码仓库全解析】第二章:如何创建账户钱包并获取 FIL Mock 代币【Filecoin 源码仓库全解析】第三章(上):存储提供方(矿工)的配置操作【Filecoin 源码仓库全解析】第三章(下):存储提供方(矿工)的配置操作
本章赞助品牌:

矿世大陆:一家专业的制造 IPFS 智能挖矿设备科技企业,提供智能硬件的设计、开发、制造及 OEM 生产服务,同时满足客户在挖矿环节的配套需求,提供轻钱包支持、POC 矿池支持、存证算力合约平台支持、矿场托管等综合性服务。为企业级客户提供整套商业模式输出、运营指导、市场指导、市值管理、商业落地方案,提供专属挖矿软件开发,系统维护、ERC20 代币制作、钱包开发、POC 矿池开发、算力合约平台开发等区块链矿业技术开发服务。公司总部位于华中地区最大的城市武汉,拥有最成熟完整的产业供应链,我们的服务辐射全球,用户遍及世界。我们置身于区块链革命的第一线,投身 IPFS 生态建设,我们坚信 IPFS 将为世界带来更好的上网体验,创造更大的商业价值。
感谢 矿世大陆 (http://www.ksminer.com/) 对 嘉乐 SOHO 的原创内容提供支持。
联系作者:
本人从业经验有限,不免有不足之处,欢迎指正和更多讨论,可私信微信公众号:jialesoho,或者加我微信:daijiale6239,如果觉得对您有帮助,可以帮点击好看推广和打赏支持噢,感激不尽!

(识别图中二维码,关注嘉乐 SOHO 微信公众号)

退出移动版