Implemented Public Peer interface
This commit is contained in:
parent
ff8a834ccc
commit
fb6ff61730
@ -2,6 +2,7 @@ package ethchain
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"container/list"
|
||||
"fmt"
|
||||
"github.com/ethereum/eth-go/ethutil"
|
||||
"github.com/ethereum/eth-go/ethwire"
|
||||
@ -14,6 +15,16 @@ type BlockProcessor interface {
|
||||
ProcessBlock(block *Block)
|
||||
}
|
||||
|
||||
type Peer interface {
|
||||
Inbound() bool
|
||||
LastSend() time.Time
|
||||
LastPong() int64
|
||||
Host() []byte
|
||||
Port() uint16
|
||||
Version() string
|
||||
Connected() *int32
|
||||
}
|
||||
|
||||
type EthManager interface {
|
||||
StateManager() *StateManager
|
||||
BlockChain() *BlockChain
|
||||
@ -23,6 +34,7 @@ type EthManager interface {
|
||||
PeerCount() int
|
||||
IsMining() bool
|
||||
IsListening() bool
|
||||
Peers() *list.List
|
||||
}
|
||||
|
||||
type StateManager struct {
|
||||
|
@ -6,6 +6,7 @@ import (
|
||||
"github.com/ethereum/eth-go/ethutil"
|
||||
"math/big"
|
||||
"strings"
|
||||
"sync/atomic"
|
||||
)
|
||||
|
||||
type PEthereum struct {
|
||||
@ -51,6 +52,18 @@ func (lib *PEthereum) GetPeerCount() int {
|
||||
return lib.manager.PeerCount()
|
||||
}
|
||||
|
||||
func (lib *PEthereum) GetPeers() []PPeer {
|
||||
var peers []PPeer
|
||||
for peer := lib.manager.Peers().Front(); peer != nil; peer = peer.Next() {
|
||||
p := peer.Value.(ethchain.Peer)
|
||||
if atomic.LoadInt32(p.Connected()) != 0 {
|
||||
peers = append(peers, *NewPPeer(p))
|
||||
}
|
||||
}
|
||||
|
||||
return peers
|
||||
}
|
||||
|
||||
func (lib *PEthereum) GetIsMining() bool {
|
||||
return lib.manager.IsMining()
|
||||
}
|
||||
|
@ -3,12 +3,40 @@ package ethpub
|
||||
import (
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/ethereum/eth-go/ethchain"
|
||||
"github.com/ethereum/eth-go/ethutil"
|
||||
_ "log"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Peer interface exposed to QML
|
||||
|
||||
type PPeer struct {
|
||||
ref *ethchain.Peer
|
||||
Inbound bool `json:"isInbound"`
|
||||
LastSend int64 `json:"lastSend"`
|
||||
LastPong int64 `json:"lastPong"`
|
||||
Ip string `json:"ip"`
|
||||
Port int `json:"port"`
|
||||
Version string `json:"version"`
|
||||
LastResponse string `json:"lastResponse"`
|
||||
}
|
||||
|
||||
func NewPPeer(peer ethchain.Peer) *PPeer {
|
||||
if peer == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
// TODO: There must be something build in to do this?
|
||||
var ip []string
|
||||
for _, i := range peer.Host() {
|
||||
ip = append(ip, fmt.Sprintf("%d", i))
|
||||
}
|
||||
ipAddress := strings.Join(ip, ".")
|
||||
|
||||
return &PPeer{ref: &peer, Inbound: peer.Inbound(), LastSend: peer.LastSend().Unix(), LastPong: peer.LastPong(), Version: peer.Version(), Ip: ipAddress, Port: int(peer.Port())}
|
||||
}
|
||||
|
||||
// Block interface exposed to QML
|
||||
type PBlock struct {
|
||||
ref *ethchain.Block
|
||||
|
42
peer.go
42
peer.go
@ -129,7 +129,7 @@ type Peer struct {
|
||||
diverted bool
|
||||
blocksRequested int
|
||||
|
||||
Version string
|
||||
version string
|
||||
}
|
||||
|
||||
func NewPeer(conn net.Conn, ethereum *Ethereum, inbound bool) *Peer {
|
||||
@ -160,7 +160,7 @@ func NewOutboundPeer(addr string, ethereum *Ethereum, caps Caps) *Peer {
|
||||
connected: 0,
|
||||
disconnect: 0,
|
||||
caps: caps,
|
||||
Version: ethutil.Config.ClientString,
|
||||
version: ethutil.Config.ClientString,
|
||||
}
|
||||
|
||||
// Set up the connection in another goroutine so we don't block the main thread
|
||||
@ -184,6 +184,34 @@ func NewOutboundPeer(addr string, ethereum *Ethereum, caps Caps) *Peer {
|
||||
return p
|
||||
}
|
||||
|
||||
// Getters
|
||||
func (p *Peer) Inbound() bool {
|
||||
return p.inbound
|
||||
}
|
||||
func (p *Peer) LastSend() time.Time {
|
||||
return p.lastSend
|
||||
}
|
||||
func (p *Peer) LastPong() int64 {
|
||||
return p.lastPong
|
||||
}
|
||||
func (p *Peer) Host() []byte {
|
||||
return p.host
|
||||
}
|
||||
func (p *Peer) Port() uint16 {
|
||||
return p.port
|
||||
}
|
||||
func (p *Peer) Version() string {
|
||||
return p.version
|
||||
}
|
||||
func (p *Peer) Connected() *int32 {
|
||||
return &p.connected
|
||||
}
|
||||
|
||||
// Setters
|
||||
func (p *Peer) SetVersion(version string) {
|
||||
p.version = version
|
||||
}
|
||||
|
||||
// Outputs any RLP encoded data to the peer
|
||||
func (p *Peer) QueueMessage(msg *ethwire.Msg) {
|
||||
if atomic.LoadInt32(&p.connected) != 1 {
|
||||
@ -531,7 +559,7 @@ func (p *Peer) pushHandshake() error {
|
||||
pubkey := keyRing.PublicKey
|
||||
|
||||
msg := ethwire.NewMessage(ethwire.MsgHandshakeTy, []interface{}{
|
||||
uint32(ProtocolVersion), uint32(0), p.Version, byte(p.caps), p.port, pubkey[1:],
|
||||
uint32(ProtocolVersion), uint32(0), p.version, byte(p.caps), p.port, pubkey[1:],
|
||||
})
|
||||
|
||||
p.QueueMessage(msg)
|
||||
@ -588,8 +616,12 @@ func (p *Peer) handleHandshake(msg *ethwire.Msg) {
|
||||
|
||||
// Set the peer's caps
|
||||
p.caps = Caps(c.Get(3).Byte())
|
||||
|
||||
// Get a reference to the peers version
|
||||
p.Version = c.Get(2).Str()
|
||||
versionString := c.Get(2).Str()
|
||||
if len(versionString) > 0 {
|
||||
p.SetVersion(c.Get(2).Str())
|
||||
}
|
||||
|
||||
// Catch up with the connected peer
|
||||
if !p.ethereum.IsUpToDate() {
|
||||
@ -615,7 +647,7 @@ func (p *Peer) String() string {
|
||||
strConnectType = "disconnected"
|
||||
}
|
||||
|
||||
return fmt.Sprintf("[%s] (%s) %v %s [%s]", strConnectType, strBoundType, p.conn.RemoteAddr(), p.Version, p.caps)
|
||||
return fmt.Sprintf("[%s] (%s) %v %s [%s]", strConnectType, strBoundType, p.conn.RemoteAddr(), p.version, p.caps)
|
||||
|
||||
}
|
||||
func (p *Peer) SyncWithPeerToLastKnown() {
|
||||
|
Loading…
Reference in New Issue
Block a user