diff --git a/api/api_common.go b/api/api_common.go index aa63e9815..0c20d0ad9 100644 --- a/api/api_common.go +++ b/api/api_common.go @@ -6,6 +6,7 @@ import ( "github.com/libp2p/go-libp2p-core/network" "github.com/libp2p/go-libp2p-core/peer" + ma "github.com/multiformats/go-multiaddr" "github.com/filecoin-project/go-jsonrpc/auth" @@ -28,6 +29,7 @@ type Common interface { NetDisconnect(context.Context, peer.ID) error NetFindPeer(context.Context, peer.ID) (peer.AddrInfo, error) NetPubsubScores(context.Context) ([]PubsubScore, error) + NetAutoNatStatus(context.Context) (NatInfo, error) // MethodGroup: Common @@ -65,3 +67,8 @@ type Version struct { func (v Version) String() string { return fmt.Sprintf("%s+api%s", v.Version, v.APIVersion.String()) } + +type NatInfo struct { + Reachability network.Reachability + PublicAddr ma.Multiaddr +} diff --git a/api/apistruct/struct.go b/api/apistruct/struct.go index 5be189c98..49a0c2afc 100644 --- a/api/apistruct/struct.go +++ b/api/apistruct/struct.go @@ -49,6 +49,7 @@ type CommonStruct struct { NetDisconnect func(context.Context, peer.ID) error `perm:"write"` NetFindPeer func(context.Context, peer.ID) (peer.AddrInfo, error) `perm:"read"` NetPubsubScores func(context.Context) ([]api.PubsubScore, error) `perm:"read"` + NetAutoNatStatus func(context.Context) (api.NatInfo, error) `perm:"read"` ID func(context.Context) (peer.ID, error) `perm:"read"` Version func(context.Context) (api.Version, error) `perm:"read"` @@ -331,6 +332,7 @@ func (c *CommonStruct) AuthNew(ctx context.Context, perms []auth.Permission) ([] func (c *CommonStruct) NetPubsubScores(ctx context.Context) ([]api.PubsubScore, error) { return c.Internal.NetPubsubScores(ctx) } + func (c *CommonStruct) NetConnectedness(ctx context.Context, pid peer.ID) (network.Connectedness, error) { return c.Internal.NetConnectedness(ctx, pid) } @@ -355,6 +357,10 @@ func (c *CommonStruct) NetFindPeer(ctx context.Context, p peer.ID) (peer.AddrInf return c.Internal.NetFindPeer(ctx, p) } +func (c *CommonStruct) NetAutoNatStatus(ctx context.Context) (api.NatInfo, error) { + return c.Internal.NetAutoNatStatus(ctx) +} + // ID implements API.ID func (c *CommonStruct) ID(ctx context.Context) (peer.ID, error) { return c.Internal.ID(ctx) diff --git a/chain/events/state/diff_adt.go b/chain/events/state/diff_adt.go index 9e66eede3..1b921dd9e 100644 --- a/chain/events/state/diff_adt.go +++ b/chain/events/state/diff_adt.go @@ -41,7 +41,7 @@ func DiffAdtArray(preArr, curArr *adt.Array, out AdtArrayDiff) error { } // no modification - if !bytes.Equal(prevVal.Raw,curVal.Raw) { + if !bytes.Equal(prevVal.Raw, curVal.Raw) { if err := out.Modify(uint64(i), prevVal, curVal); err != nil { return err } @@ -95,13 +95,12 @@ func DiffAdtMap(preMap, curMap *adt.Map, out AdtMapDiff) error { } // no modification - if !bytes.Equal(prevVal.Raw,curVal.Raw) { + if !bytes.Equal(prevVal.Raw, curVal.Raw) { if err := out.Modify(key, prevVal, curVal); err != nil { return err } } - return curMap.Delete(k) }); err != nil { return err diff --git a/chain/events/state/diff_adt_test.go b/chain/events/state/diff_adt_test.go index a430d2de7..56a03bf33 100644 --- a/chain/events/state/diff_adt_test.go +++ b/chain/events/state/diff_adt_test.go @@ -71,7 +71,6 @@ func TestDiffAdtArray(t *testing.T) { assert.EqualValues(t, []byte{1}, changes.Removed[1].val) } - func TestDiffAdtMap(t *testing.T) { ctxstoreA := newContextStore() ctxstoreB := newContextStore() @@ -128,14 +127,13 @@ func TestDiffAdtMap(t *testing.T) { } type TestDiffMap struct { - Added []adtMapDiffResult + Added []adtMapDiffResult Modified []TestAdtMapDiffModified - Removed []adtMapDiffResult + Removed []adtMapDiffResult } var _ AdtMapDiff = &TestDiffMap{} - func (t *TestDiffMap) AsKey(key string) (adt.Keyer, error) { k, err := adt.ParseUIntKey(key) if err != nil { @@ -218,7 +216,7 @@ type adtMapDiffResult struct { type TestAdtMapDiffModified struct { From adtMapDiffResult - To adtMapDiffResult + To adtMapDiffResult } type adtArrayDiffResult struct { diff --git a/chain/events/state/predicates.go b/chain/events/state/predicates.go index 544ff7b14..bf85f1f1a 100644 --- a/chain/events/state/predicates.go +++ b/chain/events/state/predicates.go @@ -649,22 +649,20 @@ type AddressPair struct { } type InitActorAddressChanges struct { - Added []AddressPair + Added []AddressPair Modified []AddressChange - Removed []AddressPair + Removed []AddressPair } type AddressChange struct { From AddressPair - To AddressPair + To AddressPair } type DiffInitActorStateFunc func(ctx context.Context, oldState *init_.State, newState *init_.State) (changed bool, user UserData, err error) - - func (i *InitActorAddressChanges) AsKey(key string) (adt.Keyer, error) { - addr , err := address.NewFromBytes([]byte(key)) + addr, err := address.NewFromBytes([]byte(key)) if err != nil { return nil, err } @@ -720,7 +718,7 @@ func (i *InitActorAddressChanges) Modify(key string, from, to *typegen.Deferred) ID: fromIDAddr, PK: pkAddr, }, - To: AddressPair{ + To: AddressPair{ ID: toIDAddr, PK: pkAddr, }, @@ -786,4 +784,3 @@ func (sp *StatePredicates) OnAddressMapChange() DiffInitActorStateFunc { return true, addressChanges, nil } } - diff --git a/cli/net.go b/cli/net.go index 2e35f552f..7a2474bf4 100644 --- a/cli/net.go +++ b/cli/net.go @@ -24,6 +24,7 @@ var netCmd = &cli.Command{ NetId, netFindPeer, netScores, + NetReachability, }, } @@ -202,3 +203,28 @@ var netFindPeer = &cli.Command{ return nil }, } + +var NetReachability = &cli.Command{ + Name: "reachability", + Usage: "Print information about reachability from the internet", + Action: func(cctx *cli.Context) error { + api, closer, err := GetAPI(cctx) + if err != nil { + return err + } + defer closer() + + ctx := ReqContext(cctx) + + i, err := api.NetAutoNatStatus(ctx) + if err != nil { + return err + } + + fmt.Println("AutoNAT status: ", i.Reachability.String()) + if i.PublicAddr != nil { + fmt.Println("Public address: ", i.PublicAddr.String()) + } + return nil + }, +} diff --git a/cmd/lotus-chainwatch/processor/common_actors.go b/cmd/lotus-chainwatch/processor/common_actors.go index b2e86ddc2..3fbdbf170 100644 --- a/cmd/lotus-chainwatch/processor/common_actors.go +++ b/cmd/lotus-chainwatch/processor/common_actors.go @@ -176,7 +176,7 @@ func (p Processor) storeActorAddresses(ctx context.Context, actors map[cid.Cid]A for _, updates := range addressesToUpdate { if _, err := updateTx.Exec( fmt.Sprintf("update id_address_map set id=%s, address=%s where id=%s and address=%s", updates.New.ID, updates.New.PK, updates.Old.ID, updates.Old.PK), - ); err != nil { + ); err != nil { return err } } diff --git a/cmd/lotus-storage-miner/info_all.go b/cmd/lotus-storage-miner/info_all.go index 4b81bf37c..be9377816 100644 --- a/cmd/lotus-storage-miner/info_all.go +++ b/cmd/lotus-storage-miner/info_all.go @@ -63,6 +63,11 @@ var infoAllCmd = &cli.Command{ return err } + fmt.Println("\n#: Reachability") + if err := lcli.NetReachability.Action(cctx); err != nil { + return err + } + // Very Verbose info fmt.Println("\n#: Peers") if err := lcli.NetPeers.Action(cctx); err != nil { diff --git a/node/impl/common/common.go b/node/impl/common/common.go index 1d2695b6e..73abea8fb 100644 --- a/node/impl/common/common.go +++ b/node/impl/common/common.go @@ -12,6 +12,7 @@ import ( "github.com/libp2p/go-libp2p-core/network" "github.com/libp2p/go-libp2p-core/peer" swarm "github.com/libp2p/go-libp2p-swarm" + basichost "github.com/libp2p/go-libp2p/p2p/host/basic" ma "github.com/multiformats/go-multiaddr" "go.uber.org/fx" "golang.org/x/xerrors" @@ -28,6 +29,7 @@ type CommonAPI struct { fx.In APISecret *dtypes.APIAlg + RawHost lp2p.RawHost Host host.Host Router lp2p.BaseIpfsRouting Sk *dtypes.ScoreKeeper @@ -113,6 +115,23 @@ func (a *CommonAPI) NetFindPeer(ctx context.Context, p peer.ID) (peer.AddrInfo, return a.Router.FindPeer(ctx, p) } +func (a *CommonAPI) NetAutoNatStatus(ctx context.Context) (i api.NatInfo, err error) { + autonat := a.RawHost.(*basichost.BasicHost).AutoNat + + var maddr ma.Multiaddr + if autonat.Status() == network.ReachabilityPublic { + maddr, err = autonat.PublicAddr() + if err != nil { + return api.NatInfo{}, err + } + } + + return api.NatInfo{ + Reachability: autonat.Status(), + PublicAddr: maddr, + }, nil +} + func (a *CommonAPI) ID(context.Context) (peer.ID, error) { return a.Host.ID(), nil }