mirror of
https://github.com/kaspanet/kaspad.git
synced 2026-03-04 08:15:24 +00:00
BIP0144+wire: add a MessageEncoding variant for serialization/deserialization
This commit modifies the existing wire.Message interface to introduce a new MessageEncoding variant which dictates the exact encoding to be used when serializing and deserializing messages. Such an option is now necessary due to the segwit soft-fork package, as btcd will need to be able to optionally encode transactions/blocks without witness data to un-upgraded peers. Two new functions have been introduced: ReadMessageWithEncodingN and WriteMessageWithEncodingN which wrap BtcDecode/BtcEncode with the desired encoding format.
This commit is contained in:
committed by
Dave Collins
parent
1b359e1131
commit
48abfdf87c
@@ -60,7 +60,7 @@ func (msg *MsgBlock) ClearTransactions() {
|
||||
// This is part of the Message interface implementation.
|
||||
// See Deserialize for decoding blocks stored to disk, such as in a database, as
|
||||
// opposed to decoding blocks from the wire.
|
||||
func (msg *MsgBlock) BtcDecode(r io.Reader, pver uint32) error {
|
||||
func (msg *MsgBlock) BtcDecode(r io.Reader, pver uint32, enc MessageEncoding) error {
|
||||
err := readBlockHeader(r, pver, &msg.Header)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -83,7 +83,7 @@ func (msg *MsgBlock) BtcDecode(r io.Reader, pver uint32) error {
|
||||
msg.Transactions = make([]*MsgTx, 0, txCount)
|
||||
for i := uint64(0); i < txCount; i++ {
|
||||
tx := MsgTx{}
|
||||
err := tx.BtcDecode(r, pver)
|
||||
err := tx.BtcDecode(r, pver, enc)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -106,7 +106,19 @@ func (msg *MsgBlock) Deserialize(r io.Reader) error {
|
||||
// At the current time, there is no difference between the wire encoding
|
||||
// at protocol version 0 and the stable long-term storage format. As
|
||||
// a result, make use of BtcDecode.
|
||||
return msg.BtcDecode(r, 0)
|
||||
//
|
||||
// Passing an encoding type of WitnessEncoding to BtcEncode for the
|
||||
// MessageEncoding parameter indicates that the transactions within the
|
||||
// block are expected to be serialized according to the new
|
||||
// serialization structure defined in BIP0141.
|
||||
return msg.BtcDecode(r, 0, WitnessEncoding)
|
||||
}
|
||||
|
||||
// DeserializeWitness decodes a block from r into the receiver similar to
|
||||
// Deserialize, however DeserializeWitness strips all (if any) witness data
|
||||
// from the transactions within the block before encoding them.
|
||||
func (msg *MsgBlock) DeserializeNoWitness(r io.Reader) error {
|
||||
return msg.BtcDecode(r, 0, BaseEncoding)
|
||||
}
|
||||
|
||||
// DeserializeTxLoc decodes r in the same manner Deserialize does, but it takes
|
||||
@@ -160,7 +172,7 @@ func (msg *MsgBlock) DeserializeTxLoc(r *bytes.Buffer) ([]TxLoc, error) {
|
||||
// This is part of the Message interface implementation.
|
||||
// See Serialize for encoding blocks to be stored to disk, such as in a
|
||||
// database, as opposed to encoding blocks for the wire.
|
||||
func (msg *MsgBlock) BtcEncode(w io.Writer, pver uint32) error {
|
||||
func (msg *MsgBlock) BtcEncode(w io.Writer, pver uint32, enc MessageEncoding) error {
|
||||
err := writeBlockHeader(w, pver, &msg.Header)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -172,7 +184,7 @@ func (msg *MsgBlock) BtcEncode(w io.Writer, pver uint32) error {
|
||||
}
|
||||
|
||||
for _, tx := range msg.Transactions {
|
||||
err = tx.BtcEncode(w, pver)
|
||||
err = tx.BtcEncode(w, pver, enc)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -194,7 +206,20 @@ func (msg *MsgBlock) Serialize(w io.Writer) error {
|
||||
// At the current time, there is no difference between the wire encoding
|
||||
// at protocol version 0 and the stable long-term storage format. As
|
||||
// a result, make use of BtcEncode.
|
||||
return msg.BtcEncode(w, 0)
|
||||
//
|
||||
// Passing WitnessEncoding as the encoding type here indicates that
|
||||
// each of the transactions should be serialized using the witness
|
||||
// serialization structure defined in BIP0141.
|
||||
return msg.BtcEncode(w, 0, WitnessEncoding)
|
||||
}
|
||||
|
||||
// SerializeWitness encodes a block to w using an identical format to Serialize,
|
||||
// with all (if any) witness data stripped from all transactions.
|
||||
// This method is provided in additon to the regular Serialize, in order to
|
||||
// allow one to selectively encode transaction witness data to non-upgraded
|
||||
// peers which are unaware of the new encoding.
|
||||
func (msg *MsgBlock) SerializeNoWitness(w io.Writer) error {
|
||||
return msg.BtcEncode(w, 0, BaseEncoding)
|
||||
}
|
||||
|
||||
// SerializeSize returns the number of bytes it would take to serialize the
|
||||
|
||||
Reference in New Issue
Block a user