github.com/jiajun1992/watercarver@v0.0.0-20191031150618-dfc2b17c0c4a/go-ethereum/cmd/devp2p/nodeset.go (about) 1 // Copyright 2019 The go-ethereum Authors 2 // This file is part of go-ethereum. 3 // 4 // go-ethereum is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // go-ethereum is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with go-ethereum. If not, see <http://www.gnu.org/licenses/>. 16 17 package main 18 19 import ( 20 "bytes" 21 "encoding/json" 22 "fmt" 23 "io/ioutil" 24 "sort" 25 26 "github.com/ethereum/go-ethereum/common" 27 "github.com/ethereum/go-ethereum/p2p/enode" 28 ) 29 30 const jsonIndent = " " 31 32 // nodeSet is the nodes.json file format. It holds a set of node records 33 // as a JSON object. 34 type nodeSet map[enode.ID]nodeJSON 35 36 type nodeJSON struct { 37 Seq uint64 `json:"seq"` 38 N *enode.Node `json:"record"` 39 } 40 41 func loadNodesJSON(file string) nodeSet { 42 var nodes nodeSet 43 if err := common.LoadJSON(file, &nodes); err != nil { 44 exit(err) 45 } 46 return nodes 47 } 48 49 func writeNodesJSON(file string, nodes nodeSet) { 50 nodesJSON, err := json.MarshalIndent(nodes, "", jsonIndent) 51 if err != nil { 52 exit(err) 53 } 54 if err := ioutil.WriteFile(file, nodesJSON, 0644); err != nil { 55 exit(err) 56 } 57 } 58 59 func (ns nodeSet) nodes() []*enode.Node { 60 result := make([]*enode.Node, 0, len(ns)) 61 for _, n := range ns { 62 result = append(result, n.N) 63 } 64 // Sort by ID. 65 sort.Slice(result, func(i, j int) bool { 66 return bytes.Compare(result[i].ID().Bytes(), result[j].ID().Bytes()) < 0 67 }) 68 return result 69 } 70 71 func (ns nodeSet) add(nodes ...*enode.Node) { 72 for _, n := range nodes { 73 ns[n.ID()] = nodeJSON{Seq: n.Seq(), N: n} 74 } 75 } 76 77 func (ns nodeSet) verify() error { 78 for id, n := range ns { 79 if n.N.ID() != id { 80 return fmt.Errorf("invalid node %v: ID does not match ID %v in record", id, n.N.ID()) 81 } 82 if n.N.Seq() != n.Seq { 83 return fmt.Errorf("invalid node %v: 'seq' does not match seq %d from record", id, n.N.Seq()) 84 } 85 } 86 return nil 87 }