|
|
|
@ -31,6 +31,7 @@ import ( |
|
|
|
|
"os" |
|
|
|
|
"path" |
|
|
|
|
"runtime" |
|
|
|
|
"sort" |
|
|
|
|
"strconv" |
|
|
|
|
"time" |
|
|
|
|
|
|
|
|
@ -449,6 +450,7 @@ func (gui *Gui) update() { |
|
|
|
|
|
|
|
|
|
case <-peerUpdateTicker.C: |
|
|
|
|
gui.setPeerInfo() |
|
|
|
|
|
|
|
|
|
case <-generalUpdateTicker.C: |
|
|
|
|
statusText := "#" + gui.eth.ChainManager().CurrentBlock().Number().String() |
|
|
|
|
lastBlockLabel.Set("text", statusText) |
|
|
|
@ -499,12 +501,34 @@ NumGC: %d |
|
|
|
|
)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type qmlpeer struct{ Addr, NodeID, Caps string } |
|
|
|
|
|
|
|
|
|
type peersByID []*qmlpeer |
|
|
|
|
|
|
|
|
|
func (s peersByID) Len() int { return len(s) } |
|
|
|
|
func (s peersByID) Less(i, j int) bool { return s[i].NodeID < s[j].NodeID } |
|
|
|
|
func (s peersByID) Swap(i, j int) { s[i], s[j] = s[j], s[i] } |
|
|
|
|
|
|
|
|
|
func (gui *Gui) setPeerInfo() { |
|
|
|
|
gui.win.Root().Call("setPeers", fmt.Sprintf("%d / %d", gui.eth.PeerCount(), gui.eth.MaxPeers)) |
|
|
|
|
gui.win.Root().Call("resetPeers") |
|
|
|
|
//for _, peer := range gui.xeth.Peers() {
|
|
|
|
|
//gui.win.Root().Call("addPeer", peer)
|
|
|
|
|
//}
|
|
|
|
|
peers := gui.eth.Peers() |
|
|
|
|
qpeers := make(peersByID, len(peers)) |
|
|
|
|
for i, p := range peers { |
|
|
|
|
qpeers[i] = &qmlpeer{ |
|
|
|
|
NodeID: p.ID().String(), |
|
|
|
|
Addr: p.RemoteAddr().String(), |
|
|
|
|
Caps: fmt.Sprint(p.Caps()), |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// we need to sort the peers because they jump around randomly
|
|
|
|
|
// otherwise. order returned by eth.Peers is random because they
|
|
|
|
|
// are taken from a map.
|
|
|
|
|
sort.Sort(qpeers) |
|
|
|
|
|
|
|
|
|
gui.win.Root().Call("setPeerCounters", fmt.Sprintf("%d / %d", len(peers), gui.eth.MaxPeers())) |
|
|
|
|
gui.win.Root().Call("clearPeers") |
|
|
|
|
for _, p := range qpeers { |
|
|
|
|
gui.win.Root().Call("addPeer", p) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (gui *Gui) privateKey() string { |
|
|
|
|