Skip to content

Commit fed66d8

Browse files
committed
main: fix bug in getutreexoheader handling code
We were putting in the length of leafdatas for numadds instead of the leaves that we were adding into the accumulator. We fix the bug and refactor the function for readability.
1 parent e432494 commit fed66d8

File tree

1 file changed

+39
-63
lines changed

1 file changed

+39
-63
lines changed

server.go

Lines changed: 39 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -900,91 +900,67 @@ 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)
962+
963+
return
988964
}
989965

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

0 commit comments

Comments
 (0)