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