# 迁移订单

lotus 迁移到 venus 的时候,需要迁移已完成封装证明的订单和还在 StorageDealWaitingForData 状态的订单。 本文档主要介绍如何从 lotus-minerboost 迁移订单到 droplet

# 前置条件

要完成订单的迁移,需要满足以下两个条件:

  • 已经拥有一套带有 droplet 组件的 venus 链服务
  • 已经将矿工账号迁入 venus 链服务

# 从 lotus-miner 迁移订单

# 从 lotus-miner 导出订单

通过接口导出订单,参考以下示例:

TOKENlotus-miner 的 token,可以通过命令生成:lotus-miner auth api-info --perm=admin

curl http://127.0.0.1:2345/rpc/v0 -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <TOKEN>" \
-d '{"method": "Filecoin.MarketListIncompleteDeals","params":[], "id": 0}' > lotus_miner_deals.json

执行完命令后,你可能得到如下结果:

{"jsonrpc":"2.0","result":[{"Proposal":{"PieceCID":{"/":"baga6ea4seaqcrddjqzqavqipgljq6jn3bmbnhzw5yucdmoqoji3tni6kisjqini"},"PieceSize":128,"VerifiedDeal":false,"Client":"t3r3nyp4sitvilwc5wggvrsyoqmue3zgliqsqzqxri5up2fmlx2e5xeltxv4qbokjj6qrdgz3t7zdwygogpjaa","Provider":"t01000","Label":"uAVUAHOi_meaYr-eUqOadpea1i-ivleeahOaVsOaNrgo","StartEpoch":173482,"EndEpoch":694737,"StoragePricePerEpoch":"0",
......
":"bafkqahhix6m6ngfp46kkrzu5uxtllc7iv6k6pgue42k3bzunvyfa"},"PieceCid":{"/":"baga6ea4seaqcrddjqzqavqipgljq6jn3bmbnhzw5yucdmoqoji3tni6kisjqini"},"PieceSize":127,"RawBlockSize":0},"AvailableForRetrieval":false,"DealID":0,"CreationTime":"2022-08-03T10:35:09.774748628+08:00","TransferChannelId":null,"SectorNumber":0,"InboundCAR":""}],"id":0}

其中,result 中的每一项都是一个订单的详细信息。每个订单中的 State 字段表征了当前订单的状态,如果 State = 18,表示当前订单处于 StorageDealWaitingForData 的状态。

# 将订单导入到 droplet

开始导入订单之前,先确认矿工账号是否在 venus 链服务中,如果不在,需要将矿工账号迁入 venus 链服务。

./droplet actor list

确定完矿工之后,在 droplet 中可以直接通过命令导入订单:

./droplet storage deal import-deal lotus_miner_deals.json

# 结果
import 2 deals success

# 从 boost 迁移订单

# 从 boost 导出订单

boost 支持两种发单协议,暂且称之为新老协议,用户发单时两种协议可能都使用到了,所以需要分两步导出订单。

# 导出老协议订单

通过接口导出订单,此次导出和从 lotus-miner 导出订单很类似,参考例子:

TOKENboost 生成的 token,可以通过命令 ./boostd auth create-token --perm admin 生成。

curl http://127.0.0.1:1288/rpc/v0 -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <TOKEN>" \
-d '{"method": "Filecoin.MarketListIncompleteDeals","params":[], "id": 0}' > boost_old_deals.json

# 导出新协议订单

  1. 先确定有多少订单
curl -X POST -H "Content-Type: application/json" -d '{"query":"query { dealsCount() }"}' http://localhost:8080/graphql/query | jq

# 结果

{
  "data": {
    "dealsCount": 2
  }
}

返回结果中 dealsCount 的值就是现有订单数量。

  1. 导出全部订单

下面查询中 limit 字段的值是 10000000,最多获取到 10000000 条订单,需要大于现有的订单数量。

curl -X POST \
-H "Content-Type: application/json" \
-d '{"query":"query { deals(limit: 10000000) { totalCount deals { ID ClientAddress ProviderAddress CreatedAt PieceCid PieceSize IsVerified ProposalLabel ProviderCollateral ClientCollateral StoragePricePerEpoch StartEpoch EndEpoch ClientPeerID DealDataRoot SignedProposalCid InboundFilePath ChainDealID PublishCid IsOffline Transfer { Type Size } IsTransferStalled Checkpoint Err Sector { ID Offset Length } Message } } }"}' \
http://localhost:8080/graphql/query | jq > boost_deals.json

# 导入订单

开始导入订单之前,先确认矿工账号是否在 venus 链服务中,如果不在,需要将矿工账号迁入 venus 链服务。

./droplet actor list
  1. 导入老协议订单
./droplet storage deal import-deal boost_old_deals.json

# 结果
import 2 deals success
  1. 导入新协议订单
./droplet storage deal import-deal --from boost boost_deals.json

# 结果
import 3 deals success

--car-dirs 指定car文件的目录,可以设置多个:--car-dirs /tmp/cars --car-dirs /tmp/cars2,程序会根据 piece cid 来获取订单 payload size

payload size 在生成索引的时候会用到

如果导入过程遇到 deal bafyreih7qaddtjxu66khjohckd3gkp42p3x5i2fhw5xjw325rnb7wvje7q payload size 0,则说明有的订单的 payload size0,这样的订单不会导入。可以通过设置 --car-dirs,让程序根据 piece cid 去获取 payload size 来解决这个问题。