mirror of
https://github.com/FlipsideCrypto/dcrd.git
synced 2026-02-06 10:56:47 +00:00
multi: add getnetworkinfo rpc.
This commit is contained in:
parent
b9b863f5a7
commit
b69302960f
@ -74,6 +74,13 @@ type localAddress struct {
|
||||
score AddressPriority
|
||||
}
|
||||
|
||||
// LocalAddr represents network address information for a local address.
|
||||
type LocalAddr struct {
|
||||
Address string
|
||||
Port uint16
|
||||
Score int32
|
||||
}
|
||||
|
||||
// AddressPriority type is used to describe the hierarchy of local address
|
||||
// discovery methods.
|
||||
type AddressPriority int
|
||||
@ -536,7 +543,7 @@ func (a *AddrManager) deserializePeers(filePath string) error {
|
||||
|
||||
if v.refs > 0 && v.tried {
|
||||
return fmt.Errorf("address %s after serialisation "+
|
||||
"which is both new and tried!", k)
|
||||
"which is both new and tried", k)
|
||||
}
|
||||
}
|
||||
|
||||
@ -1022,6 +1029,25 @@ func (a *AddrManager) HasLocalAddress(na *wire.NetAddress) bool {
|
||||
return ok
|
||||
}
|
||||
|
||||
// FetchLocalAddresses fetches a summary of local addresses information for
|
||||
// the getnetworkinfo rpc.
|
||||
func (a *AddrManager) FetchLocalAddresses() []LocalAddr {
|
||||
a.lamtx.Lock()
|
||||
defer a.lamtx.Unlock()
|
||||
|
||||
addrs := make([]LocalAddr, 0, len(a.localAddresses))
|
||||
for _, addr := range a.localAddresses {
|
||||
la := LocalAddr{
|
||||
Address: addr.na.IP.String(),
|
||||
Port: addr.na.Port,
|
||||
}
|
||||
|
||||
addrs = append(addrs, la)
|
||||
}
|
||||
|
||||
return addrs
|
||||
}
|
||||
|
||||
const (
|
||||
// Unreachable represents a publicly unreachable connection state
|
||||
// between two addresses.
|
||||
|
||||
@ -202,6 +202,10 @@ the method name for further details such as parameter and return information.
|
||||
|Y
|
||||
|Returns the estimated network hashes per second for the block heights provided by the parameters.
|
||||
|-
|
||||
|[[#getnetworkinfo|getnetworkinfo]]
|
||||
|Y
|
||||
|Returns a JSON object containing network-related information.
|
||||
|-
|
||||
|[[#getpeerinfo|getpeerinfo]]
|
||||
|N
|
||||
|Returns information about each connected network peer as an array of json objects.
|
||||
@ -950,6 +954,45 @@ the method name for further details such as parameter and return information.
|
||||
|
||||
----
|
||||
|
||||
====getnetworkinfo====
|
||||
{|
|
||||
!Method
|
||||
|getnetworkinfo
|
||||
|-
|
||||
!Parameters
|
||||
|None
|
||||
|-
|
||||
!Description
|
||||
|Returns a JSON object containing network-related information.
|
||||
|-
|
||||
!Returns
|
||||
|<code>(json object)</code>
|
||||
: <code>address</code>: <code>(string)</code> The local address being listened on.
|
||||
: <code>port</code>: <code>(numeric)</code> The port being listened on for the associated local address.
|
||||
: <code>score</code>: <code>(numeric)</code> Reserved.
|
||||
: <code>name</code>: <code>(string)</code> The name of the network interface.
|
||||
: <code>limited</code>: <code>(boolean)</code> True if only connections to the network are allowed.
|
||||
: <code>proxy</code>: <code>(string)</code> The proxy set for the network.
|
||||
: <code>proxyrandomizecredentials</code>: <code>(boolean)</code> True if randomized credentials are set for the proxy.
|
||||
: <code>reachable</code>: <code>(boolean)</code> True if connections can be made to or from the network.
|
||||
: <code>version</code>: <code>(numeric)</code> The version of the node as a numeric.
|
||||
: <code>subversion</code>: <code>(string)</code> The subversion of the node, as advertised to peers.
|
||||
: <code>protocolversion</code>: <code>(numeric)</code> The protocol version of the node.
|
||||
: <code>timeoffset</code>: <code>(numeric)</code> The node clock offset in seconds.
|
||||
: <code>connections</code>: <code>(numeric)</code> The total number of open connections for the node.
|
||||
: <code>networks</code>: <code>(json array)</code> An array of objects describing IPV4, IPV6 and Onion network interface states.
|
||||
: <code>relayfee</code>: <code>(numeric)</code> The minimum required transaction fee for the node.
|
||||
: <code>localaddresses</code>: <code>(json array)</code> An array of objects describing local addresses being listened on by the node.
|
||||
: <code>localservices</code>: <code>(string)</code> The services supported by the node, as advertised in its version message.
|
||||
|
||||
<code>{"version": n, "subversion": "major.minor.patch", "protocolversion": n, "timeoffset": n, "connections": n, "networks": [{"name": "network", "limited": true or false, "reachable": true or false, "proxy": "host:port","proxyrandomizecredentials": true or false }, ...], "relayfee": n.nn., "localaddresses": [{ "address": "ip", "port": n, "score": n }, ...], "localservices": "services"}</code>
|
||||
|-
|
||||
!Example Return
|
||||
|<code>{"version": 1050000, "subversion": "1.5.0", "protocolversion": 6, "timeoffset": 0, "connections": 4, "networks": [{"name": "IPV4", "limited": true, "reachable": true, "proxy": "127.0.0.1:9050", "proxyrandomizecredentials": false}, {"name": "IPV6", "limited": false, "reachable": false, "proxy": "", "proxyrandomizecredentials": false}, {"name": "Onion", "limited": false, "reachable": false, "proxy": "", "proxyrandomizecredentials": false}], "relayfee": 0.0001, "localaddresses": [{"address": "fd87:d87e:eb43:d208:593b:4305:c8e5:2e77", "port": 9108, "score": 0}], "localservices": "0000000000000005"}</code>
|
||||
|}
|
||||
|
||||
----
|
||||
|
||||
====getpeerinfo====
|
||||
{|
|
||||
!Method
|
||||
|
||||
@ -287,12 +287,14 @@ type NetworksResult struct {
|
||||
// command.
|
||||
type GetNetworkInfoResult struct {
|
||||
Version int32 `json:"version"`
|
||||
SubVersion string `json:"subversion"`
|
||||
ProtocolVersion int32 `json:"protocolversion"`
|
||||
TimeOffset int64 `json:"timeoffset"`
|
||||
Connections int32 `json:"connections"`
|
||||
Networks []NetworksResult `json:"networks"`
|
||||
RelayFee float64 `json:"relayfee"`
|
||||
LocalAddresses []LocalAddressesResult `json:"localaddresses"`
|
||||
LocalServices string `json:"localservices"`
|
||||
}
|
||||
|
||||
// GetNetTotalsResult models the data returned from the getnettotals command.
|
||||
|
||||
32
rpcserver.go
32
rpcserver.go
@ -210,6 +210,7 @@ var rpcHandlersBeforeInit = map[types.Method]commandHandler{
|
||||
"getmininginfo": handleGetMiningInfo,
|
||||
"getnettotals": handleGetNetTotals,
|
||||
"getnetworkhashps": handleGetNetworkHashPS,
|
||||
"getnetworkinfo": handleGetNetworkInfo,
|
||||
"getpeerinfo": handleGetPeerInfo,
|
||||
"getrawmempool": handleGetRawMempool,
|
||||
"getrawtransaction": handleGetRawTransaction,
|
||||
@ -299,7 +300,6 @@ var rpcAskWallet = map[string]struct{}{
|
||||
var rpcUnimplemented = map[string]struct{}{
|
||||
"estimatepriority": {},
|
||||
"getblocktemplate": {},
|
||||
"getnetworkinfo": {},
|
||||
}
|
||||
|
||||
// Commands that are available to a limited user
|
||||
@ -331,6 +331,7 @@ var rpcLimited = map[string]struct{}{
|
||||
"getinfo": {},
|
||||
"getnettotals": {},
|
||||
"getnetworkhashps": {},
|
||||
"getnetworkinfo": {},
|
||||
"getrawmempool": {},
|
||||
"getrawtransaction": {},
|
||||
"gettxout": {},
|
||||
@ -3359,6 +3360,35 @@ func handleGetNetworkHashPS(s *rpcServer, cmd interface{}, closeChan <-chan stru
|
||||
return hashesPerSec.Int64(), nil
|
||||
}
|
||||
|
||||
// handleGetNetworkInfo implements the getnetworkinfo command.
|
||||
func handleGetNetworkInfo(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {
|
||||
networks := cfg.generateNetworkInfo()
|
||||
lAddrs := s.server.addrManager.FetchLocalAddresses()
|
||||
localAddrs := make([]types.LocalAddressesResult, len(lAddrs))
|
||||
for idx, entry := range lAddrs {
|
||||
addr := types.LocalAddressesResult{
|
||||
Address: entry.Address,
|
||||
Port: entry.Port,
|
||||
}
|
||||
localAddrs[idx] = addr
|
||||
}
|
||||
|
||||
info := types.GetNetworkInfoResult{
|
||||
Version: int32(1000000*version.Major + 10000*version.Minor +
|
||||
100*version.Patch),
|
||||
SubVersion: userAgentVersion,
|
||||
ProtocolVersion: int32(maxProtocolVersion),
|
||||
TimeOffset: int64(s.server.timeSource.Offset().Seconds()),
|
||||
Connections: s.server.ConnectedCount(),
|
||||
RelayFee: cfg.minRelayTxFee.ToCoin(),
|
||||
Networks: networks,
|
||||
LocalAddresses: localAddrs,
|
||||
LocalServices: fmt.Sprintf("%016x", uint64(s.server.services)),
|
||||
}
|
||||
|
||||
return info, nil
|
||||
}
|
||||
|
||||
// handleGetPeerInfo implements the getpeerinfo command.
|
||||
func handleGetPeerInfo(s *rpcServer, cmd interface{}, closeChan <-chan struct{}) (interface{}, error) {
|
||||
peers := s.server.Peers()
|
||||
|
||||
@ -609,6 +609,32 @@ var helpDescsEnUS = map[string]string{
|
||||
"getnetworkhashps-height": "Perform estimate ending with this height or -1 for current best chain block height",
|
||||
"getnetworkhashps--result0": "Estimated hashes per second",
|
||||
|
||||
// GetNetworkInfoCmd help.
|
||||
"getnetworkinfo--synopsis": "Returns a JSON object containing network-related information.",
|
||||
|
||||
// LocalAddressesResult help.
|
||||
"localaddressesresult-address": "The local address being listened on",
|
||||
"localaddressesresult-port": "The port being listened on for the associated local address",
|
||||
"localaddressesresult-score": "Reserved",
|
||||
|
||||
// NetworksResult help.
|
||||
"networksresult-name": "The name of the network interface",
|
||||
"networksresult-limited": "True if only connections to the network are allowed",
|
||||
"networksresult-proxy": "The proxy set for the network",
|
||||
"networksresult-proxyrandomizecredentials": "True if randomized credentials are set for the proxy",
|
||||
"networksresult-reachable": "True if connections can be made to or from the network",
|
||||
|
||||
// GetNetworkInfoResult help.
|
||||
"getnetworkinforesult-version": "The version of the node as a numeric",
|
||||
"getnetworkinforesult-subversion": "The subversion of the node, as advertised to peers",
|
||||
"getnetworkinforesult-protocolversion": "The protocol version of the node",
|
||||
"getnetworkinforesult-timeoffset": "The node clock offset in seconds",
|
||||
"getnetworkinforesult-connections": "The total number of open connections for the node",
|
||||
"getnetworkinforesult-networks": "An array of objects describing IPV4, IPV6 and Onion network interface states",
|
||||
"getnetworkinforesult-relayfee": "The minimum required transaction fee for the node.",
|
||||
"getnetworkinforesult-localaddresses": "An array of objects describing local addresses being listened on by the node",
|
||||
"getnetworkinforesult-localservices": "The services supported by the node, as advertised in its version message",
|
||||
|
||||
// GetNetTotalsCmd help.
|
||||
"getnettotals--synopsis": "Returns a JSON object containing network traffic statistics.",
|
||||
|
||||
@ -990,6 +1016,7 @@ var rpcResultTypes = map[types.Method][]interface{}{
|
||||
"getmininginfo": {(*types.GetMiningInfoResult)(nil)},
|
||||
"getnettotals": {(*types.GetNetTotalsResult)(nil)},
|
||||
"getnetworkhashps": {(*int64)(nil)},
|
||||
"getnetworkinfo": {(*[]types.GetNetworkInfoResult)(nil)},
|
||||
"getpeerinfo": {(*[]types.GetPeerInfoResult)(nil)},
|
||||
"getrawmempool": {(*[]string)(nil), (*types.GetRawMempoolVerboseResult)(nil)},
|
||||
"getrawtransaction": {(*string)(nil), (*types.TxRawResult)(nil)},
|
||||
|
||||
Loading…
Reference in New Issue
Block a user