2019-07-09 13:35:32 +00:00
|
|
|
package api
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
2020-08-20 08:18:05 +00:00
|
|
|
"fmt"
|
2021-03-08 22:49:53 +00:00
|
|
|
"time"
|
2020-08-18 23:26:21 +00:00
|
|
|
|
|
|
|
datatransfer "github.com/filecoin-project/go-data-transfer"
|
2021-11-11 15:17:39 +00:00
|
|
|
"github.com/filecoin-project/go-fil-markets/retrievalmarket"
|
2020-09-07 03:49:10 +00:00
|
|
|
"github.com/filecoin-project/go-state-types/abi"
|
2021-11-11 15:17:39 +00:00
|
|
|
"github.com/filecoin-project/lotus/chain/types"
|
2020-08-18 23:26:21 +00:00
|
|
|
"github.com/ipfs/go-cid"
|
2021-12-10 20:28:54 +00:00
|
|
|
"github.com/ipfs/go-graphsync"
|
2019-07-09 15:19:27 +00:00
|
|
|
|
2020-06-03 01:13:49 +00:00
|
|
|
"github.com/libp2p/go-libp2p-core/peer"
|
2020-07-31 08:27:22 +00:00
|
|
|
pubsub "github.com/libp2p/go-libp2p-pubsub"
|
2019-07-09 13:35:32 +00:00
|
|
|
ma "github.com/multiformats/go-multiaddr"
|
|
|
|
)
|
|
|
|
|
|
|
|
// TODO: check if this exists anywhere else
|
2020-05-27 20:53:20 +00:00
|
|
|
|
2019-07-09 13:35:32 +00:00
|
|
|
type MultiaddrSlice []ma.Multiaddr
|
|
|
|
|
|
|
|
func (m *MultiaddrSlice) UnmarshalJSON(raw []byte) (err error) {
|
|
|
|
var temp []string
|
|
|
|
if err := json.Unmarshal(raw, &temp); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
res := make([]ma.Multiaddr, len(temp))
|
|
|
|
for i, str := range temp {
|
|
|
|
res[i], err = ma.NewMultiaddr(str)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*m = res
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
var _ json.Unmarshaler = new(MultiaddrSlice)
|
2020-03-04 23:52:28 +00:00
|
|
|
|
|
|
|
type ObjStat struct {
|
|
|
|
Size uint64
|
|
|
|
Links uint64
|
|
|
|
}
|
2020-06-03 01:13:49 +00:00
|
|
|
|
|
|
|
type PubsubScore struct {
|
|
|
|
ID peer.ID
|
2020-07-31 08:27:22 +00:00
|
|
|
Score *pubsub.PeerScoreSnapshot
|
2020-06-03 01:13:49 +00:00
|
|
|
}
|
2020-06-09 23:08:43 +00:00
|
|
|
|
2020-08-12 20:17:21 +00:00
|
|
|
type MessageSendSpec struct {
|
|
|
|
MaxFee abi.TokenAmount
|
|
|
|
}
|
|
|
|
|
2021-12-10 20:28:54 +00:00
|
|
|
// GraphSyncDataTransfer provides diagnostics on a data transfer happening over graphsync
|
|
|
|
type GraphSyncDataTransfer struct {
|
|
|
|
// GraphSync request id for this transfer
|
|
|
|
RequestID graphsync.RequestID
|
|
|
|
// Graphsync state for this transfer
|
|
|
|
RequestState string
|
|
|
|
// If a channel ID is present, indicates whether this is the current graphsync request for this channel
|
|
|
|
// (could have changed in a restart)
|
|
|
|
IsCurrentChannelRequest bool
|
|
|
|
// Data transfer channel ID for this transfer
|
|
|
|
ChannelID *datatransfer.ChannelID
|
|
|
|
// Data transfer state for this transfer
|
|
|
|
ChannelState *DataTransferChannel
|
|
|
|
// Diagnostic information about this request -- and unexpected inconsistencies in
|
|
|
|
// request state
|
|
|
|
Diagnostics []string
|
|
|
|
}
|
|
|
|
|
|
|
|
// TransferDiagnostics give current information about transfers going over graphsync that may be helpful for debugging
|
|
|
|
type TransferDiagnostics struct {
|
|
|
|
ReceivingTransfers []*GraphSyncDataTransfer
|
|
|
|
SendingTransfers []*GraphSyncDataTransfer
|
|
|
|
}
|
|
|
|
|
2020-08-18 23:26:21 +00:00
|
|
|
type DataTransferChannel struct {
|
|
|
|
TransferID datatransfer.TransferID
|
|
|
|
Status datatransfer.Status
|
|
|
|
BaseCID cid.Cid
|
|
|
|
IsInitiator bool
|
|
|
|
IsSender bool
|
2020-08-19 00:36:22 +00:00
|
|
|
Voucher string
|
2020-08-18 23:26:21 +00:00
|
|
|
Message string
|
|
|
|
OtherPeer peer.ID
|
|
|
|
Transferred uint64
|
2021-03-10 12:25:52 +00:00
|
|
|
Stages *datatransfer.ChannelStages
|
2020-08-18 23:26:21 +00:00
|
|
|
}
|
2020-08-20 08:18:05 +00:00
|
|
|
|
|
|
|
// NewDataTransferChannel constructs an API DataTransferChannel type from full channel state snapshot and a host id
|
|
|
|
func NewDataTransferChannel(hostID peer.ID, channelState datatransfer.ChannelState) DataTransferChannel {
|
|
|
|
channel := DataTransferChannel{
|
|
|
|
TransferID: channelState.TransferID(),
|
|
|
|
Status: channelState.Status(),
|
|
|
|
BaseCID: channelState.BaseCID(),
|
|
|
|
IsSender: channelState.Sender() == hostID,
|
|
|
|
Message: channelState.Message(),
|
|
|
|
}
|
|
|
|
stringer, ok := channelState.Voucher().(fmt.Stringer)
|
|
|
|
if ok {
|
|
|
|
channel.Voucher = stringer.String()
|
|
|
|
} else {
|
|
|
|
voucherJSON, err := json.Marshal(channelState.Voucher())
|
|
|
|
if err != nil {
|
|
|
|
channel.Voucher = fmt.Errorf("Voucher Serialization: %w", err).Error()
|
|
|
|
} else {
|
|
|
|
channel.Voucher = string(voucherJSON)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if channel.IsSender {
|
|
|
|
channel.IsInitiator = !channelState.IsPull()
|
|
|
|
channel.Transferred = channelState.Sent()
|
|
|
|
channel.OtherPeer = channelState.Recipient()
|
|
|
|
} else {
|
|
|
|
channel.IsInitiator = channelState.IsPull()
|
|
|
|
channel.Transferred = channelState.Received()
|
|
|
|
channel.OtherPeer = channelState.Sender()
|
|
|
|
}
|
|
|
|
return channel
|
|
|
|
}
|
2020-11-13 19:11:17 +00:00
|
|
|
|
|
|
|
type NetBlockList struct {
|
|
|
|
Peers []peer.ID
|
|
|
|
IPAddrs []string
|
|
|
|
IPSubnets []string
|
|
|
|
}
|
2021-03-06 17:14:13 +00:00
|
|
|
|
|
|
|
type ExtendedPeerInfo struct {
|
2021-03-08 22:49:53 +00:00
|
|
|
ID peer.ID
|
|
|
|
Agent string
|
|
|
|
Addrs []string
|
|
|
|
Protocols []string
|
|
|
|
ConnMgrMeta *ConnMgrInfo
|
|
|
|
}
|
|
|
|
|
|
|
|
type ConnMgrInfo struct {
|
|
|
|
FirstSeen time.Time
|
|
|
|
Value int
|
|
|
|
Tags map[string]int
|
|
|
|
Conns map[string]time.Time
|
2021-03-06 17:14:13 +00:00
|
|
|
}
|
2021-03-10 17:22:35 +00:00
|
|
|
|
|
|
|
type NodeStatus struct {
|
|
|
|
SyncStatus NodeSyncStatus
|
|
|
|
PeerStatus NodePeerStatus
|
|
|
|
ChainStatus NodeChainStatus
|
|
|
|
}
|
|
|
|
|
|
|
|
type NodeSyncStatus struct {
|
|
|
|
Epoch uint64
|
|
|
|
Behind uint64
|
|
|
|
}
|
|
|
|
|
|
|
|
type NodePeerStatus struct {
|
|
|
|
PeersToPublishMsgs int
|
|
|
|
PeersToPublishBlocks int
|
|
|
|
}
|
|
|
|
|
|
|
|
type NodeChainStatus struct {
|
|
|
|
BlocksPerTipsetLast100 float64
|
|
|
|
BlocksPerTipsetLastFinality float64
|
|
|
|
}
|
2021-03-12 15:10:12 +00:00
|
|
|
|
|
|
|
type CheckStatusCode int
|
|
|
|
|
|
|
|
//go:generate go run golang.org/x/tools/cmd/stringer -type=CheckStatusCode -trimprefix=CheckStatus
|
|
|
|
const (
|
|
|
|
_ CheckStatusCode = iota
|
|
|
|
// Message Checks
|
|
|
|
CheckStatusMessageSerialize
|
|
|
|
CheckStatusMessageSize
|
|
|
|
CheckStatusMessageValidity
|
|
|
|
CheckStatusMessageMinGas
|
|
|
|
CheckStatusMessageMinBaseFee
|
|
|
|
CheckStatusMessageBaseFee
|
|
|
|
CheckStatusMessageBaseFeeLowerBound
|
|
|
|
CheckStatusMessageBaseFeeUpperBound
|
|
|
|
CheckStatusMessageGetStateNonce
|
|
|
|
CheckStatusMessageNonce
|
|
|
|
CheckStatusMessageGetStateBalance
|
|
|
|
CheckStatusMessageBalance
|
|
|
|
)
|
|
|
|
|
|
|
|
type CheckStatus struct {
|
|
|
|
Code CheckStatusCode
|
|
|
|
OK bool
|
|
|
|
Err string
|
|
|
|
Hint map[string]interface{}
|
|
|
|
}
|
|
|
|
|
|
|
|
type MessageCheckStatus struct {
|
|
|
|
Cid cid.Cid
|
|
|
|
CheckStatus
|
|
|
|
}
|
2021-03-27 14:35:46 +00:00
|
|
|
|
|
|
|
type MessagePrototype struct {
|
|
|
|
Message types.Message
|
|
|
|
ValidNonce bool
|
|
|
|
}
|
2021-05-27 02:50:34 +00:00
|
|
|
|
|
|
|
type RetrievalInfo struct {
|
|
|
|
PayloadCID cid.Cid
|
|
|
|
ID retrievalmarket.DealID
|
|
|
|
PieceCID *cid.Cid
|
|
|
|
PricePerByte abi.TokenAmount
|
|
|
|
UnsealPrice abi.TokenAmount
|
|
|
|
|
|
|
|
Status retrievalmarket.DealStatus
|
|
|
|
Message string // more information about deal state, particularly errors
|
|
|
|
Provider peer.ID
|
|
|
|
BytesReceived uint64
|
|
|
|
BytesPaidFor uint64
|
|
|
|
TotalPaid abi.TokenAmount
|
|
|
|
|
|
|
|
TransferChannelID *datatransfer.ChannelID
|
|
|
|
DataTransfer *DataTransferChannel
|
2021-11-10 14:45:46 +00:00
|
|
|
|
|
|
|
// optional event if part of ClientGetRetrievalUpdates
|
|
|
|
Event *retrievalmarket.ClientEvent
|
|
|
|
}
|
|
|
|
|
|
|
|
type RestrievalRes struct {
|
|
|
|
DealID retrievalmarket.DealID
|
|
|
|
}
|
|
|
|
|
2021-11-11 15:17:39 +00:00
|
|
|
// Selector specifies ipld selector string
|
|
|
|
// - if the string starts with '{', it's interpreted as json selector string
|
|
|
|
// see https://ipld.io/specs/selectors/ and https://ipld.io/specs/selectors/fixtures/selector-fixtures-1/
|
|
|
|
// - otherwise the string is interpreted as ipld-selector-text-lite (simple ipld path)
|
|
|
|
// see https://github.com/ipld/go-ipld-selector-text-lite
|
|
|
|
type Selector string
|
|
|
|
|
|
|
|
type DagSpec struct {
|
|
|
|
// DataSelector matches data to be retrieved
|
|
|
|
// - when using textselector, the path specifies subtree
|
2021-11-23 16:42:43 +00:00
|
|
|
// - the matched graph must have a single root
|
2021-11-11 15:17:39 +00:00
|
|
|
DataSelector *Selector
|
2021-11-29 18:59:32 +00:00
|
|
|
|
2021-11-29 20:29:00 +00:00
|
|
|
// ExportMerkleProof is applicable only when exporting to a CAR file via a path textselector
|
|
|
|
// When true, in addition to the selection target, the resulting CAR will contain every block along the
|
|
|
|
// path back to, and including the original root
|
2021-11-29 20:39:27 +00:00
|
|
|
// When false the resulting CAR contains only the blocks of the target subdag
|
2021-11-29 20:14:00 +00:00
|
|
|
ExportMerkleProof bool
|
2021-11-11 15:17:39 +00:00
|
|
|
}
|
|
|
|
|
2021-11-10 14:45:46 +00:00
|
|
|
type ExportRef struct {
|
2021-11-11 15:17:54 +00:00
|
|
|
Root cid.Cid
|
2021-11-11 15:17:39 +00:00
|
|
|
|
|
|
|
// DAGs array specifies a list of DAGs to export
|
2021-11-25 09:30:57 +00:00
|
|
|
// - If exporting into unixfs files, only one DAG is supported, DataSelector is only used to find the targeted root node
|
|
|
|
// - If exporting into a car file
|
|
|
|
// - When exactly one text-path DataSelector is specified exports the subgraph and its full merkle-path from the original root
|
|
|
|
// - Otherwise ( multiple paths and/or JSON selector specs) determines each individual subroot and exports the subtrees as a multi-root car
|
2021-11-11 15:17:39 +00:00
|
|
|
// - When not specified defaults to a single DAG:
|
|
|
|
// - Data - the entire DAG: `{"R":{"l":{"none":{}},":>":{"a":{">":{"@":{}}}}}}`
|
|
|
|
DAGs []DagSpec
|
2021-11-10 14:45:46 +00:00
|
|
|
|
|
|
|
FromLocalCAR string // if specified, get data from a local CARv2 file.
|
|
|
|
DealID retrievalmarket.DealID
|
2021-05-27 02:50:34 +00:00
|
|
|
}
|