mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2024-12-28 23:27:36 +00:00
4d2ecab16f
It was broken somewhere between2f490a3403
and85ce207f40
leading to panic on watch only node: 2021-07-21T16:21:39.201+0200 INFO received Commit {"validator": 3} panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x28 pc=0xbcc59e] goroutine 486 [running]: github.com/nspcc-dev/neo-go/pkg/consensus.(*service).newBlockFromContext(0xc0001629a0, 0xc000308000, 0xc0010fa000, 0x2cb417800) github.com/nspcc-dev/neo-go/pkg/consensus/consensus.go:664 +0xbe github.com/nspcc-dev/dbft.(*Context).MakeHeader(...) github.com/nspcc-dev/dbft@v0.0.0-20210302103605-cc75991b7cfb/context.go:270 github.com/nspcc-dev/dbft.(*DBFT).onCommit(0xc000308000, 0x138c998, 0xc000115110) github.com/nspcc-dev/dbft@v0.0.0-20210302103605-cc75991b7cfb/dbft.go:487 +0x575 github.com/nspcc-dev/dbft.(*DBFT).OnReceive(0xc000308000, 0x138c998, 0xc000115110) github.com/nspcc-dev/dbft@v0.0.0-20210302103605-cc75991b7cfb/dbft.go:251 +0xef5 github.com/nspcc-dev/neo-go/pkg/consensus.(*service).eventLoop(0xc0001629a0) github.com/nspcc-dev/neo-go/pkg/consensus/consensus.go:312 +0x7d6 created by github.com/nspcc-dev/neo-go/pkg/consensus.(*service).Start github.com/nspcc-dev/neo-go/pkg/consensus/consensus.go:262 +0xdc In fact, nonce is correctly provided by dbft library (since Legacy), we just need to use it here.
82 lines
2.4 KiB
Go
82 lines
2.4 KiB
Go
package consensus
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"github.com/nspcc-dev/dbft/block"
|
|
"github.com/nspcc-dev/dbft/crypto"
|
|
"github.com/nspcc-dev/neo-go/pkg/config/netmode"
|
|
coreb "github.com/nspcc-dev/neo-go/pkg/core/block"
|
|
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
|
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
|
)
|
|
|
|
// neoBlock is a wrapper of core.Block which implements
|
|
// methods necessary for dBFT library.
|
|
type neoBlock struct {
|
|
coreb.Block
|
|
|
|
network netmode.Magic
|
|
signature []byte
|
|
}
|
|
|
|
var _ block.Block = (*neoBlock)(nil)
|
|
|
|
// Sign implements block.Block interface.
|
|
func (n *neoBlock) Sign(key crypto.PrivateKey) error {
|
|
k := key.(*privateKey)
|
|
sig := k.PrivateKey.SignHashable(uint32(n.network), &n.Block)
|
|
n.signature = sig
|
|
return nil
|
|
}
|
|
|
|
// Verify implements block.Block interface.
|
|
func (n *neoBlock) Verify(key crypto.PublicKey, sign []byte) error {
|
|
k := key.(*publicKey)
|
|
if k.PublicKey.VerifyHashable(sign, uint32(n.network), &n.Block) {
|
|
return nil
|
|
}
|
|
return errors.New("verification failed")
|
|
}
|
|
|
|
// Transactions implements block.Block interface.
|
|
func (n *neoBlock) Transactions() []block.Transaction {
|
|
txes := make([]block.Transaction, len(n.Block.Transactions))
|
|
for i, tx := range n.Block.Transactions {
|
|
txes[i] = tx
|
|
}
|
|
|
|
return txes
|
|
}
|
|
|
|
// SetTransactions implements block.Block interface.
|
|
func (n *neoBlock) SetTransactions(txes []block.Transaction) {
|
|
n.Block.Transactions = make([]*transaction.Transaction, len(txes))
|
|
for i, tx := range txes {
|
|
n.Block.Transactions[i] = tx.(*transaction.Transaction)
|
|
}
|
|
}
|
|
|
|
// Version implements block.Block interface.
|
|
func (n *neoBlock) Version() uint32 { return n.Block.Version }
|
|
|
|
// PrevHash implements block.Block interface.
|
|
func (n *neoBlock) PrevHash() util.Uint256 { return n.Block.PrevHash }
|
|
|
|
// MerkleRoot implements block.Block interface.
|
|
func (n *neoBlock) MerkleRoot() util.Uint256 { return n.Block.MerkleRoot }
|
|
|
|
// Timestamp implements block.Block interface.
|
|
func (n *neoBlock) Timestamp() uint64 { return n.Block.Timestamp * nsInMs }
|
|
|
|
// Index implements block.Block interface.
|
|
func (n *neoBlock) Index() uint32 { return n.Block.Index }
|
|
|
|
// ConsensusData implements block.Block interface.
|
|
func (n *neoBlock) ConsensusData() uint64 { return n.Block.Nonce }
|
|
|
|
// NextConsensus implements block.Block interface.
|
|
func (n *neoBlock) NextConsensus() util.Uint160 { return n.Block.NextConsensus }
|
|
|
|
// Signature implements block.Block interface.
|
|
func (n *neoBlock) Signature() []byte { return n.signature }
|