# 迁移订单
从 lotus
迁移到 venus
的时候,需要迁移已完成封装证明的订单和还在 StorageDealWaitingForData
状态的订单。
本文档主要介绍如何从 lotus-miner
和 boost
迁移订单到 droplet
。
# 前置条件
要完成订单的迁移,需要满足以下两个条件:
- 已经拥有一套带有
droplet
组件的venus
链服务 - 已经将矿工账号迁入
venus
链服务
# 从 lotus-miner 迁移订单
# 从 lotus-miner 导出订单
通过接口导出订单,参考以下示例:
TOKEN
是lotus-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
导出订单很类似,参考例子:
TOKEN
是boost
生成的 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
# 导出新协议订单
- 先确定有多少订单
curl -X POST -H "Content-Type: application/json" -d '{"query":"query { dealsCount() }"}' http://localhost:8080/graphql/query | jq
# 结果
{
"data": {
"dealsCount": 2
}
}
返回结果中 dealsCount
的值就是现有订单数量。
- 导出全部订单
下面查询中
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
- 导入老协议订单
./droplet storage deal import-deal boost_old_deals.json
# 结果
import 2 deals success
- 导入新协议订单
./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 size
是 0
,这样的订单不会导入。可以通过设置 --car-dirs
,让程序根据 piece cid
去获取 payload size
来解决这个问题。