lotus/itests/kit/node_builder.go

670 lines
18 KiB
Go
Raw Normal View History

2021-05-18 21:01:10 +00:00
package kit
2020-08-13 20:37:09 +00:00
import (
"bytes"
"context"
"crypto/rand"
"io/ioutil"
"net/http"
2020-08-13 20:37:09 +00:00
"net/http/httptest"
"sync"
"testing"
"time"
2021-06-08 23:17:39 +00:00
"github.com/filecoin-project/go-jsonrpc/auth"
"github.com/filecoin-project/go-state-types/network"
2020-08-13 20:37:09 +00:00
"github.com/filecoin-project/go-address"
2020-09-07 03:49:10 +00:00
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/go-state-types/exitcode"
2020-08-13 20:37:09 +00:00
"github.com/filecoin-project/go-storedcounter"
"github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/api/client"
2021-04-05 17:56:53 +00:00
"github.com/filecoin-project/lotus/api/v1api"
2020-08-13 20:37:09 +00:00
"github.com/filecoin-project/lotus/build"
"github.com/filecoin-project/lotus/chain"
2020-08-13 20:37:09 +00:00
"github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/builtin/miner"
"github.com/filecoin-project/lotus/chain/actors/builtin/power"
2020-08-13 20:37:09 +00:00
"github.com/filecoin-project/lotus/chain/gen"
genesis2 "github.com/filecoin-project/lotus/chain/gen/genesis"
2020-11-04 15:53:16 +00:00
"github.com/filecoin-project/lotus/chain/messagepool"
2020-08-13 20:37:09 +00:00
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/chain/wallet"
"github.com/filecoin-project/lotus/cmd/lotus-seed/seed"
sectorstorage "github.com/filecoin-project/lotus/extern/sector-storage"
"github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper"
"github.com/filecoin-project/lotus/extern/sector-storage/mock"
"github.com/filecoin-project/lotus/genesis"
2020-10-08 01:09:33 +00:00
lotusminer "github.com/filecoin-project/lotus/miner"
2020-08-13 20:37:09 +00:00
"github.com/filecoin-project/lotus/node"
"github.com/filecoin-project/lotus/node/modules"
"github.com/filecoin-project/lotus/node/modules/dtypes"
2020-08-13 20:37:09 +00:00
testing2 "github.com/filecoin-project/lotus/node/modules/testing"
"github.com/filecoin-project/lotus/node/repo"
"github.com/filecoin-project/lotus/storage/mockstorage"
2020-10-08 01:09:33 +00:00
miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner"
power2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/power"
2020-08-13 20:37:09 +00:00
"github.com/ipfs/go-datastore"
"github.com/libp2p/go-libp2p-core/crypto"
"github.com/libp2p/go-libp2p-core/peer"
mocknet "github.com/libp2p/go-libp2p/p2p/net/mock"
"github.com/multiformats/go-multiaddr"
manet "github.com/multiformats/go-multiaddr/net"
2020-08-13 20:37:09 +00:00
"github.com/stretchr/testify/require"
)
func init() {
chain.BootstrapPeerThreshold = 1
2020-11-09 11:35:42 +00:00
messagepool.HeadChangeCoalesceMinDelay = time.Microsecond
messagepool.HeadChangeCoalesceMaxDelay = 2 * time.Microsecond
messagepool.HeadChangeCoalesceMergeInterval = 100 * time.Nanosecond
}
func CreateTestStorageNode(ctx context.Context, t *testing.T, waddr address.Address, act address.Address, pk crypto.PrivKey, tnd TestFullNode, mn mocknet.Mocknet, opts node.Option) TestMiner {
2020-08-13 20:37:09 +00:00
r := repo.NewMemory(nil)
lr, err := r.Lock(repo.StorageMiner)
require.NoError(t, err)
ks, err := lr.KeyStore()
require.NoError(t, err)
kbytes, err := pk.Bytes()
require.NoError(t, err)
err = ks.Put("libp2p-host", types.KeyInfo{
Type: "libp2p-host",
PrivateKey: kbytes,
})
require.NoError(t, err)
2021-01-26 10:25:34 +00:00
ds, err := lr.Datastore(context.TODO(), "/metadata")
2020-08-13 20:37:09 +00:00
require.NoError(t, err)
2021-05-19 16:13:30 +00:00
err = ds.Put(datastore.NewKey("miner-address"), act.Bytes())
2020-08-13 20:37:09 +00:00
require.NoError(t, err)
nic := storedcounter.New(ds, datastore.NewKey(modules.StorageCounterDSPrefix))
2021-05-17 12:28:09 +00:00
for i := 0; i < GenesisPreseals; i++ {
2020-08-13 20:37:09 +00:00
_, err := nic.Next()
require.NoError(t, err)
}
_, err = nic.Next()
require.NoError(t, err)
err = lr.Close()
require.NoError(t, err)
peerid, err := peer.IDFromPrivateKey(pk)
require.NoError(t, err)
2020-10-08 01:09:33 +00:00
enc, err := actors.SerializeParams(&miner2.ChangePeerIDParams{NewID: abi.PeerID(peerid)})
2020-08-13 20:37:09 +00:00
require.NoError(t, err)
msg := &types.Message{
To: act,
From: waddr,
Method: miner.Methods.ChangePeerID,
2020-08-13 20:37:09 +00:00
Params: enc,
Value: types.NewInt(0),
}
_, err = tnd.MpoolPushMessage(ctx, msg, nil)
require.NoError(t, err)
// start node
var minerapi api.StorageMiner
2020-10-08 01:09:33 +00:00
mineBlock := make(chan lotusminer.MineReq)
2020-10-08 22:59:06 +00:00
stop, err := node.New(ctx,
2020-08-13 20:37:09 +00:00
node.StorageMiner(&minerapi),
node.Online(),
node.Repo(r),
node.Test(),
node.MockHost(mn),
2021-04-05 17:56:53 +00:00
node.Override(new(v1api.FullNode), tnd),
2020-10-08 01:09:33 +00:00
node.Override(new(*lotusminer.Miner), lotusminer.NewTestMiner(mineBlock, act)),
2020-08-13 20:37:09 +00:00
opts,
)
if err != nil {
t.Fatalf("failed to construct node: %v", err)
}
2020-10-08 22:59:06 +00:00
t.Cleanup(func() { _ = stop(context.Background()) })
2020-08-13 20:37:09 +00:00
/*// Bootstrap with full node
2021-05-18 21:01:10 +00:00
remoteAddrs, err := tnd.NetAddrsListen(Ctx)
2020-08-13 20:37:09 +00:00
require.NoError(t, err)
2021-05-18 21:01:10 +00:00
err = minerapi.NetConnect(Ctx, remoteAddrs)
2020-08-13 20:37:09 +00:00
require.NoError(t, err)*/
2020-10-08 01:09:33 +00:00
mineOne := func(ctx context.Context, req lotusminer.MineReq) error {
2020-08-13 20:37:09 +00:00
select {
case mineBlock <- req:
return nil
case <-ctx.Done():
return ctx.Err()
}
}
return TestMiner{StorageMiner: minerapi, MineOne: mineOne, Stop: stop}
2020-08-13 20:37:09 +00:00
}
2021-05-21 19:39:41 +00:00
func storageBuilder(parentNode TestFullNode, mn mocknet.Mocknet, opts node.Option) MinerBuilder {
return func(ctx context.Context, t *testing.T, spt abi.RegisteredSealProof, owner address.Address) TestMiner {
pk, _, err := crypto.GenerateEd25519Key(rand.Reader)
require.NoError(t, err)
minerPid, err := peer.IDFromPrivateKey(pk)
require.NoError(t, err)
params, serr := actors.SerializeParams(&power2.CreateMinerParams{
Owner: owner,
Worker: owner,
SealProofType: spt,
Peer: abi.PeerID(minerPid),
})
require.NoError(t, serr)
createStorageMinerMsg := &types.Message{
To: power.Address,
From: owner,
Value: big.Zero(),
Method: power.Methods.CreateMiner,
Params: params,
GasLimit: 0,
GasPremium: big.NewInt(5252),
}
signed, err := parentNode.MpoolPushMessage(ctx, createStorageMinerMsg, nil)
require.NoError(t, err)
mw, err := parentNode.StateWaitMsg(ctx, signed.Cid(), build.MessageConfidence, api.LookbackNoLimit, true)
require.NoError(t, err)
require.Equal(t, exitcode.Ok, mw.Receipt.ExitCode)
var retval power2.CreateMinerReturn
err = retval.UnmarshalCBOR(bytes.NewReader(mw.Receipt.Return))
require.NoError(t, err)
return CreateTestStorageNode(ctx, t, owner, retval.IDAddress, pk, parentNode, mn, opts)
}
}
func Builder(t *testing.T, fullOpts []FullNodeOpts, storage []StorageMiner) ([]TestFullNode, []TestMiner) {
return mockBuilderOpts(t, fullOpts, storage, false)
}
func RPCBuilder(t *testing.T, fullOpts []FullNodeOpts, storage []StorageMiner) ([]TestFullNode, []TestMiner) {
return mockBuilderOpts(t, fullOpts, storage, true)
}
2021-05-20 11:17:41 +00:00
func MockMinerBuilder(t *testing.T, fullOpts []FullNodeOpts, storage []StorageMiner) ([]TestFullNode, []TestMiner) {
return mockMinerBuilderOpts(t, fullOpts, storage, false)
}
func RPCMockMinerBuilder(t *testing.T, fullOpts []FullNodeOpts, storage []StorageMiner) ([]TestFullNode, []TestMiner) {
return mockMinerBuilderOpts(t, fullOpts, storage, true)
}
func mockBuilderOpts(t *testing.T, fullOpts []FullNodeOpts, storage []StorageMiner, rpc bool) ([]TestFullNode, []TestMiner) {
2020-10-08 22:59:06 +00:00
ctx, cancel := context.WithCancel(context.Background())
t.Cleanup(cancel)
2020-08-13 20:37:09 +00:00
mn := mocknet.New(ctx)
fulls := make([]TestFullNode, len(fullOpts))
miners := make([]TestMiner, len(storage))
2020-08-13 20:37:09 +00:00
2021-05-20 15:12:42 +00:00
// *****
2020-08-13 20:37:09 +00:00
pk, _, err := crypto.GenerateEd25519Key(rand.Reader)
require.NoError(t, err)
minerPid, err := peer.IDFromPrivateKey(pk)
require.NoError(t, err)
var genbuf bytes.Buffer
if len(storage) > 1 {
panic("need more peer IDs")
}
2021-05-20 15:12:42 +00:00
// *****
2020-08-13 20:37:09 +00:00
// PRESEAL SECTION, TRY TO REPLACE WITH BETTER IN THE FUTURE
// TODO: would be great if there was a better way to fake the preseals
2021-05-20 15:12:42 +00:00
var (
genms []genesis.Miner
maddrs []address.Address
genaccs []genesis.Actor
keys []*wallet.Key
)
2020-08-13 20:37:09 +00:00
var presealDirs []string
for i := 0; i < len(storage); i++ {
maddr, err := address.NewIDAddress(genesis2.MinerStart + uint64(i))
if err != nil {
t.Fatal(err)
}
tdir, err := ioutil.TempDir("", "preseal-memgen")
if err != nil {
t.Fatal(err)
}
2021-05-17 12:28:09 +00:00
genm, k, err := seed.PreSeal(maddr, abi.RegisteredSealProof_StackedDrg2KiBV1, 0, GenesisPreseals, tdir, []byte("make genesis mem random"), nil, true)
2020-08-13 20:37:09 +00:00
if err != nil {
t.Fatal(err)
}
genm.PeerId = minerPid
wk, err := wallet.NewKey(*k)
if err != nil {
return nil, nil
}
genaccs = append(genaccs, genesis.Actor{
Type: genesis.TAccount,
Balance: big.Mul(big.NewInt(400000000), types.NewInt(build.FilecoinPrecision)),
Meta: (&genesis.AccountMeta{Owner: wk.Address}).ActorMeta(),
})
keys = append(keys, wk)
presealDirs = append(presealDirs, tdir)
maddrs = append(maddrs, maddr)
genms = append(genms, *genm)
}
2021-05-24 11:41:13 +00:00
rkhKey, err := wallet.GenerateKey(types.KTSecp256k1)
if err != nil {
return nil, nil
}
vrk := genesis.Actor{
Type: genesis.TAccount,
2021-05-31 20:12:06 +00:00
Balance: big.Mul(big.Div(big.NewInt(int64(build.FilBase)), big.NewInt(100)), big.NewInt(int64(build.FilecoinPrecision))),
2021-05-24 11:41:13 +00:00
Meta: (&genesis.AccountMeta{Owner: rkhKey.Address}).ActorMeta(),
}
keys = append(keys, rkhKey)
2020-08-13 20:37:09 +00:00
templ := &genesis.Template{
NetworkVersion: network.Version0,
Accounts: genaccs,
Miners: genms,
NetworkName: "test",
Timestamp: uint64(time.Now().Unix() - 10000), // some time sufficiently far in the past
2021-05-24 11:41:13 +00:00
VerifregRootKey: vrk,
RemainderAccount: gen.DefaultRemainderAccountActor,
2020-08-13 20:37:09 +00:00
}
// END PRESEAL SECTION
for i := 0; i < len(fullOpts); i++ {
2020-08-13 20:37:09 +00:00
var genesis node.Option
if i == 0 {
genesis = node.Override(new(modules.Genesis), testing2.MakeGenesisMem(&genbuf, *templ))
} else {
genesis = node.Override(new(modules.Genesis), modules.LoadGenesis(genbuf.Bytes()))
}
2020-10-08 22:59:06 +00:00
stop, err := node.New(ctx,
2020-10-09 16:43:22 +00:00
node.FullAPI(&fulls[i].FullNode, node.Lite(fullOpts[i].Lite)),
2020-08-13 20:37:09 +00:00
node.Online(),
node.Repo(repo.NewMemory(nil)),
node.MockHost(mn),
node.Test(),
genesis,
fullOpts[i].Opts(fulls),
2020-08-13 20:37:09 +00:00
)
2021-05-24 11:41:13 +00:00
2020-08-13 20:37:09 +00:00
if err != nil {
t.Fatal(err)
}
2020-10-08 22:59:06 +00:00
t.Cleanup(func() { _ = stop(context.Background()) })
if rpc {
fulls[i] = fullRpc(t, fulls[i])
}
fulls[i].Stb = storageBuilder(fulls[i], mn, node.Options())
2020-08-13 20:37:09 +00:00
}
2021-05-24 11:41:13 +00:00
if _, err := fulls[0].FullNode.WalletImport(ctx, &rkhKey.KeyInfo); err != nil {
t.Fatal(err)
}
2020-08-13 20:37:09 +00:00
for i, def := range storage {
// TODO: support non-bootstrap miners
if i != 0 {
t.Fatal("only one storage node supported")
}
if def.Full != 0 {
t.Fatal("storage nodes only supported on the first full node")
}
f := fulls[def.Full]
if _, err := f.FullNode.WalletImport(ctx, &keys[i].KeyInfo); err != nil {
t.Fatal(err)
}
if err := f.FullNode.WalletSetDefault(ctx, keys[i].Address); err != nil {
t.Fatal(err)
}
genMiner := maddrs[i]
wa := genms[i].Worker
2021-01-08 15:28:38 +00:00
opts := def.Opts
if opts == nil {
opts = node.Options()
}
miners[i] = CreateTestStorageNode(ctx, t, wa, genMiner, pk, f, mn, opts)
if err := miners[i].StorageAddLocal(ctx, presealDirs[i]); err != nil {
2020-08-13 20:37:09 +00:00
t.Fatalf("%+v", err)
}
/*
sma := miners[i].StorageMiner.(*impl.StorageMinerAPI)
2020-08-13 20:37:09 +00:00
psd := presealDirs[i]
*/
if rpc {
miners[i] = storerRpc(t, miners[i])
}
2020-08-13 20:37:09 +00:00
}
if err := mn.LinkAll(); err != nil {
t.Fatal(err)
}
if len(miners) > 0 {
2020-08-13 20:37:09 +00:00
// Mine 2 blocks to setup some CE stuff in some actors
var wait sync.Mutex
wait.Lock()
bm := NewBlockMiner(t, miners[0])
2021-05-21 12:39:09 +00:00
t.Cleanup(bm.Stop)
bm.MineUntilBlock(ctx, fulls[0], func(epoch abi.ChainEpoch) {
2020-08-13 20:37:09 +00:00
wait.Unlock()
2020-08-25 22:07:10 +00:00
})
2020-08-13 20:37:09 +00:00
wait.Lock()
bm.MineUntilBlock(ctx, fulls[0], func(epoch abi.ChainEpoch) {
2020-08-13 20:37:09 +00:00
wait.Unlock()
2020-08-25 22:07:10 +00:00
})
2020-08-13 20:37:09 +00:00
wait.Lock()
}
return fulls, miners
2020-08-13 20:37:09 +00:00
}
2021-05-20 11:17:41 +00:00
func mockMinerBuilderOpts(t *testing.T, fullOpts []FullNodeOpts, storage []StorageMiner, rpc bool) ([]TestFullNode, []TestMiner) {
ctx, cancel := context.WithCancel(context.Background())
t.Cleanup(cancel)
2020-08-13 20:37:09 +00:00
mn := mocknet.New(ctx)
fulls := make([]TestFullNode, len(fullOpts))
miners := make([]TestMiner, len(storage))
2020-08-13 20:37:09 +00:00
var genbuf bytes.Buffer
// PRESEAL SECTION, TRY TO REPLACE WITH BETTER IN THE FUTURE
// TODO: would be great if there was a better way to fake the preseals
2021-05-20 15:12:42 +00:00
var (
genms []genesis.Miner
genaccs []genesis.Actor
maddrs []address.Address
keys []*wallet.Key
pidKeys []crypto.PrivKey
)
2020-08-13 20:37:09 +00:00
for i := 0; i < len(storage); i++ {
maddr, err := address.NewIDAddress(genesis2.MinerStart + uint64(i))
if err != nil {
t.Fatal(err)
}
preseals := storage[i].Preseal
2021-05-17 12:28:09 +00:00
if preseals == PresealGenesis {
preseals = GenesisPreseals
2020-08-13 20:37:09 +00:00
}
2020-11-05 12:43:05 +00:00
genm, k, err := mockstorage.PreSeal(abi.RegisteredSealProof_StackedDrg2KiBV1, maddr, preseals)
2020-08-13 20:37:09 +00:00
if err != nil {
t.Fatal(err)
}
pk, _, err := crypto.GenerateEd25519Key(rand.Reader)
require.NoError(t, err)
minerPid, err := peer.IDFromPrivateKey(pk)
require.NoError(t, err)
genm.PeerId = minerPid
wk, err := wallet.NewKey(*k)
if err != nil {
return nil, nil
}
genaccs = append(genaccs, genesis.Actor{
Type: genesis.TAccount,
Balance: big.Mul(big.NewInt(400000000), types.NewInt(build.FilecoinPrecision)),
2020-08-13 20:37:09 +00:00
Meta: (&genesis.AccountMeta{Owner: wk.Address}).ActorMeta(),
})
keys = append(keys, wk)
pidKeys = append(pidKeys, pk)
maddrs = append(maddrs, maddr)
genms = append(genms, *genm)
}
2021-05-31 20:12:06 +00:00
rkhKey, err := wallet.GenerateKey(types.KTSecp256k1)
if err != nil {
return nil, nil
}
vrk := genesis.Actor{
Type: genesis.TAccount,
Balance: big.Mul(big.Div(big.NewInt(int64(build.FilBase)), big.NewInt(100)), big.NewInt(int64(build.FilecoinPrecision))),
Meta: (&genesis.AccountMeta{Owner: rkhKey.Address}).ActorMeta(),
}
keys = append(keys, rkhKey)
2020-08-13 20:37:09 +00:00
templ := &genesis.Template{
NetworkVersion: network.Version0,
Accounts: genaccs,
Miners: genms,
NetworkName: "test",
Timestamp: uint64(time.Now().Unix()) - (build.BlockDelaySecs * 20000),
2021-05-31 20:12:06 +00:00
VerifregRootKey: vrk,
RemainderAccount: gen.DefaultRemainderAccountActor,
2020-08-13 20:37:09 +00:00
}
// END PRESEAL SECTION
for i := 0; i < len(fullOpts); i++ {
2020-08-13 20:37:09 +00:00
var genesis node.Option
if i == 0 {
genesis = node.Override(new(modules.Genesis), testing2.MakeGenesisMem(&genbuf, *templ))
} else {
genesis = node.Override(new(modules.Genesis), modules.LoadGenesis(genbuf.Bytes()))
}
2020-10-08 22:59:06 +00:00
stop, err := node.New(ctx,
2020-10-09 16:43:22 +00:00
node.FullAPI(&fulls[i].FullNode, node.Lite(fullOpts[i].Lite)),
2020-08-13 20:37:09 +00:00
node.Online(),
node.Repo(repo.NewMemory(nil)),
node.MockHost(mn),
node.Test(),
node.Override(new(ffiwrapper.Verifier), mock.MockVerifier),
2021-05-19 13:20:23 +00:00
node.Override(new(ffiwrapper.Prover), mock.MockProver),
2020-08-13 20:37:09 +00:00
// so that we subscribe to pubsub topics immediately
node.Override(new(dtypes.Bootstrapper), dtypes.Bootstrapper(true)),
2020-08-13 20:37:09 +00:00
genesis,
fullOpts[i].Opts(fulls),
2020-08-13 20:37:09 +00:00
)
if err != nil {
t.Fatalf("%+v", err)
}
2020-10-08 22:59:06 +00:00
t.Cleanup(func() { _ = stop(context.Background()) })
if rpc {
fulls[i] = fullRpc(t, fulls[i])
}
fulls[i].Stb = storageBuilder(fulls[i], mn, node.Options(
2021-06-07 10:32:15 +00:00
node.Override(new(*mock.SectorMgr), func() (*mock.SectorMgr, error) {
return mock.NewMockSectorMgr(nil), nil
}),
2021-06-07 10:32:15 +00:00
node.Override(new(sectorstorage.SectorManager), node.From(new(*mock.SectorMgr))),
node.Override(new(sectorstorage.Unsealer), node.From(new(*mock.SectorMgr))),
node.Override(new(sectorstorage.PieceProvider), node.From(new(*mock.SectorMgr))),
node.Override(new(ffiwrapper.Verifier), mock.MockVerifier),
2021-05-19 13:20:23 +00:00
node.Override(new(ffiwrapper.Prover), mock.MockProver),
node.Unset(new(*sectorstorage.Manager)),
))
2020-08-13 20:37:09 +00:00
}
2021-05-31 20:12:06 +00:00
if _, err := fulls[0].FullNode.WalletImport(ctx, &rkhKey.KeyInfo); err != nil {
t.Fatal(err)
}
2020-08-13 20:37:09 +00:00
for i, def := range storage {
// TODO: support non-bootstrap miners
minerID := abi.ActorID(genesis2.MinerStart + uint64(i))
if def.Full != 0 {
t.Fatal("storage nodes only supported on the first full node")
}
f := fulls[def.Full]
if _, err := f.FullNode.WalletImport(ctx, &keys[i].KeyInfo); err != nil {
return nil, nil
}
if err := f.FullNode.WalletSetDefault(ctx, keys[i].Address); err != nil {
return nil, nil
}
sectors := make([]abi.SectorID, len(genms[i].Sectors))
for i, sector := range genms[i].Sectors {
sectors[i] = abi.SectorID{
Miner: minerID,
Number: sector.SectorID,
}
}
2021-01-08 15:28:38 +00:00
opts := def.Opts
if opts == nil {
opts = node.Options()
}
miners[i] = CreateTestStorageNode(ctx, t, genms[i].Worker, maddrs[i], pidKeys[i], f, mn, node.Options(
2021-06-07 10:32:15 +00:00
node.Override(new(*mock.SectorMgr), func() (*mock.SectorMgr, error) {
2020-11-05 12:43:05 +00:00
return mock.NewMockSectorMgr(sectors), nil
2020-08-13 20:37:09 +00:00
}),
2021-06-07 10:32:15 +00:00
node.Override(new(sectorstorage.SectorManager), node.From(new(*mock.SectorMgr))),
node.Override(new(sectorstorage.Unsealer), node.From(new(*mock.SectorMgr))),
node.Override(new(sectorstorage.PieceProvider), node.From(new(*mock.SectorMgr))),
2020-08-13 20:37:09 +00:00
node.Override(new(ffiwrapper.Verifier), mock.MockVerifier),
2021-05-19 13:20:23 +00:00
node.Override(new(ffiwrapper.Prover), mock.MockProver),
2020-08-13 20:37:09 +00:00
node.Unset(new(*sectorstorage.Manager)),
2021-01-08 15:28:38 +00:00
opts,
2020-08-13 20:37:09 +00:00
))
if rpc {
miners[i] = storerRpc(t, miners[i])
}
2020-08-13 20:37:09 +00:00
}
if err := mn.LinkAll(); err != nil {
t.Fatal(err)
}
bm := NewBlockMiner(t, miners[0])
if len(miners) > 0 {
2020-08-13 20:37:09 +00:00
// Mine 2 blocks to setup some CE stuff in some actors
var wait sync.Mutex
wait.Lock()
bm.MineUntilBlock(ctx, fulls[0], func(abi.ChainEpoch) {
2020-08-13 20:37:09 +00:00
wait.Unlock()
})
2020-08-13 20:37:09 +00:00
wait.Lock()
bm.MineUntilBlock(ctx, fulls[0], func(abi.ChainEpoch) {
2020-08-13 20:37:09 +00:00
wait.Unlock()
})
2020-08-13 20:37:09 +00:00
wait.Lock()
}
return fulls, miners
2020-08-13 20:37:09 +00:00
}
func CreateRPCServer(t *testing.T, handler http.Handler) (*httptest.Server, multiaddr.Multiaddr) {
testServ := httptest.NewServer(handler)
t.Cleanup(testServ.Close)
t.Cleanup(testServ.CloseClientConnections)
addr := testServ.Listener.Addr()
maddr, err := manet.FromNetAddr(addr)
require.NoError(t, err)
return testServ, maddr
2020-08-13 20:37:09 +00:00
}
func fullRpc(t *testing.T, nd TestFullNode) TestFullNode {
2021-06-08 23:17:39 +00:00
tok, err := nd.AuthNew(context.Background(), []auth.Permission{"admin", "read", "write", "sign"})
require.NoError(t, err)
handler, err := node.FullNodeHandler(nd.FullNode)
require.NoError(t, err)
2020-08-13 20:37:09 +00:00
srv, maddr := CreateRPCServer(t, handler)
var ret TestFullNode
2021-06-08 23:17:39 +00:00
cl, stop, err := client.NewFullNodeRPCV1(context.Background(), "ws://"+srv.Listener.Addr().String()+"/rpc/v1", map[string][]string{
"Authorization": {"Bearer " + string(tok)},
})
require.NoError(t, err)
2021-01-21 02:17:41 +00:00
t.Cleanup(stop)
ret.ListenAddr, ret.FullNode = maddr, cl
2020-08-13 20:37:09 +00:00
return ret
2020-08-13 20:37:09 +00:00
}
func storerRpc(t *testing.T, nd TestMiner) TestMiner {
2021-06-08 23:17:39 +00:00
tok, err := nd.AuthNew(context.Background(), []auth.Permission{"admin", "read", "write"})
require.NoError(t, err)
handler, err := node.MinerHandler(nd.StorageMiner)
require.NoError(t, err)
srv, maddr := CreateRPCServer(t, handler)
var ret TestMiner
2021-06-08 23:17:39 +00:00
cl, stop, err := client.NewStorageMinerRPCV0(context.Background(), "ws://"+srv.Listener.Addr().String()+"/rpc/v0", map[string][]string{
"Authorization": {"Bearer " + string(tok)},
})
require.NoError(t, err)
t.Cleanup(stop)
ret.ListenAddr, ret.StorageMiner, ret.MineOne = maddr, cl, nd.MineOne
return ret
}