2019-07-09 13:35:32 +00:00
|
|
|
package api
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
2020-08-20 08:18:05 +00:00
|
|
|
"fmt"
|
2020-08-18 23:26:21 +00:00
|
|
|
|
2020-06-09 23:08:43 +00:00
|
|
|
"github.com/filecoin-project/go-address"
|
2020-08-18 23:26:21 +00:00
|
|
|
datatransfer "github.com/filecoin-project/go-data-transfer"
|
2020-09-04 13:52:50 +00:00
|
|
|
"github.com/filecoin-project/lotus/build"
|
2020-06-09 23:08:43 +00:00
|
|
|
"github.com/filecoin-project/specs-actors/actors/abi"
|
|
|
|
"github.com/filecoin-project/specs-actors/actors/builtin/miner"
|
2020-08-18 23:26:21 +00:00
|
|
|
"github.com/ipfs/go-cid"
|
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
|
|
|
|
|
|
|
type MinerInfo struct {
|
2020-08-19 23:26:13 +00:00
|
|
|
Owner address.Address // Must be an ID-address.
|
|
|
|
Worker address.Address // Must be an ID-address.
|
|
|
|
NewWorker address.Address // Must be an ID-address.
|
2020-08-19 20:08:04 +00:00
|
|
|
ControlAddresses []address.Address // Must be an ID-addresses.
|
2020-06-09 23:08:43 +00:00
|
|
|
WorkerChangeEpoch abi.ChainEpoch
|
2020-08-18 18:17:06 +00:00
|
|
|
PeerId *peer.ID
|
2020-06-09 23:08:43 +00:00
|
|
|
Multiaddrs []abi.Multiaddrs
|
2020-06-15 16:30:49 +00:00
|
|
|
SealProofType abi.RegisteredSealProof
|
2020-06-09 23:08:43 +00:00
|
|
|
SectorSize abi.SectorSize
|
|
|
|
WindowPoStPartitionSectors uint64
|
2020-09-03 02:37:50 +00:00
|
|
|
ConsensusFaultElapsed abi.ChainEpoch
|
2020-06-09 23:08:43 +00:00
|
|
|
}
|
|
|
|
|
2020-07-01 11:47:40 +00:00
|
|
|
func NewApiMinerInfo(info *miner.MinerInfo) MinerInfo {
|
2020-08-18 18:17:06 +00:00
|
|
|
var pid *peer.ID
|
|
|
|
if peerID, err := peer.IDFromBytes(info.PeerId); err == nil {
|
|
|
|
pid = &peerID
|
|
|
|
}
|
|
|
|
|
2020-06-09 23:08:43 +00:00
|
|
|
mi := MinerInfo{
|
2020-08-19 20:08:04 +00:00
|
|
|
Owner: info.Owner,
|
|
|
|
Worker: info.Worker,
|
|
|
|
ControlAddresses: info.ControlAddresses,
|
|
|
|
|
|
|
|
NewWorker: address.Undef,
|
|
|
|
WorkerChangeEpoch: -1,
|
|
|
|
|
2020-08-18 18:17:06 +00:00
|
|
|
PeerId: pid,
|
2020-06-09 23:08:43 +00:00
|
|
|
Multiaddrs: info.Multiaddrs,
|
|
|
|
SealProofType: info.SealProofType,
|
|
|
|
SectorSize: info.SectorSize,
|
|
|
|
WindowPoStPartitionSectors: info.WindowPoStPartitionSectors,
|
2020-09-03 02:37:50 +00:00
|
|
|
ConsensusFaultElapsed: info.ConsensusFaultElapsed,
|
2020-06-09 23:08:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if info.PendingWorkerKey != nil {
|
|
|
|
mi.NewWorker = info.PendingWorkerKey.NewWorker
|
|
|
|
mi.WorkerChangeEpoch = info.PendingWorkerKey.EffectiveAt
|
|
|
|
}
|
|
|
|
|
|
|
|
return mi
|
|
|
|
}
|
2020-08-12 20:17:21 +00:00
|
|
|
|
|
|
|
type MessageSendSpec struct {
|
|
|
|
MaxFee abi.TokenAmount
|
|
|
|
}
|
|
|
|
|
|
|
|
var DefaultMessageSendSpec = MessageSendSpec{
|
2020-09-04 13:52:50 +00:00
|
|
|
// MaxFee of 0.1FIL
|
|
|
|
MaxFee: abi.NewTokenAmount(int64(build.FilecoinPrecision) / 10),
|
2020-08-12 20:17:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (ms *MessageSendSpec) Get() MessageSendSpec {
|
|
|
|
if ms == nil {
|
|
|
|
return DefaultMessageSendSpec
|
|
|
|
}
|
|
|
|
|
|
|
|
return *ms
|
|
|
|
}
|
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
|
|
|
|
}
|
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
|
|
|
|
}
|