Skip to content

Commit

Permalink
capability: add ArchivalNode, fix #3776
Browse files Browse the repository at this point in the history
This will be used to differentiate full history nodes from state only. Currently
it's just a definition, we can not use it safely on current networks because
nodes will refuse this Version, so actual code using the attribute will be
added in newer versions.

Signed-off-by: Roman Khimov <[email protected]>
  • Loading branch information
roman-khimov committed Dec 28, 2024
1 parent 1db2458 commit e36b28a
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 0 deletions.
18 changes: 18 additions & 0 deletions pkg/network/capability/capability.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ type Capability struct {
func (c *Capability) DecodeBinary(br *io.BinReader) {
c.Type = Type(br.ReadB())
switch c.Type {
case ArchivalNode:
c.Data = &Archival{}
case FullNode:
c.Data = &Node{}
case TCPServer, WSServer:
Expand Down Expand Up @@ -115,6 +117,22 @@ func (s *Server) EncodeBinary(bw *io.BinWriter) {
bw.WriteU16LE(s.Port)
}

// Archival represents an archival node that stores all blocks.
type Archival struct{}

// DecodeBinary implements io.Serializable.
func (a *Archival) DecodeBinary(br *io.BinReader) {
var zero = br.ReadB() // Zero-length byte array as per Unknown.
if zero != 0 {
br.Err = errors.New("archival capability with non-zero data")
}
}

// EncodeBinary implements io.Serializable.
func (a *Archival) EncodeBinary(bw *io.BinWriter) {
bw.WriteB(0)
}

// Unknown represents an unknown capability with some data. Other nodes can
// decode it even if they can't interpret it. This is not expected to be used
// for sending data directly (proper new types should be used), but it allows
Expand Down
12 changes: 12 additions & 0 deletions pkg/network/capability/capability_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"testing"

"github.com/nspcc-dev/neo-go/internal/testserdes"
"github.com/stretchr/testify/require"
)

func TestUnknownEncodeDecode(t *testing.T) {
Expand All @@ -13,3 +14,14 @@ func TestUnknownEncodeDecode(t *testing.T) {
)
testserdes.EncodeDecodeBinary(t, &u, &ud)
}

func TestArchivalEncodeDecode(t *testing.T) {
var (
a = Archival{}
ad Archival
)
testserdes.EncodeDecodeBinary(t, &a, &ad)

var bad = []byte{0x02, 0x55, 0xaa} // Two-byte var-encoded string.
require.Error(t, testserdes.DecodeBinary(bad, &ad))
}
5 changes: 5 additions & 0 deletions pkg/network/capability/type.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@ const (
WSServer Type = 0x02
// FullNode represents a node that has complete current state.
FullNode Type = 0x10
// ArchivalNode represents a node that stores full block history.
// These nodes can be used for P2P synchronization from genesis
// (FullNode can cut the tail and may not respond to requests for
// old (wrt MaxTraceableBlocks) blocks).
ArchivalNode Type = 0x11

// 0xf0-0xff are reserved for private experiments.
ReservedFirst Type = 0xf0
Expand Down
4 changes: 4 additions & 0 deletions pkg/network/payload/version_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ func TestVersionEncodeDecode(t *testing.T) {
Port: wsPort,
},
},
{
Type: capability.ArchivalNode,
Data: &capability.Archival{},
},
{
Type: 0xff,
Data: &capability.Unknown{},
Expand Down

0 comments on commit e36b28a

Please sign in to comment.