Merge remote-tracking branch 'origin/master' into next
This commit is contained in:
commit
7003960fdd
11
Makefile
11
Makefile
@ -103,16 +103,17 @@ install:
|
|||||||
install -C ./lotus-storage-miner /usr/local/bin/lotus-storage-miner
|
install -C ./lotus-storage-miner /usr/local/bin/lotus-storage-miner
|
||||||
install -C ./lotus-seal-worker /usr/local/bin/lotus-seal-worker
|
install -C ./lotus-seal-worker /usr/local/bin/lotus-seal-worker
|
||||||
|
|
||||||
install-services:
|
install-services: install
|
||||||
install -C -m 0644 ./scripts/lotus-daemon.service /etc/systemd/system/lotus-daemon.service
|
mkdir -p /usr/local/lib/systemd/system
|
||||||
install -C -m 0644 ./scripts/lotus-miner.service /etc/systemd/system/lotus-miner.service
|
install -C -m 0644 ./scripts/lotus-daemon.service /usr/local/lib/systemd/system/lotus-daemon.service
|
||||||
|
install -C -m 0644 ./scripts/lotus-miner.service /usr/local/lib/systemd/system/lotus-miner.service
|
||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
@echo
|
@echo
|
||||||
@echo "lotus and lotus-miner services installed. Don't forget to 'systemctl enable lotus|lotus-miner' for it to be enabled on startup."
|
@echo "lotus and lotus-miner services installed. Don't forget to 'systemctl enable lotus|lotus-miner' for it to be enabled on startup."
|
||||||
|
|
||||||
clean-services:
|
clean-services:
|
||||||
rm -f /etc/systemd/system/lotus-daemon.service
|
rm -f /usr/local/lib/systemd/system/lotus-daemon.service
|
||||||
rm -f /etc/systemd/system/lotus-miner.service
|
rm -f /usr/local/lib/systemd/system/lotus-miner.service
|
||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
|
|
||||||
# TOOLS
|
# TOOLS
|
||||||
|
@ -148,6 +148,8 @@ type FullNode interface {
|
|||||||
StateMinerInfo(context.Context, address.Address, types.TipSetKey) (miner.MinerInfo, error)
|
StateMinerInfo(context.Context, address.Address, types.TipSetKey) (miner.MinerInfo, error)
|
||||||
StateMinerDeadlines(context.Context, address.Address, types.TipSetKey) (*miner.Deadlines, error)
|
StateMinerDeadlines(context.Context, address.Address, types.TipSetKey) (*miner.Deadlines, error)
|
||||||
StateMinerFaults(context.Context, address.Address, types.TipSetKey) (*abi.BitField, error)
|
StateMinerFaults(context.Context, address.Address, types.TipSetKey) (*abi.BitField, error)
|
||||||
|
// Returns all non-expired Faults that occur within lookback epochs of the given tipset
|
||||||
|
StateAllMinerFaults(ctx context.Context, lookback abi.ChainEpoch, ts types.TipSetKey) ([]*Fault, error)
|
||||||
StateMinerRecoveries(context.Context, address.Address, types.TipSetKey) (*abi.BitField, error)
|
StateMinerRecoveries(context.Context, address.Address, types.TipSetKey) (*abi.BitField, error)
|
||||||
StateMinerInitialPledgeCollateral(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (types.BigInt, error)
|
StateMinerInitialPledgeCollateral(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (types.BigInt, error)
|
||||||
StateMinerAvailableBalance(context.Context, address.Address, types.TipSetKey) (types.BigInt, error)
|
StateMinerAvailableBalance(context.Context, address.Address, types.TipSetKey) (types.BigInt, error)
|
||||||
@ -454,3 +456,8 @@ const (
|
|||||||
MsigApprove MsigProposeResponse = iota
|
MsigApprove MsigProposeResponse = iota
|
||||||
MsigCancel
|
MsigCancel
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type Fault struct {
|
||||||
|
Miner address.Address
|
||||||
|
Epoch abi.ChainEpoch
|
||||||
|
}
|
||||||
|
@ -124,6 +124,7 @@ type FullNodeStruct struct {
|
|||||||
StateMinerInfo func(context.Context, address.Address, types.TipSetKey) (miner.MinerInfo, error) `perm:"read"`
|
StateMinerInfo func(context.Context, address.Address, types.TipSetKey) (miner.MinerInfo, error) `perm:"read"`
|
||||||
StateMinerDeadlines func(context.Context, address.Address, types.TipSetKey) (*miner.Deadlines, error) `perm:"read"`
|
StateMinerDeadlines func(context.Context, address.Address, types.TipSetKey) (*miner.Deadlines, error) `perm:"read"`
|
||||||
StateMinerFaults func(context.Context, address.Address, types.TipSetKey) (*abi.BitField, error) `perm:"read"`
|
StateMinerFaults func(context.Context, address.Address, types.TipSetKey) (*abi.BitField, error) `perm:"read"`
|
||||||
|
StateAllMinerFaults func(context.Context, abi.ChainEpoch, types.TipSetKey) ([]*api.Fault, error) `perm:"read"`
|
||||||
StateMinerRecoveries func(context.Context, address.Address, types.TipSetKey) (*abi.BitField, error) `perm:"read"`
|
StateMinerRecoveries func(context.Context, address.Address, types.TipSetKey) (*abi.BitField, error) `perm:"read"`
|
||||||
StateMinerInitialPledgeCollateral func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (types.BigInt, error) `perm:"read"`
|
StateMinerInitialPledgeCollateral func(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (types.BigInt, error) `perm:"read"`
|
||||||
StateMinerAvailableBalance func(context.Context, address.Address, types.TipSetKey) (types.BigInt, error) `perm:"read"`
|
StateMinerAvailableBalance func(context.Context, address.Address, types.TipSetKey) (types.BigInt, error) `perm:"read"`
|
||||||
@ -545,6 +546,10 @@ func (c *FullNodeStruct) StateMinerFaults(ctx context.Context, actor address.Add
|
|||||||
return c.Internal.StateMinerFaults(ctx, actor, tsk)
|
return c.Internal.StateMinerFaults(ctx, actor, tsk)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *FullNodeStruct) StateAllMinerFaults(ctx context.Context, cutoff abi.ChainEpoch, endTsk types.TipSetKey) ([]*api.Fault, error) {
|
||||||
|
return c.Internal.StateAllMinerFaults(ctx, cutoff, endTsk)
|
||||||
|
}
|
||||||
|
|
||||||
func (c *FullNodeStruct) StateMinerRecoveries(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*abi.BitField, error) {
|
func (c *FullNodeStruct) StateMinerRecoveries(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*abi.BitField, error) {
|
||||||
return c.Internal.StateMinerRecoveries(ctx, actor, tsk)
|
return c.Internal.StateMinerRecoveries(ctx, actor, tsk)
|
||||||
}
|
}
|
||||||
|
@ -12,8 +12,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="Index-node" id="formnd">
|
<div class="Index-node" id="formnd">
|
||||||
<form id="f" action='/mkminer' method='POST'>
|
<form id="f" action='/mkminer' method='POST'>
|
||||||
<span>Enter destination address:</span>
|
<span>Enter owner/worker address:</span>
|
||||||
<input type='text' name='address' style="width: 300px">
|
<input type='text' name='address' style="width: 300px" placeholder="t3...">
|
||||||
<select name="sectorSize">
|
<select name="sectorSize">
|
||||||
<option selected value="34359738368">32GiB sectors</option>
|
<option selected value="34359738368">32GiB sectors</option>
|
||||||
<option value="68719476736">64GiB sectors</option>
|
<option value="68719476736">64GiB sectors</option>
|
||||||
@ -27,6 +27,9 @@
|
|||||||
<div class="Index-node">
|
<div class="Index-node">
|
||||||
<span>When creating storage miner, DO NOT REFRESH THE PAGE, wait for it to load. This can take more than 5min.</span>
|
<span>When creating storage miner, DO NOT REFRESH THE PAGE, wait for it to load. This can take more than 5min.</span>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="Index-node">
|
||||||
|
<span>If you don't have an owner/worker address, you can create it by following <a target="_blank" href="https://docs.lotu.sh/en+mining#get-started-22083">these instructions</a>.</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="Index-footer">
|
<div class="Index-footer">
|
||||||
<div>
|
<div>
|
||||||
|
@ -27,6 +27,7 @@ func main() {
|
|||||||
commpToCidCmd,
|
commpToCidCmd,
|
||||||
fetchParamCmd,
|
fetchParamCmd,
|
||||||
proofsCmd,
|
proofsCmd,
|
||||||
|
verifRegCmd,
|
||||||
}
|
}
|
||||||
|
|
||||||
app := &cli.App{
|
app := &cli.App{
|
||||||
|
377
cmd/lotus-shed/verifreg.go
Normal file
377
cmd/lotus-shed/verifreg.go
Normal file
@ -0,0 +1,377 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/go-address"
|
||||||
|
"gopkg.in/urfave/cli.v2"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
|
lcli "github.com/filecoin-project/lotus/cli"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/lotus/api/apibstore"
|
||||||
|
"github.com/filecoin-project/lotus/chain/actors"
|
||||||
|
"github.com/filecoin-project/specs-actors/actors/builtin"
|
||||||
|
"github.com/filecoin-project/specs-actors/actors/builtin/verifreg"
|
||||||
|
"github.com/ipfs/go-hamt-ipld"
|
||||||
|
cbor "github.com/ipfs/go-ipld-cbor"
|
||||||
|
|
||||||
|
cbg "github.com/whyrusleeping/cbor-gen"
|
||||||
|
)
|
||||||
|
|
||||||
|
var verifRegCmd = &cli.Command{
|
||||||
|
Name: "verifreg",
|
||||||
|
Usage: "Interact with the verified registry actor",
|
||||||
|
Flags: []cli.Flag{},
|
||||||
|
Subcommands: []*cli.Command{
|
||||||
|
verifRegAddVerifierCmd,
|
||||||
|
verifRegVerifyClientCmd,
|
||||||
|
verifRegListVerifiersCmd,
|
||||||
|
verifRegListClientsCmd,
|
||||||
|
verifRegCheckClientCmd,
|
||||||
|
verifRegCheckVerifierCmd,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var verifRegAddVerifierCmd = &cli.Command{
|
||||||
|
Name: "add-verifier",
|
||||||
|
Usage: "make a given account a verifier",
|
||||||
|
Action: func(cctx *cli.Context) error {
|
||||||
|
fromk, err := address.NewFromString("t3qfoulel6fy6gn3hjmbhpdpf6fs5aqjb5fkurhtwvgssizq4jey5nw4ptq5up6h7jk7frdvvobv52qzmgjinq")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if cctx.Args().Len() != 2 {
|
||||||
|
return fmt.Errorf("must specify two arguments: address and allowance")
|
||||||
|
}
|
||||||
|
|
||||||
|
target, err := address.NewFromString(cctx.Args().Get(0))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
allowance, err := types.BigFromString(cctx.Args().Get(1))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
params, err := actors.SerializeParams(&verifreg.AddVerifierParams{Address: target, Allowance: allowance})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
api, closer, err := lcli.GetFullNodeAPI(cctx)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer closer()
|
||||||
|
ctx := lcli.ReqContext(cctx)
|
||||||
|
|
||||||
|
msg := &types.Message{
|
||||||
|
To: builtin.VerifiedRegistryActorAddr,
|
||||||
|
From: fromk,
|
||||||
|
Method: builtin.MethodsVerifiedRegistry.AddVerifier,
|
||||||
|
GasPrice: types.NewInt(1),
|
||||||
|
GasLimit: 300000,
|
||||||
|
Params: params,
|
||||||
|
}
|
||||||
|
|
||||||
|
smsg, err := api.MpoolPushMessage(ctx, msg)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("message sent, now waiting on cid: %s\n", smsg.Cid())
|
||||||
|
|
||||||
|
mwait, err := api.StateWaitMsg(ctx, smsg.Cid())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if mwait.Receipt.ExitCode != 0 {
|
||||||
|
return fmt.Errorf("failed to add verifier: %d", mwait.Receipt.ExitCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var verifRegVerifyClientCmd = &cli.Command{
|
||||||
|
Name: "verify-client",
|
||||||
|
Usage: "make a given account a verified client",
|
||||||
|
Flags: []cli.Flag{
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "from",
|
||||||
|
Usage: "specify your verifier address to send the message from",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Action: func(cctx *cli.Context) error {
|
||||||
|
froms := cctx.String("from")
|
||||||
|
if froms == "" {
|
||||||
|
return fmt.Errorf("must specify from address with --from")
|
||||||
|
}
|
||||||
|
|
||||||
|
fromk, err := address.NewFromString(froms)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if cctx.Args().Len() != 2 {
|
||||||
|
return fmt.Errorf("must specify two arguments: address and allowance")
|
||||||
|
}
|
||||||
|
|
||||||
|
target, err := address.NewFromString(cctx.Args().Get(0))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
allowance, err := types.BigFromString(cctx.Args().Get(1))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
params, err := actors.SerializeParams(&verifreg.AddVerifiedClientParams{Address: target, Allowance: allowance})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
api, closer, err := lcli.GetFullNodeAPI(cctx)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer closer()
|
||||||
|
ctx := lcli.ReqContext(cctx)
|
||||||
|
|
||||||
|
msg := &types.Message{
|
||||||
|
To: builtin.VerifiedRegistryActorAddr,
|
||||||
|
From: fromk,
|
||||||
|
Method: builtin.MethodsVerifiedRegistry.AddVerifiedClient,
|
||||||
|
GasPrice: types.NewInt(1),
|
||||||
|
GasLimit: 300000,
|
||||||
|
Params: params,
|
||||||
|
}
|
||||||
|
|
||||||
|
smsg, err := api.MpoolPushMessage(ctx, msg)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("message sent, now waiting on cid: %s\n", smsg.Cid())
|
||||||
|
|
||||||
|
mwait, err := api.StateWaitMsg(ctx, smsg.Cid())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if mwait.Receipt.ExitCode != 0 {
|
||||||
|
return fmt.Errorf("failed to add verified client: %d", mwait.Receipt.ExitCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var verifRegListVerifiersCmd = &cli.Command{
|
||||||
|
Name: "list-verifiers",
|
||||||
|
Usage: "list all verifiers",
|
||||||
|
Action: func(cctx *cli.Context) error {
|
||||||
|
api, closer, err := lcli.GetFullNodeAPI(cctx)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer closer()
|
||||||
|
ctx := lcli.ReqContext(cctx)
|
||||||
|
|
||||||
|
act, err := api.StateGetActor(ctx, builtin.VerifiedRegistryActorAddr, types.EmptyTSK)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
apibs := apibstore.NewAPIBlockstore(api)
|
||||||
|
cst := cbor.NewCborStore(apibs)
|
||||||
|
|
||||||
|
var st verifreg.State
|
||||||
|
if err := cst.Get(ctx, act.Head, &st); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
vh, err := hamt.LoadNode(ctx, cst, st.Verifiers)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := vh.ForEach(ctx, func(k string, val interface{}) error {
|
||||||
|
addr, err := address.NewFromBytes([]byte(k))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var dcap verifreg.DataCap
|
||||||
|
|
||||||
|
if err := dcap.UnmarshalCBOR(bytes.NewReader(val.(*cbg.Deferred).Raw)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("%s: %s\n", addr, dcap)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var verifRegListClientsCmd = &cli.Command{
|
||||||
|
Name: "list-clients",
|
||||||
|
Usage: "list all verified clients",
|
||||||
|
Action: func(cctx *cli.Context) error {
|
||||||
|
api, closer, err := lcli.GetFullNodeAPI(cctx)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer closer()
|
||||||
|
ctx := lcli.ReqContext(cctx)
|
||||||
|
|
||||||
|
act, err := api.StateGetActor(ctx, builtin.VerifiedRegistryActorAddr, types.EmptyTSK)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
apibs := apibstore.NewAPIBlockstore(api)
|
||||||
|
cst := cbor.NewCborStore(apibs)
|
||||||
|
|
||||||
|
var st verifreg.State
|
||||||
|
if err := cst.Get(ctx, act.Head, &st); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
vh, err := hamt.LoadNode(ctx, cst, st.VerifiedClients)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := vh.ForEach(ctx, func(k string, val interface{}) error {
|
||||||
|
addr, err := address.NewFromBytes([]byte(k))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var dcap verifreg.DataCap
|
||||||
|
|
||||||
|
if err := dcap.UnmarshalCBOR(bytes.NewReader(val.(*cbg.Deferred).Raw)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("%s: %s\n", addr, dcap)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var verifRegCheckClientCmd = &cli.Command{
|
||||||
|
Name: "check-client",
|
||||||
|
Usage: "check verified client remaining bytes",
|
||||||
|
Action: func(cctx *cli.Context) error {
|
||||||
|
if !cctx.Args().Present() {
|
||||||
|
return fmt.Errorf("must specify client address to check")
|
||||||
|
}
|
||||||
|
|
||||||
|
caddr, err := address.NewFromString(cctx.Args().First())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
api, closer, err := lcli.GetFullNodeAPI(cctx)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer closer()
|
||||||
|
ctx := lcli.ReqContext(cctx)
|
||||||
|
|
||||||
|
act, err := api.StateGetActor(ctx, builtin.VerifiedRegistryActorAddr, types.EmptyTSK)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
apibs := apibstore.NewAPIBlockstore(api)
|
||||||
|
cst := cbor.NewCborStore(apibs)
|
||||||
|
|
||||||
|
var st verifreg.State
|
||||||
|
if err := cst.Get(ctx, act.Head, &st); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
vh, err := hamt.LoadNode(ctx, cst, st.VerifiedClients)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var dcap verifreg.DataCap
|
||||||
|
if err := vh.Find(ctx, string(caddr.Bytes()), &dcap); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(dcap)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var verifRegCheckVerifierCmd = &cli.Command{
|
||||||
|
Name: "check-verifier",
|
||||||
|
Usage: "check verifiers remaining bytes",
|
||||||
|
Action: func(cctx *cli.Context) error {
|
||||||
|
if !cctx.Args().Present() {
|
||||||
|
return fmt.Errorf("must specify verifier address to check")
|
||||||
|
}
|
||||||
|
|
||||||
|
vaddr, err := address.NewFromString(cctx.Args().First())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
api, closer, err := lcli.GetFullNodeAPI(cctx)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer closer()
|
||||||
|
ctx := lcli.ReqContext(cctx)
|
||||||
|
|
||||||
|
act, err := api.StateGetActor(ctx, builtin.VerifiedRegistryActorAddr, types.EmptyTSK)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
apibs := apibstore.NewAPIBlockstore(api)
|
||||||
|
cst := cbor.NewCborStore(apibs)
|
||||||
|
|
||||||
|
var st verifreg.State
|
||||||
|
if err := cst.Get(ctx, act.Head, &st); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
vh, err := hamt.LoadNode(ctx, cst, st.Verifiers)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var dcap verifreg.DataCap
|
||||||
|
if err := vh.Find(ctx, string(vaddr.Bytes()), &dcap); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(dcap)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
@ -56,6 +56,12 @@
|
|||||||
"github": "en/join-testnet.md",
|
"github": "en/join-testnet.md",
|
||||||
"value": null
|
"value": null
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"title": "Use Lotus with systemd",
|
||||||
|
"slug": "en+install-system-services",
|
||||||
|
"github": "en/install-system-services.md",
|
||||||
|
"value": null
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"title": "Setup Troubleshooting",
|
"title": "Setup Troubleshooting",
|
||||||
"slug": "en+setup-troubleshooting",
|
"slug": "en+setup-troubleshooting",
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Here is an early overview of how to make API calls.
|
Here is an early overview of how to make API calls.
|
||||||
|
|
||||||
Implementation details for the **JSON-RPC** package are [here](https://github.com/filecoin-project/lotus/tree/master/lib/jsonrpc).
|
Implementation details for the **JSON-RPC** package are [here](https://github.com/filecoin-project/go-jsonrpc).
|
||||||
|
|
||||||
## Overview: How do you modify the config.toml to change the API endpoint?
|
## Overview: How do you modify the config.toml to change the API endpoint?
|
||||||
|
|
||||||
@ -77,7 +77,7 @@ lotus-storage-miner auth create-token --perm admin
|
|||||||
|
|
||||||
## What authorization level should I use?
|
## What authorization level should I use?
|
||||||
|
|
||||||
When viewing [api/struct.go](https://github.com/filecoin-project/lotus/blob/master/api/struct.go), you will encounter these types:
|
When viewing [api/apistruct/struct.go](https://github.com/filecoin-project/lotus/blob/master/api/apistruct/struct.go), you will encounter these types:
|
||||||
|
|
||||||
- `read` - Read node state, no private data.
|
- `read` - Read node state, no private data.
|
||||||
- `write` - Write to local store / chain, and `read` permissions.
|
- `write` - Write to local store / chain, and `read` permissions.
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# Lotus and Miner as a systemd service
|
# Use Lotus with systemd
|
||||||
|
|
||||||
Lotus is capable of running as a systemd service daemon. You can find installable service files for systemd in the [lotus repo](https://github.com/filecoin-project/lotus/tree/master/scripts) as files with `.service` extension. In order to install these service files, you can copy these `.service` files to the default systemd service path.
|
Lotus is capable of running as a systemd service daemon. You can find installable service files for systemd in the [lotus repo scripts directory](https://github.com/filecoin-project/lotus/tree/master/scripts) as files with `.service` extension. In order to install these service files, you can copy these `.service` files to the default systemd service path.
|
||||||
|
|
||||||
## Installing via `make`
|
## Installing via `make`
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@ Download the 2048 byte parameters:
|
|||||||
Pre-seal some sectors:
|
Pre-seal some sectors:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
./lotus-seed pre-seal --sector-size 2048 --num-sectors 2
|
./lotus-seed pre-seal --sector-size 2KiB --num-sectors 2
|
||||||
```
|
```
|
||||||
|
|
||||||
Create the genesis block and start up the first node:
|
Create the genesis block and start up the first node:
|
||||||
@ -34,7 +34,7 @@ Then, in another console, import the genesis miner key:
|
|||||||
Set up the genesis miner:
|
Set up the genesis miner:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
./lotus-storage-miner init --genesis-miner --actor=t01000 --sector-size=2048 --pre-sealed-sectors=~/.genesis-sectors --pre-sealed-metadata=~/.genesis-sectors/pre-seal-t01000.json --nosync
|
./lotus-storage-miner init --genesis-miner --actor=t01000 --sector-size=2KiB --pre-sealed-sectors=~/.genesis-sectors --pre-sealed-metadata=~/.genesis-sectors/pre-seal-t01000.json --nosync
|
||||||
```
|
```
|
||||||
|
|
||||||
Now, finally, start up the miner:
|
Now, finally, start up the miner:
|
||||||
|
@ -51,7 +51,7 @@ If you suspect that your GPU is not being used, first make sure it is properly c
|
|||||||
First, to watch GPU utilization run `nvtop` in one terminal, then in a separate terminal, run:
|
First, to watch GPU utilization run `nvtop` in one terminal, then in a separate terminal, run:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
lotus-bench --sector-size=2048
|
lotus-bench --sector-size=2KiB
|
||||||
```
|
```
|
||||||
|
|
||||||
This process uses a fair amount of GPU, and generally takes ~4 minutes to complete. If you do not see any activity in nvtop from lotus during the entire process, it is likely something is misconfigured with your GPU.
|
This process uses a fair amount of GPU, and generally takes ~4 minutes to complete. If you do not see any activity in nvtop from lotus during the entire process, it is likely something is misconfigured with your GPU.
|
||||||
|
@ -187,7 +187,11 @@ func (m *Miner) mine(ctx context.Context) {
|
|||||||
log.Errorf("failed to submit newly mined block: %s", err)
|
log.Errorf("failed to submit newly mined block: %s", err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
nextRound := time.Unix(int64(base.TipSet.MinTimestamp()+uint64(build.BlockDelay*base.NullRounds)), 0)
|
// Wait until the next epoch, plus the propagation delay, so a new tipset
|
||||||
|
// has enough time to form.
|
||||||
|
//
|
||||||
|
// See: https://github.com/filecoin-project/lotus/issues/1845
|
||||||
|
nextRound := time.Unix(int64(base.TipSet.MinTimestamp()+uint64(build.BlockDelay*base.NullRounds))+int64(build.PropagationDelay), 0)
|
||||||
|
|
||||||
select {
|
select {
|
||||||
case <-time.After(time.Until(nextRound)):
|
case <-time.After(time.Until(nextRound)):
|
||||||
|
@ -116,6 +116,47 @@ func (a *StateAPI) StateMinerFaults(ctx context.Context, addr address.Address, t
|
|||||||
return stmgr.GetMinerFaults(ctx, a.StateManager, ts, addr)
|
return stmgr.GetMinerFaults(ctx, a.StateManager, ts, addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *StateAPI) StateAllMinerFaults(ctx context.Context, lookback abi.ChainEpoch, endTsk types.TipSetKey) ([]*api.Fault, error) {
|
||||||
|
endTs, err := a.Chain.GetTipSetFromKey(endTsk)
|
||||||
|
if err != nil {
|
||||||
|
return nil, xerrors.Errorf("loading end tipset %s: %w", endTsk, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
cutoff := endTs.Height() - lookback
|
||||||
|
miners, err := stmgr.ListMinerActors(ctx, a.StateManager, endTs)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, xerrors.Errorf("loading miners: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var allFaults []*api.Fault
|
||||||
|
|
||||||
|
for _, m := range miners {
|
||||||
|
var mas miner.State
|
||||||
|
_, err := a.StateManager.LoadActorState(ctx, m, &mas, endTs)
|
||||||
|
if err != nil {
|
||||||
|
return nil, xerrors.Errorf("failed to load miner actor state %s: %w", m, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = mas.ForEachFaultEpoch(a.Chain.Store(ctx), func(faultStart abi.ChainEpoch, faults *abi.BitField) error {
|
||||||
|
if faultStart >= cutoff {
|
||||||
|
allFaults = append(allFaults, &api.Fault{
|
||||||
|
Miner: m,
|
||||||
|
Epoch: faultStart,
|
||||||
|
})
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, xerrors.Errorf("failure when iterating over miner states: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return allFaults, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (a *StateAPI) StateMinerRecoveries(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.BitField, error) {
|
func (a *StateAPI) StateMinerRecoveries(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.BitField, error) {
|
||||||
ts, err := a.Chain.GetTipSetFromKey(tsk)
|
ts, err := a.Chain.GetTipSetFromKey(tsk)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -292,6 +292,9 @@ func NewStorageAsk(ctx helpers.MetricsCtx, fapi lapi.FullNode, ds dtypes.Metadat
|
|||||||
}
|
}
|
||||||
|
|
||||||
storedAsk, err := storedask.NewStoredAsk(namespace.Wrap(ds, datastore.NewKey("/deals/provider")), datastore.NewKey("latest-ask"), spn, address.Address(minerAddress))
|
storedAsk, err := storedask.NewStoredAsk(namespace.Wrap(ds, datastore.NewKey("/deals/provider")), datastore.NewKey("latest-ask"), spn, address.Address(minerAddress))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
// Hacky way to set max piece size to the sector size
|
// Hacky way to set max piece size to the sector size
|
||||||
a := storedAsk.GetAsk(address.Address(minerAddress)).Ask
|
a := storedAsk.GetAsk(address.Address(minerAddress)).Ask
|
||||||
err = storedAsk.AddAsk(a.Price, a.Expiry-a.Timestamp, storagemarket.MaxPieceSize(abi.PaddedPieceSize(mi.SectorSize)))
|
err = storedAsk.AddAsk(a.Price, a.Expiry-a.Timestamp, storagemarket.MaxPieceSize(abi.PaddedPieceSize(mi.SectorSize)))
|
||||||
|
@ -2,6 +2,7 @@ package repo
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"github.com/filecoin-project/sector-storage/stores"
|
"github.com/filecoin-project/sector-storage/stores"
|
||||||
|
|
||||||
"github.com/ipfs/go-datastore"
|
"github.com/ipfs/go-datastore"
|
||||||
@ -13,7 +14,7 @@ import (
|
|||||||
var (
|
var (
|
||||||
ErrNoAPIEndpoint = errors.New("API not running (no endpoint)")
|
ErrNoAPIEndpoint = errors.New("API not running (no endpoint)")
|
||||||
ErrNoAPIToken = errors.New("API token not set")
|
ErrNoAPIToken = errors.New("API token not set")
|
||||||
ErrRepoAlreadyLocked = errors.New("repo is already locked")
|
ErrRepoAlreadyLocked = errors.New("repo is already locked (lotus daemon already running)")
|
||||||
ErrClosedRepo = errors.New("repo is no longer open")
|
ErrClosedRepo = errors.New("repo is no longer open")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ set -o xtrace
|
|||||||
export TRUST_PARAMS=1
|
export TRUST_PARAMS=1
|
||||||
tag=${TAG:-debug}
|
tag=${TAG:-debug}
|
||||||
|
|
||||||
go run -tags=$tag ./cmd/lotus-seed pre-seal --sector-size 2048 --num-sectors 2
|
go run -tags=$tag ./cmd/lotus-seed pre-seal --sector-size 2KiB --num-sectors 2
|
||||||
go run -tags=$tag ./cmd/lotus-seed genesis new localnet.json
|
go run -tags=$tag ./cmd/lotus-seed genesis new localnet.json
|
||||||
go run -tags=$tag ./cmd/lotus-seed genesis add-miner localnet.json ~/.genesis-sectors/pre-seal-t01000.json
|
go run -tags=$tag ./cmd/lotus-seed genesis add-miner localnet.json ~/.genesis-sectors/pre-seal-t01000.json
|
||||||
go run -tags=$tag ./cmd/lotus daemon --lotus-make-genesis=devel.gen --genesis-template=localnet.json --bootstrap=false
|
go run -tags=$tag ./cmd/lotus daemon --lotus-make-genesis=devel.gen --genesis-template=localnet.json --bootstrap=false
|
||||||
|
@ -12,11 +12,11 @@ faucet="http://t01000.miner.interopnet.kittyhawk.wtf"
|
|||||||
|
|
||||||
PLEDGE_COUNT="${1:-20}"
|
PLEDGE_COUNT="${1:-20}"
|
||||||
|
|
||||||
if [ -z "$BRANCH" ]; then
|
if [ -z "$BRANCH" ]; then
|
||||||
BRANCH="interopnet"
|
BRANCH="interopnet"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -z "$BUILD" ]; then
|
if [ -z "$BUILD" ]; then
|
||||||
BUILD="no"
|
BUILD="no"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -65,7 +65,7 @@ cat > "${BASEDIR}/scripts/create_miner.bash" <<EOF
|
|||||||
set -x
|
set -x
|
||||||
|
|
||||||
lotus wallet import ~/.genesis-sectors/pre-seal-t01000.key
|
lotus wallet import ~/.genesis-sectors/pre-seal-t01000.key
|
||||||
lotus-storage-miner init --genesis-miner --actor=t01000 --sector-size=2048 --pre-sealed-sectors=~/.genesis-sectors --pre-sealed-metadata=~/.genesis-sectors/pre-seal-t01000.json --nosync
|
lotus-storage-miner init --genesis-miner --actor=t01000 --sector-size=2KiB --pre-sealed-sectors=~/.genesis-sectors --pre-sealed-metadata=~/.genesis-sectors/pre-seal-t01000.json --nosync
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
cat > "${BASEDIR}/scripts/pledge_sectors.bash" <<EOF
|
cat > "${BASEDIR}/scripts/pledge_sectors.bash" <<EOF
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
set -xeo
|
set -xeo
|
||||||
|
|
||||||
NUM_SECTORS=2
|
NUM_SECTORS=2
|
||||||
SECTOR_SIZE=2048
|
SECTOR_SIZE=2KiB
|
||||||
|
|
||||||
|
|
||||||
sdt0111=$(mktemp -d)
|
sdt0111=$(mktemp -d)
|
||||||
|
@ -1,11 +1,15 @@
|
|||||||
[Unit]
|
[Unit]
|
||||||
Description=Lotus Daemon
|
Description=Lotus Daemon
|
||||||
After=network.target
|
After=network-online.target
|
||||||
|
Wants=network-online.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
ExecStart=/usr/local/bin/lotus daemon
|
|
||||||
Environment=GOLOG_FILE="/var/log/lotus-daemon"
|
Environment=GOLOG_FILE="/var/log/lotus-daemon"
|
||||||
Environment=GOLOG_LOG_FMT="json"
|
Environment=GOLOG_LOG_FMT="json"
|
||||||
|
ExecStart=/usr/local/bin/lotus daemon
|
||||||
|
Restart=always
|
||||||
|
RestartSec=30
|
||||||
|
|
||||||
MemoryAccounting=true
|
MemoryAccounting=true
|
||||||
MemoryHigh=8G
|
MemoryHigh=8G
|
||||||
MemoryMax=10G
|
MemoryMax=10G
|
||||||
|
Loading…
Reference in New Issue
Block a user