diff --git a/app/rpc/rpchandlers/get_block_template.go b/app/rpc/rpchandlers/get_block_template.go index a6a40963d..f80bae5af 100644 --- a/app/rpc/rpchandlers/get_block_template.go +++ b/app/rpc/rpchandlers/get_block_template.go @@ -4,6 +4,7 @@ import ( "github.com/kaspanet/kaspad/app/appmessage" "github.com/kaspanet/kaspad/app/rpc/rpccontext" "github.com/kaspanet/kaspad/domain/consensus/model/externalapi" + "github.com/kaspanet/kaspad/domain/consensus/utils/transactionhelper" "github.com/kaspanet/kaspad/domain/consensus/utils/txscript" "github.com/kaspanet/kaspad/infrastructure/network/netadapter/router" "github.com/kaspanet/kaspad/util" @@ -16,7 +17,7 @@ func HandleGetBlockTemplate(context *rpccontext.Context, _ *router.Router, reque payAddress, err := util.DecodeAddress(getBlockTemplateRequest.PayAddress, context.Config.ActiveNetParams.Prefix) if err != nil { - errorMessage := &appmessage.GetBlockResponseMessage{} + errorMessage := &appmessage.GetBlockTemplateResponseMessage{} errorMessage.Error = appmessage.RPCErrorf("Could not decode address: %s", err) return errorMessage, nil } @@ -27,11 +28,17 @@ func HandleGetBlockTemplate(context *rpccontext.Context, _ *router.Router, reque } coinbaseData := &externalapi.DomainCoinbaseData{ScriptPublicKey: scriptPublicKey, ExtraData: []byte(version.Version() + "/" + getBlockTemplateRequest.ExtraData)} - templateBlock, err := context.Domain.MiningManager().GetBlockTemplate(coinbaseData) if err != nil { return nil, err } + + if uint64(len(templateBlock.Transactions[transactionhelper.CoinbaseTransactionIndex].Payload)) > context.Config.NetParams().MaxCoinbasePayloadLength { + errorMessage := &appmessage.GetBlockTemplateResponseMessage{} + errorMessage.Error = appmessage.RPCErrorf("Coinbase payload is above max length (%d). Try to shorten the extra data.", context.Config.NetParams().MaxCoinbasePayloadLength) + return errorMessage, nil + } + rpcBlock := appmessage.DomainBlockToRPCBlock(templateBlock) isSynced, err := context.ProtocolManager.ShouldMine() diff --git a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_get_block_template.go b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_get_block_template.go index 03b04ac94..457bac8ba 100644 --- a/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_get_block_template.go +++ b/infrastructure/network/netadapter/server/grpcserver/protowire/rpc_get_block_template.go @@ -38,20 +38,52 @@ func (x *KaspadMessage_GetBlockTemplateResponse) toAppMessage() (appmessage.Mess } func (x *KaspadMessage_GetBlockTemplateResponse) fromAppMessage(message *appmessage.GetBlockTemplateResponseMessage) error { - x.GetBlockTemplateResponse = &GetBlockTemplateResponseMessage{ - Block: &RpcBlock{}, - IsSynced: message.IsSynced, + var err *RPCError + if message.Error != nil { + err = &RPCError{Message: message.Error.Message} } - return x.GetBlockTemplateResponse.Block.fromAppMessage(message.Block) + + var block *RpcBlock + if message.Block != nil { + protoBlock := &RpcBlock{} + err := protoBlock.fromAppMessage(message.Block) + if err != nil { + return err + } + block = protoBlock + } + + x.GetBlockTemplateResponse = &GetBlockTemplateResponseMessage{ + Block: block, + IsSynced: message.IsSynced, + Error: err, + } + return nil } func (x *GetBlockTemplateResponseMessage) toAppMessage() (appmessage.Message, error) { if x == nil { return nil, errors.Wrapf(errorNil, "GetBlockTemplateResponseMessage is nil") } - msgBlock, err := x.Block.toAppMessage() - if err != nil { - return nil, err + var msgBlock *appmessage.RPCBlock + if x.Block != nil { + var err error + msgBlock, err = x.Block.toAppMessage() + if err != nil { + return nil, err + } } - return appmessage.NewGetBlockTemplateResponseMessage(msgBlock, x.IsSynced), nil + var rpcError *appmessage.RPCError + if x.Error != nil { + var err error + rpcError, err = x.Error.toAppMessage() + if err != nil { + return nil, err + } + } + return &appmessage.GetBlockTemplateResponseMessage{ + Block: msgBlock, + IsSynced: x.IsSynced, + Error: rpcError, + }, nil }