本文将向你展示如何通过与存储矿工进行存储交易来存储数据到 Filecoin 存储网络。

文章导读:

Filecoin 是一个去中心化的存储市场,客户端把数据存储到满足他们要求的矿工的矿机上。客户发送存储订单 ,矿工可以选择接单或者拒绝节点(假如觉得不划算)。 一旦矿工接收了订单,客户端就开始发送数据,整个存储交易就开始了。

注:在开始存储数据之前,你先得确保你的计算机上已经安装了 Filecoin 并且运行了守护进程。否则请先阅读我们之前的文章: IPFS 系列03-搭建 Filecon 挖矿节点

下载测试数据

官方的 GitHub 有个项目专门提供了各种测试数据供用户测试,直接打包下载下来即可:

https://github.com/filecoin-project/sample-data/archive/master.zip

我这里直接下载到我的 home 目录

wget https://github.com/filecoin-project/sample-data/archive/master.zip # 下载
unzip master.zip # 解压

导入数据到 Filecoin 本地实例

这里我们随便导入一张图片:

export CID=`go-filecoin client import ~/sample-data-master/camel.jpg`

然后我们验证是否导入成功,查看一下:

go-filecoin client cat $CID > image.png

打开 image.png, 如果跟导入之前一样,就说明导入成功了。

发送存储交易

导入数据后,你可以查看矿工提供的可用订单。目前官方没有提供自动撮合交易服务,你需要自己手动选择存储在哪个矿工那里。

我们先查看所有可用订单(ask order):

go-filecoin client list-asks --enc=json | jq

或者你也可以指定获取某个矿工发布的订单,比如我的矿工 ID 是 fcqdzp28x8vnph7aedzw3pwlpwrnxjh77zayx75c5

go-filecoin client list-asks --enc=json |grep "fcqdzp28x8vnph7aedzw3pwlpwrnxjh77zayx75c5" |jq

上述命令返回的是一个列表,列表元素的数据结构是 JSON 对象,我们用 jq 工具把格式化成可读性较高的格式:

{
  "Miner": "fcqdzp28x8vnph7aedzw3pwlpwrnxjh77zayx75c5",
  "Price": "0.000000001",
  "Expiry": 36257,
  "ID": 1,
  "Error": null
}

你只需从列表中随便选择一个交易就 OK 了,目前不同矿工之前唯一不同的特征就是价格,将来矿工将具有其他特征。

创建矿工你需要传入 4 个参数:

参数名称 参数说明
{miner} 矿工地址
{data} 导入数据的 CID
{ask} 订单 ID,通常为 0,但是我这里创建过两个订单,所以 ID 是1
go-filecoin client propose-storage-deal fcqdzp28x8vnph7aedzw3pwlpwrnxjh77zayx75c5 $CID 1 2880

如果成功则会返回 Status: accepted 以及 {dealID}。

这里需要注意的是,如果你的矿工是部署在阿里云服务器上,切记要要把 6000 端口打开,否则会出现客户端与矿工无法通信的问题。
还有就是 如果你自己部署的矿工节点的节点 ID 没有在你本地的节点列表,那么你需要手动连接矿工节点。

举个栗子:我的矿工节点是部署在阿里云的,我在本地查找节点列表确实没有包含我的矿工节点,也就是说他们两目前是没有办法通过 P2P 连接的, 所以我肯定无法把数据存储到我的矿工节点上。那么该怎么处理呢:

1. 在矿工节点运行 go-filecoin id 你可以看到该节点的 ID 详细信息

2. 然后在你的客户端节点运行 go-filecoin swarm connect {ID} {ID} 为你的矿机节点的 ID

3. 运行 go-filecoin ping {ID} 来测试两个节点是否可以通信。

还有一个需要说明的是,发布存储订单的时候,大部分时候都会返回一个 Error: error creating payment: context deadline exceeded 的错误。

这是一个 Bug 截止本分发布为止还没有解决。有很多人提了 Bug,这里贴出一个关注度比较高的,有兴趣的同学可以了解一下:

https://github.com/filecoin-project/go-filecoin/issues/1965

发送数据并支付矿工

当你的存储订单提交成功的同时,propose-storage-deal 命令将自动将支付交易所需的资金转移到存储矿工的支付渠道(钱包地址)。这笔资金将在整个交易生命 周期内定期分次支付给矿工。

订单提交之后你的数据将通过 Filecoin 的底层 bitswap 协议(实现自 IPFS)自动存储到暂存区。矿工将开始把你的文件存储到它的机器,并开始打包和验证。

矿工在某个配置的时间间隔(默认为120秒)自动启动密封程序,以获取矿工暂存区域中的所有数据并将其密封打包到到矿工的承诺的存储区域, 此时您的交易状态将转为 “暂存”。在打包密封完成后,矿工将向区块链提交存储证明,此时您的交易状态将移至 “已发布”。

检索你的数据

在你成功存储数据之后,你可以尝试去检索它,但是在检索之前,你最好先查询一下你的存储交易是否发布成功了。

使用下面的命令来检查交易的状态:

go-filecoin client query-storage-deal {dealID}

{dealID} 是你通过 propose-storage-deal 命令提交存储订单时候返回数据.

如果成功发布,命令将返回 posted, 然后你可以通过下面的命令去检索它:

# Retrieve your data, using the address of the
# miner you made a deal with and the <CID> of the data.
go-filecoin retrieval-client retrieve-piece <minerAddress> <CID> # can take a minute

目前检索一次预计要花费一分钟左右,这让我有点担忧,这效率也太低了吧,我就存一张图片,结果存要一分钟,读取还要一分钟, 如果 Filecoin 要投入生产使用,至少需要把效率提升两个数量级,否则根本不现实。我只能说期待它在今年有重大的技术突破把。。。

参考文献