123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- // Copyright 2016 The go-ethereum Authors
- // This file is part of the go-ethereum library.
- //
- // The go-ethereum library is free software: you can redistribute it and/or modify
- // it under the terms of the GNU Lesser General Public License as published by
- // the Free Software Foundation, either version 3 of the License, or
- // (at your option) any later version.
- //
- // The go-ethereum library is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU Lesser General Public License for more details.
- //
- // You should have received a copy of the GNU Lesser General Public License
- // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
- // Contains all the wrappers from the accounts package to support client side enode
- // management on mobile platforms.
- package geth
- import (
- "errors"
- "github.com/ethereum/go-ethereum/p2p/discv5"
- )
- // Enode represents a host on the network.
- type Enode struct {
- node *discv5.Node
- }
- // NewEnode parses a node designator.
- //
- // There are two basic forms of node designators
- // - incomplete nodes, which only have the public key (node ID)
- // - complete nodes, which contain the public key and IP/Port information
- //
- // For incomplete nodes, the designator must look like one of these
- //
- // enode://<hex node id>
- // <hex node id>
- //
- // For complete nodes, the node ID is encoded in the username portion
- // of the URL, separated from the host by an @ sign. The hostname can
- // only be given as an IP address, DNS domain names are not allowed.
- // The port in the host name section is the TCP listening port. If the
- // TCP and UDP (discovery) ports differ, the UDP port is specified as
- // query parameter "discport".
- //
- // In the following example, the node URL describes
- // a node with IP address 10.3.58.6, TCP listening port 30303
- // and UDP discovery port 30301.
- //
- // enode://<hex node id>@10.3.58.6:30303?discport=30301
- func NewEnode(rawurl string) (enode *Enode, _ error) {
- node, err := discv5.ParseNode(rawurl)
- if err != nil {
- return nil, err
- }
- return &Enode{node}, nil
- }
- // Enodes represents a slice of accounts.
- type Enodes struct{ nodes []*discv5.Node }
- // NewEnodes creates a slice of uninitialized enodes.
- func NewEnodes(size int) *Enodes {
- return &Enodes{
- nodes: make([]*discv5.Node, size),
- }
- }
- // NewEnodesEmpty creates an empty slice of Enode values.
- func NewEnodesEmpty() *Enodes {
- return NewEnodes(0)
- }
- // Size returns the number of enodes in the slice.
- func (e *Enodes) Size() int {
- return len(e.nodes)
- }
- // Get returns the enode at the given index from the slice.
- func (e *Enodes) Get(index int) (enode *Enode, _ error) {
- if index < 0 || index >= len(e.nodes) {
- return nil, errors.New("index out of bounds")
- }
- return &Enode{e.nodes[index]}, nil
- }
- // Set sets the enode at the given index in the slice.
- func (e *Enodes) Set(index int, enode *Enode) error {
- if index < 0 || index >= len(e.nodes) {
- return errors.New("index out of bounds")
- }
- e.nodes[index] = enode.node
- return nil
- }
- // Append adds a new enode element to the end of the slice.
- func (e *Enodes) Append(enode *Enode) {
- e.nodes = append(e.nodes, enode.node)
- }
|