)
}
@@ -105,9 +101,9 @@ class FullNode extends React.Component {
)
}
- let mine = [Mine]
- if (this.state.mining) {
- mine = "[Mining]"
+ let miners =
+ if(this.state.minerList.length > 0) {
+ miners = this.state.minerList.map((a, k) => )
}
let storageMine = [Spawn Storage Miner]
@@ -143,11 +139,12 @@ class FullNode extends React.Component {
Repo: LOTUS_PATH={this.props.node.Repo}
{chainInfo}
- {mine} {storageMine}
+ {storageMine}
-
+
{addresses}
+
{miners}
{paychannels}
diff --git a/miner/miner.go b/miner/miner.go
index 7bbcccf44..d8ff1455b 100644
--- a/miner/miner.go
+++ b/miner/miner.go
@@ -30,6 +30,7 @@ type api struct {
full.ChainAPI
full.MpoolAPI
full.WalletAPI
+ full.StateAPI
}
func NewMiner(api api) *Miner {
@@ -53,6 +54,16 @@ type Miner struct {
lastWork *MiningBase
}
+func (m *Miner) Addresses() ([]address.Address, error) {
+ m.lk.Lock()
+ defer m.lk.Unlock()
+
+ out := make([]address.Address, len(m.addresses))
+ copy(out, m.addresses)
+
+ return out, nil
+}
+
func (m *Miner) Register(addr address.Address) error {
m.lk.Lock()
defer m.lk.Unlock()
@@ -171,7 +182,7 @@ func (m *Miner) GetBestMiningCandidate() (*MiningBase, error) {
return m.lastWork, nil
}
- if bts.Weight() <= m.lastWork.ts.Weight() {
+ if types.BigCmp(bts.Weight(), m.lastWork.ts.Weight()) <= 0 {
return m.lastWork, nil
}
}
@@ -254,12 +265,12 @@ func (m *Miner) isWinnerNextRound(ctx context.Context, base *MiningBase) (bool,
return false, nil, xerrors.Errorf("failed to compute VRF: %w", err)
}
- mpow, totpow, err := m.getPowerForTipset(ctx, m.addresses[0], base.ts)
+ pow, err := m.api.StateMinerPower(ctx, m.addresses[0], base.ts)
if err != nil {
return false, nil, xerrors.Errorf("failed to check power: %w", err)
}
- return powerCmp(vrfout, mpow, totpow), vrfout, nil
+ return powerCmp(vrfout, pow.MinerPower, pow.TotalPower), vrfout, nil
}
func powerCmp(vrfout []byte, mpow, totpow types.BigInt) bool {
@@ -280,45 +291,6 @@ func powerCmp(vrfout []byte, mpow, totpow types.BigInt) bool {
return types.BigCmp(types.BigFromBytes(h[:]), out) < 0
}
-func (m *Miner) getPowerForTipset(ctx context.Context, maddr address.Address, ts *types.TipSet) (types.BigInt, types.BigInt, error) {
- var err error
- enc, err := actors.SerializeParams(&actors.PowerLookupParams{maddr})
- if err != nil {
- return types.EmptyInt, types.EmptyInt, err
- }
-
- ret, err := m.api.ChainCall(ctx, &types.Message{
- From: maddr,
- To: actors.StorageMarketAddress,
- Method: actors.SMAMethods.PowerLookup,
- Params: enc,
- }, ts)
- if err != nil {
- return types.EmptyInt, types.EmptyInt, xerrors.Errorf("failed to get miner power from chain: %w", err)
- }
- if ret.ExitCode != 0 {
- return types.EmptyInt, types.EmptyInt, xerrors.Errorf("failed to get miner power from chain (exit code %d)", ret.ExitCode)
- }
-
- mpow := types.BigFromBytes(ret.Return)
-
- ret, err = m.api.ChainCall(ctx, &types.Message{
- From: maddr,
- To: actors.StorageMarketAddress,
- Method: actors.SMAMethods.GetTotalStorage,
- }, ts)
- if err != nil {
- return types.EmptyInt, types.EmptyInt, xerrors.Errorf("failed to get total power from chain: %w", err)
- }
- if ret.ExitCode != 0 {
- return types.EmptyInt, types.EmptyInt, xerrors.Errorf("failed to get total power from chain (exit code %d)", ret.ExitCode)
- }
-
- tpow := types.BigFromBytes(ret.Return)
-
- return mpow, tpow, nil
-}
-
func (m *Miner) runVDF(ctx context.Context, input []byte) ([]byte, []byte, error) {
select {
case <-ctx.Done():
diff --git a/node/impl/full.go b/node/impl/full.go
index 03bd5d7d7..c8c788064 100644
--- a/node/impl/full.go
+++ b/node/impl/full.go
@@ -24,6 +24,10 @@ type FullNodeAPI struct {
Miner *miner.Miner
}
+func (a *FullNodeAPI) MinerAddresses(context.Context) ([]address.Address, error) {
+ return a.Miner.Addresses()
+}
+
func (a *FullNodeAPI) MinerRegister(ctx context.Context, addr address.Address) error {
return a.Miner.Register(addr)
}
diff --git a/node/impl/full/state.go b/node/impl/full/state.go
index 5a557948b..bcf518837 100644
--- a/node/impl/full/state.go
+++ b/node/impl/full/state.go
@@ -3,6 +3,9 @@ package full
import (
"context"
"fmt"
+ "github.com/filecoin-project/go-lotus/chain/types"
+ "github.com/filecoin-project/go-lotus/chain/vm"
+ "golang.org/x/xerrors"
"strconv"
"github.com/filecoin-project/go-lotus/api"
@@ -137,3 +140,49 @@ func (a *StateAPI) StateMinerProvingSet(ctx context.Context, addr address.Addres
})
return sinfos, nil
}
+
+func (a *StateAPI) StateMinerPower(ctx context.Context, maddr address.Address, ts *types.TipSet) (api.MinerPower, error) {
+ var err error
+ enc, err := actors.SerializeParams(&actors.PowerLookupParams{maddr})
+ if err != nil {
+ return api.MinerPower{}, err
+ }
+
+ var mpow types.BigInt
+
+ if maddr != address.Undef {
+ ret, err := vm.Call(ctx, a.Chain, &types.Message{
+ From: maddr,
+ To: actors.StorageMarketAddress,
+ Method: actors.SMAMethods.PowerLookup,
+ Params: enc,
+ }, ts)
+ if err != nil {
+ return api.MinerPower{}, xerrors.Errorf("failed to get miner power from chain: %w", err)
+ }
+ if ret.ExitCode != 0 {
+ return api.MinerPower{}, xerrors.Errorf("failed to get miner power from chain (exit code %d)", ret.ExitCode)
+ }
+
+ mpow = types.BigFromBytes(ret.Return)
+ }
+
+ ret, err := vm.Call(ctx, a.Chain, &types.Message{
+ From: actors.StorageMarketAddress,
+ To: actors.StorageMarketAddress,
+ Method: actors.SMAMethods.GetTotalStorage,
+ }, ts)
+ if err != nil {
+ return api.MinerPower{}, xerrors.Errorf("failed to get total power from chain: %w", err)
+ }
+ if ret.ExitCode != 0 {
+ return api.MinerPower{}, xerrors.Errorf("failed to get total power from chain (exit code %d)", ret.ExitCode)
+ }
+
+ tpow := types.BigFromBytes(ret.Return)
+
+ return api.MinerPower{
+ MinerPower: mpow,
+ TotalPower: tpow,
+ }, nil
+}