Validate GetBlockTemplate extra data (#1997)

* Validate GetBlockTemplate extra data

* Check payload instead of extra data

* Fix error message
This commit is contained in:
Ori Newman 2022-04-02 21:25:58 +03:00 committed by GitHub
parent 95fa045297
commit d45af760d8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 49 additions and 10 deletions

View File

@ -4,6 +4,7 @@ import (
"github.com/kaspanet/kaspad/app/appmessage" "github.com/kaspanet/kaspad/app/appmessage"
"github.com/kaspanet/kaspad/app/rpc/rpccontext" "github.com/kaspanet/kaspad/app/rpc/rpccontext"
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi" "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/domain/consensus/utils/txscript"
"github.com/kaspanet/kaspad/infrastructure/network/netadapter/router" "github.com/kaspanet/kaspad/infrastructure/network/netadapter/router"
"github.com/kaspanet/kaspad/util" "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) payAddress, err := util.DecodeAddress(getBlockTemplateRequest.PayAddress, context.Config.ActiveNetParams.Prefix)
if err != nil { if err != nil {
errorMessage := &appmessage.GetBlockResponseMessage{} errorMessage := &appmessage.GetBlockTemplateResponseMessage{}
errorMessage.Error = appmessage.RPCErrorf("Could not decode address: %s", err) errorMessage.Error = appmessage.RPCErrorf("Could not decode address: %s", err)
return errorMessage, nil 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)} coinbaseData := &externalapi.DomainCoinbaseData{ScriptPublicKey: scriptPublicKey, ExtraData: []byte(version.Version() + "/" + getBlockTemplateRequest.ExtraData)}
templateBlock, err := context.Domain.MiningManager().GetBlockTemplate(coinbaseData) templateBlock, err := context.Domain.MiningManager().GetBlockTemplate(coinbaseData)
if err != nil { if err != nil {
return nil, err 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) rpcBlock := appmessage.DomainBlockToRPCBlock(templateBlock)
isSynced, err := context.ProtocolManager.ShouldMine() isSynced, err := context.ProtocolManager.ShouldMine()

View File

@ -38,20 +38,52 @@ func (x *KaspadMessage_GetBlockTemplateResponse) toAppMessage() (appmessage.Mess
} }
func (x *KaspadMessage_GetBlockTemplateResponse) fromAppMessage(message *appmessage.GetBlockTemplateResponseMessage) error { func (x *KaspadMessage_GetBlockTemplateResponse) fromAppMessage(message *appmessage.GetBlockTemplateResponseMessage) error {
x.GetBlockTemplateResponse = &GetBlockTemplateResponseMessage{ var err *RPCError
Block: &RpcBlock{}, if message.Error != nil {
IsSynced: message.IsSynced, 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) { func (x *GetBlockTemplateResponseMessage) toAppMessage() (appmessage.Message, error) {
if x == nil { if x == nil {
return nil, errors.Wrapf(errorNil, "GetBlockTemplateResponseMessage is nil") return nil, errors.Wrapf(errorNil, "GetBlockTemplateResponseMessage is nil")
} }
msgBlock, err := x.Block.toAppMessage() var msgBlock *appmessage.RPCBlock
if err != nil { if x.Block != nil {
return nil, err 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
} }