diff --git a/pkg/consensus/consensus.go b/pkg/consensus/consensus.go index ee2cababd..db6555ad1 100644 --- a/pkg/consensus/consensus.go +++ b/pkg/consensus/consensus.go @@ -1,6 +1,8 @@ package consensus import ( + "crypto/rand" + "encoding/binary" "errors" "fmt" "sort" @@ -239,9 +241,19 @@ func (s *service) newPrepareRequest() payload.PrepareRequest { panic(err) } } + r.nonce = s.getNonce() return r } +func (s *service) getNonce() uint64 { + b := make([]byte, 8) + _, err := rand.Read(b) + if err != nil { + panic(err) + } + return binary.LittleEndian.Uint64(b) +} + func (s *service) Start() { if s.started.CAS(false, true) { s.log.Info("starting consensus service") @@ -649,6 +661,7 @@ func (s *service) newBlockFromContext(ctx *dbft.Context) block.Block { block := &neoBlock{network: s.ProtocolConfiguration.Magic} block.Block.Timestamp = ctx.Timestamp / nsInMs + block.Block.Nonce = ctx.PreparationPayloads[ctx.PrimaryIndex].GetPrepareRequest().Nonce() block.Block.Index = ctx.BlockIndex if s.ProtocolConfiguration.StateRootInHeader { sr, err := s.Chain.GetStateModule().GetStateRoot(ctx.BlockIndex - 1) diff --git a/pkg/consensus/prepare_request.go b/pkg/consensus/prepare_request.go index 3ce5d2f77..4cbc61f04 100644 --- a/pkg/consensus/prepare_request.go +++ b/pkg/consensus/prepare_request.go @@ -12,6 +12,7 @@ type prepareRequest struct { version uint32 prevHash util.Uint256 timestamp uint64 + nonce uint64 transactionHashes []util.Uint256 stateRootEnabled bool stateRoot util.Uint256 @@ -24,6 +25,7 @@ func (p *prepareRequest) EncodeBinary(w *io.BinWriter) { w.WriteU32LE(p.version) w.WriteBytes(p.prevHash[:]) w.WriteU64LE(p.timestamp) + w.WriteU64LE(p.nonce) w.WriteArray(p.transactionHashes) if p.stateRootEnabled { w.WriteBytes(p.stateRoot[:]) @@ -35,6 +37,7 @@ func (p *prepareRequest) DecodeBinary(r *io.BinReader) { p.version = r.ReadU32LE() r.ReadBytes(p.prevHash[:]) p.timestamp = r.ReadU64LE() + p.nonce = r.ReadU64LE() r.ReadArray(&p.transactionHashes, block.MaxTransactionsPerBlock) if p.stateRootEnabled { r.ReadBytes(p.stateRoot[:]) @@ -68,10 +71,10 @@ func (p *prepareRequest) Timestamp() uint64 { return p.timestamp * nsInMs } func (p *prepareRequest) SetTimestamp(ts uint64) { p.timestamp = ts / nsInMs } // Nonce implements payload.PrepareRequest interface. -func (p *prepareRequest) Nonce() uint64 { return 0 } +func (p *prepareRequest) Nonce() uint64 { return p.nonce } // SetNonce implements payload.PrepareRequest interface. -func (p *prepareRequest) SetNonce(nonce uint64) {} +func (p *prepareRequest) SetNonce(nonce uint64) { p.nonce = nonce } // TransactionHashes implements payload.PrepareRequest interface. func (p *prepareRequest) TransactionHashes() []util.Uint256 { return p.transactionHashes }