Skip to content

Commit 82c08ea

Browse files
authored
Merge pull request #234 from kcalvinalvin/2025-01-03-fix-bug-in-handle-get-utreexo-header
main: fix bug in getutreexoheader handling code
2 parents e432494 + 855f008 commit 82c08ea

File tree

1 file changed

+37
-63
lines changed

1 file changed

+37
-63
lines changed

server.go

Lines changed: 37 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -900,91 +900,65 @@ func (sp *serverPeer) OnGetUtreexoHeader(_ *peer.Peer, msg *wire.MsgGetUtreexoHe
900900
return
901901
}
902902

903-
if !cfg.NoUtreexo {
904-
height, err := sp.server.chain.BlockHeightByHash(&msg.BlockHash)
905-
if err != nil {
906-
chanLog.Debugf("Unable to fetch height for block hash %v: %v",
907-
msg.BlockHash, err)
908-
return
909-
}
910-
911-
// If we're pruned and the requested block is beyond the point where pruned blocks
912-
// are able to serve blocks, just ignore the message.
913-
if cfg.Prune != 0 && height >= sp.server.chain.BestSnapshot().Height-288 {
914-
return
915-
}
916-
917-
var blockBytes []byte
918-
err = sp.server.db.View(func(dbTx database.Tx) error {
919-
var err error
920-
blockBytes, err = dbTx.FetchBlock(&msg.BlockHash)
921-
return err
922-
})
923-
if err != nil {
924-
chanLog.Debugf("Unable to fetch block %v: %v",
925-
msg.BlockHash, err)
926-
return
927-
}
928-
var msgBlock wire.MsgBlock
929-
err = msgBlock.Deserialize(bytes.NewReader(blockBytes))
930-
if err != nil {
931-
chanLog.Debugf("Unable to deserialize block with hash %v: %v",
932-
msg.BlockHash, err)
933-
return
934-
}
935-
936-
targets := msgBlock.UData.AccProof.Targets
903+
height, err := sp.server.chain.BlockHeightByHash(&msg.BlockHash)
904+
if err != nil {
905+
chanLog.Debugf("Unable to fetch height for block hash %v: %v",
906+
msg.BlockHash, err)
907+
return
908+
}
937909

938-
var blockHeader wire.MsgUtreexoHeader
939-
blockHeader.BlockHash = msg.BlockHash
940-
blockHeader.NumAdds = uint16(len(msgBlock.UData.LeafDatas))
941-
blockHeader.Targets = make([]uint64, len(targets))
942-
copy(blockHeader.Targets, targets)
943-
sp.QueueMessage(&blockHeader, nil)
910+
// If we're pruned and the requested block is beyond the point where pruned blocks
911+
// are able to serve blocks, just ignore the message.
912+
if cfg.Prune != 0 && height >= sp.server.chain.BestSnapshot().Height-288 {
913+
return
914+
}
944915

916+
// Fetch adds.
917+
block, err := sp.server.chain.BlockByHash(&msg.BlockHash)
918+
if err != nil {
919+
chanLog.Debugf("Unable to fetch block for block hash %v: %v",
920+
msg.BlockHash, err)
921+
return
922+
}
923+
adds, err := blockchain.ExtractAccumulatorAdds(block, []uint32{})
924+
if err != nil {
925+
chanLog.Debugf("Unable to extract adds for block hash %v: %v",
926+
msg.BlockHash, err)
945927
return
946928
}
947929

930+
// Fetch targets.
931+
var targets []uint64
932+
if !cfg.NoUtreexo {
933+
targets = block.MsgBlock().UData.AccProof.Targets
934+
}
948935
if sp.server.utreexoProofIndex != nil {
949936
udata, err := sp.server.utreexoProofIndex.FetchUtreexoProof(&msg.BlockHash)
950937
if err != nil {
951938
chanLog.Debugf("Unable to fetch utreexo proof for block hash %v: %v",
952939
msg.BlockHash, err)
953940
return
954941
}
955-
956-
var blockHeader wire.MsgUtreexoHeader
957-
blockHeader.BlockHash = msg.BlockHash
958-
blockHeader.NumAdds = uint16(len(udata.LeafDatas))
959-
blockHeader.Targets = make([]uint64, len(udata.AccProof.Targets))
960-
copy(blockHeader.Targets, udata.AccProof.Targets)
961-
sp.QueueMessage(&blockHeader, nil)
962-
return
942+
targets = udata.AccProof.Targets
963943
}
964-
965944
if sp.server.flatUtreexoProofIndex != nil {
966-
height, err := sp.server.chain.BlockHeightByHash(&msg.BlockHash)
967-
if err != nil {
968-
chanLog.Debugf("Unable to fetch height for block hash %v: %v",
969-
msg.BlockHash, err)
970-
return
971-
}
972-
973945
udata, err := sp.server.flatUtreexoProofIndex.FetchUtreexoProof(height)
974946
if err != nil {
975947
chanLog.Debugf("Unable to fetch utreexo proof for block hash %v: %v",
976948
msg.BlockHash, err)
977949
return
978950
}
951+
targets = udata.AccProof.Targets
952+
}
979953

980-
var blockHeader wire.MsgUtreexoHeader
981-
blockHeader.BlockHash = msg.BlockHash
982-
blockHeader.NumAdds = uint16(len(udata.LeafDatas))
983-
blockHeader.Targets = make([]uint64, len(udata.AccProof.Targets))
984-
copy(blockHeader.Targets, udata.AccProof.Targets)
985-
sp.QueueMessage(&blockHeader, nil)
986-
return
954+
// Construct the utreexo header.
955+
blockHeader := wire.MsgUtreexoHeader{
956+
BlockHash: msg.BlockHash,
957+
NumAdds: uint16(len(adds)),
958+
Targets: make([]uint64, len(targets)),
987959
}
960+
copy(blockHeader.Targets, targets)
961+
sp.QueueMessage(&blockHeader, nil)
988962
}
989963

990964
// OnGetCFilters is invoked when a peer receives a getcfilters bitcoin message.

0 commit comments

Comments
 (0)