aboutsummaryrefslogtreecommitdiffstats
path: root/p2p
diff options
context:
space:
mode:
Diffstat (limited to 'p2p')
-rw-r--r--p2p/discv5/testimg/1173
-rw-r--r--p2p/discv5/testimg/2178
-rw-r--r--p2p/discv5/testimg/testimg.1191
-rw-r--r--p2p/discv5/testimg/testimg.go335
-rw-r--r--p2p/discv5/ticket.go20
5 files changed, 18 insertions, 879 deletions
diff --git a/p2p/discv5/testimg/1 b/p2p/discv5/testimg/1
deleted file mode 100644
index f2acfdc06..000000000
--- a/p2p/discv5/testimg/1
+++ /dev/null
@@ -1,173 +0,0 @@
-package main
-
-import (
- "bufio"
- "encoding/binary"
- "fmt"
- "image"
- "image/png"
- "os"
- "sort"
- "strconv"
-
- "github.com/ethereum/go-ethereum/crypto"
-)
-
-var xs, ys, maxTime int
-
-func set(pic *image.NRGBA, x, y, c, v int) {
- if v > 255 {
- v = 255
- }
- if x >= 0 && x < xs && y >= 0 && y < ys {
- pic.Pix[y*pic.Stride+x*4+c] = uint8(v)
- }
-}
-
-func main() {
- topicHash := crypto.Keccak256Hash([]byte("foo"))
- fmt.Println(topicHash)
- topicPrefix := binary.BigEndian.Uint64(topicHash[:8])
- var nodes uint64Slice
-
- inputFile := "test.out"
- if len(os.Args) > 1 {
- inputFile = os.Args[1]
- }
-
- f, _ := os.Open(inputFile)
- scanner := bufio.NewScanner(f)
- scanner.Split(bufio.ScanWords)
- for scanner.Scan() {
- w := scanner.Text()
- if w == "*N" {
- scanner.Scan()
- prefix, _ := strconv.ParseUint(scanner.Text(), 16, 64)
- nodes = append(nodes, prefix^topicPrefix)
- }
- if w == "*R" {
- scanner.Scan()
- time, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- if int(time) > maxTime {
- maxTime = int(time)
- }
- }
- }
- f.Close()
- sort.Sort(nodes)
- nodeIdx := make(map[uint64]int)
- for i, v := range nodes {
- nodeIdx[v^topicPrefix] = i
- }
-
- xs = maxTime / 10000
- ys = len(nodes)
-
- pic := image.NewNRGBA(image.Rect(0, 0, xs, ys))
- for y := 0; y < ys; y++ {
- for x := 0; x < xs; x++ {
- set(pic, x, y, 3, 255)
- }
- }
-
- pic2 := image.NewNRGBA(image.Rect(0, 0, xs, ys))
- for y := 0; y < ys; y++ {
- for x := 0; x < xs; x++ {
- set(pic2, x, y, 3, 255)
- }
- }
-
- f, _ = os.Open(inputFile)
- scanner = bufio.NewScanner(f)
- scanner.Split(bufio.ScanWords)
-
- nodeRad := make(map[uint64]int)
-
- for scanner.Scan() {
- w := scanner.Text()
- if w == "*R" {
- scanner.Scan()
- time, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- scanner.Scan()
- prefix, _ := strconv.ParseUint(scanner.Text(), 16, 64)
- scanner.Scan()
- rad, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- if int(rad) != nodeRad[prefix] {
- nodeRad[prefix] = int(rad)
- radUint := uint64(rad) * ((^uint64(0)) / 1000000)
- x := int(time * int64(xs) / int64(maxTime))
- y := sort.Search(ys, func(i int) bool {
- return nodes[i] > radUint
- })
- set(pic, x, y, 1, 255)
- }
- }
- if w == "*MR" {
- scanner.Scan()
- time, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- scanner.Scan()
- scanner.Scan()
- rad, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- radUint := uint64(rad) * ((^uint64(0)) / 1000000)
- x := int(time * int64(xs) / int64(maxTime))
- y := sort.Search(ys, func(i int) bool {
- return nodes[i] > radUint
- })
- set(pic, x, y, 0, 255)
- }
- if w == "*W" {
- scanner.Scan()
- time, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- scanner.Scan()
- prefix, _ := strconv.ParseUint(scanner.Text(), 16, 64)
- scanner.Scan()
- wp, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- x := int(time * int64(xs) / int64(maxTime))
- y := nodeIdx[prefix]
- set(pic2, x, y, 0, int(wp/100000))
- set(pic2, x, y, 1, int(wp/10000))
- set(pic2, x, y, 2, int(wp/1000))
- }
- if w == "*+" {
- scanner.Scan()
- time, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- scanner.Scan()
- prefix, _ := strconv.ParseUint(scanner.Text(), 16, 64)
- x := int(time * int64(xs) / int64(maxTime))
- y := nodeIdx[prefix]
- set(pic, x, y, 2, 255)
- scanner.Scan()
- }
- }
- f.Close()
-
- f, _ = os.Create("test.png")
- w := bufio.NewWriter(f)
- png.Encode(w, pic)
- w.Flush()
- f.Close()
-
- f, _ = os.Create("test2.png")
- w = bufio.NewWriter(f)
- png.Encode(w, pic2)
- w.Flush()
- f.Close()
-}
-
-type uint64Slice []uint64
-
-// Len is the number of elements in the collection.
-func (s uint64Slice) Len() int {
- return len(s)
-}
-
-// Less reports whether the element with
-// index i should sort before the element with index j.
-func (s uint64Slice) Less(i, j int) bool {
- return s[i] < s[j]
-}
-
-// Swap swaps the elements with indexes i and j.
-func (s uint64Slice) Swap(i, j int) {
- s[i], s[j] = s[j], s[i]
-}
diff --git a/p2p/discv5/testimg/2 b/p2p/discv5/testimg/2
deleted file mode 100644
index 2638eff4f..000000000
--- a/p2p/discv5/testimg/2
+++ /dev/null
@@ -1,178 +0,0 @@
-package main
-
-import (
- "bufio"
- "encoding/binary"
- "fmt"
- "image"
- "image/png"
- "os"
- "sort"
- "strconv"
-
- "github.com/ethereum/go-ethereum/crypto"
-)
-
-var xs, ys, maxTime int
-
-func set(pic *image.NRGBA, x, y, c, v int) {
- if v > 255 {
- v = 255
- }
- if x >= 0 && x < xs && y >= 0 && y < ys {
- pic.Pix[y*pic.Stride+x*4+c] = uint8(v)
- }
-}
-
-func main() {
- topics := make(map[string]uint64)
- var nodes uint64Slice
-
- inputFile := "test.out"
- if len(os.Args) > 1 {
- inputFile = os.Args[1]
- }
-
- f, _ := os.Open(inputFile)
- scanner := bufio.NewScanner(f)
- scanner.Split(bufio.ScanWords)
- for scanner.Scan() {
- w := scanner.Text()
- if w == "*N" {
- scanner.Scan()
- prefix, _ := strconv.ParseUint(scanner.Text(), 16, 64)
- nodes = append(nodes, prefix^topicPrefix)
- }
- if w == "*R" {
- scanner.Scan()
- time, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- if int(time) > maxTime {
- maxTime = int(time)
- }
- scanner.Scan()
- topic := scanner.Text()
- if _, ok := topics[topic]; !ok {
- fmt.Println(topic)
- topicHash := crypto.Keccak256Hash([]byte(topic))
- topics[topic] := binary.BigEndian.Uint64(topicHash[:8])
- }
- }
- }
- f.Close()
- sort.Sort(nodes)
- nodeIdx := make(map[uint64]int)
- for i, v := range nodes {
- nodeIdx[v^topicPrefix] = i
- }
-
- xs = maxTime / 10000
- ys = len(nodes)
-
- pic := image.NewNRGBA(image.Rect(0, 0, xs, ys))
- for y := 0; y < ys; y++ {
- for x := 0; x < xs; x++ {
- set(pic, x, y, 3, 255)
- }
- }
-
- pic2 := image.NewNRGBA(image.Rect(0, 0, xs, ys))
- for y := 0; y < ys; y++ {
- for x := 0; x < xs; x++ {
- set(pic2, x, y, 3, 255)
- }
- }
-
- f, _ = os.Open(inputFile)
- scanner = bufio.NewScanner(f)
- scanner.Split(bufio.ScanWords)
-
- nodeRad := make(map[uint64]int)
-
- for scanner.Scan() {
- w := scanner.Text()
- if w == "*R" {
- scanner.Scan()
- time, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- scanner.Scan()
- prefix, _ := strconv.ParseUint(scanner.Text(), 16, 64)
- scanner.Scan()
- rad, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- if int(rad) != nodeRad[prefix] {
- nodeRad[prefix] = int(rad)
- radUint := uint64(rad) * ((^uint64(0)) / 1000000)
- x := int(time * int64(xs) / int64(maxTime))
- y := sort.Search(ys, func(i int) bool {
- return nodes[i] > radUint
- })
- set(pic, x, y, 1, 255)
- }
- }
- if w == "*MR" {
- scanner.Scan()
- time, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- scanner.Scan()
- scanner.Scan()
- rad, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- radUint := uint64(rad) * ((^uint64(0)) / 1000000)
- x := int(time * int64(xs) / int64(maxTime))
- y := sort.Search(ys, func(i int) bool {
- return nodes[i] > radUint
- })
- set(pic, x, y, 0, 255)
- }
- if w == "*W" {
- scanner.Scan()
- time, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- scanner.Scan()
- prefix, _ := strconv.ParseUint(scanner.Text(), 16, 64)
- scanner.Scan()
- wp, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- x := int(time * int64(xs) / int64(maxTime))
- y := nodeIdx[prefix]
- set(pic2, x, y, 0, int(wp/100000))
- set(pic2, x, y, 1, int(wp/10000))
- set(pic2, x, y, 2, int(wp/1000))
- }
- if w == "*+" {
- scanner.Scan()
- time, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- scanner.Scan()
- prefix, _ := strconv.ParseUint(scanner.Text(), 16, 64)
- x := int(time * int64(xs) / int64(maxTime))
- y := nodeIdx[prefix]
- set(pic, x, y, 2, 255)
- scanner.Scan()
- }
- }
- f.Close()
-
- f, _ = os.Create("test.png")
- w := bufio.NewWriter(f)
- png.Encode(w, pic)
- w.Flush()
- f.Close()
-
- f, _ = os.Create("test2.png")
- w = bufio.NewWriter(f)
- png.Encode(w, pic2)
- w.Flush()
- f.Close()
-}
-
-type uint64Slice []uint64
-
-// Len is the number of elements in the collection.
-func (s uint64Slice) Len() int {
- return len(s)
-}
-
-// Less reports whether the element with
-// index i should sort before the element with index j.
-func (s uint64Slice) Less(i, j int) bool {
- return s[i] < s[j]
-}
-
-// Swap swaps the elements with indexes i and j.
-func (s uint64Slice) Swap(i, j int) {
- s[i], s[j] = s[j], s[i]
-}
diff --git a/p2p/discv5/testimg/testimg.1 b/p2p/discv5/testimg/testimg.1
deleted file mode 100644
index 32268aa97..000000000
--- a/p2p/discv5/testimg/testimg.1
+++ /dev/null
@@ -1,191 +0,0 @@
-package main
-
-import (
- "bufio"
- "encoding/binary"
- "fmt"
- "image"
- "image/png"
- "os"
- "sort"
- "strconv"
-
- "github.com/ethereum/go-ethereum/crypto"
-)
-
-var xs, ys, maxTime int
-
-func set(pic *image.NRGBA, x, y, c, v int) {
- if v > 255 {
- v = 255
- }
- if x >= 0 && x < xs && y >= 0 && y < ys {
- pic.Pix[y*pic.Stride+x*4+c] = uint8(v)
- }
-}
-
-func main() {
- var nodes uint64Slice
-
- inputFile := "test.out"
- if len(os.Args) > 1 {
- inputFile = os.Args[1]
- }
-
- topic := "foo"
- if len(os.Args) > 2 {
- topic = os.Args[2]
- }
-
- topicHash := crypto.Keccak256Hash([]byte(topic))
- fmt.Println(topicHash)
- topicPrefix := binary.BigEndian.Uint64(topicHash[:8])
-
- f, _ := os.Open(inputFile)
- scanner := bufio.NewScanner(f)
- scanner.Split(bufio.ScanWords)
- for scanner.Scan() {
- w := scanner.Text()
- if w == "*N" {
- scanner.Scan()
- prefix, _ := strconv.ParseUint(scanner.Text(), 16, 64)
- nodes = append(nodes, prefix^topicPrefix)
- }
- if w == "*R" {
- scanner.Scan()
- time, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- if int(time) > maxTime {
- maxTime = int(time)
- }
- }
- }
- f.Close()
- sort.Sort(nodes)
- nodeIdx := make(map[uint64]int)
- for i, v := range nodes {
- nodeIdx[v^topicPrefix] = i
- }
-
- xs = maxTime / 10000
- ys = len(nodes)
-
- pic := image.NewNRGBA(image.Rect(0, 0, xs, ys))
- for y := 0; y < ys; y++ {
- for x := 0; x < xs; x++ {
- set(pic, x, y, 3, 255)
- }
- }
-
- pic2 := image.NewNRGBA(image.Rect(0, 0, xs, ys))
- for y := 0; y < ys; y++ {
- for x := 0; x < xs; x++ {
- set(pic2, x, y, 3, 255)
- }
- }
-
- f, _ = os.Open(inputFile)
- scanner = bufio.NewScanner(f)
- scanner.Split(bufio.ScanWords)
-
- nodeRad := make(map[uint64]int)
-
- for scanner.Scan() {
- w := scanner.Text()
- if w == "*R" {
- scanner.Scan()
- time, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- scanner.Scan()
- if scanner.Text() == topic {
- scanner.Scan()
- prefix, _ := strconv.ParseUint(scanner.Text(), 16, 64)
- scanner.Scan()
- rad, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- if int(rad) != nodeRad[prefix] {
- nodeRad[prefix] = int(rad)
- radUint := uint64(rad) * ((^uint64(0)) / 1000000)
- x := int(time * int64(xs) / int64(maxTime))
- y := sort.Search(ys, func(i int) bool {
- return nodes[i] > radUint
- })
- set(pic, x, y, 1, 255)
- }
- }
- }
- if w == "*MR" {
- scanner.Scan()
- time, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- scanner.Scan()
- if scanner.Text() == topic {
- scanner.Scan()
- scanner.Scan()
- rad, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- radUint := uint64(rad) * ((^uint64(0)) / 1000000)
- x := int(time * int64(xs) / int64(maxTime))
- y := sort.Search(ys, func(i int) bool {
- return nodes[i] > radUint
- })
- set(pic, x, y, 0, 255)
- }
- }
- if w == "*W" {
- scanner.Scan()
- time, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- scanner.Scan()
- if scanner.Text() == topic {
- scanner.Scan()
- prefix, _ := strconv.ParseUint(scanner.Text(), 16, 64)
- scanner.Scan()
- wp, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- x := int(time * int64(xs) / int64(maxTime))
- y := nodeIdx[prefix]
- set(pic2, x, y, 0, int(wp/100000))
- set(pic2, x, y, 1, int(wp/10000))
- set(pic2, x, y, 2, int(wp/1000))
- }
- }
- if w == "*+" {
- scanner.Scan()
- time, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- scanner.Scan()
- if scanner.Text() == topic {
- scanner.Scan()
- prefix, _ := strconv.ParseUint(scanner.Text(), 16, 64)
- x := int(time * int64(xs) / int64(maxTime))
- y := nodeIdx[prefix]
- set(pic, x, y, 2, 255)
- scanner.Scan()
- }
- }
- }
- f.Close()
-
- f, _ = os.Create("test.png")
- w := bufio.NewWriter(f)
- png.Encode(w, pic)
- w.Flush()
- f.Close()
-
- f, _ = os.Create("test2.png")
- w = bufio.NewWriter(f)
- png.Encode(w, pic2)
- w.Flush()
- f.Close()
-}
-
-type uint64Slice []uint64
-
-// Len is the number of elements in the collection.
-func (s uint64Slice) Len() int {
- return len(s)
-}
-
-// Less reports whether the element with
-// index i should sort before the element with index j.
-func (s uint64Slice) Less(i, j int) bool {
- return s[i] < s[j]
-}
-
-// Swap swaps the elements with indexes i and j.
-func (s uint64Slice) Swap(i, j int) {
- s[i], s[j] = s[j], s[i]
-}
diff --git a/p2p/discv5/testimg/testimg.go b/p2p/discv5/testimg/testimg.go
deleted file mode 100644
index dab918a77..000000000
--- a/p2p/discv5/testimg/testimg.go
+++ /dev/null
@@ -1,335 +0,0 @@
-package main
-
-import (
- "bufio"
- "encoding/binary"
- "fmt"
- "image"
- "image/png"
- "math"
- "os"
- "sort"
- "strconv"
-
- "github.com/ethereum/go-ethereum/crypto"
-)
-
-var xs, ys, maxTime int
-var minAbsTime, maxAbsTime int64
-
-func set(pic *image.NRGBA, x, y, c, v int) {
- if v > 255 {
- v = 255
- }
- if x >= 0 && x < xs && y >= 0 && y < ys {
- pic.Pix[y*pic.Stride+x*4+c] = uint8(v)
- }
-}
-
-type nodeStats []struct{ wpSum, wpCnt, wpXcnt, regCnt, regXcnt uint64 }
-
-type nodeInfo struct {
- maxMR int
- topics map[string]struct{}
-}
-
-const (
- regStatDiv = 60
- regStatYdiv = 30
-)
-
-type topicInfo struct {
- prefix uint64
- nodes uint64Slice
- nodeStats nodeStats
- nodeIdx map[uint64]int
- pic, pic2 *image.NRGBA
- nodeRad map[uint64]int
- regStats []int
-}
-
-func main() {
- var nodes uint64Slice
- topics := make(map[string]*topicInfo)
-
- inputFile := "test.out"
- if len(os.Args) > 1 {
- inputFile = os.Args[1]
- }
-
- f, _ := os.Open(inputFile)
- scanner := bufio.NewScanner(f)
- scanner.Split(bufio.ScanWords)
- minAbsTime = math.MaxInt64
- for scanner.Scan() {
- w := scanner.Text()
- if w == "*N" {
- scanner.Scan()
- prefix, _ := strconv.ParseUint(scanner.Text(), 16, 64)
- nodes = append(nodes, prefix)
- }
- if w == "*R" {
- scanner.Scan()
- time, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- if time > maxAbsTime {
- maxAbsTime = time
- }
- if time < minAbsTime {
- minAbsTime = time
- }
- scanner.Scan()
- topic := scanner.Text()
- if _, ok := topics[topic]; !ok {
- fmt.Println(topic)
- topicHash := crypto.Keccak256Hash([]byte(topic))
- topics[topic] = &topicInfo{prefix: binary.BigEndian.Uint64(topicHash[:8])}
- }
- }
- }
- f.Close()
-
- maxTime = int(maxAbsTime - minAbsTime)
- xs = maxTime / 10000
- ys = len(nodes)
- nodeIdx := make(map[uint64]int)
- for i, v := range nodes {
- nodeIdx[v] = i
- }
- nodeInfo := make([]nodeInfo, len(nodes))
-
- for _, t := range topics {
- t.nodes = make(uint64Slice, len(nodes))
- t.nodeStats = make(nodeStats, len(nodes))
- for i, v := range nodes {
- t.nodes[i] = v ^ t.prefix
- }
- sort.Sort(t.nodes)
- t.nodeIdx = make(map[uint64]int)
- for i, v := range t.nodes {
- t.nodeIdx[v^t.prefix] = i
- }
-
- t.pic = image.NewNRGBA(image.Rect(0, 0, xs, ys))
- for y := 0; y < ys; y++ {
- for x := 0; x < xs; x++ {
- set(t.pic, x, y, 3, 255)
- }
- }
-
- t.pic2 = image.NewNRGBA(image.Rect(0, 0, xs, ys))
- for y := 0; y < ys; y++ {
- for x := 0; x < xs; x++ {
- set(t.pic2, x, y, 3, 255)
- }
- }
- t.nodeRad = make(map[uint64]int)
- t.regStats = make([]int, xs/regStatDiv+1)
- }
-
- f, _ = os.Open(inputFile)
- scanner = bufio.NewScanner(f)
- scanner.Split(bufio.ScanWords)
- statBegin := int64(40000000)
- statEnd := int64(maxTime - 10000000)
-
- for scanner.Scan() {
- w := scanner.Text()
- if w == "*R" {
- scanner.Scan()
- time, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- time -= minAbsTime
- scanner.Scan()
- t := topics[scanner.Text()]
- scanner.Scan()
- prefix, _ := strconv.ParseUint(scanner.Text(), 16, 64)
- scanner.Scan()
- rad, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- if int(rad) != t.nodeRad[prefix] {
- t.nodeRad[prefix] = int(rad)
- radUint := uint64(rad) * ((^uint64(0)) / 1000000)
- x := int(time * int64(xs) / int64(maxTime))
- y := sort.Search(ys, func(i int) bool {
- return t.nodes[i] > radUint
- })
- set(t.pic, x, y, 1, 255)
- }
- }
- if w == "*MR" {
- scanner.Scan()
- time, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- time -= minAbsTime
- scanner.Scan()
- topic := scanner.Text()
- t := topics[topic]
- scanner.Scan()
- prefix, _ := strconv.ParseUint(scanner.Text(), 16, 64)
- scanner.Scan()
- rad, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- radUint := uint64(rad) * ((^uint64(0)) / 1000000)
- x := int(time * int64(xs) / int64(maxTime))
- y := sort.Search(ys, func(i int) bool {
- return t.nodes[i] > radUint
- })
- set(t.pic, x, y, 0, 255)
- ni := nodeInfo[nodeIdx[prefix]]
- if int(rad) > ni.maxMR {
- ni.maxMR = int(rad)
- if ni.topics == nil {
- ni.topics = make(map[string]struct{})
- }
- ni.topics[topic] = struct{}{}
- }
- nodeInfo[nodeIdx[prefix]] = ni
- }
- if w == "*W" {
- scanner.Scan()
- time, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- time -= minAbsTime
- scanner.Scan()
- t := topics[scanner.Text()]
- scanner.Scan()
- prefix, _ := strconv.ParseUint(scanner.Text(), 16, 64)
- scanner.Scan()
- wp, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- x := int(time * int64(xs) / int64(maxTime))
- y := t.nodeIdx[prefix]
- if time >= statBegin && time < statEnd {
- t.nodeStats[y].wpSum += uint64(wp)
- if wp >= 600000 {
- t.nodeStats[y].wpXcnt++
- }
- t.nodeStats[y].wpCnt++
- }
- /*set(t.pic2, x, y, 0, int(wp/100000))
- set(t.pic2, x, y, 1, int(wp/10000))
- set(t.pic2, x, y, 2, int(wp/1000))*/
- if wp >= 1800000 {
- set(t.pic2, x, y, 0, 255)
- }
- if wp >= 600000 {
- set(t.pic2, x, y, 1, 255)
- }
- if wp >= 60000 {
- set(t.pic2, x, y, 2, 255)
- }
- }
- if w == "*+" {
- scanner.Scan()
- time, _ := strconv.ParseInt(scanner.Text(), 10, 64)
- time -= minAbsTime
- scanner.Scan()
- t := topics[scanner.Text()]
- scanner.Scan()
- prefix, _ := strconv.ParseUint(scanner.Text(), 16, 64)
- x := int(time * int64(xs) / int64(maxTime))
- if x < xs {
- t.regStats[x/regStatDiv]++
- }
- y := t.nodeIdx[prefix]
- set(t.pic, x, y, 2, 255)
- scanner.Scan()
- prefix2, _ := strconv.ParseUint(scanner.Text(), 16, 64)
- y2 := t.nodeIdx[prefix2]
- if time >= statBegin && time < statEnd {
- t.nodeStats[y].regCnt++
- t.nodeStats[y2].regXcnt++
- }
- }
- }
- f.Close()
-
- for tt, t := range topics {
- f, _ = os.Create("test_" + tt + ".png")
- w := bufio.NewWriter(f)
- png.Encode(w, t.pic)
- w.Flush()
- f.Close()
-
- for x := 0; x < xs; x++ {
- yy := t.regStats[x/regStatDiv] / regStatYdiv
- if yy > ys {
- yy = ys
- }
- for y := 0; y < yy; y++ {
- set(t.pic2, x, ys-1-y, 1, 255)
- }
- }
-
- f, _ = os.Create("test2_" + tt + ".png")
- w = bufio.NewWriter(f)
- png.Encode(w, t.pic2)
- w.Flush()
- f.Close()
-
- if statEnd > statBegin {
- xxs := len(t.nodeStats)
- yys := 1000
- yyh := yys / 2
- pic3 := image.NewNRGBA(image.Rect(0, 0, xxs, yys))
- for y := 0; y < yys; y++ {
- for x := 0; x < xxs; x++ {
- set(pic3, x, y, 3, 255)
- }
- }
- for x := 0; x < xxs; x++ {
- wpy := 0
- if t.nodeStats[x].wpCnt > 0 {
- // wpy = int(t.nodeStats[x].wpSum / t.nodeStats[x].wpCnt / 10000)
- wpy = int(uint64(yyh) * t.nodeStats[x].wpXcnt / t.nodeStats[x].wpCnt)
- }
- if wpy > yyh {
- wpy = yyh
- }
- for y := 0; y < wpy; y++ {
- set(pic3, x, yys-1-y, 1, 255)
- }
- regy := int(t.nodeStats[x].regCnt * 2400000 / uint64(statEnd-statBegin))
- if regy > yyh {
- regy = yyh
- }
- for y := 0; y < regy; y++ {
- set(pic3, x, yyh-1-y, 2, 255)
- }
- regy2 := int(t.nodeStats[x].regXcnt * 2400000 / uint64(statEnd-statBegin))
- if regy2 > yyh {
- regy2 = yyh
- }
- for y := 0; y < regy2; y++ {
- set(pic3, x, yyh-1-y, 0, 255)
- }
- }
-
- f, _ = os.Create("test3_" + tt + ".png")
- w = bufio.NewWriter(f)
- png.Encode(w, pic3)
- w.Flush()
- f.Close()
- }
- }
-
- for i, ni := range nodeInfo {
- fmt.Printf("%d %016x maxMR = %d ", i, nodes[i], ni.maxMR)
- for t, _ := range ni.topics {
- fmt.Printf(" %s", t)
- }
- fmt.Println()
- }
-}
-
-type uint64Slice []uint64
-
-// Len is the number of elements in the collection.
-func (s uint64Slice) Len() int {
- return len(s)
-}
-
-// Less reports whether the element with
-// index i should sort before the element with index j.
-func (s uint64Slice) Less(i, j int) bool {
- return s[i] < s[j]
-}
-
-// Swap swaps the elements with indexes i and j.
-func (s uint64Slice) Swap(i, j int) {
- s[i], s[j] = s[j], s[i]
-}
diff --git a/p2p/discv5/ticket.go b/p2p/discv5/ticket.go
index e256d7679..3f9711ec0 100644
--- a/p2p/discv5/ticket.go
+++ b/p2p/discv5/ticket.go
@@ -766,10 +766,26 @@ func (r *topicRadius) targetForBucket(bucket int) common.Hash {
prefix := r.topicHashPrefix ^ xor
var target common.Hash
binary.BigEndian.PutUint64(target[0:8], prefix)
- rand.Read(target[8:])
+ globalRandRead(target[8:])
return target
}
+// package rand provides a Read function in Go 1.6 and later, but
+// we can't use it yet because we still support Go 1.5.
+func globalRandRead(b []byte) {
+ pos := 0
+ val := 0
+ for n := 0; n < len(b); n++ {
+ if pos == 0 {
+ val = rand.Int()
+ pos = 7
+ }
+ b[n] = byte(val)
+ val >>= 8
+ pos--
+ }
+}
+
func (r *topicRadius) isInRadius(addrHash common.Hash) bool {
nodePrefix := binary.BigEndian.Uint64(addrHash[0:8])
dist := nodePrefix ^ r.topicHashPrefix
@@ -926,7 +942,7 @@ func (r *topicRadius) nextTarget(forceRegular bool) lookupInfo {
prefix := r.topicHashPrefix ^ rnd
var target common.Hash
binary.BigEndian.PutUint64(target[0:8], prefix)
- rand.Read(target[8:])
+ globalRandRead(target[8:])
return lookupInfo{target: target, topic: r.topic, radiusLookup: false}
}