// Parese network's "addr" message func (c *OneConnection) ParseAddr(pl []byte) { b := bytes.NewBuffer(pl) cnt, _ := btc.ReadVLen(b) for i := 0; i < int(cnt); i++ { var buf [30]byte n, e := b.Read(buf[:]) if n != len(buf) || e != nil { common.CountSafe("AddrError") c.DoS("AddrError") //println("ParseAddr:", n, e) break } a := peersdb.NewPeer(buf[:]) if !sys.ValidIp4(a.Ip4[:]) { c.Misbehave("AddrLocal", 2) } else if time.Unix(int64(a.Time), 0).Before(time.Now().Add(time.Minute)) { if time.Now().Before(time.Unix(int64(a.Time), 0).Add(peersdb.ExpirePeerAfter)) { k := qdb.KeyType(a.UniqID()) v := peersdb.PeerDB.Get(k) if v != nil { a.Banned = peersdb.NewPeer(v[:]).Banned } peersdb.PeerDB.Put(k, a.Bytes()) } else { common.CountSafe("AddrStale") } } else { c.Misbehave("AddrFuture", 5) } } }
func parse_addr(pl []byte) { b := bytes.NewBuffer(pl) cnt, _ := btc.ReadVLen(b) for i := 0; i < int(cnt); i++ { var buf [30]byte n, e := b.Read(buf[:]) if n != len(buf) || e != nil { COUNTER("ADER") break } a := peersdb.NewPeer(buf[:]) if !sys.ValidIp4(a.Ip4[:]) { COUNTER("ADNO") } else if time.Unix(int64(a.Time), 0).Before(time.Now().Add(time.Minute)) { if time.Now().Before(time.Unix(int64(a.Time), 0).Add(peersdb.ExpirePeerAfter)) { k := qdb.KeyType(a.UniqID()) v := peersdb.PeerDB.Get(k) if v != nil { a.Banned = peersdb.NewPeer(v[:]).Banned } peersdb.PeerDB.Put(k, a.Bytes()) } else { COUNTER("ADST") } } else { COUNTER("ADFU") } } }
func show_addresses(par string) { fmt.Println(peersdb.PeerDB.Count(), "peers in the database") if par == "list" { cnt := 0 peersdb.PeerDB.Browse(func(k qdb.KeyType, v []byte) uint32 { cnt++ fmt.Printf("%4d) %s\n", cnt, peersdb.NewPeer(v).String()) return 0 }) } else if par == "ban" { cnt := 0 peersdb.PeerDB.Browse(func(k qdb.KeyType, v []byte) uint32 { pr := peersdb.NewPeer(v) if pr.Banned != 0 { cnt++ fmt.Printf("%4d) %s\n", cnt, pr.String()) } return 0 }) if cnt == 0 { fmt.Println("No banned peers in the DB") } } else if par != "" { limit, er := strconv.ParseUint(par, 10, 32) if er != nil { fmt.Println("Specify number of best peers to display") return } prs := peersdb.GetBestPeers(uint(limit), nil) for i := range prs { fmt.Printf("%4d) %s", i+1, prs[i].String()) if network.ConnectionActive(prs[i]) { fmt.Print(" CONNECTED") } fmt.Print("\n") } } else { fmt.Println("Use 'peers list' to list them") fmt.Println("Use 'peers ban' to list the benned ones") fmt.Println("Use 'peers <number>' to show the most recent ones") } }
// Parese network's "addr" message func (c *OneConnection) ParseAddr(pl []byte) { b := bytes.NewBuffer(pl) cnt, _ := btc.ReadVLen(b) for i := 0; i < int(cnt); i++ { var buf [30]byte n, e := b.Read(buf[:]) if n != len(buf) || e != nil { common.CountSafe("AddrError") c.DoS("AddrError") //println("ParseAddr:", n, e) break } a := peersdb.NewPeer(buf[:]) if !sys.ValidIp4(a.Ip4[:]) { //common.CountSafe("AddrLocal") if c.Misbehave("AddrLocal", 1) { break } //print(c.PeerAddr.Ip(), " ", c.Node.Agent, " ", c.Node.Version, " addr local ", a.String(), "\n> ") } else if time.Unix(int64(a.Time), 0).Before(time.Now().Add(time.Minute)) { if time.Now().Before(time.Unix(int64(a.Time), 0).Add(peersdb.ExpirePeerAfter)) { k := qdb.KeyType(a.UniqID()) v := peersdb.PeerDB.Get(k) if v != nil { a.Banned = peersdb.NewPeer(v[:]).Banned } a.Time = uint32(time.Now().Add(-5 * time.Minute).Unix()) // add new peers as not just alive peersdb.PeerDB.Put(k, a.Bytes()) } else { common.CountSafe("AddrStale") } } else { if c.Misbehave("AddrFuture", 50) { break } } } }