Lint everything
We were ignoring quite a few error cases, and had one case where we weren't actually updating state where we wanted to. Unfortunately, if the linter doesn't pass, nobody has any reason to actually check lint failures in CI. There are three remaining XXXs marked in the code for lint.
This commit is contained in:
parent
659babc6b3
commit
5733c71c50
@ -288,9 +288,6 @@ jobs:
|
|||||||
command: |
|
command: |
|
||||||
$HOME/.local/bin/golangci-lint run -v --timeout 2m \
|
$HOME/.local/bin/golangci-lint run -v --timeout 2m \
|
||||||
--concurrency << parameters.concurrency >> << parameters.args >>
|
--concurrency << parameters.concurrency >> << parameters.args >>
|
||||||
lint-changes:
|
|
||||||
<<: *lint
|
|
||||||
|
|
||||||
lint-all:
|
lint-all:
|
||||||
<<: *lint
|
<<: *lint
|
||||||
|
|
||||||
@ -319,8 +316,7 @@ workflows:
|
|||||||
version: 2.1
|
version: 2.1
|
||||||
ci:
|
ci:
|
||||||
jobs:
|
jobs:
|
||||||
- lint-changes:
|
- lint-all
|
||||||
args: "--new-from-rev origin/next"
|
|
||||||
- mod-tidy-check
|
- mod-tidy-check
|
||||||
- gofmt
|
- gofmt
|
||||||
- test:
|
- test:
|
||||||
|
@ -23,6 +23,14 @@ issues:
|
|||||||
- "Potential file inclusion via variable"
|
- "Potential file inclusion via variable"
|
||||||
- "should have( a package)? comment"
|
- "should have( a package)? comment"
|
||||||
- "Error return value of `logging.SetLogLevel` is not checked"
|
- "Error return value of `logging.SetLogLevel` is not checked"
|
||||||
|
- "comment on exported"
|
||||||
|
- "(func|method) \\w+ should be \\w+"
|
||||||
|
- "(type|var|struct field|(method|func) parameter) `\\w+` should be `\\w+`"
|
||||||
|
- "(G306|G301|G307|G108|G302|G204|G104)"
|
||||||
|
- "don't use ALL_CAPS in Go names"
|
||||||
|
- "string .* has .* occurrences, make it a constant"
|
||||||
|
- "a blank import should be only in a main or test package, or have a comment justifying it"
|
||||||
|
- "package comment should be of the form"
|
||||||
|
|
||||||
exclude-use-default: false
|
exclude-use-default: false
|
||||||
exclude-rules:
|
exclude-rules:
|
||||||
@ -46,6 +54,19 @@ issues:
|
|||||||
linters:
|
linters:
|
||||||
- gosec
|
- gosec
|
||||||
|
|
||||||
|
- path: chain/vectors/gen/.*
|
||||||
|
linters:
|
||||||
|
- gosec
|
||||||
|
|
||||||
|
- path: cmd/lotus-bench/.*
|
||||||
|
linters:
|
||||||
|
- gosec
|
||||||
|
|
||||||
|
- path: api/test/.*
|
||||||
|
text: "context.Context should be the first parameter"
|
||||||
|
linters:
|
||||||
|
- golint
|
||||||
|
|
||||||
linters-settings:
|
linters-settings:
|
||||||
goconst:
|
goconst:
|
||||||
min-occurrences: 6
|
min-occurrences: 6
|
||||||
|
@ -26,7 +26,7 @@ import (
|
|||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
"github.com/ipfs/go-filestore"
|
"github.com/ipfs/go-filestore"
|
||||||
"github.com/libp2p/go-libp2p-core/network"
|
"github.com/libp2p/go-libp2p-core/network"
|
||||||
peer "github.com/libp2p/go-libp2p-peer"
|
"github.com/libp2p/go-libp2p-core/peer"
|
||||||
"github.com/multiformats/go-multiaddr"
|
"github.com/multiformats/go-multiaddr"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -66,7 +66,7 @@ func init() {
|
|||||||
|
|
||||||
ExampleValues[reflect.TypeOf(addr)] = addr
|
ExampleValues[reflect.TypeOf(addr)] = addr
|
||||||
|
|
||||||
pid, err := peer.IDB58Decode("12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf")
|
pid, err := peer.Decode("12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
@ -141,7 +141,7 @@ func makeDeal(t *testing.T, ctx context.Context, rseed int, client *impl.FullNod
|
|||||||
info, err := client.ClientGetDealInfo(ctx, *deal)
|
info, err := client.ClientGetDealInfo(ctx, *deal)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
testRetrieval(t, ctx, err, client, fcid, &info.PieceCID, carExport, data)
|
testRetrieval(t, ctx, client, fcid, &info.PieceCID, carExport, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFastRetrievalDealFlow(t *testing.T, b APIBuilder, blocktime time.Duration) {
|
func TestFastRetrievalDealFlow(t *testing.T, b APIBuilder, blocktime time.Duration) {
|
||||||
@ -193,7 +193,7 @@ func TestFastRetrievalDealFlow(t *testing.T, b APIBuilder, blocktime time.Durati
|
|||||||
info, err := client.ClientGetDealInfo(ctx, *deal)
|
info, err := client.ClientGetDealInfo(ctx, *deal)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
testRetrieval(t, ctx, err, client, fcid, &info.PieceCID, false, data)
|
testRetrieval(t, ctx, client, fcid, &info.PieceCID, false, data)
|
||||||
atomic.AddInt64(&mine, -1)
|
atomic.AddInt64(&mine, -1)
|
||||||
fmt.Println("shutting down mining")
|
fmt.Println("shutting down mining")
|
||||||
<-done
|
<-done
|
||||||
@ -267,7 +267,7 @@ func TestSenondDealRetrieval(t *testing.T, b APIBuilder, blocktime time.Duration
|
|||||||
rf, _ := miner.SectorsRefs(ctx)
|
rf, _ := miner.SectorsRefs(ctx)
|
||||||
fmt.Printf("refs: %+v\n", rf)
|
fmt.Printf("refs: %+v\n", rf)
|
||||||
|
|
||||||
testRetrieval(t, ctx, err, client, fcid2, &info.PieceCID, false, data2)
|
testRetrieval(t, ctx, client, fcid2, &info.PieceCID, false, data2)
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic.AddInt64(&mine, -1)
|
atomic.AddInt64(&mine, -1)
|
||||||
@ -373,7 +373,7 @@ func startSealingWaiting(t *testing.T, ctx context.Context, miner TestStorageNod
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func testRetrieval(t *testing.T, ctx context.Context, err error, client *impl.FullNodeAPI, fcid cid.Cid, piece *cid.Cid, carExport bool, data []byte) {
|
func testRetrieval(t *testing.T, ctx context.Context, client *impl.FullNodeAPI, fcid cid.Cid, piece *cid.Cid, carExport bool, data []byte) {
|
||||||
offers, err := client.ClientFindData(ctx, fcid, piece)
|
offers, err := client.ClientFindData(ctx, fcid, piece)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
@ -20,6 +20,7 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/node/impl"
|
"github.com/filecoin-project/lotus/node/impl"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
//nolint:deadcode,varcheck
|
||||||
var log = logging.Logger("apitest")
|
var log = logging.Logger("apitest")
|
||||||
|
|
||||||
func (ts *testSuite) testMining(t *testing.T) {
|
func (ts *testSuite) testMining(t *testing.T) {
|
||||||
|
@ -153,6 +153,9 @@ func TestPaymentChannels(t *testing.T, b APIBuilder, blocktime time.Duration) {
|
|||||||
}, int(build.MessageConfidence)+1, build.SealRandomnessLookbackLimit, func(oldTs, newTs *types.TipSet) (bool, events.StateChange, error) {
|
}, int(build.MessageConfidence)+1, build.SealRandomnessLookbackLimit, func(oldTs, newTs *types.TipSet) (bool, events.StateChange, error) {
|
||||||
return preds.OnPaymentChannelActorChanged(channel, preds.OnToSendAmountChanges())(ctx, oldTs.Key(), newTs.Key())
|
return preds.OnPaymentChannelActorChanged(channel, preds.OnToSendAmountChanges())(ctx, oldTs.Key(), newTs.Key())
|
||||||
})
|
})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
select {
|
select {
|
||||||
case <-finished:
|
case <-finished:
|
||||||
|
@ -24,9 +24,14 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/node/impl"
|
"github.com/filecoin-project/lotus/node/impl"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestPledgeSector(t *testing.T, b APIBuilder, blocktime time.Duration, nSectors int) {
|
func init() {
|
||||||
os.Setenv("BELLMAN_NO_GPU", "1")
|
err := os.Setenv("BELLMAN_NO_GPU", "1")
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Sprintf("failed to set BELLMAN_NO_GPU env variable: %s", err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPledgeSector(t *testing.T, b APIBuilder, blocktime time.Duration, nSectors int) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
n, sn := b(t, 1, OneMiner)
|
n, sn := b(t, 1, OneMiner)
|
||||||
client := n[0].FullNode.(*impl.FullNodeAPI)
|
client := n[0].FullNode.(*impl.FullNodeAPI)
|
||||||
@ -110,8 +115,6 @@ func pledgeSectors(t *testing.T, ctx context.Context, miner TestStorageNode, n,
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestWindowPost(t *testing.T, b APIBuilder, blocktime time.Duration, nSectors int) {
|
func TestWindowPost(t *testing.T, b APIBuilder, blocktime time.Duration, nSectors int) {
|
||||||
os.Setenv("BELLMAN_NO_GPU", "1")
|
|
||||||
|
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
n, sn := b(t, 1, OneMiner)
|
n, sn := b(t, 1, OneMiner)
|
||||||
client := n[0].FullNode.(*impl.FullNodeAPI)
|
client := n[0].FullNode.(*impl.FullNodeAPI)
|
||||||
|
@ -7,8 +7,8 @@ import (
|
|||||||
|
|
||||||
"github.com/filecoin-project/lotus/build"
|
"github.com/filecoin-project/lotus/build"
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
"github.com/hashicorp/golang-lru"
|
lru "github.com/hashicorp/golang-lru"
|
||||||
peer "github.com/libp2p/go-libp2p-core/peer"
|
"github.com/libp2p/go-libp2p-core/peer"
|
||||||
)
|
)
|
||||||
|
|
||||||
type blockReceiptTracker struct {
|
type blockReceiptTracker struct {
|
||||||
|
@ -172,7 +172,7 @@ func (client *BlockSync) processResponse(
|
|||||||
resLength, req.Length)
|
resLength, req.Length)
|
||||||
}
|
}
|
||||||
if resLength < int(req.Length) && res.Status != Partial {
|
if resLength < int(req.Length) && res.Status != Partial {
|
||||||
return nil, xerrors.Errorf("got less than requested without a proper status: %s", res.Status)
|
return nil, xerrors.Errorf("got less than requested without a proper status: %d", res.Status)
|
||||||
}
|
}
|
||||||
|
|
||||||
validRes := &validatedResponse{}
|
validRes := &validatedResponse{}
|
||||||
@ -205,7 +205,7 @@ func (client *BlockSync) processResponse(
|
|||||||
validRes.messages = make([]*CompactedMessages, resLength)
|
validRes.messages = make([]*CompactedMessages, resLength)
|
||||||
for i := 0; i < resLength; i++ {
|
for i := 0; i < resLength; i++ {
|
||||||
if res.Chain[i].Messages == nil {
|
if res.Chain[i].Messages == nil {
|
||||||
return nil, xerrors.Errorf("no messages included for tipset at height (head - %d): %w", i)
|
return nil, xerrors.Errorf("no messages included for tipset at height (head - %d)", i)
|
||||||
}
|
}
|
||||||
validRes.messages[i] = res.Chain[i].Messages
|
validRes.messages[i] = res.Chain[i].Messages
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
package blocksync
|
package blocksync
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/build"
|
"github.com/filecoin-project/lotus/build"
|
||||||
"github.com/filecoin-project/lotus/chain/store"
|
"github.com/filecoin-project/lotus/chain/store"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
logging "github.com/ipfs/go-log"
|
logging "github.com/ipfs/go-log"
|
||||||
|
@ -2,6 +2,7 @@ package state
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
|
||||||
"github.com/filecoin-project/specs-actors/actors/util/adt"
|
"github.com/filecoin-project/specs-actors/actors/util/adt"
|
||||||
typegen "github.com/whyrusleeping/cbor-gen"
|
typegen "github.com/whyrusleeping/cbor-gen"
|
||||||
)
|
)
|
||||||
|
@ -3,6 +3,7 @@ package state
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-address"
|
"github.com/filecoin-project/go-address"
|
||||||
"github.com/filecoin-project/specs-actors/actors/abi"
|
"github.com/filecoin-project/specs-actors/actors/abi"
|
||||||
"github.com/filecoin-project/specs-actors/actors/abi/big"
|
"github.com/filecoin-project/specs-actors/actors/abi/big"
|
||||||
|
@ -114,10 +114,10 @@ func TestMarketPredicates(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
oldBalances := map[address.Address]balance{
|
oldBalances := map[address.Address]balance{
|
||||||
tutils.NewIDAddr(t, 1): balance{abi.NewTokenAmount(1000), abi.NewTokenAmount(1000)},
|
tutils.NewIDAddr(t, 1): {abi.NewTokenAmount(1000), abi.NewTokenAmount(1000)},
|
||||||
tutils.NewIDAddr(t, 2): balance{abi.NewTokenAmount(2000), abi.NewTokenAmount(500)},
|
tutils.NewIDAddr(t, 2): {abi.NewTokenAmount(2000), abi.NewTokenAmount(500)},
|
||||||
tutils.NewIDAddr(t, 3): balance{abi.NewTokenAmount(3000), abi.NewTokenAmount(2000)},
|
tutils.NewIDAddr(t, 3): {abi.NewTokenAmount(3000), abi.NewTokenAmount(2000)},
|
||||||
tutils.NewIDAddr(t, 5): balance{abi.NewTokenAmount(3000), abi.NewTokenAmount(1000)},
|
tutils.NewIDAddr(t, 5): {abi.NewTokenAmount(3000), abi.NewTokenAmount(1000)},
|
||||||
}
|
}
|
||||||
|
|
||||||
oldStateC := createMarketState(ctx, t, store, oldDeals, oldProps, oldBalances)
|
oldStateC := createMarketState(ctx, t, store, oldDeals, oldProps, oldBalances)
|
||||||
@ -162,10 +162,10 @@ func TestMarketPredicates(t *testing.T) {
|
|||||||
// NB: DealProposals cannot be modified, so don't test that case.
|
// NB: DealProposals cannot be modified, so don't test that case.
|
||||||
}
|
}
|
||||||
newBalances := map[address.Address]balance{
|
newBalances := map[address.Address]balance{
|
||||||
tutils.NewIDAddr(t, 1): balance{abi.NewTokenAmount(3000), abi.NewTokenAmount(0)},
|
tutils.NewIDAddr(t, 1): {abi.NewTokenAmount(3000), abi.NewTokenAmount(0)},
|
||||||
tutils.NewIDAddr(t, 2): balance{abi.NewTokenAmount(2000), abi.NewTokenAmount(500)},
|
tutils.NewIDAddr(t, 2): {abi.NewTokenAmount(2000), abi.NewTokenAmount(500)},
|
||||||
tutils.NewIDAddr(t, 4): balance{abi.NewTokenAmount(5000), abi.NewTokenAmount(0)},
|
tutils.NewIDAddr(t, 4): {abi.NewTokenAmount(5000), abi.NewTokenAmount(0)},
|
||||||
tutils.NewIDAddr(t, 5): balance{abi.NewTokenAmount(1000), abi.NewTokenAmount(3000)},
|
tutils.NewIDAddr(t, 5): {abi.NewTokenAmount(1000), abi.NewTokenAmount(3000)},
|
||||||
}
|
}
|
||||||
|
|
||||||
newStateC := createMarketState(ctx, t, store, newDeals, newProps, newBalances)
|
newStateC := createMarketState(ctx, t, store, newDeals, newProps, newBalances)
|
||||||
@ -505,6 +505,7 @@ func createBalanceTable(ctx context.Context, t *testing.T, store adt.Store, bala
|
|||||||
lockedMapRootCid, err := lockedMapRoot.Root()
|
lockedMapRootCid, err := lockedMapRoot.Root()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
lockedRoot, err := adt.AsBalanceTable(store, lockedMapRootCid)
|
lockedRoot, err := adt.AsBalanceTable(store, lockedMapRootCid)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
for addr, balance := range balances {
|
for addr, balance := range balances {
|
||||||
err := escrowRoot.Add(addr, big.Add(balance.available, balance.locked))
|
err := escrowRoot.Add(addr, big.Add(balance.available, balance.locked))
|
||||||
@ -542,6 +543,7 @@ func createEmptyMinerState(ctx context.Context, t *testing.T, store adt.Store, o
|
|||||||
|
|
||||||
emptyVestingFunds := miner.ConstructVestingFunds()
|
emptyVestingFunds := miner.ConstructVestingFunds()
|
||||||
emptyVestingFundsCid, err := store.Put(store.Context(), emptyVestingFunds)
|
emptyVestingFundsCid, err := store.Put(store.Context(), emptyVestingFunds)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
emptyDeadlines := miner.ConstructDeadlines(emptyDeadline)
|
emptyDeadlines := miner.ConstructDeadlines(emptyDeadline)
|
||||||
emptyDeadlinesCid, err := store.Put(store.Context(), emptyDeadlines)
|
emptyDeadlinesCid, err := store.Put(store.Context(), emptyDeadlines)
|
||||||
|
@ -41,10 +41,11 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/node/repo"
|
"github.com/filecoin-project/lotus/node/repo"
|
||||||
)
|
)
|
||||||
|
|
||||||
var log = logging.Logger("gen")
|
|
||||||
|
|
||||||
const msgsPerBlock = 20
|
const msgsPerBlock = 20
|
||||||
|
|
||||||
|
//nolint:deadcode,varcheck
|
||||||
|
var log = logging.Logger("gen")
|
||||||
|
|
||||||
var ValidWpostForTesting = []abi.PoStProof{{
|
var ValidWpostForTesting = []abi.PoStProof{{
|
||||||
ProofBytes: []byte("valid proof"),
|
ProofBytes: []byte("valid proof"),
|
||||||
}}
|
}}
|
||||||
@ -605,7 +606,7 @@ func IsRoundWinner(ctx context.Context, ts *types.TipSet, round abi.ChainEpoch,
|
|||||||
|
|
||||||
buf := new(bytes.Buffer)
|
buf := new(bytes.Buffer)
|
||||||
if err := miner.MarshalCBOR(buf); err != nil {
|
if err := miner.MarshalCBOR(buf); err != nil {
|
||||||
return nil, xerrors.Errorf("failed to cbor marshal address: %w")
|
return nil, xerrors.Errorf("failed to cbor marshal address: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
electionRand, err := store.DrawRandomness(brand.Data, crypto.DomainSeparationTag_ElectionProofProduction, round, buf.Bytes())
|
electionRand, err := store.DrawRandomness(brand.Data, crypto.DomainSeparationTag_ElectionProofProduction, round, buf.Bytes())
|
||||||
|
@ -129,6 +129,9 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sroot cid.Cid
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
if err != nil {
|
||||||
|
return cid.Undef, xerrors.Errorf("mutating state: %w", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add market funds
|
// Add market funds
|
||||||
@ -217,9 +220,12 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sroot cid.Cid
|
|||||||
}
|
}
|
||||||
|
|
||||||
err = vm.MutateState(ctx, builtin.RewardActorAddr, func(sct cbor.IpldStore, st *reward.State) error {
|
err = vm.MutateState(ctx, builtin.RewardActorAddr, func(sct cbor.IpldStore, st *reward.State) error {
|
||||||
st = reward.ConstructState(qaPow)
|
*st = *reward.ConstructState(qaPow)
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
if err != nil {
|
||||||
|
return cid.Undef, xerrors.Errorf("mutating state: %w", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for i, m := range miners {
|
for i, m := range miners {
|
||||||
@ -244,7 +250,7 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sroot cid.Cid
|
|||||||
|
|
||||||
// we've added fake power for this sector above, remove it now
|
// we've added fake power for this sector above, remove it now
|
||||||
err = vm.MutateState(ctx, builtin.StoragePowerActorAddr, func(cst cbor.IpldStore, st *power.State) error {
|
err = vm.MutateState(ctx, builtin.StoragePowerActorAddr, func(cst cbor.IpldStore, st *power.State) error {
|
||||||
st.TotalQualityAdjPower = types.BigSub(st.TotalQualityAdjPower, sectorWeight)
|
st.TotalQualityAdjPower = types.BigSub(st.TotalQualityAdjPower, sectorWeight) //nolint:scopelint
|
||||||
st.TotalRawBytePower = types.BigSub(st.TotalRawBytePower, types.NewInt(uint64(m.SectorSize)))
|
st.TotalRawBytePower = types.BigSub(st.TotalRawBytePower, types.NewInt(uint64(m.SectorSize)))
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
@ -21,10 +21,6 @@ func mustEnc(i cbg.CBORMarshaler) []byte {
|
|||||||
return enc
|
return enc
|
||||||
}
|
}
|
||||||
|
|
||||||
func doExec(ctx context.Context, vm *vm.VM, to, from address.Address, method abi.MethodNum, params []byte) ([]byte, error) {
|
|
||||||
return doExecValue(ctx, vm, to, from, types.NewInt(0), method, params)
|
|
||||||
}
|
|
||||||
|
|
||||||
func doExecValue(ctx context.Context, vm *vm.VM, to, from address.Address, value types.BigInt, method abi.MethodNum, params []byte) ([]byte, error) {
|
func doExecValue(ctx context.Context, vm *vm.VM, to, from address.Address, value types.BigInt, method abi.MethodNum, params []byte) ([]byte, error) {
|
||||||
act, err := vm.StateTree().GetActor(from)
|
act, err := vm.StateTree().GetActor(from)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -147,6 +147,7 @@ func TestAddFunds(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for testCase, data := range testCases {
|
for testCase, data := range testCases {
|
||||||
|
//nolint:scopelint
|
||||||
t.Run(testCase, func(t *testing.T) {
|
t.Run(testCase, func(t *testing.T) {
|
||||||
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
|
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
@ -56,7 +56,7 @@ func binomialCoefficient(n, k float64) float64 {
|
|||||||
for d := 1.0; d <= k; d++ {
|
for d := 1.0; d <= k; d++ {
|
||||||
r *= n
|
r *= n
|
||||||
r /= d
|
r /= d
|
||||||
n -= 1
|
n--
|
||||||
}
|
}
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,7 @@ func (mpp *mpoolProvider) PutMessage(m types.ChainMsg) (cid.Cid, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (mpp *mpoolProvider) PubSubPublish(k string, v []byte) error {
|
func (mpp *mpoolProvider) PubSubPublish(k string, v []byte) error {
|
||||||
return mpp.ps.Publish(k, v)
|
return mpp.ps.Publish(k, v) //nolint
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mpp *mpoolProvider) StateGetActor(addr address.Address, ts *types.TipSet) (*types.Actor, error) {
|
func (mpp *mpoolProvider) StateGetActor(addr address.Address, ts *types.TipSet) (*types.Actor, error) {
|
||||||
|
@ -44,7 +44,7 @@ func SendHeadNotifs(nickname string) func(mctx helpers.MetricsCtx, lc fx.Lifecyc
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
go func() {
|
go func() {
|
||||||
sub, err := ps.Subscribe(topic)
|
sub, err := ps.Subscribe(topic) //nolint
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -116,6 +116,7 @@ func sendHeadNotifs(ctx context.Context, ps *pubsub.PubSub, topic string, chain
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//nolint
|
||||||
if err := ps.Publish(topic, b); err != nil {
|
if err := ps.Publish(topic, b); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -246,7 +246,7 @@ func (st *StateTree) DeleteActor(addr address.Address) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (st *StateTree) Flush(ctx context.Context) (cid.Cid, error) {
|
func (st *StateTree) Flush(ctx context.Context) (cid.Cid, error) {
|
||||||
ctx, span := trace.StartSpan(ctx, "stateTree.Flush")
|
ctx, span := trace.StartSpan(ctx, "stateTree.Flush") //nolint:staticcheck
|
||||||
defer span.End()
|
defer span.End()
|
||||||
if len(st.snaps.layers) != 1 {
|
if len(st.snaps.layers) != 1 {
|
||||||
return cid.Undef, xerrors.Errorf("tried to flush state tree with snapshots on the stack")
|
return cid.Undef, xerrors.Errorf("tried to flush state tree with snapshots on the stack")
|
||||||
@ -268,7 +268,7 @@ func (st *StateTree) Flush(ctx context.Context) (cid.Cid, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (st *StateTree) Snapshot(ctx context.Context) error {
|
func (st *StateTree) Snapshot(ctx context.Context) error {
|
||||||
ctx, span := trace.StartSpan(ctx, "stateTree.SnapShot")
|
ctx, span := trace.StartSpan(ctx, "stateTree.SnapShot") //nolint:staticcheck
|
||||||
defer span.End()
|
defer span.End()
|
||||||
|
|
||||||
st.snaps.addLayer()
|
st.snaps.addLayer()
|
||||||
|
@ -42,7 +42,7 @@ func TestIndexSeeks(t *testing.T) {
|
|||||||
if err := cs.PutTipSet(ctx, mock.TipSet(gen)); err != nil {
|
if err := cs.PutTipSet(ctx, mock.TipSet(gen)); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
cs.SetGenesis(gen)
|
assert.NoError(t, cs.SetGenesis(gen))
|
||||||
|
|
||||||
// Put 113 blocks from genesis
|
// Put 113 blocks from genesis
|
||||||
for i := 0; i < 113; i++ {
|
for i := 0; i < 113; i++ {
|
||||||
|
@ -925,7 +925,7 @@ func (cs *ChainStore) LoadMessagesFromCids(cids []cid.Cid) ([]*types.Message, er
|
|||||||
for i, c := range cids {
|
for i, c := range cids {
|
||||||
m, err := cs.GetMessage(c)
|
m, err := cs.GetMessage(c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, xerrors.Errorf("failed to get message: (%s):%d: %w", err, c, i)
|
return nil, xerrors.Errorf("failed to get message: (%s):%d: %w", c, i, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
msgs = append(msgs, m)
|
msgs = append(msgs, m)
|
||||||
@ -939,7 +939,7 @@ func (cs *ChainStore) LoadSignedMessagesFromCids(cids []cid.Cid) ([]*types.Signe
|
|||||||
for i, c := range cids {
|
for i, c := range cids {
|
||||||
m, err := cs.GetSignedMessage(c)
|
m, err := cs.GetSignedMessage(c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, xerrors.Errorf("failed to get message: (%s):%d: %w", err, c, i)
|
return nil, xerrors.Errorf("failed to get message: (%s):%d: %w", c, i, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
msgs = append(msgs, m)
|
msgs = append(msgs, m)
|
||||||
|
@ -292,10 +292,9 @@ func (bv *BlockValidator) Validate(ctx context.Context, pid peer.ID, msg *pubsub
|
|||||||
log.Warnf("received block from unknown miner or miner that doesn't meet min power over pubsub; rejecting message")
|
log.Warnf("received block from unknown miner or miner that doesn't meet min power over pubsub; rejecting message")
|
||||||
recordFailure("unknown_miner")
|
recordFailure("unknown_miner")
|
||||||
return pubsub.ValidationReject
|
return pubsub.ValidationReject
|
||||||
} else {
|
|
||||||
log.Warnf("cannot validate block message; unknown miner or miner that doesn't meet min power in unsynced chain")
|
|
||||||
return pubsub.ValidationIgnore
|
|
||||||
}
|
}
|
||||||
|
log.Warnf("cannot validate block message; unknown miner or miner that doesn't meet min power in unsynced chain")
|
||||||
|
return pubsub.ValidationIgnore
|
||||||
}
|
}
|
||||||
|
|
||||||
err = sigs.CheckBlockSignature(ctx, blk.Header, key)
|
err = sigs.CheckBlockSignature(ctx, blk.Header, key)
|
||||||
|
@ -343,12 +343,12 @@ func (sm *SyncManager) scheduleProcessResult(res *syncResult) {
|
|||||||
sm.syncQueue.buckets = append(sm.syncQueue.buckets, relbucket)
|
sm.syncQueue.buckets = append(sm.syncQueue.buckets, relbucket)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
} else {
|
|
||||||
// TODO: this is the case where we try to sync a chain, and
|
|
||||||
// fail, and we have more blocks on top of that chain that
|
|
||||||
// have come in since. The question is, should we try to
|
|
||||||
// sync these? or just drop them?
|
|
||||||
}
|
}
|
||||||
|
// TODO: this is the case where we try to sync a chain, and
|
||||||
|
// fail, and we have more blocks on top of that chain that
|
||||||
|
// have come in since. The question is, should we try to
|
||||||
|
// sync these? or just drop them?
|
||||||
|
log.Error("failed to sync chain but have new unconnected blocks from chain")
|
||||||
}
|
}
|
||||||
|
|
||||||
if sm.nextSyncTarget == nil && !sm.syncQueue.Empty() {
|
if sm.nextSyncTarget == nil && !sm.syncQueue.Empty() {
|
||||||
|
@ -3,11 +3,12 @@ package chain_test
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/ipfs/go-cid"
|
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/ipfs/go-cid"
|
||||||
|
|
||||||
ds "github.com/ipfs/go-datastore"
|
ds "github.com/ipfs/go-datastore"
|
||||||
logging "github.com/ipfs/go-log/v2"
|
logging "github.com/ipfs/go-log/v2"
|
||||||
"github.com/libp2p/go-libp2p-core/peer"
|
"github.com/libp2p/go-libp2p-core/peer"
|
||||||
@ -36,7 +37,10 @@ import (
|
|||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
build.InsecurePoStValidation = true
|
build.InsecurePoStValidation = true
|
||||||
os.Setenv("TRUST_PARAMS", "1")
|
err := os.Setenv("TRUST_PARAMS", "1")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
miner.SupportedProofTypes = map[abi.RegisteredSealProof]struct{}{
|
miner.SupportedProofTypes = map[abi.RegisteredSealProof]struct{}{
|
||||||
abi.RegisteredSealProof_StackedDrg2KiBV1: {},
|
abi.RegisteredSealProof_StackedDrg2KiBV1: {},
|
||||||
}
|
}
|
||||||
@ -212,20 +216,6 @@ func (tu *syncTestUtil) mineNewBlock(src int, miners []int) {
|
|||||||
tu.g.CurTipset = mts
|
tu.g.CurTipset = mts
|
||||||
}
|
}
|
||||||
|
|
||||||
func fblkToBlkMsg(fb *types.FullBlock) *types.BlockMsg {
|
|
||||||
out := &types.BlockMsg{
|
|
||||||
Header: fb.Header,
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, msg := range fb.BlsMessages {
|
|
||||||
out.BlsMessages = append(out.BlsMessages, msg.Cid())
|
|
||||||
}
|
|
||||||
for _, msg := range fb.SecpkMessages {
|
|
||||||
out.SecpkMessages = append(out.SecpkMessages, msg.Cid())
|
|
||||||
}
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
|
|
||||||
func (tu *syncTestUtil) addSourceNode(gen int) {
|
func (tu *syncTestUtil) addSourceNode(gen int) {
|
||||||
if tu.genesis != nil {
|
if tu.genesis != nil {
|
||||||
tu.t.Fatal("source node already exists")
|
tu.t.Fatal("source node already exists")
|
||||||
@ -454,7 +444,7 @@ func (wpp badWpp) GenerateCandidates(context.Context, abi.PoStRandomness, uint64
|
|||||||
|
|
||||||
func (wpp badWpp) ComputeProof(context.Context, []abi.SectorInfo, abi.PoStRandomness) ([]abi.PoStProof, error) {
|
func (wpp badWpp) ComputeProof(context.Context, []abi.SectorInfo, abi.PoStRandomness) ([]abi.PoStProof, error) {
|
||||||
return []abi.PoStProof{
|
return []abi.PoStProof{
|
||||||
abi.PoStProof{
|
{
|
||||||
PoStProof: abi.RegisteredPoStProof_StackedDrgWinning2KiBV1,
|
PoStProof: abi.RegisteredPoStProof_StackedDrgWinning2KiBV1,
|
||||||
ProofBytes: []byte("evil"),
|
ProofBytes: []byte("evil"),
|
||||||
},
|
},
|
||||||
@ -587,7 +577,7 @@ func TestDuplicateNonce(t *testing.T) {
|
|||||||
|
|
||||||
msgs := make([][]*types.SignedMessage, 2)
|
msgs := make([][]*types.SignedMessage, 2)
|
||||||
// Each miner includes a message from the banker with the same nonce, but to different addresses
|
// Each miner includes a message from the banker with the same nonce, but to different addresses
|
||||||
for k, _ := range msgs {
|
for k := range msgs {
|
||||||
msgs[k] = []*types.SignedMessage{makeMsg(tu.g.Miners[k])}
|
msgs[k] = []*types.SignedMessage{makeMsg(tu.g.Miners[k])}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,8 +62,8 @@ func (sm *SignedMessage) Serialize() ([]byte, error) {
|
|||||||
return buf.Bytes(), nil
|
return buf.Bytes(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *SignedMessage) ChainLength() int {
|
func (sm *SignedMessage) ChainLength() int {
|
||||||
ser, err := m.Serialize()
|
ser, err := sm.Serialize()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
@ -238,3 +238,7 @@ func (ts *TipSet) IsChildOf(parent *TipSet) bool {
|
|||||||
// height for their processing logic at the moment to obviate it.
|
// height for their processing logic at the moment to obviate it.
|
||||||
ts.height > parent.height
|
ts.height > parent.height
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ts *TipSet) String() string {
|
||||||
|
return fmt.Sprintf("%v", ts.cids)
|
||||||
|
}
|
||||||
|
@ -2,6 +2,7 @@ package validation
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/chain/state"
|
"github.com/filecoin-project/lotus/chain/state"
|
||||||
"github.com/filecoin-project/specs-actors/actors/runtime"
|
"github.com/filecoin-project/specs-actors/actors/runtime"
|
||||||
cbor "github.com/ipfs/go-ipld-cbor"
|
cbor "github.com/ipfs/go-ipld-cbor"
|
||||||
|
@ -2,9 +2,10 @@ package validation
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/minio/blake2b-simd"
|
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
|
||||||
|
"github.com/minio/blake2b-simd"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-address"
|
"github.com/filecoin-project/go-address"
|
||||||
"github.com/filecoin-project/go-crypto"
|
"github.com/filecoin-project/go-crypto"
|
||||||
acrypto "github.com/filecoin-project/specs-actors/actors/crypto"
|
acrypto "github.com/filecoin-project/specs-actors/actors/crypto"
|
||||||
|
@ -18,7 +18,7 @@ func LoadVector(t *testing.T, f string, out interface{}) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
defer fi.Close()
|
defer fi.Close() //nolint:errcheck
|
||||||
|
|
||||||
if err := json.NewDecoder(fi).Decode(out); err != nil {
|
if err := json.NewDecoder(fi).Decode(out); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
@ -410,8 +410,10 @@ type shimStateHandle struct {
|
|||||||
|
|
||||||
func (ssh *shimStateHandle) Create(obj vmr.CBORMarshaler) {
|
func (ssh *shimStateHandle) Create(obj vmr.CBORMarshaler) {
|
||||||
c := ssh.rt.Put(obj)
|
c := ssh.rt.Put(obj)
|
||||||
// TODO: handle error below
|
err := ssh.rt.stateCommit(EmptyObjectCid, c)
|
||||||
ssh.rt.stateCommit(EmptyObjectCid, c)
|
if err != nil {
|
||||||
|
panic(fmt.Errorf("failed to commit state after creating object: %w", err))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ssh *shimStateHandle) Readonly(obj vmr.CBORUnmarshaler) {
|
func (ssh *shimStateHandle) Readonly(obj vmr.CBORUnmarshaler) {
|
||||||
@ -440,8 +442,10 @@ func (ssh *shimStateHandle) Transaction(obj vmr.CBORer, f func()) {
|
|||||||
|
|
||||||
c := ssh.rt.Put(obj)
|
c := ssh.rt.Put(obj)
|
||||||
|
|
||||||
// TODO: handle error below
|
err = ssh.rt.stateCommit(baseState, c)
|
||||||
ssh.rt.stateCommit(baseState, c)
|
if err != nil {
|
||||||
|
panic(fmt.Errorf("failed to commit state after transaction: %w", err))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rt *Runtime) GetBalance(a address.Address) (types.BigInt, aerrors.ActorError) {
|
func (rt *Runtime) GetBalance(a address.Address) (types.BigInt, aerrors.ActorError) {
|
||||||
|
@ -254,6 +254,9 @@ func (vm *VM) send(ctx context.Context, msg *types.Message, parent *Runtime,
|
|||||||
if aerr := rt.chargeGasSafe(rt.Pricelist().OnMethodInvocation(msg.Value, msg.Method)); aerr != nil {
|
if aerr := rt.chargeGasSafe(rt.Pricelist().OnMethodInvocation(msg.Value, msg.Method)); aerr != nil {
|
||||||
return nil, aerrors.Wrap(aerr, "not enough gas for method invocation")
|
return nil, aerrors.Wrap(aerr, "not enough gas for method invocation")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// not charging any gas, just logging
|
||||||
|
//nolint:errcheck
|
||||||
defer rt.chargeGasSafe(newGasCharge("OnMethodInvocationDone", 0, 0))
|
defer rt.chargeGasSafe(newGasCharge("OnMethodInvocationDone", 0, 0))
|
||||||
|
|
||||||
if types.BigCmp(msg.Value, types.NewInt(0)) != 0 {
|
if types.BigCmp(msg.Value, types.NewInt(0)) != 0 {
|
||||||
|
@ -2,6 +2,7 @@ package cli
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
|
@ -319,7 +319,7 @@ var chainSetHeadCmd = &cli.Command{
|
|||||||
ts, err = api.ChainGetTipSetByHeight(ctx, abi.ChainEpoch(cctx.Uint64("epoch")), types.EmptyTSK)
|
ts, err = api.ChainGetTipSetByHeight(ctx, abi.ChainEpoch(cctx.Uint64("epoch")), types.EmptyTSK)
|
||||||
}
|
}
|
||||||
if ts == nil {
|
if ts == nil {
|
||||||
ts, err = parseTipSet(api, ctx, cctx.Args().Slice())
|
ts, err = parseTipSet(ctx, api, cctx.Args().Slice())
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -337,7 +337,7 @@ var chainSetHeadCmd = &cli.Command{
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseTipSet(api api.FullNode, ctx context.Context, vals []string) (*types.TipSet, error) {
|
func parseTipSet(ctx context.Context, api api.FullNode, vals []string) (*types.TipSet, error) {
|
||||||
var headers []*types.BlockHeader
|
var headers []*types.BlockHeader
|
||||||
for _, c := range vals {
|
for _, c := range vals {
|
||||||
blkc, err := cid.Decode(c)
|
blkc, err := cid.Decode(c)
|
||||||
|
@ -930,11 +930,11 @@ var clientQueryAskCmd = &cli.Command{
|
|||||||
return xerrors.Errorf("failed to get peerID for miner: %w", err)
|
return xerrors.Errorf("failed to get peerID for miner: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if peer.ID(*mi.PeerId) == peer.ID("SETME") {
|
if *mi.PeerId == peer.ID("SETME") {
|
||||||
return fmt.Errorf("the miner hasn't initialized yet")
|
return fmt.Errorf("the miner hasn't initialized yet")
|
||||||
}
|
}
|
||||||
|
|
||||||
pid = peer.ID(*mi.PeerId)
|
pid = *mi.PeerId
|
||||||
}
|
}
|
||||||
|
|
||||||
ask, err := api.ClientQueryAsk(ctx, pid, maddr)
|
ask, err := api.ClientQueryAsk(ctx, pid, maddr)
|
||||||
@ -1045,55 +1045,55 @@ var clientListDeals = &cli.Command{
|
|||||||
fmt.Fprintf(w, "%s\t%s\t%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%d\t%s\n", d.LocalDeal.CreationTime.Format(time.Stamp), d.LocalDeal.ProposalCid, d.LocalDeal.DealID, d.LocalDeal.Provider, dealStateString(color, d.LocalDeal.State), onChain, slashed, d.LocalDeal.PieceCID, types.SizeStr(types.NewInt(d.LocalDeal.Size)), price, d.LocalDeal.Duration, d.LocalDeal.Message)
|
fmt.Fprintf(w, "%s\t%s\t%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%d\t%s\n", d.LocalDeal.CreationTime.Format(time.Stamp), d.LocalDeal.ProposalCid, d.LocalDeal.DealID, d.LocalDeal.Provider, dealStateString(color, d.LocalDeal.State), onChain, slashed, d.LocalDeal.PieceCID, types.SizeStr(types.NewInt(d.LocalDeal.Size)), price, d.LocalDeal.Duration, d.LocalDeal.Message)
|
||||||
}
|
}
|
||||||
return w.Flush()
|
return w.Flush()
|
||||||
} else {
|
}
|
||||||
w := tablewriter.New(tablewriter.Col("DealCid"),
|
|
||||||
tablewriter.Col("DealId"),
|
|
||||||
tablewriter.Col("Provider"),
|
|
||||||
tablewriter.Col("State"),
|
|
||||||
tablewriter.Col("On Chain?"),
|
|
||||||
tablewriter.Col("Slashed?"),
|
|
||||||
tablewriter.Col("PieceCID"),
|
|
||||||
tablewriter.Col("Size"),
|
|
||||||
tablewriter.Col("Price"),
|
|
||||||
tablewriter.Col("Duration"),
|
|
||||||
tablewriter.NewLineCol("Message"))
|
|
||||||
|
|
||||||
for _, d := range deals {
|
w := tablewriter.New(tablewriter.Col("DealCid"),
|
||||||
propcid := d.LocalDeal.ProposalCid.String()
|
tablewriter.Col("DealId"),
|
||||||
propcid = "..." + propcid[len(propcid)-8:]
|
tablewriter.Col("Provider"),
|
||||||
|
tablewriter.Col("State"),
|
||||||
|
tablewriter.Col("On Chain?"),
|
||||||
|
tablewriter.Col("Slashed?"),
|
||||||
|
tablewriter.Col("PieceCID"),
|
||||||
|
tablewriter.Col("Size"),
|
||||||
|
tablewriter.Col("Price"),
|
||||||
|
tablewriter.Col("Duration"),
|
||||||
|
tablewriter.NewLineCol("Message"))
|
||||||
|
|
||||||
onChain := "N"
|
for _, d := range deals {
|
||||||
if d.OnChainDealState.SectorStartEpoch != -1 {
|
propcid := d.LocalDeal.ProposalCid.String()
|
||||||
onChain = fmt.Sprintf("Y (epoch %d)", d.OnChainDealState.SectorStartEpoch)
|
propcid = "..." + propcid[len(propcid)-8:]
|
||||||
}
|
|
||||||
|
|
||||||
slashed := "N"
|
onChain := "N"
|
||||||
if d.OnChainDealState.SlashEpoch != -1 {
|
if d.OnChainDealState.SectorStartEpoch != -1 {
|
||||||
slashed = fmt.Sprintf("Y (epoch %d)", d.OnChainDealState.SlashEpoch)
|
onChain = fmt.Sprintf("Y (epoch %d)", d.OnChainDealState.SectorStartEpoch)
|
||||||
}
|
|
||||||
|
|
||||||
piece := d.LocalDeal.PieceCID.String()
|
|
||||||
piece = "..." + piece[len(piece)-8:]
|
|
||||||
|
|
||||||
price := types.FIL(types.BigMul(d.LocalDeal.PricePerEpoch, types.NewInt(d.LocalDeal.Duration)))
|
|
||||||
|
|
||||||
w.Write(map[string]interface{}{
|
|
||||||
"DealCid": propcid,
|
|
||||||
"DealId": d.LocalDeal.DealID,
|
|
||||||
"Provider": d.LocalDeal.Provider,
|
|
||||||
"State": dealStateString(color, d.LocalDeal.State),
|
|
||||||
"On Chain?": onChain,
|
|
||||||
"Slashed?": slashed,
|
|
||||||
"PieceCID": piece,
|
|
||||||
"Size": types.SizeStr(types.NewInt(d.LocalDeal.Size)),
|
|
||||||
"Price": price,
|
|
||||||
"Duration": d.LocalDeal.Duration,
|
|
||||||
"Message": d.LocalDeal.Message,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return w.Flush(os.Stdout)
|
slashed := "N"
|
||||||
|
if d.OnChainDealState.SlashEpoch != -1 {
|
||||||
|
slashed = fmt.Sprintf("Y (epoch %d)", d.OnChainDealState.SlashEpoch)
|
||||||
|
}
|
||||||
|
|
||||||
|
piece := d.LocalDeal.PieceCID.String()
|
||||||
|
piece = "..." + piece[len(piece)-8:]
|
||||||
|
|
||||||
|
price := types.FIL(types.BigMul(d.LocalDeal.PricePerEpoch, types.NewInt(d.LocalDeal.Duration)))
|
||||||
|
|
||||||
|
w.Write(map[string]interface{}{
|
||||||
|
"DealCid": propcid,
|
||||||
|
"DealId": d.LocalDeal.DealID,
|
||||||
|
"Provider": d.LocalDeal.Provider,
|
||||||
|
"State": dealStateString(color, d.LocalDeal.State),
|
||||||
|
"On Chain?": onChain,
|
||||||
|
"Slashed?": slashed,
|
||||||
|
"PieceCID": piece,
|
||||||
|
"Size": types.SizeStr(types.NewInt(d.LocalDeal.Size)),
|
||||||
|
"Price": price,
|
||||||
|
"Duration": d.LocalDeal.Duration,
|
||||||
|
"Message": d.LocalDeal.Message,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return w.Flush(os.Stdout)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1318,7 +1318,7 @@ func OutputDataTransferChannels(out io.Writer, channels []lapi.DataTransferChann
|
|||||||
for _, channel := range sendingChannels {
|
for _, channel := range sendingChannels {
|
||||||
w.Write(toChannelOutput(color, "Sending To", channel))
|
w.Write(toChannelOutput(color, "Sending To", channel))
|
||||||
}
|
}
|
||||||
w.Flush(out)
|
w.Flush(out) //nolint:errcheck
|
||||||
|
|
||||||
fmt.Fprintf(out, "\nReceiving Channels\n\n")
|
fmt.Fprintf(out, "\nReceiving Channels\n\n")
|
||||||
w = tablewriter.New(tablewriter.Col("ID"),
|
w = tablewriter.New(tablewriter.Col("ID"),
|
||||||
@ -1332,7 +1332,7 @@ func OutputDataTransferChannels(out io.Writer, channels []lapi.DataTransferChann
|
|||||||
for _, channel := range receivingChannels {
|
for _, channel := range receivingChannels {
|
||||||
w.Write(toChannelOutput(color, "Receiving From", channel))
|
w.Write(toChannelOutput(color, "Receiving From", channel))
|
||||||
}
|
}
|
||||||
w.Flush(out)
|
w.Flush(out) //nolint:errcheck
|
||||||
}
|
}
|
||||||
|
|
||||||
func channelStatusString(useColor bool, status datatransfer.Status) string {
|
func channelStatusString(useColor bool, status datatransfer.Status) string {
|
||||||
|
@ -39,7 +39,7 @@ func RunApp(app *cli.App) {
|
|||||||
}
|
}
|
||||||
var phe *PrintHelpErr
|
var phe *PrintHelpErr
|
||||||
if xerrors.As(err, &phe) {
|
if xerrors.As(err, &phe) {
|
||||||
cli.ShowCommandHelp(phe.Ctx, phe.Ctx.Command.Name)
|
_ = cli.ShowCommandHelp(phe.Ctx, phe.Ctx.Command.Name)
|
||||||
}
|
}
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
@ -313,7 +313,7 @@ var mpoolReplaceCmd = &cli.Command{
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("parsing gas-premium: %w", err)
|
return fmt.Errorf("parsing gas-premium: %w", err)
|
||||||
}
|
}
|
||||||
// TODO: estiamte fee cap here
|
// TODO: estimate fee cap here
|
||||||
msg.GasFeeCap, err = types.BigFromString(cctx.String("gas-feecap"))
|
msg.GasFeeCap, err = types.BigFromString(cctx.String("gas-feecap"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("parsing gas-feecap: %w", err)
|
return fmt.Errorf("parsing gas-feecap: %w", err)
|
||||||
|
@ -180,7 +180,7 @@ var netFindPeer = &cli.Command{
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
pid, err := peer.IDB58Decode(cctx.Args().First())
|
pid, err := peer.Decode(cctx.Args().First())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,7 @@ var PprofGoroutines = &cli.Command{
|
|||||||
|
|
||||||
addr = "http://" + addr + "/debug/pprof/goroutine?debug=2"
|
addr = "http://" + addr + "/debug/pprof/goroutine?debug=2"
|
||||||
|
|
||||||
r, err := http.Get(addr)
|
r, err := http.Get(addr) //nolint:gosec
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
14
cli/state.go
14
cli/state.go
@ -353,6 +353,9 @@ var stateReplaySetCmd = &cli.Command{
|
|||||||
}
|
}
|
||||||
|
|
||||||
ts, err = types.NewTipSet(headers)
|
ts, err = types.NewTipSet(headers)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
var r *api.MsgLookup
|
var r *api.MsgLookup
|
||||||
r, err = fapi.StateWaitMsg(ctx, mcid, build.MessageConfidence)
|
r, err = fapi.StateWaitMsg(ctx, mcid, build.MessageConfidence)
|
||||||
@ -365,9 +368,9 @@ var stateReplaySetCmd = &cli.Command{
|
|||||||
return xerrors.Errorf("loading tipset: %w", err)
|
return xerrors.Errorf("loading tipset: %w", err)
|
||||||
}
|
}
|
||||||
ts, err = fapi.ChainGetTipSet(ctx, childTs.Parents())
|
ts, err = fapi.ChainGetTipSet(ctx, childTs.Parents())
|
||||||
}
|
if err != nil {
|
||||||
if err != nil {
|
return err
|
||||||
return err
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1499,7 +1502,7 @@ func parseParamsForMethod(act cid.Cid, method uint64, args []string) ([]byte, er
|
|||||||
}
|
}
|
||||||
p.Elem().Field(i).Set(reflect.ValueOf(val))
|
p.Elem().Field(i).Set(reflect.ValueOf(val))
|
||||||
case reflect.TypeOf(peer.ID("")):
|
case reflect.TypeOf(peer.ID("")):
|
||||||
pid, err := peer.IDB58Decode(args[i])
|
pid, err := peer.Decode(args[i])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to parse peer ID: %s", err)
|
return nil, fmt.Errorf("failed to parse peer ID: %s", err)
|
||||||
}
|
}
|
||||||
@ -1584,6 +1587,9 @@ var stateMarketBalanceCmd = &cli.Command{
|
|||||||
}
|
}
|
||||||
|
|
||||||
balance, err := api.StateMarketBalance(ctx, addr, ts.Key())
|
balance, err := api.StateMarketBalance(ctx, addr, ts.Key())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
fmt.Printf("Escrow: %s\n", types.FIL(balance.Escrow))
|
fmt.Printf("Escrow: %s\n", types.FIL(balance.Escrow))
|
||||||
fmt.Printf("Locked: %s\n", types.FIL(balance.Locked))
|
fmt.Printf("Locked: %s\n", types.FIL(balance.Locked))
|
||||||
|
@ -385,10 +385,9 @@ var walletVerify = &cli.Command{
|
|||||||
if api.WalletVerify(ctx, addr, msg, &sig) {
|
if api.WalletVerify(ctx, addr, msg, &sig) {
|
||||||
fmt.Println("valid")
|
fmt.Println("valid")
|
||||||
return nil
|
return nil
|
||||||
} else {
|
|
||||||
fmt.Println("invalid")
|
|
||||||
return NewCliError("CLI Verify called with invalid signature")
|
|
||||||
}
|
}
|
||||||
|
fmt.Println("invalid")
|
||||||
|
return NewCliError("CLI Verify called with invalid signature")
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -214,7 +214,7 @@ func countGasCosts(et *types.ExecutionTrace) (int64, int64) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, sub := range et.Subcalls {
|
for _, sub := range et.Subcalls {
|
||||||
c, v := countGasCosts(&sub)
|
c, v := countGasCosts(&sub) //nolint
|
||||||
cgas += c
|
cgas += c
|
||||||
vgas += v
|
vgas += v
|
||||||
}
|
}
|
||||||
@ -222,24 +222,6 @@ func countGasCosts(et *types.ExecutionTrace) (int64, int64) {
|
|||||||
return cgas, vgas
|
return cgas, vgas
|
||||||
}
|
}
|
||||||
|
|
||||||
func compStats(vals []float64) (float64, float64) {
|
|
||||||
var sum float64
|
|
||||||
|
|
||||||
for _, v := range vals {
|
|
||||||
sum += v
|
|
||||||
}
|
|
||||||
|
|
||||||
av := sum / float64(len(vals))
|
|
||||||
|
|
||||||
var varsum float64
|
|
||||||
for _, v := range vals {
|
|
||||||
delta := av - v
|
|
||||||
varsum += delta * delta
|
|
||||||
}
|
|
||||||
|
|
||||||
return av, math.Sqrt(varsum / float64(len(vals)))
|
|
||||||
}
|
|
||||||
|
|
||||||
type stats struct {
|
type stats struct {
|
||||||
timeTaken meanVar
|
timeTaken meanVar
|
||||||
gasRatio meanVar
|
gasRatio meanVar
|
||||||
@ -264,20 +246,20 @@ func (cov1 *covar) VarianceX() float64 {
|
|||||||
return cov1.m2x / (cov1.n - 1)
|
return cov1.m2x / (cov1.n - 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v1 *covar) StddevX() float64 {
|
func (cov1 *covar) StddevX() float64 {
|
||||||
return math.Sqrt(v1.VarianceX())
|
return math.Sqrt(cov1.VarianceX())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cov1 *covar) VarianceY() float64 {
|
func (cov1 *covar) VarianceY() float64 {
|
||||||
return cov1.m2y / (cov1.n - 1)
|
return cov1.m2y / (cov1.n - 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v1 *covar) StddevY() float64 {
|
func (cov1 *covar) StddevY() float64 {
|
||||||
return math.Sqrt(v1.VarianceY())
|
return math.Sqrt(cov1.VarianceY())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cov1 *covar) AddPoint(x, y float64) {
|
func (cov1 *covar) AddPoint(x, y float64) {
|
||||||
cov1.n += 1
|
cov1.n++
|
||||||
|
|
||||||
dx := x - cov1.meanX
|
dx := x - cov1.meanX
|
||||||
cov1.meanX += dx / cov1.n
|
cov1.meanX += dx / cov1.n
|
||||||
@ -344,7 +326,7 @@ type meanVar struct {
|
|||||||
|
|
||||||
func (v1 *meanVar) AddPoint(value float64) {
|
func (v1 *meanVar) AddPoint(value float64) {
|
||||||
// based on https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Welford's_online_algorithm
|
// based on https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Welford's_online_algorithm
|
||||||
v1.n += 1
|
v1.n++
|
||||||
delta := value - v1.mean
|
delta := value - v1.mean
|
||||||
v1.mean += delta / v1.n
|
v1.mean += delta / v1.n
|
||||||
delta2 := value - v1.mean
|
delta2 := value - v1.mean
|
||||||
@ -481,7 +463,7 @@ var importAnalyzeCmd = &cli.Command{
|
|||||||
}
|
}
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
http.ListenAndServe("localhost:6060", nil)
|
http.ListenAndServe("localhost:6060", nil) //nolint:errcheck
|
||||||
}()
|
}()
|
||||||
|
|
||||||
fi, err := os.Open(cctx.Args().First())
|
fi, err := os.Open(cctx.Args().First())
|
||||||
|
@ -159,7 +159,7 @@ func (p *Processor) persistRewardActors(ctx context.Context, rewards []rewardAct
|
|||||||
log.Debugw("Persisted Reward Actors", "duration", time.Since(start).String())
|
log.Debugw("Persisted Reward Actors", "duration", time.Since(start).String())
|
||||||
}()
|
}()
|
||||||
|
|
||||||
grp, ctx := errgroup.WithContext(ctx)
|
grp, ctx := errgroup.WithContext(ctx) //nolint
|
||||||
|
|
||||||
grp.Go(func() error {
|
grp.Go(func() error {
|
||||||
if err := p.storeChainPower(rewards); err != nil {
|
if err := p.storeChainPower(rewards); err != nil {
|
||||||
|
@ -29,7 +29,7 @@ var runCmd = &cli.Command{
|
|||||||
},
|
},
|
||||||
Action: func(cctx *cli.Context) error {
|
Action: func(cctx *cli.Context) error {
|
||||||
go func() {
|
go func() {
|
||||||
http.ListenAndServe(":6060", nil)
|
http.ListenAndServe(":6060", nil) //nolint:errcheck
|
||||||
}()
|
}()
|
||||||
ll := cctx.String("log-level")
|
ll := cctx.String("log-level")
|
||||||
if err := logging.SetLogLevel("*", ll); err != nil {
|
if err := logging.SetLogLevel("*", ll); err != nil {
|
||||||
|
@ -49,11 +49,11 @@ func setupTopMinerByBaseRewardSchema(ctx context.Context, db *sql.DB) error {
|
|||||||
order by 1 desc
|
order by 1 desc
|
||||||
limit 1;
|
limit 1;
|
||||||
`); err != nil {
|
`); err != nil {
|
||||||
return xerrors.Errorf("create top_miner_by_base_reward views", err)
|
return xerrors.Errorf("create top_miner_by_base_reward views: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := tx.Commit(); err != nil {
|
if err := tx.Commit(); err != nil {
|
||||||
return xerrors.Errorf("commiting top_miner_by_base_reward views", err)
|
return xerrors.Errorf("committing top_miner_by_base_reward views; %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,7 @@ func PrepareScheduler(db *sql.DB) *Scheduler {
|
|||||||
|
|
||||||
func (s *Scheduler) setupSchema(ctx context.Context) error {
|
func (s *Scheduler) setupSchema(ctx context.Context) error {
|
||||||
if err := setupTopMinerByBaseRewardSchema(ctx, s.db); err != nil {
|
if err := setupTopMinerByBaseRewardSchema(ctx, s.db); err != nil {
|
||||||
return xerrors.Errorf("setup top miners by reward schema", err)
|
return xerrors.Errorf("setup top miners by reward schema: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -35,14 +35,14 @@ func (s *Scheduler) Start(ctx context.Context) {
|
|||||||
log.Debug("Starting Scheduler")
|
log.Debug("Starting Scheduler")
|
||||||
|
|
||||||
if err := s.setupSchema(ctx); err != nil {
|
if err := s.setupSchema(ctx); err != nil {
|
||||||
log.Fatalw("applying scheduling schema", err)
|
log.Fatalw("applying scheduling schema", "error", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
// run once on start after schema has initialized
|
// run once on start after schema has initialized
|
||||||
time.Sleep(5 * time.Second)
|
time.Sleep(5 * time.Second)
|
||||||
if err := refreshTopMinerByBaseReward(ctx, s.db); err != nil {
|
if err := refreshTopMinerByBaseReward(ctx, s.db); err != nil {
|
||||||
log.Errorf(err.Error())
|
log.Errorw("failed to refresh top miner", "error", err)
|
||||||
}
|
}
|
||||||
refreshTopMinerCh := time.NewTicker(30 * time.Second)
|
refreshTopMinerCh := time.NewTicker(30 * time.Second)
|
||||||
defer refreshTopMinerCh.Stop()
|
defer refreshTopMinerCh.Stop()
|
||||||
@ -50,7 +50,7 @@ func (s *Scheduler) Start(ctx context.Context) {
|
|||||||
select {
|
select {
|
||||||
case <-refreshTopMinerCh.C:
|
case <-refreshTopMinerCh.C:
|
||||||
if err := refreshTopMinerByBaseReward(ctx, s.db); err != nil {
|
if err := refreshTopMinerByBaseReward(ctx, s.db); err != nil {
|
||||||
log.Errorf(err.Error())
|
log.Errorw("failed to refresh top miner", "error", err)
|
||||||
}
|
}
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
return
|
return
|
||||||
|
@ -47,7 +47,7 @@ var supportedSectors struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
for supportedSector, _ := range miner.SupportedProofTypes {
|
for supportedSector := range miner.SupportedProofTypes {
|
||||||
sectorSize, err := supportedSector.SectorSize()
|
sectorSize, err := supportedSector.SectorSize()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
@ -207,24 +207,24 @@ type handler struct {
|
|||||||
func (h *handler) minerhtml(w http.ResponseWriter, r *http.Request) {
|
func (h *handler) minerhtml(w http.ResponseWriter, r *http.Request) {
|
||||||
f, err := rice.MustFindBox("site").Open("_miner.html")
|
f, err := rice.MustFindBox("site").Open("_miner.html")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
w.WriteHeader(500)
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
_, _ = w.Write([]byte(err.Error()))
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
tmpl, err := ioutil.ReadAll(f)
|
tmpl, err := ioutil.ReadAll(f)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
w.WriteHeader(500)
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
_, _ = w.Write([]byte(err.Error()))
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var executedTmpl bytes.Buffer
|
var executedTmpl bytes.Buffer
|
||||||
|
|
||||||
t, err := template.New("miner.html").Parse(string(tmpl))
|
t, err := template.New("miner.html").Parse(string(tmpl))
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
|
}
|
||||||
if err := t.Execute(&executedTmpl, supportedSectors); err != nil {
|
if err := t.Execute(&executedTmpl, supportedSectors); err != nil {
|
||||||
w.WriteHeader(500)
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
_, _ = w.Write([]byte(err.Error()))
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -238,8 +238,7 @@ func (h *handler) minerhtml(w http.ResponseWriter, r *http.Request) {
|
|||||||
func (h *handler) send(w http.ResponseWriter, r *http.Request) {
|
func (h *handler) send(w http.ResponseWriter, r *http.Request) {
|
||||||
to, err := address.NewFromString(r.FormValue("address"))
|
to, err := address.NewFromString(r.FormValue("address"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
w.WriteHeader(400)
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
||||||
_, _ = w.Write([]byte(err.Error()))
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -282,8 +281,7 @@ func (h *handler) send(w http.ResponseWriter, r *http.Request) {
|
|||||||
To: to,
|
To: to,
|
||||||
}, nil)
|
}, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
w.WriteHeader(400)
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
||||||
_, _ = w.Write([]byte(err.Error()))
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -293,15 +291,15 @@ func (h *handler) send(w http.ResponseWriter, r *http.Request) {
|
|||||||
func (h *handler) mkminer(w http.ResponseWriter, r *http.Request) {
|
func (h *handler) mkminer(w http.ResponseWriter, r *http.Request) {
|
||||||
owner, err := address.NewFromString(r.FormValue("address"))
|
owner, err := address.NewFromString(r.FormValue("address"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
w.WriteHeader(400)
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
||||||
_, _ = w.Write([]byte(err.Error()))
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if owner.Protocol() != address.BLS {
|
if owner.Protocol() != address.BLS {
|
||||||
w.WriteHeader(400)
|
http.Error(w,
|
||||||
_, _ = w.Write([]byte("Miner address must use BLS. A BLS address starts with the prefix 't3'."))
|
"Miner address must use BLS. A BLS address starts with the prefix 't3'."+
|
||||||
_, _ = w.Write([]byte("Please create a BLS address by running \"lotus wallet new bls\" while connected to a Lotus node."))
|
"Please create a BLS address by running \"lotus wallet new bls\" while connected to a Lotus node.",
|
||||||
|
http.StatusBadRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -346,16 +344,14 @@ func (h *handler) mkminer(w http.ResponseWriter, r *http.Request) {
|
|||||||
To: owner,
|
To: owner,
|
||||||
}, nil)
|
}, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
w.WriteHeader(400)
|
http.Error(w, "pushfunds: "+err.Error(), http.StatusBadRequest)
|
||||||
w.Write([]byte("pushfunds: " + err.Error()))
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
log.Infof("%s: push funds %s", owner, smsg.Cid())
|
log.Infof("%s: push funds %s", owner, smsg.Cid())
|
||||||
|
|
||||||
spt, err := ffiwrapper.SealProofTypeFromSectorSize(abi.SectorSize(ssize))
|
spt, err := ffiwrapper.SealProofTypeFromSectorSize(abi.SectorSize(ssize))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
w.WriteHeader(400)
|
http.Error(w, "sealprooftype: "+err.Error(), http.StatusBadRequest)
|
||||||
w.Write([]byte("sealprooftype: " + err.Error()))
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -366,8 +362,7 @@ func (h *handler) mkminer(w http.ResponseWriter, r *http.Request) {
|
|||||||
Peer: abi.PeerID(h.defaultMinerPeer),
|
Peer: abi.PeerID(h.defaultMinerPeer),
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
w.WriteHeader(400)
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
||||||
w.Write([]byte(err.Error()))
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -382,66 +377,58 @@ func (h *handler) mkminer(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
signed, err := h.api.MpoolPushMessage(r.Context(), createStorageMinerMsg, nil)
|
signed, err := h.api.MpoolPushMessage(r.Context(), createStorageMinerMsg, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
w.WriteHeader(400)
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
||||||
w.Write([]byte(err.Error()))
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Infof("%s: create miner msg: %s", owner, signed.Cid())
|
log.Infof("%s: create miner msg: %s", owner, signed.Cid())
|
||||||
|
|
||||||
http.Redirect(w, r, fmt.Sprintf("/wait.html?f=%s&m=%s&o=%s", signed.Cid(), smsg.Cid(), owner), 303)
|
http.Redirect(w, r, fmt.Sprintf("/wait.html?f=%s&m=%s&o=%s", signed.Cid(), smsg.Cid(), owner), http.StatusSeeOther)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *handler) msgwait(w http.ResponseWriter, r *http.Request) {
|
func (h *handler) msgwait(w http.ResponseWriter, r *http.Request) {
|
||||||
c, err := cid.Parse(r.FormValue("cid"))
|
c, err := cid.Parse(r.FormValue("cid"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
w.WriteHeader(400)
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
||||||
w.Write([]byte(err.Error()))
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
mw, err := h.api.StateWaitMsg(r.Context(), c, build.MessageConfidence)
|
mw, err := h.api.StateWaitMsg(r.Context(), c, build.MessageConfidence)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
w.WriteHeader(400)
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
||||||
w.Write([]byte(err.Error()))
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if mw.Receipt.ExitCode != 0 {
|
if mw.Receipt.ExitCode != 0 {
|
||||||
w.WriteHeader(400)
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
||||||
w.Write([]byte(xerrors.Errorf("create miner failed: exit code %d", mw.Receipt.ExitCode).Error()))
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
w.WriteHeader(200)
|
w.WriteHeader(http.StatusOK)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *handler) msgwaitaddr(w http.ResponseWriter, r *http.Request) {
|
func (h *handler) msgwaitaddr(w http.ResponseWriter, r *http.Request) {
|
||||||
c, err := cid.Parse(r.FormValue("cid"))
|
c, err := cid.Parse(r.FormValue("cid"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
w.WriteHeader(400)
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
||||||
w.Write([]byte(err.Error()))
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
mw, err := h.api.StateWaitMsg(r.Context(), c, build.MessageConfidence)
|
mw, err := h.api.StateWaitMsg(r.Context(), c, build.MessageConfidence)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
w.WriteHeader(400)
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
||||||
w.Write([]byte(err.Error()))
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if mw.Receipt.ExitCode != 0 {
|
if mw.Receipt.ExitCode != 0 {
|
||||||
w.WriteHeader(400)
|
http.Error(w, xerrors.Errorf("create miner failed: exit code %d", mw.Receipt.ExitCode).Error(), http.StatusBadRequest)
|
||||||
w.Write([]byte(xerrors.Errorf("create miner failed: exit code %d", mw.Receipt.ExitCode).Error()))
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
w.WriteHeader(200)
|
w.WriteHeader(http.StatusOK)
|
||||||
|
|
||||||
var ma power.CreateMinerReturn
|
var ma power.CreateMinerReturn
|
||||||
if err := ma.UnmarshalCBOR(bytes.NewReader(mw.Receipt.Return)); err != nil {
|
if err := ma.UnmarshalCBOR(bytes.NewReader(mw.Receipt.Return)); err != nil {
|
||||||
log.Errorf("%w", err)
|
log.Errorf("%w", err)
|
||||||
w.WriteHeader(400)
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
||||||
w.Write([]byte(err.Error()))
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,7 +54,12 @@ func main() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer fi.Close()
|
defer func() {
|
||||||
|
err2 := fi.Close()
|
||||||
|
if err == nil {
|
||||||
|
err = err2
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
b, err := json.Marshal(ki)
|
b, err := json.Marshal(ki)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -142,7 +142,7 @@ var runCmd = &cli.Command{
|
|||||||
},
|
},
|
||||||
Action: func(cctx *cli.Context) error {
|
Action: func(cctx *cli.Context) error {
|
||||||
go func() {
|
go func() {
|
||||||
http.ListenAndServe(":6060", nil)
|
http.ListenAndServe(":6060", nil) //nolint:errcheck
|
||||||
}()
|
}()
|
||||||
|
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
@ -445,7 +445,7 @@ func (r *refunder) Refund(ctx context.Context, tipset *types.TipSet, refunds *Mi
|
|||||||
// Calculate the minimum balance as the total refund we need to issue plus 5% to cover fees
|
// Calculate the minimum balance as the total refund we need to issue plus 5% to cover fees
|
||||||
minBalance := types.BigAdd(refundSum, types.BigDiv(refundSum, types.NewInt(500)))
|
minBalance := types.BigAdd(refundSum, types.BigDiv(refundSum, types.NewInt(500)))
|
||||||
if balance.LessThan(minBalance) {
|
if balance.LessThan(minBalance) {
|
||||||
log.Errorw("not sufficent funds to cover refunds", "balance", balance, "refund_sum", refundSum, "minimum_required", minBalance)
|
log.Errorw("not sufficient funds to cover refunds", "balance", balance, "refund_sum", refundSum, "minimum_required", minBalance)
|
||||||
return xerrors.Errorf("wallet does not have enough balance to cover refund")
|
return xerrors.Errorf("wallet does not have enough balance to cover refund")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -467,24 +467,24 @@ func (r *refunder) Refund(ctx context.Context, tipset *types.TipSet, refunds *Mi
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type repo struct {
|
type Repo struct {
|
||||||
last abi.ChainEpoch
|
last abi.ChainEpoch
|
||||||
path string
|
path string
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewRepo(path string) (*repo, error) {
|
func NewRepo(path string) (*Repo, error) {
|
||||||
path, err := homedir.Expand(path)
|
path, err := homedir.Expand(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return &repo{
|
return &Repo{
|
||||||
last: 0,
|
last: 0,
|
||||||
path: path,
|
path: path,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *repo) exists() (bool, error) {
|
func (r *Repo) exists() (bool, error) {
|
||||||
_, err := os.Stat(r.path)
|
_, err := os.Stat(r.path)
|
||||||
notexist := os.IsNotExist(err)
|
notexist := os.IsNotExist(err)
|
||||||
if notexist {
|
if notexist {
|
||||||
@ -494,7 +494,7 @@ func (r *repo) exists() (bool, error) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *repo) init() error {
|
func (r *Repo) init() error {
|
||||||
exist, err := r.exists()
|
exist, err := r.exists()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -511,7 +511,7 @@ func (r *repo) init() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *repo) Open() (err error) {
|
func (r *Repo) Open() (err error) {
|
||||||
if err = r.init(); err != nil {
|
if err = r.init(); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -542,11 +542,11 @@ func (r *repo) Open() (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *repo) Height() abi.ChainEpoch {
|
func (r *Repo) Height() abi.ChainEpoch {
|
||||||
return r.last
|
return r.last
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *repo) SetHeight(last abi.ChainEpoch) (err error) {
|
func (r *Repo) SetHeight(last abi.ChainEpoch) (err error) {
|
||||||
r.last = last
|
r.last = last
|
||||||
var f *os.File
|
var f *os.File
|
||||||
f, err = os.OpenFile(filepath.Join(r.path, "height"), os.O_RDWR, 0644)
|
f, err = os.OpenFile(filepath.Join(r.path, "height"), os.O_RDWR, 0644)
|
||||||
|
@ -185,7 +185,7 @@ var runCmd = &cli.Command{
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if v.APIVersion != build.APIVersion {
|
if v.APIVersion != build.APIVersion {
|
||||||
return xerrors.Errorf("lotus-miner API version doesn't match: local: ", api.Version{APIVersion: build.APIVersion})
|
return xerrors.Errorf("lotus-miner API version doesn't match: local: %s", api.Version{APIVersion: build.APIVersion})
|
||||||
}
|
}
|
||||||
log.Infof("Remote version %s", v)
|
log.Infof("Remote version %s", v)
|
||||||
|
|
||||||
@ -420,10 +420,11 @@ func watchMinerConn(ctx context.Context, cctx *cli.Context, nodeApi api.StorageM
|
|||||||
log.Errorf("getting executable for auto-restart: %+v", err)
|
log.Errorf("getting executable for auto-restart: %+v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Sync()
|
_ = log.Sync()
|
||||||
|
|
||||||
// TODO: there are probably cleaner/more graceful ways to restart,
|
// TODO: there are probably cleaner/more graceful ways to restart,
|
||||||
// but this is good enough for now (FSM can recover from the mess this creates)
|
// but this is good enough for now (FSM can recover from the mess this creates)
|
||||||
|
//nolint:gosec
|
||||||
if err := syscall.Exec(exe, []string{exe,
|
if err := syscall.Exec(exe, []string{exe,
|
||||||
fmt.Sprintf("--worker-repo=%s", cctx.String("worker-repo")),
|
fmt.Sprintf("--worker-repo=%s", cctx.String("worker-repo")),
|
||||||
fmt.Sprintf("--miner-repo=%s", cctx.String("miner-repo")),
|
fmt.Sprintf("--miner-repo=%s", cctx.String("miner-repo")),
|
||||||
@ -450,7 +451,7 @@ func extractRoutableIP(timeout time.Duration) (string, error) {
|
|||||||
env, ok := os.LookupEnv(minerMultiAddrKey)
|
env, ok := os.LookupEnv(minerMultiAddrKey)
|
||||||
if !ok {
|
if !ok {
|
||||||
// TODO remove after deprecation period
|
// TODO remove after deprecation period
|
||||||
env, ok = os.LookupEnv(deprecatedMinerMultiAddrKey)
|
_, ok = os.LookupEnv(deprecatedMinerMultiAddrKey)
|
||||||
if ok {
|
if ok {
|
||||||
log.Warnf("Using a deprecated env(%s) value, please use env(%s) instead.", deprecatedMinerMultiAddrKey, minerMultiAddrKey)
|
log.Warnf("Using a deprecated env(%s) value, please use env(%s) instead.", deprecatedMinerMultiAddrKey, minerMultiAddrKey)
|
||||||
}
|
}
|
||||||
@ -461,7 +462,7 @@ func extractRoutableIP(timeout time.Duration) (string, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
defer conn.Close()
|
defer conn.Close() //nolint:errcheck
|
||||||
|
|
||||||
localAddr := conn.LocalAddr().(*net.TCPAddr)
|
localAddr := conn.LocalAddr().(*net.TCPAddr)
|
||||||
|
|
||||||
|
@ -114,6 +114,9 @@ var preSealCmd = &cli.Command{
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
kb, err := hex.DecodeString(string(kh))
|
kb, err := hex.DecodeString(string(kh))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if err := json.Unmarshal(kb, k); err != nil {
|
if err := json.Unmarshal(kb, k); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -69,7 +69,7 @@ var keyinfoImportCmd = &cli.Command{
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer inputFile.Close()
|
defer inputFile.Close() //nolint:errcheck
|
||||||
input = bufio.NewReader(inputFile)
|
input = bufio.NewReader(inputFile)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -98,7 +98,7 @@ var keyinfoImportCmd = &cli.Command{
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
defer lkrepo.Close()
|
defer lkrepo.Close() //nolint:errcheck
|
||||||
|
|
||||||
keystore, err := lkrepo.KeyStore()
|
keystore, err := lkrepo.KeyStore()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -150,7 +150,7 @@ var keyinfoInfoCmd = &cli.Command{
|
|||||||
|
|
||||||
The 'format' flag takes a golang text/template template as its value.
|
The 'format' flag takes a golang text/template template as its value.
|
||||||
|
|
||||||
The following fields can be retrived through this command
|
The following fields can be retrieved through this command
|
||||||
Type
|
Type
|
||||||
Address
|
Address
|
||||||
PublicKey
|
PublicKey
|
||||||
@ -159,7 +159,7 @@ var keyinfoInfoCmd = &cli.Command{
|
|||||||
|
|
||||||
Examples
|
Examples
|
||||||
|
|
||||||
Retreive the address of a lotus wallet
|
Retrieve the address of a lotus wallet
|
||||||
lotus-shed keyinfo info --format '{{ .Address }}' wallet.keyinfo
|
lotus-shed keyinfo info --format '{{ .Address }}' wallet.keyinfo
|
||||||
`,
|
`,
|
||||||
Flags: []cli.Flag{
|
Flags: []cli.Flag{
|
||||||
@ -181,7 +181,7 @@ var keyinfoInfoCmd = &cli.Command{
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer inputFile.Close()
|
defer inputFile.Close() //nolint:errcheck
|
||||||
input = bufio.NewReader(inputFile)
|
input = bufio.NewReader(inputFile)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,7 +126,9 @@ var infoAllCmd = &cli.Command{
|
|||||||
|
|
||||||
fs := &flag.FlagSet{}
|
fs := &flag.FlagSet{}
|
||||||
for _, f := range sectorsStatusCmd.Flags {
|
for _, f := range sectorsStatusCmd.Flags {
|
||||||
f.Apply(fs)
|
if err := f.Apply(fs); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if err := fs.Parse([]string{"--log", "--on-chain-info", fmt.Sprint(s)}); err != nil {
|
if err := fs.Parse([]string{"--log", "--on-chain-info", fmt.Sprint(s)}); err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -53,7 +53,10 @@ var runCmd = &cli.Command{
|
|||||||
},
|
},
|
||||||
Action: func(cctx *cli.Context) error {
|
Action: func(cctx *cli.Context) error {
|
||||||
if !cctx.Bool("enable-gpu-proving") {
|
if !cctx.Bool("enable-gpu-proving") {
|
||||||
os.Setenv("BELLMAN_NO_GPU", "true")
|
err := os.Setenv("BELLMAN_NO_GPU", "true")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nodeApi, ncloser, err := lcli.GetFullNodeAPI(cctx)
|
nodeApi, ncloser, err := lcli.GetFullNodeAPI(cctx)
|
||||||
|
@ -3,13 +3,14 @@ package main
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"golang.org/x/xerrors"
|
|
||||||
"os"
|
"os"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
"text/tabwriter"
|
"text/tabwriter"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
"github.com/fatih/color"
|
"github.com/fatih/color"
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
|
|
||||||
|
@ -2,13 +2,14 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/filecoin-project/specs-actors/actors/builtin/miner"
|
|
||||||
"os"
|
"os"
|
||||||
"sort"
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"text/tabwriter"
|
"text/tabwriter"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/specs-actors/actors/builtin/miner"
|
||||||
|
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
|
@ -106,10 +106,11 @@ func handler(ps *pubsub.PubSub) func(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
sub, err := ps.Subscribe(topic)
|
sub, err := ps.Subscribe(topic) //nolint
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
defer sub.Cancel() //nolint:errcheck
|
||||||
|
|
||||||
fmt.Println("new conn")
|
fmt.Println("new conn")
|
||||||
|
|
||||||
|
@ -118,7 +118,7 @@ func openPartialFile(maxPieceSize abi.PaddedPieceSize, path string) (*partialFil
|
|||||||
trailerLen := binary.LittleEndian.Uint32(tlen[:])
|
trailerLen := binary.LittleEndian.Uint32(tlen[:])
|
||||||
expectLen := int64(trailerLen) + int64(len(tlen)) + int64(maxPieceSize)
|
expectLen := int64(trailerLen) + int64(len(tlen)) + int64(maxPieceSize)
|
||||||
if expectLen != st.Size() {
|
if expectLen != st.Size() {
|
||||||
return xerrors.Errorf("file '%d' has inconsistent length; has %d bytes; expected %d (%d trailer, %d sector data)", path, st.Size(), expectLen, int64(trailerLen)+int64(len(tlen)), maxPieceSize)
|
return xerrors.Errorf("file '%s' has inconsistent length; has %d bytes; expected %d (%d trailer, %d sector data)", path, st.Size(), expectLen, int64(trailerLen)+int64(len(tlen)), maxPieceSize)
|
||||||
}
|
}
|
||||||
if trailerLen > veryLargeRle {
|
if trailerLen > veryLargeRle {
|
||||||
log.Warnf("Partial file '%s' has a VERY large trailer with %d bytes", path, trailerLen)
|
log.Warnf("Partial file '%s' has a VERY large trailer with %d bytes", path, trailerLen)
|
||||||
|
2
extern/sector-storage/fsutil/statfs_unix.go
vendored
2
extern/sector-storage/fsutil/statfs_unix.go
vendored
@ -12,6 +12,8 @@ func Statfs(path string) (FsStat, error) {
|
|||||||
return FsStat{}, xerrors.Errorf("statfs: %w", err)
|
return FsStat{}, xerrors.Errorf("statfs: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// force int64 to handle platform specific differences
|
||||||
|
//nolint:unconvert
|
||||||
return FsStat{
|
return FsStat{
|
||||||
Capacity: int64(stat.Blocks) * int64(stat.Bsize),
|
Capacity: int64(stat.Blocks) * int64(stat.Bsize),
|
||||||
Available: int64(stat.Bavail) * int64(stat.Bsize),
|
Available: int64(stat.Bavail) * int64(stat.Bsize),
|
||||||
|
2
extern/sector-storage/mock/mock.go
vendored
2
extern/sector-storage/mock/mock.go
vendored
@ -438,7 +438,7 @@ func (m mockVerif) VerifyWindowPoSt(ctx context.Context, info abi.WindowPoStVeri
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !bytes.Equal(b1, b2) {
|
if !bytes.Equal(b1, b2) {
|
||||||
return false, xerrors.Errorf("proven and challenged sector sets didn't match: %s != !s", string(b1), string(b2))
|
return false, xerrors.Errorf("proven and challenged sector sets didn't match: %s != %s", string(b1), string(b2))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
2
extern/sector-storage/tarutil/systar.go
vendored
2
extern/sector-storage/tarutil/systar.go
vendored
@ -36,6 +36,8 @@ func ExtractTar(body io.Reader, dir string) error {
|
|||||||
return xerrors.Errorf("creating file %s: %w", filepath.Join(dir, header.Name), err)
|
return xerrors.Errorf("creating file %s: %w", filepath.Join(dir, header.Name), err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This data is coming from a trusted source, no need to check the size.
|
||||||
|
//nolint:gosec
|
||||||
if _, err := io.Copy(f, tr); err != nil {
|
if _, err := io.Copy(f, tr); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
4
extern/storage-sealing/fsm.go
vendored
4
extern/storage-sealing/fsm.go
vendored
@ -348,7 +348,9 @@ func (m *Sealing) restartSectors(ctx context.Context) error {
|
|||||||
timer := time.NewTimer(cfg.WaitDealsDelay)
|
timer := time.NewTimer(cfg.WaitDealsDelay)
|
||||||
go func() {
|
go func() {
|
||||||
<-timer.C
|
<-timer.C
|
||||||
m.StartPacking(sector.SectorNumber)
|
if err := m.StartPacking(sector.SectorNumber); err != nil {
|
||||||
|
log.Errorf("starting sector %d: %+v", sector.SectorNumber, err)
|
||||||
|
}
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
7
extern/storage-sealing/sealing.go
vendored
7
extern/storage-sealing/sealing.go
vendored
@ -355,7 +355,9 @@ func (m *Sealing) newDealSector() (abi.SectorNumber, error) {
|
|||||||
timer := time.NewTimer(cf.WaitDealsDelay)
|
timer := time.NewTimer(cf.WaitDealsDelay)
|
||||||
go func() {
|
go func() {
|
||||||
<-timer.C
|
<-timer.C
|
||||||
m.StartPacking(sid)
|
if err := m.StartPacking(sid); err != nil {
|
||||||
|
log.Errorf("starting sector %d: %+v", sid, err)
|
||||||
|
}
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -396,7 +398,6 @@ func (m *Sealing) Address() address.Address {
|
|||||||
func getDealPerSectorLimit(size abi.SectorSize) uint64 {
|
func getDealPerSectorLimit(size abi.SectorSize) uint64 {
|
||||||
if size < 64<<30 {
|
if size < 64<<30 {
|
||||||
return 256
|
return 256
|
||||||
} else {
|
|
||||||
return 512
|
|
||||||
}
|
}
|
||||||
|
return 512
|
||||||
}
|
}
|
||||||
|
1
extern/storage-sealing/types.go
vendored
1
extern/storage-sealing/types.go
vendored
@ -3,6 +3,7 @@ package sealing
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
|
|
||||||
"github.com/filecoin-project/specs-actors/actors/abi"
|
"github.com/filecoin-project/specs-actors/actors/abi"
|
||||||
|
1
go.mod
1
go.mod
@ -92,7 +92,6 @@ require (
|
|||||||
github.com/libp2p/go-libp2p-kad-dht v0.8.3
|
github.com/libp2p/go-libp2p-kad-dht v0.8.3
|
||||||
github.com/libp2p/go-libp2p-mplex v0.2.4
|
github.com/libp2p/go-libp2p-mplex v0.2.4
|
||||||
github.com/libp2p/go-libp2p-noise v0.1.1
|
github.com/libp2p/go-libp2p-noise v0.1.1
|
||||||
github.com/libp2p/go-libp2p-peer v0.2.0
|
|
||||||
github.com/libp2p/go-libp2p-peerstore v0.2.6
|
github.com/libp2p/go-libp2p-peerstore v0.2.6
|
||||||
github.com/libp2p/go-libp2p-pubsub v0.3.5-0.20200820194335-bfc96c2cd081
|
github.com/libp2p/go-libp2p-pubsub v0.3.5-0.20200820194335-bfc96c2cd081
|
||||||
github.com/libp2p/go-libp2p-quic-transport v0.7.1
|
github.com/libp2p/go-libp2p-quic-transport v0.7.1
|
||||||
|
@ -5,7 +5,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"sync"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
logging "github.com/ipfs/go-log"
|
logging "github.com/ipfs/go-log"
|
||||||
@ -48,8 +47,6 @@ type fsJournal struct {
|
|||||||
fi *os.File
|
fi *os.File
|
||||||
fSize int64
|
fSize int64
|
||||||
|
|
||||||
lk sync.Mutex
|
|
||||||
|
|
||||||
journalDir string
|
journalDir string
|
||||||
|
|
||||||
incoming chan *JournalEntry
|
incoming chan *JournalEntry
|
||||||
@ -58,7 +55,7 @@ type fsJournal struct {
|
|||||||
closing chan struct{}
|
closing chan struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func OpenFSJournal(dir string) (*fsJournal, error) {
|
func OpenFSJournal(dir string) (Journal, error) {
|
||||||
fsj := &fsJournal{
|
fsj := &fsJournal{
|
||||||
journalDir: dir,
|
journalDir: dir,
|
||||||
incoming: make(chan *JournalEntry, 32),
|
incoming: make(chan *JournalEntry, 32),
|
||||||
@ -94,7 +91,7 @@ func (fsj *fsJournal) putEntry(je *JournalEntry) error {
|
|||||||
fsj.fSize += int64(n)
|
fsj.fSize += int64(n)
|
||||||
|
|
||||||
if fsj.fSize >= fsj.journalSizeLimit {
|
if fsj.fSize >= fsj.journalSizeLimit {
|
||||||
fsj.rollJournalFile()
|
return fsj.rollJournalFile()
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@ -104,7 +101,10 @@ const RFC3339nocolon = "2006-01-02T150405Z0700"
|
|||||||
|
|
||||||
func (fsj *fsJournal) rollJournalFile() error {
|
func (fsj *fsJournal) rollJournalFile() error {
|
||||||
if fsj.fi != nil {
|
if fsj.fi != nil {
|
||||||
fsj.fi.Close()
|
err := fsj.fi.Close()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nfi, err := os.Create(filepath.Join(fsj.journalDir, fmt.Sprintf("lotus-journal-%s.ndjson", build.Clock.Now().Format(RFC3339nocolon))))
|
nfi, err := os.Create(filepath.Join(fsj.journalDir, fmt.Sprintf("lotus-journal-%s.ndjson", build.Clock.Now().Format(RFC3339nocolon))))
|
||||||
@ -125,7 +125,9 @@ func (fsj *fsJournal) runLoop() {
|
|||||||
log.Errorw("failed to write out journal entry", "entry", je, "err", err)
|
log.Errorw("failed to write out journal entry", "entry", je, "err", err)
|
||||||
}
|
}
|
||||||
case <-fsj.closing:
|
case <-fsj.closing:
|
||||||
fsj.fi.Close()
|
if err := fsj.fi.Close(); err != nil {
|
||||||
|
log.Errorw("failed to close journal", "err", err)
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,12 +28,12 @@ func NewTemporary() blockstore.Blockstore {
|
|||||||
return NewBlockstore(ds.NewMapDatastore())
|
return NewBlockstore(ds.NewMapDatastore())
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewTemporary returns a thread-safe temporary blockstore.
|
// NewTemporarySync returns a thread-safe temporary blockstore.
|
||||||
func NewTemporarySync() blockstore.Blockstore {
|
func NewTemporarySync() blockstore.Blockstore {
|
||||||
return NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore()))
|
return NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore()))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wraps the underlying blockstore in an "identity" blockstore.
|
// WrapIDStore wraps the underlying blockstore in an "identity" blockstore.
|
||||||
func WrapIDStore(bstore blockstore.Blockstore) blockstore.Blockstore {
|
func WrapIDStore(bstore blockstore.Blockstore) blockstore.Blockstore {
|
||||||
return blockstore.NewIdStore(bstore)
|
return blockstore.NewIdStore(bstore)
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ import (
|
|||||||
bstore "github.com/filecoin-project/lotus/lib/blockstore"
|
bstore "github.com/filecoin-project/lotus/lib/blockstore"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
//nolint:deadcode,varcheck
|
||||||
var log = logging.Logger("cachebs")
|
var log = logging.Logger("cachebs")
|
||||||
|
|
||||||
type CacheBS struct {
|
type CacheBS struct {
|
||||||
|
@ -64,7 +64,7 @@ func ReaderParamEncoder(addr string) jsonrpc.Option {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close() //nolint:errcheck
|
||||||
|
|
||||||
if resp.StatusCode != 200 {
|
if resp.StatusCode != 200 {
|
||||||
b, _ := ioutil.ReadAll(resp.Body)
|
b, _ := ioutil.ReadAll(resp.Body)
|
||||||
|
@ -56,7 +56,7 @@ func TestReaderProxy(t *testing.T) {
|
|||||||
|
|
||||||
read, err := client.ReadAll(context.TODO(), strings.NewReader("pooooootato"))
|
read, err := client.ReadAll(context.TODO(), strings.NewReader("pooooootato"))
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, "pooooootato", string(read), "potatos weren't equal")
|
require.Equal(t, "pooooootato", string(read), "potatoes weren't equal")
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNullReaderProxy(t *testing.T) {
|
func TestNullReaderProxy(t *testing.T) {
|
||||||
|
@ -2,8 +2,9 @@ package bls
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"github.com/filecoin-project/go-address"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/go-address"
|
||||||
)
|
)
|
||||||
|
|
||||||
func BenchmarkBLSSign(b *testing.B) {
|
func BenchmarkBLSSign(b *testing.B) {
|
||||||
@ -12,7 +13,7 @@ func BenchmarkBLSSign(b *testing.B) {
|
|||||||
b.StopTimer()
|
b.StopTimer()
|
||||||
pk, _ := signer.GenPrivate()
|
pk, _ := signer.GenPrivate()
|
||||||
randMsg := make([]byte, 32)
|
randMsg := make([]byte, 32)
|
||||||
rand.Read(randMsg)
|
_, _ = rand.Read(randMsg)
|
||||||
b.StartTimer()
|
b.StartTimer()
|
||||||
|
|
||||||
_, _ = signer.Sign(pk, randMsg)
|
_, _ = signer.Sign(pk, randMsg)
|
||||||
@ -24,7 +25,7 @@ func BenchmarkBLSVerify(b *testing.B) {
|
|||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
b.StopTimer()
|
b.StopTimer()
|
||||||
randMsg := make([]byte, 32)
|
randMsg := make([]byte, 32)
|
||||||
rand.Read(randMsg)
|
_, _ = rand.Read(randMsg)
|
||||||
|
|
||||||
priv, _ := signer.GenPrivate()
|
priv, _ := signer.GenPrivate()
|
||||||
pk, _ := signer.ToPublic(priv)
|
pk, _ := signer.ToPublic(priv)
|
||||||
|
@ -17,7 +17,7 @@ import (
|
|||||||
type NodeState int
|
type NodeState int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
NodeUnknown = iota
|
NodeUnknown = iota //nolint:deadcode
|
||||||
NodeRunning
|
NodeRunning
|
||||||
NodeStopped
|
NodeStopped
|
||||||
)
|
)
|
||||||
|
@ -73,7 +73,7 @@ func (m *outmux) run() {
|
|||||||
case msg := <-stdout:
|
case msg := <-stdout:
|
||||||
for k, out := range m.outs {
|
for k, out := range m.outs {
|
||||||
if err := out.WriteMessage(websocket.BinaryMessage, msg); err != nil {
|
if err := out.WriteMessage(websocket.BinaryMessage, msg); err != nil {
|
||||||
out.Close()
|
_ = out.Close()
|
||||||
fmt.Printf("outmux write failed: %s\n", err)
|
fmt.Printf("outmux write failed: %s\n", err)
|
||||||
delete(m.outs, k)
|
delete(m.outs, k)
|
||||||
}
|
}
|
||||||
|
@ -266,7 +266,7 @@ func (c *ClientNodeAdapter) OnDealSectorCommitted(ctx context.Context, provider
|
|||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
sd, err := stmgr.GetStorageDeal(ctx, c.StateManager, abi.DealID(dealId), ts)
|
sd, err := stmgr.GetStorageDeal(ctx, c.StateManager, dealId, ts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, xerrors.Errorf("failed to look up deal on chain: %w", err)
|
return false, xerrors.Errorf("failed to look up deal on chain: %w", err)
|
||||||
}
|
}
|
||||||
@ -303,7 +303,7 @@ func (c *ClientNodeAdapter) OnDealSectorCommitted(ctx context.Context, provider
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, did := range params.DealIDs {
|
for _, did := range params.DealIDs {
|
||||||
if did == abi.DealID(dealId) {
|
if did == dealId {
|
||||||
sectorNumber = params.SectorNumber
|
sectorNumber = params.SectorNumber
|
||||||
sectorFound = true
|
sectorFound = true
|
||||||
return true, false, nil
|
return true, false, nil
|
||||||
@ -464,7 +464,7 @@ func (c *ClientNodeAdapter) ValidateAskSignature(ctx context.Context, ask *stora
|
|||||||
|
|
||||||
mi, err := c.StateMinerInfo(ctx, ask.Ask.Miner, tsk)
|
mi, err := c.StateMinerInfo(ctx, ask.Ask.Miner, tsk)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, xerrors.Errorf("failed to get worker for miner in ask", err)
|
return false, xerrors.Errorf("failed to get worker for miner in ask: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
sigb, err := cborutil.Dump(ask.Ask)
|
sigb, err := cborutil.Dump(ask.Ask)
|
||||||
|
@ -69,7 +69,7 @@ func (n *ProviderNodeAdapter) PublishDeals(ctx context.Context, deal storagemark
|
|||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return cid.Undef, xerrors.Errorf("serializing PublishStorageDeals params failed: ", err)
|
return cid.Undef, xerrors.Errorf("serializing PublishStorageDeals params failed: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: We may want this to happen after fetching data
|
// TODO: We may want this to happen after fetching data
|
||||||
@ -267,7 +267,7 @@ func (n *ProviderNodeAdapter) OnDealSectorCommitted(ctx context.Context, provide
|
|||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
sd, err := n.StateMarketStorageDeal(ctx, abi.DealID(dealID), ts.Key())
|
sd, err := n.StateMarketStorageDeal(ctx, dealID, ts.Key())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, xerrors.Errorf("failed to look up deal on chain: %w", err)
|
return false, xerrors.Errorf("failed to look up deal on chain: %w", err)
|
||||||
}
|
}
|
||||||
@ -305,7 +305,7 @@ func (n *ProviderNodeAdapter) OnDealSectorCommitted(ctx context.Context, provide
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, did := range params.DealIDs {
|
for _, did := range params.DealIDs {
|
||||||
if did == abi.DealID(dealID) {
|
if did == dealID {
|
||||||
sectorNumber = params.SectorNumber
|
sectorNumber = params.SectorNumber
|
||||||
sectorFound = true
|
sectorFound = true
|
||||||
return true, false, nil
|
return true, false, nil
|
||||||
|
@ -36,7 +36,7 @@ type waitFunc func(ctx context.Context, baseTime uint64) (func(bool, error), abi
|
|||||||
|
|
||||||
func randTimeOffset(width time.Duration) time.Duration {
|
func randTimeOffset(width time.Duration) time.Duration {
|
||||||
buf := make([]byte, 8)
|
buf := make([]byte, 8)
|
||||||
rand.Reader.Read(buf)
|
rand.Reader.Read(buf) //nolint:errcheck
|
||||||
val := time.Duration(binary.BigEndian.Uint64(buf) % uint64(width))
|
val := time.Duration(binary.BigEndian.Uint64(buf) % uint64(width))
|
||||||
|
|
||||||
return val - (width / 2)
|
return val - (width / 2)
|
||||||
@ -508,12 +508,3 @@ func (c *cachedActorLookup) StateGetActor(ctx context.Context, a address.Address
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ActorLookup func(context.Context, address.Address, types.TipSetKey) (*types.Actor, error)
|
type ActorLookup func(context.Context, address.Address, types.TipSetKey) (*types.Actor, error)
|
||||||
|
|
||||||
func countFrom(msgs []*types.SignedMessage, from address.Address) (out int) {
|
|
||||||
for _, msg := range msgs {
|
|
||||||
if msg.Message.From == from {
|
|
||||||
out++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
|
@ -67,6 +67,7 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/storage/sectorblocks"
|
"github.com/filecoin-project/lotus/storage/sectorblocks"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
//nolint:deadcode,varcheck
|
||||||
var log = logging.Logger("builder")
|
var log = logging.Logger("builder")
|
||||||
|
|
||||||
// special is a type used to give keys to modules which
|
// special is a type used to give keys to modules which
|
||||||
|
@ -109,7 +109,7 @@ func (a *API) ClientStartDeal(ctx context.Context, params *api.StartDealParams)
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if c.Equals(params.Data.Root) {
|
if c.Equals(params.Data.Root) {
|
||||||
storeID = &importID
|
storeID = &importID //nolint
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -614,7 +614,7 @@ func (a *API) ClientCalcCommP(ctx context.Context, inpath string) (*api.CommPRet
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
defer rdr.Close()
|
defer rdr.Close() //nolint:errcheck
|
||||||
|
|
||||||
stat, err := rdr.Stat()
|
stat, err := rdr.Stat()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -700,7 +700,7 @@ func (a *API) clientImport(ctx context.Context, ref api.FileRef, store *multisto
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return cid.Undef, err
|
return cid.Undef, err
|
||||||
}
|
}
|
||||||
defer f.Close()
|
defer f.Close() //nolint:errcheck
|
||||||
|
|
||||||
stat, err := f.Stat()
|
stat, err := f.Stat()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -2,14 +2,15 @@ package full
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/filecoin-project/specs-actors/actors/abi"
|
|
||||||
"github.com/filecoin-project/specs-actors/actors/abi/big"
|
|
||||||
|
|
||||||
|
"github.com/filecoin-project/go-address"
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
"go.uber.org/fx"
|
"go.uber.org/fx"
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-address"
|
"github.com/filecoin-project/specs-actors/actors/abi"
|
||||||
|
"github.com/filecoin-project/specs-actors/actors/abi/big"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/api"
|
"github.com/filecoin-project/lotus/api"
|
||||||
"github.com/filecoin-project/lotus/chain/messagepool"
|
"github.com/filecoin-project/lotus/chain/messagepool"
|
||||||
"github.com/filecoin-project/lotus/chain/store"
|
"github.com/filecoin-project/lotus/chain/store"
|
||||||
|
@ -28,7 +28,7 @@ type MsigAPI struct {
|
|||||||
MpoolAPI MpoolAPI
|
MpoolAPI MpoolAPI
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: remove gp (gasPrice) from arguemnts
|
// TODO: remove gp (gasPrice) from arguments
|
||||||
func (a *MsigAPI) MsigCreate(ctx context.Context, req uint64, addrs []address.Address, duration abi.ChainEpoch, val types.BigInt, src address.Address, gp types.BigInt) (cid.Cid, error) {
|
func (a *MsigAPI) MsigCreate(ctx context.Context, req uint64, addrs []address.Address, duration abi.ChainEpoch, val types.BigInt, src address.Address, gp types.BigInt) (cid.Cid, error) {
|
||||||
|
|
||||||
lenAddrs := uint64(len(addrs))
|
lenAddrs := uint64(len(addrs))
|
||||||
|
@ -443,9 +443,8 @@ func (a *StateAPI) StateSearchMsg(ctx context.Context, msg cid.Cid) (*api.MsgLoo
|
|||||||
TipSet: ts.Key(),
|
TipSet: ts.Key(),
|
||||||
Height: ts.Height(),
|
Height: ts.Height(),
|
||||||
}, nil
|
}, nil
|
||||||
} else {
|
|
||||||
return nil, nil
|
|
||||||
}
|
}
|
||||||
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *StateAPI) StateGetReceipt(ctx context.Context, msg cid.Cid, tsk types.TipSetKey) (*types.MessageReceipt, error) {
|
func (a *StateAPI) StateGetReceipt(ctx context.Context, msg cid.Cid, tsk types.TipSetKey) (*types.MessageReceipt, error) {
|
||||||
@ -557,7 +556,7 @@ func (a *StateAPI) StateMarketDeals(ctx context.Context, tsk types.TipSetKey) (m
|
|||||||
} else if !found {
|
} else if !found {
|
||||||
s.SectorStartEpoch = -1
|
s.SectorStartEpoch = -1
|
||||||
}
|
}
|
||||||
out[strconv.FormatInt(int64(i), 10)] = api.MarketDeal{
|
out[strconv.FormatInt(i, 10)] = api.MarketDeal{
|
||||||
Proposal: d,
|
Proposal: d,
|
||||||
State: s,
|
State: s,
|
||||||
}
|
}
|
||||||
@ -785,10 +784,6 @@ func (a *StateAPI) StateSectorPartition(ctx context.Context, maddr address.Addre
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if found == nil {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return found, nil
|
return found, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1147,12 +1142,12 @@ func (a *StateAPI) StateDealProviderCollateralBounds(ctx context.Context, size a
|
|||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return api.DealCollateralBounds{}, xerrors.Errorf("getting power and reward actor states: %w")
|
return api.DealCollateralBounds{}, xerrors.Errorf("getting power and reward actor states: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
circ, err := a.StateCirculatingSupply(ctx, ts.Key())
|
circ, err := a.StateCirculatingSupply(ctx, ts.Key())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return api.DealCollateralBounds{}, xerrors.Errorf("getting total circulating supply: %w")
|
return api.DealCollateralBounds{}, xerrors.Errorf("getting total circulating supply: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
min, max := market.DealProviderCollateralBounds(size, verified, powerState.ThisEpochQualityAdjPower, rewardState.ThisEpochBaselinePower, circ.FilCirculating)
|
min, max := market.DealProviderCollateralBounds(size, verified, powerState.ThisEpochQualityAdjPower, rewardState.ThisEpochBaselinePower, circ.FilCirculating)
|
||||||
@ -1175,6 +1170,9 @@ func (a *StateAPI) StateCirculatingSupply(ctx context.Context, tsk types.TipSetK
|
|||||||
|
|
||||||
cst := cbor.NewCborStore(a.Chain.Blockstore())
|
cst := cbor.NewCborStore(a.Chain.Blockstore())
|
||||||
sTree, err := state.LoadStateTree(cst, st)
|
sTree, err := state.LoadStateTree(cst, st)
|
||||||
|
if err != nil {
|
||||||
|
return api.CirculatingSupply{}, err
|
||||||
|
}
|
||||||
|
|
||||||
return a.StateManager.GetCirculatingSupplyDetailed(ctx, ts.Height(), sTree)
|
return a.StateManager.GetCirculatingSupplyDetailed(ctx, ts.Height(), sTree)
|
||||||
}
|
}
|
||||||
|
@ -90,8 +90,7 @@ func (a *SyncAPI) SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) erro
|
|||||||
return xerrors.Errorf("serializing block for pubsub publishing failed: %w", err)
|
return xerrors.Errorf("serializing block for pubsub publishing failed: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: anything else to do here?
|
return a.PubSub.Publish(build.BlocksTopic(a.NetName), b) //nolint:staticcheck
|
||||||
return a.PubSub.Publish(build.BlocksTopic(a.NetName), b)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *SyncAPI) SyncIncomingBlocks(ctx context.Context) (<-chan *types.BlockHeader, error) {
|
func (a *SyncAPI) SyncIncomingBlocks(ctx context.Context) (<-chan *types.BlockHeader, error) {
|
||||||
|
@ -2,19 +2,18 @@ package full
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/filecoin-project/specs-actors/actors/abi/big"
|
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/lib/sigs"
|
|
||||||
|
|
||||||
"github.com/filecoin-project/go-address"
|
"github.com/filecoin-project/go-address"
|
||||||
|
"go.uber.org/fx"
|
||||||
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/specs-actors/actors/abi/big"
|
||||||
"github.com/filecoin-project/specs-actors/actors/crypto"
|
"github.com/filecoin-project/specs-actors/actors/crypto"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/chain/stmgr"
|
"github.com/filecoin-project/lotus/chain/stmgr"
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
"github.com/filecoin-project/lotus/chain/wallet"
|
"github.com/filecoin-project/lotus/chain/wallet"
|
||||||
|
"github.com/filecoin-project/lotus/lib/sigs"
|
||||||
"go.uber.org/fx"
|
|
||||||
"golang.org/x/xerrors"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type WalletAPI struct {
|
type WalletAPI struct {
|
||||||
@ -45,9 +44,8 @@ func (a *WalletAPI) WalletBalance(ctx context.Context, addr address.Address) (ty
|
|||||||
|
|
||||||
if xerrors.Is(err, types.ErrActorNotFound) {
|
if xerrors.Is(err, types.ErrActorNotFound) {
|
||||||
return big.Zero(), nil
|
return big.Zero(), nil
|
||||||
} else {
|
|
||||||
return bal, err
|
|
||||||
}
|
}
|
||||||
|
return bal, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *WalletAPI) WalletSign(ctx context.Context, k address.Address, msg []byte) (*crypto.Signature, error) {
|
func (a *WalletAPI) WalletSign(ctx context.Context, k address.Address, msg []byte) (*crypto.Signature, error) {
|
||||||
|
@ -123,8 +123,7 @@ func StorageClient(lc fx.Lifecycle, h host.Host, ibs dtypes.ClientBlockstore, md
|
|||||||
return c.Start(ctx)
|
return c.Start(ctx)
|
||||||
},
|
},
|
||||||
OnStop: func(context.Context) error {
|
OnStop: func(context.Context) error {
|
||||||
c.Stop()
|
return c.Stop()
|
||||||
return nil
|
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
return c, nil
|
return c, nil
|
||||||
|
@ -36,8 +36,8 @@ func RecordValidator(ps peerstore.Peerstore) record.Validator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const JWTSecretName = "auth-jwt-private" //nolint:gosec
|
const JWTSecretName = "auth-jwt-private" //nolint:gosec
|
||||||
const KTJwtHmacSecret = "jwt-hmac-secret"
|
const KTJwtHmacSecret = "jwt-hmac-secret" //nolint:gosec
|
||||||
|
|
||||||
type JwtPayload struct {
|
type JwtPayload struct {
|
||||||
Allow []auth.Permission
|
Allow []auth.Permission
|
||||||
|
@ -8,7 +8,7 @@ import (
|
|||||||
gsnet "github.com/ipfs/go-graphsync/network"
|
gsnet "github.com/ipfs/go-graphsync/network"
|
||||||
"github.com/ipfs/go-graphsync/storeutil"
|
"github.com/ipfs/go-graphsync/storeutil"
|
||||||
"github.com/libp2p/go-libp2p-core/host"
|
"github.com/libp2p/go-libp2p-core/host"
|
||||||
peer "github.com/libp2p/go-libp2p-peer"
|
"github.com/libp2p/go-libp2p-core/peer"
|
||||||
"go.uber.org/fx"
|
"go.uber.org/fx"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -76,7 +76,7 @@ func RunBlockSync(h host.Host, svc *blocksync.BlockSyncService) {
|
|||||||
func HandleIncomingBlocks(mctx helpers.MetricsCtx, lc fx.Lifecycle, ps *pubsub.PubSub, s *chain.Syncer, bserv dtypes.ChainBlockService, chain *store.ChainStore, stmgr *stmgr.StateManager, h host.Host, nn dtypes.NetworkName) {
|
func HandleIncomingBlocks(mctx helpers.MetricsCtx, lc fx.Lifecycle, ps *pubsub.PubSub, s *chain.Syncer, bserv dtypes.ChainBlockService, chain *store.ChainStore, stmgr *stmgr.StateManager, h host.Host, nn dtypes.NetworkName) {
|
||||||
ctx := helpers.LifecycleCtx(mctx, lc)
|
ctx := helpers.LifecycleCtx(mctx, lc)
|
||||||
|
|
||||||
blocksub, err := ps.Subscribe(build.BlocksTopic(nn))
|
blocksub, err := ps.Subscribe(build.BlocksTopic(nn)) //nolint
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
@ -98,7 +98,7 @@ func HandleIncomingBlocks(mctx helpers.MetricsCtx, lc fx.Lifecycle, ps *pubsub.P
|
|||||||
func HandleIncomingMessages(mctx helpers.MetricsCtx, lc fx.Lifecycle, ps *pubsub.PubSub, mpool *messagepool.MessagePool, h host.Host, nn dtypes.NetworkName) {
|
func HandleIncomingMessages(mctx helpers.MetricsCtx, lc fx.Lifecycle, ps *pubsub.PubSub, mpool *messagepool.MessagePool, h host.Host, nn dtypes.NetworkName) {
|
||||||
ctx := helpers.LifecycleCtx(mctx, lc)
|
ctx := helpers.LifecycleCtx(mctx, lc)
|
||||||
|
|
||||||
msgsub, err := ps.Subscribe(build.MessagesTopic(nn))
|
msgsub, err := ps.Subscribe(build.MessagesTopic(nn)) //nolint:staticcheck
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,6 @@ package storage
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"github.com/filecoin-project/lotus/api"
|
|
||||||
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
cbg "github.com/whyrusleeping/cbor-gen"
|
cbg "github.com/whyrusleeping/cbor-gen"
|
||||||
@ -18,6 +17,7 @@ import (
|
|||||||
"github.com/filecoin-project/specs-actors/actors/crypto"
|
"github.com/filecoin-project/specs-actors/actors/crypto"
|
||||||
"github.com/filecoin-project/specs-actors/actors/util/adt"
|
"github.com/filecoin-project/specs-actors/actors/util/adt"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/lotus/api"
|
||||||
"github.com/filecoin-project/lotus/api/apibstore"
|
"github.com/filecoin-project/lotus/api/apibstore"
|
||||||
"github.com/filecoin-project/lotus/build"
|
"github.com/filecoin-project/lotus/build"
|
||||||
"github.com/filecoin-project/lotus/chain/actors"
|
"github.com/filecoin-project/lotus/chain/actors"
|
||||||
|
@ -2,6 +2,7 @@ package storage
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-address"
|
"github.com/filecoin-project/go-address"
|
||||||
|
@ -4,13 +4,13 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"github.com/filecoin-project/specs-actors/actors/abi/big"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-bitfield"
|
"github.com/filecoin-project/go-bitfield"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-address"
|
"github.com/filecoin-project/go-address"
|
||||||
"github.com/filecoin-project/specs-actors/actors/abi"
|
"github.com/filecoin-project/specs-actors/actors/abi"
|
||||||
|
"github.com/filecoin-project/specs-actors/actors/abi/big"
|
||||||
"github.com/filecoin-project/specs-actors/actors/builtin"
|
"github.com/filecoin-project/specs-actors/actors/builtin"
|
||||||
"github.com/filecoin-project/specs-actors/actors/builtin/miner"
|
"github.com/filecoin-project/specs-actors/actors/builtin/miner"
|
||||||
"github.com/filecoin-project/specs-actors/actors/crypto"
|
"github.com/filecoin-project/specs-actors/actors/crypto"
|
||||||
|
@ -11,7 +11,7 @@ type headBuffer struct {
|
|||||||
size int
|
size int
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewHeadBuffer(size int) *headBuffer {
|
func newHeadBuffer(size int) *headBuffer {
|
||||||
buffer := list.New()
|
buffer := list.New()
|
||||||
buffer.Init()
|
buffer.Init()
|
||||||
|
|
||||||
@ -21,7 +21,7 @@ func NewHeadBuffer(size int) *headBuffer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *headBuffer) Push(hc *api.HeadChange) (rethc *api.HeadChange) {
|
func (h *headBuffer) push(hc *api.HeadChange) (rethc *api.HeadChange) {
|
||||||
if h.buffer.Len() == h.size {
|
if h.buffer.Len() == h.size {
|
||||||
var ok bool
|
var ok bool
|
||||||
|
|
||||||
@ -39,7 +39,7 @@ func (h *headBuffer) Push(hc *api.HeadChange) (rethc *api.HeadChange) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *headBuffer) Pop() {
|
func (h *headBuffer) pop() {
|
||||||
el := h.buffer.Back()
|
el := h.buffer.Back()
|
||||||
if el != nil {
|
if el != nil {
|
||||||
h.buffer.Remove(el)
|
h.buffer.Remove(el)
|
||||||
|
@ -10,34 +10,34 @@ import (
|
|||||||
func TestHeadBuffer(t *testing.T) {
|
func TestHeadBuffer(t *testing.T) {
|
||||||
|
|
||||||
t.Run("Straight push through", func(t *testing.T) {
|
t.Run("Straight push through", func(t *testing.T) {
|
||||||
hb := NewHeadBuffer(5)
|
hb := newHeadBuffer(5)
|
||||||
require.Nil(t, hb.Push(&api.HeadChange{Type: "1"}))
|
require.Nil(t, hb.push(&api.HeadChange{Type: "1"}))
|
||||||
require.Nil(t, hb.Push(&api.HeadChange{Type: "2"}))
|
require.Nil(t, hb.push(&api.HeadChange{Type: "2"}))
|
||||||
require.Nil(t, hb.Push(&api.HeadChange{Type: "3"}))
|
require.Nil(t, hb.push(&api.HeadChange{Type: "3"}))
|
||||||
require.Nil(t, hb.Push(&api.HeadChange{Type: "4"}))
|
require.Nil(t, hb.push(&api.HeadChange{Type: "4"}))
|
||||||
require.Nil(t, hb.Push(&api.HeadChange{Type: "5"}))
|
require.Nil(t, hb.push(&api.HeadChange{Type: "5"}))
|
||||||
|
|
||||||
hc := hb.Push(&api.HeadChange{Type: "6"})
|
hc := hb.push(&api.HeadChange{Type: "6"})
|
||||||
require.Equal(t, hc.Type, "1")
|
require.Equal(t, hc.Type, "1")
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Reverts", func(t *testing.T) {
|
t.Run("Reverts", func(t *testing.T) {
|
||||||
hb := NewHeadBuffer(5)
|
hb := newHeadBuffer(5)
|
||||||
require.Nil(t, hb.Push(&api.HeadChange{Type: "1"}))
|
require.Nil(t, hb.push(&api.HeadChange{Type: "1"}))
|
||||||
require.Nil(t, hb.Push(&api.HeadChange{Type: "2"}))
|
require.Nil(t, hb.push(&api.HeadChange{Type: "2"}))
|
||||||
require.Nil(t, hb.Push(&api.HeadChange{Type: "3"}))
|
require.Nil(t, hb.push(&api.HeadChange{Type: "3"}))
|
||||||
hb.Pop()
|
hb.pop()
|
||||||
require.Nil(t, hb.Push(&api.HeadChange{Type: "3a"}))
|
require.Nil(t, hb.push(&api.HeadChange{Type: "3a"}))
|
||||||
hb.Pop()
|
hb.pop()
|
||||||
require.Nil(t, hb.Push(&api.HeadChange{Type: "3b"}))
|
require.Nil(t, hb.push(&api.HeadChange{Type: "3b"}))
|
||||||
require.Nil(t, hb.Push(&api.HeadChange{Type: "4"}))
|
require.Nil(t, hb.push(&api.HeadChange{Type: "4"}))
|
||||||
require.Nil(t, hb.Push(&api.HeadChange{Type: "5"}))
|
require.Nil(t, hb.push(&api.HeadChange{Type: "5"}))
|
||||||
|
|
||||||
hc := hb.Push(&api.HeadChange{Type: "6"})
|
hc := hb.push(&api.HeadChange{Type: "6"})
|
||||||
require.Equal(t, hc.Type, "1")
|
require.Equal(t, hc.Type, "1")
|
||||||
hc = hb.Push(&api.HeadChange{Type: "7"})
|
hc = hb.push(&api.HeadChange{Type: "7"})
|
||||||
require.Equal(t, hc.Type, "2")
|
require.Equal(t, hc.Type, "2")
|
||||||
hc = hb.Push(&api.HeadChange{Type: "8"})
|
hc = hb.push(&api.HeadChange{Type: "8"})
|
||||||
require.Equal(t, hc.Type, "3b")
|
require.Equal(t, hc.Type, "3b")
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -251,16 +251,13 @@ func RecordTipsetStatePoints(ctx context.Context, api api.FullNode, pl *PointLis
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = mp.ForEach(nil, func(key string) error {
|
var claim power.Claim
|
||||||
|
err = mp.ForEach(&claim, func(key string) error {
|
||||||
addr, err := address.NewFromBytes([]byte(key))
|
addr, err := address.NewFromBytes([]byte(key))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
var claim power.Claim
|
|
||||||
keyerAddr := adt.AddrKey(addr)
|
|
||||||
mp.Get(keyerAddr, &claim)
|
|
||||||
|
|
||||||
if claim.QualityAdjPower.Int64() == 0 {
|
if claim.QualityAdjPower.Int64() == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -311,7 +308,7 @@ func RecordTipsetMessagesPoints(ctx context.Context, api api.FullNode, pl *Point
|
|||||||
|
|
||||||
for i, msg := range msgs {
|
for i, msg := range msgs {
|
||||||
// FIXME: use float so this doesn't overflow
|
// FIXME: use float so this doesn't overflow
|
||||||
// FIXME: this doesn't work as time points get overriden
|
// FIXME: this doesn't work as time points get overridden
|
||||||
p := NewPoint("chain.message_gaspremium", msg.Message.GasPremium.Int64())
|
p := NewPoint("chain.message_gaspremium", msg.Message.GasPremium.Int64())
|
||||||
pl.AddPoint(p)
|
pl.AddPoint(p)
|
||||||
p = NewPoint("chain.message_gasfeecap", msg.Message.GasFeeCap.Int64())
|
p = NewPoint("chain.message_gasfeecap", msg.Message.GasFeeCap.Int64())
|
||||||
|
@ -124,7 +124,7 @@ sync_complete:
|
|||||||
func GetTips(ctx context.Context, api api.FullNode, lastHeight abi.ChainEpoch, headlag int) (<-chan *types.TipSet, error) {
|
func GetTips(ctx context.Context, api api.FullNode, lastHeight abi.ChainEpoch, headlag int) (<-chan *types.TipSet, error) {
|
||||||
chmain := make(chan *types.TipSet)
|
chmain := make(chan *types.TipSet)
|
||||||
|
|
||||||
hb := NewHeadBuffer(headlag)
|
hb := newHeadBuffer(headlag)
|
||||||
|
|
||||||
notif, err := api.ChainNotify(ctx)
|
notif, err := api.ChainNotify(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -134,7 +134,8 @@ func GetTips(ctx context.Context, api api.FullNode, lastHeight abi.ChainEpoch, h
|
|||||||
go func() {
|
go func() {
|
||||||
defer close(chmain)
|
defer close(chmain)
|
||||||
|
|
||||||
ping := time.Tick(30 * time.Second)
|
ticker := time.NewTicker(30 * time.Second)
|
||||||
|
defer ticker.Stop()
|
||||||
|
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
@ -154,14 +155,14 @@ func GetTips(ctx context.Context, api api.FullNode, lastHeight abi.ChainEpoch, h
|
|||||||
chmain <- tipset
|
chmain <- tipset
|
||||||
}
|
}
|
||||||
case store.HCApply:
|
case store.HCApply:
|
||||||
if out := hb.Push(change); out != nil {
|
if out := hb.push(change); out != nil {
|
||||||
chmain <- out.Val
|
chmain <- out.Val
|
||||||
}
|
}
|
||||||
case store.HCRevert:
|
case store.HCRevert:
|
||||||
hb.Pop()
|
hb.pop()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case <-ping:
|
case <-ticker.C:
|
||||||
log.Info("Running health check")
|
log.Info("Running health check")
|
||||||
|
|
||||||
cctx, cancel := context.WithTimeout(ctx, 5*time.Second)
|
cctx, cancel := context.WithTimeout(ctx, 5*time.Second)
|
||||||
|
Loading…
Reference in New Issue
Block a user