Skip to content

Commit

Permalink
Validate pruning point blue work.
Browse files Browse the repository at this point in the history
  • Loading branch information
stasatdaglabs committed Sep 5, 2021
1 parent 9391574 commit c6a90c5
Showing 1 changed file with 23 additions and 10 deletions.
33 changes: 23 additions & 10 deletions app/protocol/flows/blockrelay/ibd_with_headers_proof.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
"github.com/kaspanet/kaspad/domain/consensus/ruleerrors"
"github.com/pkg/errors"
"math/big"
)

func (flow *handleRelayInvsFlow) ibdWithHeadersProof(highHash *externalapi.DomainHash) error {
Expand Down Expand Up @@ -88,51 +89,63 @@ func (flow *handleRelayInvsFlow) checkIfHighHashHasMoreBlueWorkThanSelectedTip(h
return msgBlockBlueWork.BlueWork.Cmp(headersSelectedTipInfo.BlueWork) > 0, nil
}

func (flow *handleRelayInvsFlow) syncAndValidatePruningPointProof() error {
func (flow *handleRelayInvsFlow) syncAndValidatePruningPointProof() (*big.Int, error) {
log.Infof("Downloading the pruning point proof from %s", flow.peer)
err := flow.outgoingRoute.Enqueue(appmessage.NewMsgRequestPruningPointProof())
if err != nil {
return err
return nil, err
}
message, err := flow.dequeueIncomingMessageAndSkipInvs(common.DefaultTimeout)
if err != nil {
return err
return nil, err
}
pruningPointProofMessage, ok := message.(*appmessage.MsgPruningPointProof)
if !ok {
return protocolerrors.Errorf(true, "received unexpected message type. "+
return nil, protocolerrors.Errorf(true, "received unexpected message type. "+
"expected: %s, got: %s", appmessage.CmdPruningPointProof, message.Command())
}
pruningPointProof := appmessage.MsgPruningPointProofToDomainPruningPointProof(pruningPointProofMessage)
return flow.Domain().Consensus().ValidatePruningPointProof(pruningPointProof)
err = flow.Domain().Consensus().ValidatePruningPointProof(pruningPointProof)
if err != nil {
return nil, err
}
return pruningPointProof.PruningPointBlueWork, nil
}

func (flow *handleRelayInvsFlow) downloadHeadersAndPruningUTXOSet(highHash *externalapi.DomainHash) error {
err := flow.syncAndValidatePruningPointProof()
pruningPointBlueWork, err := flow.syncAndValidatePruningPointProof()
if err != nil {
return err
}

pruningPoint, err := flow.syncPruningPointsAndPruningPointAnticone()
pruningPointHash, err := flow.syncPruningPointsAndPruningPointAnticone()
if err != nil {
return err
}
pruningPointHeader, err := flow.Domain().Consensus().GetBlockHeader(pruningPointHash)
if err != nil {
return err
}
if pruningPointHeader.BlueWork().Cmp(pruningPointBlueWork) != 0 {
return protocolerrors.Errorf(true, "pruning point blue work in pruning point proof does "+
"not match the blue work declared in the pruning point header")
}

// TODO: Remove this condition once there's more proper way to check finality violation
// in the headers proof.
if pruningPoint.Equal(flow.Config().NetParams().GenesisHash) {
if pruningPointHash.Equal(flow.Config().NetParams().GenesisHash) {
return protocolerrors.Errorf(true, "the genesis pruning point violates finality")
}

err = flow.syncPruningPointFutureHeaders(flow.Domain().StagingConsensus(), pruningPoint, highHash)
err = flow.syncPruningPointFutureHeaders(flow.Domain().StagingConsensus(), pruningPointHash, highHash)
if err != nil {
return err
}

log.Debugf("Blocks downloaded from peer %s", flow.peer)

log.Debugf("Syncing the current pruning point UTXO set")
syncedPruningPointUTXOSetSuccessfully, err := flow.syncPruningPointUTXOSet(flow.Domain().StagingConsensus(), pruningPoint)
syncedPruningPointUTXOSetSuccessfully, err := flow.syncPruningPointUTXOSet(flow.Domain().StagingConsensus(), pruningPointHash)
if err != nil {
return err
}
Expand Down

0 comments on commit c6a90c5

Please sign in to comment.