forked from TrueCloudLab/neoneo-go
payload: drop Network from Extensible
It's only used to sign/verify it and is not a part of the structure. It's still neded in consensus.Payload though because that's the way dbft library is.
This commit is contained in:
parent
95c279325a
commit
f91ff78918
10 changed files with 18 additions and 76 deletions
|
@ -201,12 +201,12 @@ var (
|
||||||
func NewPayload(m netmode.Magic, stateRootEnabled bool) *Payload {
|
func NewPayload(m netmode.Magic, stateRootEnabled bool) *Payload {
|
||||||
return &Payload{
|
return &Payload{
|
||||||
Extensible: npayload.Extensible{
|
Extensible: npayload.Extensible{
|
||||||
Network: m,
|
|
||||||
Category: Category,
|
Category: Category,
|
||||||
},
|
},
|
||||||
message: message{
|
message: message{
|
||||||
stateRootEnabled: stateRootEnabled,
|
stateRootEnabled: stateRootEnabled,
|
||||||
},
|
},
|
||||||
|
network: m,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/nspcc-dev/dbft/payload"
|
"github.com/nspcc-dev/dbft/payload"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
npayload "github.com/nspcc-dev/neo-go/pkg/network/payload"
|
npayload "github.com/nspcc-dev/neo-go/pkg/network/payload"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
|
@ -28,6 +29,7 @@ type (
|
||||||
Payload struct {
|
Payload struct {
|
||||||
npayload.Extensible
|
npayload.Extensible
|
||||||
message
|
message
|
||||||
|
network netmode.Magic
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -128,7 +130,7 @@ func (p *Payload) EncodeBinary(w *io.BinWriter) {
|
||||||
// It also sets corresponding verification and invocation scripts.
|
// It also sets corresponding verification and invocation scripts.
|
||||||
func (p *Payload) Sign(key *privateKey) error {
|
func (p *Payload) Sign(key *privateKey) error {
|
||||||
p.encodeData()
|
p.encodeData()
|
||||||
sig := key.SignHash(p.GetSignedHash())
|
sig := key.PrivateKey.SignHashable(uint32(p.network), &p.Extensible)
|
||||||
|
|
||||||
buf := io.NewBufBinWriter()
|
buf := io.NewBufBinWriter()
|
||||||
emit.Bytes(buf.BinWriter, sig)
|
emit.Bytes(buf.BinWriter, sig)
|
||||||
|
@ -138,22 +140,6 @@ func (p *Payload) Sign(key *privateKey) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetSignedPart implements crypto.Verifiable interface.
|
|
||||||
func (p *Payload) GetSignedPart() []byte {
|
|
||||||
if p.Extensible.Data == nil {
|
|
||||||
p.encodeData()
|
|
||||||
}
|
|
||||||
return p.Extensible.GetSignedPart()
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetSignedHash returns a hash of the payload used to verify it.
|
|
||||||
func (p *Payload) GetSignedHash() util.Uint256 {
|
|
||||||
if p.Extensible.Data == nil {
|
|
||||||
p.encodeData()
|
|
||||||
}
|
|
||||||
return p.Extensible.GetSignedHash()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hash implements payload.ConsensusPayload interface.
|
// Hash implements payload.ConsensusPayload interface.
|
||||||
func (p *Payload) Hash() util.Uint256 {
|
func (p *Payload) Hash() util.Uint256 {
|
||||||
if p.Extensible.Data == nil {
|
if p.Extensible.Data == nil {
|
||||||
|
|
|
@ -79,7 +79,7 @@ func TestConsensusPayload_Setters(t *testing.T) {
|
||||||
func TestConsensusPayload_Serializable(t *testing.T) {
|
func TestConsensusPayload_Serializable(t *testing.T) {
|
||||||
for _, mt := range messageTypes {
|
for _, mt := range messageTypes {
|
||||||
p := randomPayload(t, mt)
|
p := randomPayload(t, mt)
|
||||||
actual := &Payload{Extensible: npayload.Extensible{Network: netmode.UnitTestNet}}
|
actual := &Payload{Extensible: npayload.Extensible{}, network: netmode.UnitTestNet}
|
||||||
data, err := testserdes.EncodeBinary(p)
|
data, err := testserdes.EncodeBinary(p)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NoError(t, testserdes.DecodeBinary(data, &actual.Extensible))
|
require.NoError(t, testserdes.DecodeBinary(data, &actual.Extensible))
|
||||||
|
@ -158,12 +158,12 @@ func randomPayload(t *testing.T, mt messageType) *Payload {
|
||||||
payload: randomMessage(t, mt),
|
payload: randomMessage(t, mt),
|
||||||
},
|
},
|
||||||
Extensible: npayload.Extensible{
|
Extensible: npayload.Extensible{
|
||||||
Network: netmode.UnitTestNet,
|
|
||||||
Witness: transaction.Witness{
|
Witness: transaction.Witness{
|
||||||
InvocationScript: random.Bytes(3),
|
InvocationScript: random.Bytes(3),
|
||||||
VerificationScript: []byte{byte(opcode.PUSH0)},
|
VerificationScript: []byte{byte(opcode.PUSH0)},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
network: netmode.UnitTestNet,
|
||||||
}
|
}
|
||||||
|
|
||||||
if mt == changeViewType {
|
if mt == changeViewType {
|
||||||
|
|
|
@ -298,7 +298,6 @@ func fromPayload(t messageType, recovery *Payload, p io.Serializable) *Payload {
|
||||||
return &Payload{
|
return &Payload{
|
||||||
Extensible: npayload.Extensible{
|
Extensible: npayload.Extensible{
|
||||||
Category: Category,
|
Category: Category,
|
||||||
Network: recovery.Network,
|
|
||||||
ValidBlockEnd: recovery.BlockIndex,
|
ValidBlockEnd: recovery.BlockIndex,
|
||||||
},
|
},
|
||||||
message: message{
|
message: message{
|
||||||
|
@ -308,5 +307,6 @@ func fromPayload(t messageType, recovery *Payload, p io.Serializable) *Payload {
|
||||||
payload: p,
|
payload: p,
|
||||||
stateRootEnabled: recovery.stateRootEnabled,
|
stateRootEnabled: recovery.stateRootEnabled,
|
||||||
},
|
},
|
||||||
|
network: recovery.network,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -147,7 +147,7 @@ func (m *Message) decodePayload() error {
|
||||||
case CMDBlock:
|
case CMDBlock:
|
||||||
p = block.New(m.StateRootInHeader)
|
p = block.New(m.StateRootInHeader)
|
||||||
case CMDExtensible:
|
case CMDExtensible:
|
||||||
p = payload.NewExtensible(m.Network)
|
p = payload.NewExtensible()
|
||||||
case CMDP2PNotaryRequest:
|
case CMDP2PNotaryRequest:
|
||||||
p = &payload.P2PNotaryRequest{Network: m.Network}
|
p = &payload.P2PNotaryRequest{Network: m.Network}
|
||||||
case CMDGetBlocks:
|
case CMDGetBlocks:
|
||||||
|
|
|
@ -4,7 +4,6 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"math"
|
"math"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
|
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/crypto/hash"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/hash"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
|
@ -18,8 +17,6 @@ const (
|
||||||
|
|
||||||
// Extensible represents payload containing arbitrary data.
|
// Extensible represents payload containing arbitrary data.
|
||||||
type Extensible struct {
|
type Extensible struct {
|
||||||
// Network represents network magic.
|
|
||||||
Network netmode.Magic
|
|
||||||
// Category is payload type.
|
// Category is payload type.
|
||||||
Category string
|
Category string
|
||||||
// ValidBlockStart is starting height for payload to be valid.
|
// ValidBlockStart is starting height for payload to be valid.
|
||||||
|
@ -34,15 +31,13 @@ type Extensible struct {
|
||||||
Witness transaction.Witness
|
Witness transaction.Witness
|
||||||
|
|
||||||
hash util.Uint256
|
hash util.Uint256
|
||||||
signedHash util.Uint256
|
|
||||||
signedpart []byte
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var errInvalidPadding = errors.New("invalid padding")
|
var errInvalidPadding = errors.New("invalid padding")
|
||||||
|
|
||||||
// NewExtensible creates new extensible payload.
|
// NewExtensible creates new extensible payload.
|
||||||
func NewExtensible(network netmode.Magic) *Extensible {
|
func NewExtensible() *Extensible {
|
||||||
return &Extensible{Network: network}
|
return &Extensible{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Extensible) encodeBinaryUnsigned(w *io.BinWriter) {
|
func (e *Extensible) encodeBinaryUnsigned(w *io.BinWriter) {
|
||||||
|
@ -81,22 +76,6 @@ func (e *Extensible) DecodeBinary(r *io.BinReader) {
|
||||||
e.Witness.DecodeBinary(r)
|
e.Witness.DecodeBinary(r)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetSignedPart implements crypto.Verifiable.
|
|
||||||
func (e *Extensible) GetSignedPart() []byte {
|
|
||||||
if e.signedpart == nil {
|
|
||||||
e.createHash()
|
|
||||||
}
|
|
||||||
return e.signedpart
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetSignedHash implements crypto.Verifiable.
|
|
||||||
func (e *Extensible) GetSignedHash() util.Uint256 {
|
|
||||||
if e.signedHash.Equals(util.Uint256{}) {
|
|
||||||
e.createHash()
|
|
||||||
}
|
|
||||||
return e.signedHash
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hash returns payload hash.
|
// Hash returns payload hash.
|
||||||
func (e *Extensible) Hash() util.Uint256 {
|
func (e *Extensible) Hash() util.Uint256 {
|
||||||
if e.hash.Equals(util.Uint256{}) {
|
if e.hash.Equals(util.Uint256{}) {
|
||||||
|
@ -110,14 +89,4 @@ func (e *Extensible) createHash() {
|
||||||
buf := io.NewBufBinWriter()
|
buf := io.NewBufBinWriter()
|
||||||
e.encodeBinaryUnsigned(buf.BinWriter)
|
e.encodeBinaryUnsigned(buf.BinWriter)
|
||||||
e.hash = hash.Sha256(buf.Bytes())
|
e.hash = hash.Sha256(buf.Bytes())
|
||||||
e.updateSignedPart()
|
|
||||||
e.signedHash = hash.Sha256(e.signedpart)
|
|
||||||
}
|
|
||||||
|
|
||||||
// updateSignedPart updates serialized message if needed.
|
|
||||||
func (e *Extensible) updateSignedPart() {
|
|
||||||
buf := io.NewBufBinWriter()
|
|
||||||
buf.WriteU32LE(uint32(e.Network))
|
|
||||||
buf.WriteBytes(e.hash[:])
|
|
||||||
e.signedpart = buf.Bytes()
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,6 @@ import (
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/internal/random"
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||||||
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
"github.com/nspcc-dev/neo-go/internal/testserdes"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
|
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
@ -54,23 +53,13 @@ func TestExtensible_Serializable(t *testing.T) {
|
||||||
|
|
||||||
func TestExtensible_Hashes(t *testing.T) {
|
func TestExtensible_Hashes(t *testing.T) {
|
||||||
getExtensiblePair := func() (*Extensible, *Extensible) {
|
getExtensiblePair := func() (*Extensible, *Extensible) {
|
||||||
p1 := NewExtensible(netmode.UnitTestNet)
|
p1 := NewExtensible()
|
||||||
p1.Data = []byte{1, 2, 3}
|
p1.Data = []byte{1, 2, 3}
|
||||||
p2 := NewExtensible(netmode.UnitTestNet)
|
p2 := NewExtensible()
|
||||||
p2.Data = []byte{3, 2, 1}
|
p2.Data = []byte{3, 2, 1}
|
||||||
return p1, p2
|
return p1, p2
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Run("GetSignedPart", func(t *testing.T) {
|
|
||||||
p1, p2 := getExtensiblePair()
|
|
||||||
require.NotEqual(t, p1.GetSignedPart(), p2.GetSignedPart())
|
|
||||||
require.NotEqual(t, p1.GetSignedPart(), p2.GetSignedPart())
|
|
||||||
})
|
|
||||||
t.Run("GetSignedHash", func(t *testing.T) {
|
|
||||||
p1, p2 := getExtensiblePair()
|
|
||||||
require.NotEqual(t, p1.GetSignedHash(), p2.GetSignedHash())
|
|
||||||
require.NotEqual(t, p1.GetSignedHash(), p2.GetSignedHash())
|
|
||||||
})
|
|
||||||
t.Run("Hash", func(t *testing.T) {
|
t.Run("Hash", func(t *testing.T) {
|
||||||
p1, p2 := getExtensiblePair()
|
p1, p2 := getExtensiblePair()
|
||||||
require.NotEqual(t, p1.Hash(), p2.Hash())
|
require.NotEqual(t, p1.Hash(), p2.Hash())
|
||||||
|
|
|
@ -407,7 +407,7 @@ func TestConsensus(t *testing.T) {
|
||||||
p.handshaked = true
|
p.handshaked = true
|
||||||
|
|
||||||
newConsensusMessage := func(start, end uint32) *Message {
|
newConsensusMessage := func(start, end uint32) *Message {
|
||||||
pl := payload.NewExtensible(netmode.UnitTestNet)
|
pl := payload.NewExtensible()
|
||||||
pl.Category = consensus.Category
|
pl.Category = consensus.Category
|
||||||
pl.ValidBlockStart = start
|
pl.ValidBlockStart = start
|
||||||
pl.ValidBlockEnd = end
|
pl.ValidBlockEnd = end
|
||||||
|
@ -438,7 +438,7 @@ func TestConsensus(t *testing.T) {
|
||||||
require.Error(t, s.handleMessage(p, msg))
|
require.Error(t, s.handleMessage(p, msg))
|
||||||
})
|
})
|
||||||
t.Run("invalid category", func(t *testing.T) {
|
t.Run("invalid category", func(t *testing.T) {
|
||||||
pl := payload.NewExtensible(netmode.UnitTestNet)
|
pl := payload.NewExtensible()
|
||||||
pl.Category = "invalid"
|
pl.Category = "invalid"
|
||||||
pl.ValidBlockEnd = s.chain.BlockHeight() + 1
|
pl.ValidBlockEnd = s.chain.BlockHeight() + 1
|
||||||
msg := NewMessage(CMDExtensible, pl)
|
msg := NewMessage(CMDExtensible, pl)
|
||||||
|
@ -706,7 +706,7 @@ func TestInv(t *testing.T) {
|
||||||
require.Equal(t, []util.Uint256{hs[0], hs[2]}, actual)
|
require.Equal(t, []util.Uint256{hs[0], hs[2]}, actual)
|
||||||
})
|
})
|
||||||
t.Run("extensible", func(t *testing.T) {
|
t.Run("extensible", func(t *testing.T) {
|
||||||
ep := payload.NewExtensible(netmode.UnitTestNet)
|
ep := payload.NewExtensible()
|
||||||
s.chain.(*fakechain.FakeChain).VerifyWitnessF = func() error { return nil }
|
s.chain.(*fakechain.FakeChain).VerifyWitnessF = func() error { return nil }
|
||||||
ep.ValidBlockEnd = s.chain.(*fakechain.FakeChain).BlockHeight() + 1
|
ep.ValidBlockEnd = s.chain.(*fakechain.FakeChain).BlockHeight() + 1
|
||||||
ok, err := s.extensiblePool.Add(ep)
|
ok, err := s.extensiblePool.Add(ep)
|
||||||
|
|
|
@ -81,7 +81,6 @@ func (s *service) sendValidatedRoot(r *state.MPTRoot, priv *keys.PrivateKey) {
|
||||||
m := NewMessage(s.Network, RootT, r)
|
m := NewMessage(s.Network, RootT, r)
|
||||||
m.EncodeBinary(w.BinWriter)
|
m.EncodeBinary(w.BinWriter)
|
||||||
ep := &payload.Extensible{
|
ep := &payload.Extensible{
|
||||||
Network: s.Network,
|
|
||||||
ValidBlockStart: r.Index,
|
ValidBlockStart: r.Index,
|
||||||
ValidBlockEnd: r.Index + transaction.MaxValidUntilBlockIncrement,
|
ValidBlockEnd: r.Index + transaction.MaxValidUntilBlockIncrement,
|
||||||
Sender: priv.GetScriptHash(),
|
Sender: priv.GetScriptHash(),
|
||||||
|
@ -90,7 +89,7 @@ func (s *service) sendValidatedRoot(r *state.MPTRoot, priv *keys.PrivateKey) {
|
||||||
VerificationScript: s.getAccount().GetVerificationScript(),
|
VerificationScript: s.getAccount().GetVerificationScript(),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
sig := priv.SignHash(ep.GetSignedHash())
|
sig := priv.SignHashable(uint32(s.Network), ep)
|
||||||
buf := io.NewBufBinWriter()
|
buf := io.NewBufBinWriter()
|
||||||
emit.Bytes(buf.BinWriter, sig)
|
emit.Bytes(buf.BinWriter, sig)
|
||||||
ep.Witness.InvocationScript = buf.Bytes()
|
ep.Witness.InvocationScript = buf.Bytes()
|
||||||
|
|
|
@ -68,7 +68,6 @@ func (s *service) signAndSend(r *state.MPTRoot) error {
|
||||||
return w.Err
|
return w.Err
|
||||||
}
|
}
|
||||||
e := &payload.Extensible{
|
e := &payload.Extensible{
|
||||||
Network: s.Network,
|
|
||||||
ValidBlockStart: r.Index,
|
ValidBlockStart: r.Index,
|
||||||
ValidBlockEnd: r.Index + transaction.MaxValidUntilBlockIncrement,
|
ValidBlockEnd: r.Index + transaction.MaxValidUntilBlockIncrement,
|
||||||
Sender: s.getAccount().PrivateKey().GetScriptHash(),
|
Sender: s.getAccount().PrivateKey().GetScriptHash(),
|
||||||
|
@ -77,7 +76,7 @@ func (s *service) signAndSend(r *state.MPTRoot) error {
|
||||||
VerificationScript: s.getAccount().GetVerificationScript(),
|
VerificationScript: s.getAccount().GetVerificationScript(),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
sig = acc.PrivateKey().SignHash(e.GetSignedHash())
|
sig = acc.PrivateKey().SignHashable(uint32(s.Network), e)
|
||||||
buf := io.NewBufBinWriter()
|
buf := io.NewBufBinWriter()
|
||||||
emit.Bytes(buf.BinWriter, sig)
|
emit.Bytes(buf.BinWriter, sig)
|
||||||
e.Witness.InvocationScript = buf.Bytes()
|
e.Witness.InvocationScript = buf.Bytes()
|
||||||
|
|
Loading…
Reference in a new issue