wire/msgcfheaders: optimize encode/decode by using one small buffer

This commit is contained in:
Conner Fromknecht 2020-01-24 19:43:16 -08:00 committed by Olaoluwa Osuntokun
parent d042fe0586
commit 1c525dbd0e
No known key found for this signature in database
GPG key ID: 3BBD59E99B280306

View file

@ -48,29 +48,34 @@ func (msg *MsgCFHeaders) AddCFHash(hash *chainhash.Hash) error {
// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.
// This is part of the Message interface implementation.
func (msg *MsgCFHeaders) BtcDecode(r io.Reader, pver uint32, _ MessageEncoding) error {
buf := binarySerializer.Borrow()
// Read filter type
err := readElement(r, &msg.FilterType)
if err != nil {
if _, err := io.ReadFull(r, buf[:1]); err != nil {
binarySerializer.Return(buf)
return err
}
msg.FilterType = FilterType(buf[0])
// Read stop hash
err = readElement(r, &msg.StopHash)
if err != nil {
if _, err := io.ReadFull(r, msg.StopHash[:]); err != nil {
binarySerializer.Return(buf)
return err
}
// Read prev filter header
err = readElement(r, &msg.PrevFilterHeader)
if err != nil {
if _, err := io.ReadFull(r, msg.PrevFilterHeader[:]); err != nil {
binarySerializer.Return(buf)
return err
}
// Read number of filter headers
count, err := ReadVarInt(r, pver)
count, err := ReadVarIntBuf(r, pver, buf)
if err != nil {
binarySerializer.Return(buf)
return err
}
binarySerializer.Return(buf)
// Limit to max committed filter headers per message.
if count > MaxCFHeadersPerMsg {
@ -85,7 +90,7 @@ func (msg *MsgCFHeaders) BtcDecode(r io.Reader, pver uint32, _ MessageEncoding)
msg.FilterHashes = make([]*chainhash.Hash, 0, count)
for i := uint64(0); i < count; i++ {
var cfh chainhash.Hash
err := readElement(r, &cfh)
_, err := io.ReadFull(r, cfh[:])
if err != nil {
return err
}
@ -98,25 +103,6 @@ func (msg *MsgCFHeaders) BtcDecode(r io.Reader, pver uint32, _ MessageEncoding)
// BtcEncode encodes the receiver to w using the bitcoin protocol encoding.
// This is part of the Message interface implementation.
func (msg *MsgCFHeaders) BtcEncode(w io.Writer, pver uint32, _ MessageEncoding) error {
// Write filter type
err := writeElement(w, msg.FilterType)
if err != nil {
return err
}
// Write stop hash
err = writeElement(w, msg.StopHash)
if err != nil {
return err
}
// Write prev filter header
err = writeElement(w, msg.PrevFilterHeader)
if err != nil {
return err
}
// Limit to max committed headers per message.
count := len(msg.FilterHashes)
if count > MaxCFHeadersPerMsg {
str := fmt.Sprintf("too many committed filter headers for "+
@ -125,13 +111,36 @@ func (msg *MsgCFHeaders) BtcEncode(w io.Writer, pver uint32, _ MessageEncoding)
return messageError("MsgCFHeaders.BtcEncode", str)
}
err = WriteVarInt(w, pver, uint64(count))
if err != nil {
buf := binarySerializer.Borrow()
// Write filter type
buf[0] = byte(msg.FilterType)
if _, err := w.Write(buf[:1]); err != nil {
binarySerializer.Return(buf)
return err
}
// Write stop hash
if _, err := w.Write(msg.StopHash[:]); err != nil {
binarySerializer.Return(buf)
return err
}
// Write prev filter header
if _, err := w.Write(msg.PrevFilterHeader[:]); err != nil {
binarySerializer.Return(buf)
return err
}
err := WriteVarIntBuf(w, pver, uint64(count), buf)
if err != nil {
binarySerializer.Return(buf)
return err
}
binarySerializer.Return(buf)
for _, cfh := range msg.FilterHashes {
err := writeElement(w, cfh)
_, err := w.Write(cfh[:])
if err != nil {
return err
}