wire/msgcfcheckpt: optimize serialization by reusing small buffers

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

View file

@ -52,23 +52,28 @@ func (msg *MsgCFCheckpt) AddCFHeader(header *chainhash.Hash) error {
// BtcDecode decodes r using the bitcoin protocol encoding into the receiver.
// This is part of the Message interface implementation.
func (msg *MsgCFCheckpt) 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 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)
// Refuse to decode an insane number of cfheaders.
if count > maxCFHeadersLen {
@ -80,7 +85,7 @@ func (msg *MsgCFCheckpt) BtcDecode(r io.Reader, pver uint32, _ MessageEncoding)
msg.FilterHeaders = make([]*chainhash.Hash, 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
}
@ -93,27 +98,32 @@ func (msg *MsgCFCheckpt) 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 *MsgCFCheckpt) BtcEncode(w io.Writer, pver uint32, _ MessageEncoding) error {
buf := binarySerializer.Borrow()
// Write filter type
err := writeElement(w, msg.FilterType)
if err != nil {
buf[0] = byte(msg.FilterType)
if _, err := w.Write(buf[:1]); err != nil {
binarySerializer.Return(buf)
return err
}
// Write stop hash
err = writeElement(w, msg.StopHash)
if err != nil {
if _, err := w.Write(msg.StopHash[:]); err != nil {
binarySerializer.Return(buf)
return err
}
// Write length of FilterHeaders slice
count := len(msg.FilterHeaders)
err = WriteVarInt(w, pver, uint64(count))
err := WriteVarIntBuf(w, pver, uint64(count), buf)
if err != nil {
binarySerializer.Return(buf)
return err
}
binarySerializer.Return(buf)
for _, cfh := range msg.FilterHeaders {
err := writeElement(w, cfh)
_, err := w.Write(cfh[:])
if err != nil {
return err
}