github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/p2p/discover/node.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:41</date> 10 //</624450102911569920> 11 12 13 package discover 14 15 import ( 16 "crypto/ecdsa" 17 "errors" 18 "math/big" 19 "net" 20 "time" 21 22 "github.com/ethereum/go-ethereum/common/math" 23 "github.com/ethereum/go-ethereum/crypto" 24 "github.com/ethereum/go-ethereum/crypto/secp256k1" 25 "github.com/ethereum/go-ethereum/p2p/enode" 26 ) 27 28 //节点表示网络上的主机。 29 //不能修改节点的字段。 30 type node struct { 31 enode.Node 32 addedAt time.Time //将节点添加到表中的时间 33 } 34 35 type encPubkey [64]byte 36 37 func encodePubkey(key *ecdsa.PublicKey) encPubkey { 38 var e encPubkey 39 math.ReadBits(key.X, e[:len(e)/2]) 40 math.ReadBits(key.Y, e[len(e)/2:]) 41 return e 42 } 43 44 func decodePubkey(e encPubkey) (*ecdsa.PublicKey, error) { 45 p := &ecdsa.PublicKey{Curve: crypto.S256(), X: new(big.Int), Y: new(big.Int)} 46 half := len(e) / 2 47 p.X.SetBytes(e[:half]) 48 p.Y.SetBytes(e[half:]) 49 if !p.Curve.IsOnCurve(p.X, p.Y) { 50 return nil, errors.New("invalid secp256k1 curve point") 51 } 52 return p, nil 53 } 54 55 func (e encPubkey) id() enode.ID { 56 return enode.ID(crypto.Keccak256Hash(e[:])) 57 } 58 59 //recovernodekey计算用于签名的公钥 60 //从签名中给定哈希。 61 func recoverNodeKey(hash, sig []byte) (key encPubkey, err error) { 62 pubkey, err := secp256k1.RecoverPubkey(hash, sig) 63 if err != nil { 64 return key, err 65 } 66 copy(key[:], pubkey[1:]) 67 return key, nil 68 } 69 70 func wrapNode(n *enode.Node) *node { 71 return &node{Node: *n} 72 } 73 74 func wrapNodes(ns []*enode.Node) []*node { 75 result := make([]*node, len(ns)) 76 for i, n := range ns { 77 result[i] = wrapNode(n) 78 } 79 return result 80 } 81 82 func unwrapNode(n *node) *enode.Node { 83 return &n.Node 84 } 85 86 func unwrapNodes(ns []*node) []*enode.Node { 87 result := make([]*enode.Node, len(ns)) 88 for i, n := range ns { 89 result[i] = unwrapNode(n) 90 } 91 return result 92 } 93 94 func (n *node) addr() *net.UDPAddr { 95 return &net.UDPAddr{IP: n.IP(), Port: n.UDP()} 96 } 97 98 func (n *node) String() string { 99 return n.Node.String() 100 } 101