Implement a simple mechanism to stop a miner from mining while kaspad is not synced (#1284)

* Reintroduce isSynced into the GetBlockTemplate response.

* Add a warning for when kaspad is not synced.

* Rephrase a log.
This commit is contained in:
stasatdaglabs 2020-12-24 17:15:44 +02:00 committed by GitHub
parent bd97075e07
commit 9d0f513e49
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 572 additions and 545 deletions

View File

@ -24,6 +24,7 @@ func NewGetBlockTemplateRequestMessage(payAddress string) *GetBlockTemplateReque
type GetBlockTemplateResponseMessage struct { type GetBlockTemplateResponseMessage struct {
baseMessage baseMessage
MsgBlock *MsgBlock MsgBlock *MsgBlock
IsSynced bool
Error *RPCError Error *RPCError
} }
@ -34,6 +35,9 @@ func (msg *GetBlockTemplateResponseMessage) Command() MessageCommand {
} }
// NewGetBlockTemplateResponseMessage returns a instance of the message // NewGetBlockTemplateResponseMessage returns a instance of the message
func NewGetBlockTemplateResponseMessage(msgBlock *MsgBlock) *GetBlockTemplateResponseMessage { func NewGetBlockTemplateResponseMessage(msgBlock *MsgBlock, isSynced bool) *GetBlockTemplateResponseMessage {
return &GetBlockTemplateResponseMessage{MsgBlock: msgBlock} return &GetBlockTemplateResponseMessage{
MsgBlock: msgBlock,
IsSynced: isSynced,
}
} }

View File

@ -67,3 +67,8 @@ func (m *Manager) SetOnBlockAddedToDAGHandler(onBlockAddedToDAGHandler flowconte
func (m *Manager) SetOnTransactionAddedToMempoolHandler(onTransactionAddedToMempoolHandler flowcontext.OnTransactionAddedToMempoolHandler) { func (m *Manager) SetOnTransactionAddedToMempoolHandler(onTransactionAddedToMempoolHandler flowcontext.OnTransactionAddedToMempoolHandler) {
m.context.SetOnTransactionAddedToMempoolHandler(onTransactionAddedToMempoolHandler) m.context.SetOnTransactionAddedToMempoolHandler(onTransactionAddedToMempoolHandler)
} }
// IsIBDRunning returns true if IBD is currently running
func (m *Manager) IsIBDRunning() bool {
return m.context.IsIBDRunning()
}

View File

@ -33,5 +33,7 @@ func HandleGetBlockTemplate(context *rpccontext.Context, _ *router.Router, reque
} }
msgBlock := appmessage.DomainBlockToMsgBlock(templateBlock) msgBlock := appmessage.DomainBlockToMsgBlock(templateBlock)
return appmessage.NewGetBlockTemplateResponseMessage(msgBlock), nil isSynced := !context.ProtocolManager.IsIBDRunning()
return appmessage.NewGetBlockTemplateResponseMessage(msgBlock, isSynced), nil
} }

View File

@ -158,6 +158,10 @@ func solveLoop(newTemplateChan chan *appmessage.GetBlockTemplateResponseMessage,
if stopOldTemplateSolving != nil { if stopOldTemplateSolving != nil {
close(stopOldTemplateSolving) close(stopOldTemplateSolving)
} }
if !template.IsSynced && !mineWhenNotSynced {
log.Warnf("Kaspad is not synced. Skipping current block template")
continue
}
stopOldTemplateSolving = make(chan struct{}) stopOldTemplateSolving = make(chan struct{})
block := appmessage.MsgBlockToDomainBlock(template.MsgBlock) block := appmessage.MsgBlockToDomainBlock(template.MsgBlock)

View File

@ -344,6 +344,7 @@ message GetBlockTemplateRequestMessage{
message GetBlockTemplateResponseMessage{ message GetBlockTemplateResponseMessage{
BlockMessage blockMessage = 1; BlockMessage blockMessage = 1;
bool isSynced = 2;
RPCError error = 1000; RPCError error = 1000;
} }

View File

@ -22,12 +22,13 @@ func (x *KaspadMessage_GetBlockTemplateResponse) toAppMessage() (appmessage.Mess
if err != nil { if err != nil {
return nil, err return nil, err
} }
return appmessage.NewGetBlockTemplateResponseMessage(msgBlock), nil return appmessage.NewGetBlockTemplateResponseMessage(msgBlock, x.GetBlockTemplateResponse.IsSynced), nil
} }
func (x *KaspadMessage_GetBlockTemplateResponse) fromAppMessage(message *appmessage.GetBlockTemplateResponseMessage) error { func (x *KaspadMessage_GetBlockTemplateResponse) fromAppMessage(message *appmessage.GetBlockTemplateResponseMessage) error {
x.GetBlockTemplateResponse = &GetBlockTemplateResponseMessage{ x.GetBlockTemplateResponse = &GetBlockTemplateResponseMessage{
BlockMessage: &BlockMessage{}, BlockMessage: &BlockMessage{},
IsSynced: message.IsSynced,
} }
return x.GetBlockTemplateResponse.BlockMessage.fromAppMessage(message.MsgBlock) return x.GetBlockTemplateResponse.BlockMessage.fromAppMessage(message.MsgBlock)
} }