Ori Newman 42e50e6dc2
[NOD-1191] Convert wire protocol to proto (#831)
* [NOD-1191] Convert wire protocol to 100% protobuf

* [NOD-1191] Simplify wire interface and remove redundant messages

* [NOD-1191] Map all proto to wire conversions

* [NOD-1203] Create netadapter outside of protocol manager

* [NOD-1191] Fix nil errors

* [NOD-1191] Fix comments

* [NOD-1191] Add converter interface

* [NOD-1191] Add missing GetBlockLocator message

* [NOD-1191] Change message names that starts with 'get' to 'request'

* [NOD-1191] Change message commands values

* [NOD-1191] Remove redundant methods

* [NOD-1191] Rename message constructors

* [NOD-1191] Change message commands to use iota

* [NOD-1191] Add missing outputs to protobuf conversion

* [NOD-1191] Make block header a required field

* [NOD-1191] Rename variables

* [NOD-1212] Fix test names

* [NOD-1191] Rename flow names

* [NOD-1191] Fix infinite loop
2020-07-30 18:19:55 +03:00

71 lines
1.4 KiB
Go

package id
import (
"bytes"
"crypto/rand"
"encoding/hex"
"io"
)
// IDLength of array used to store the ID.
const IDLength = 16
// ID identifies a network connection
type ID struct {
bytes []byte
}
// GenerateID generates a new ID
func GenerateID() (*ID, error) {
id := new(ID)
err := id.Deserialize(rand.Reader)
if err != nil {
return nil, err
}
return id, nil
}
// IsEqual returns whether id equals to other.
func (id *ID) IsEqual(other *ID) bool {
return bytes.Equal(id.bytes, other.bytes)
}
func (id *ID) String() string {
return hex.EncodeToString(id.bytes)
}
// Deserialize decodes a block from r into the receiver.
func (id *ID) Deserialize(r io.Reader) error {
id.bytes = make([]byte, IDLength)
_, err := io.ReadFull(r, id.bytes)
return err
}
// Serialize serializes the receiver into the given writer.
func (id *ID) Serialize(w io.Writer) error {
_, err := w.Write(id.bytes)
return err
}
// SerializeToBytes serializes the receiver and returns a byte slice of the serialized id.
func (id *ID) SerializeToBytes() ([]byte, error) {
w := &bytes.Buffer{}
err := id.Serialize(w)
if err != nil {
return nil, err
}
return w.Bytes(), nil
}
// FromBytes returns an ID deserialized from the given byte slice.
func FromBytes(serializedID []byte) *ID {
r := bytes.NewReader(serializedID)
newID := new(ID)
err := newID.Deserialize(r)
if err != nil {
panic(err)
}
return newID
}