Skip to content

Remove remnants of bitcoin v0.29 #5202

Description

@tvolk131

Follow-up to #2356

We've migrated almost all of the codebase to bitcoin v0.30, but there are a few places remaining where we're using v0.29 which require some more care to remove:

  1. PartiallySignedTransaction no longer implements Encodable or Decodable, which is why we're currently converting to/from the v0.29 version when encoding/decoding:

impl crate::encoding::Encodable for bitcoin::psbt::PartiallySignedTransaction {
fn consensus_encode<W: std::io::Write>(&self, writer: &mut W) -> Result<usize, std::io::Error> {
bitcoin29::consensus::Encodable::consensus_encode(
&bitcoin30_to_bitcoin29_psbt(self),
writer,
)
}
}
impl crate::encoding::Decodable for bitcoin::psbt::PartiallySignedTransaction {
fn consensus_decode_from_finite_reader<D: std::io::Read>(
d: &mut D,
_modules: &ModuleDecoderRegistry,
) -> Result<Self, crate::encoding::DecodeError> {
Ok(bitcoin29_to_bitcoin30_psbt(
&bitcoin29::consensus::Decodable::consensus_decode_from_finite_reader(d)
.map_err(crate::encoding::DecodeError::from_err)?,
))
}
}

Ideally we would be able to use impl_encode_decode_bridge!(bitcoin::psbt::PartiallySignedTransaction); like we did prior to the migration to v0.30 but I'm not sure how feasible that is.

  1. bitcoin::network::constants::Magic is encoded/decoded in reverse byte order to v29 (which doesn't have a struct, but instead just uses a u32). See here for details:

pub fn bitcoin29_to_bitcoin30_network_magic(magic: u32) -> bitcoin::network::Magic {
// Invert the byte order when converting from v0.29 to v0.30.
// See the following bitcoin v0.29 and v0.30 code:
// https://docs.rs/bitcoin/0.29.2/src/bitcoin/network/constants.rs.html#81-84
// https://docs.rs/bitcoin/0.30.2/src/bitcoin/network/constants.rs.html#251-258
let bytes = [
(magic & 0xFF) as u8,
((magic >> 8) & 0xFF) as u8,
((magic >> 16) & 0xFF) as u8,
((magic >> 24) & 0xFF) as u8,
];
bitcoin::network::Magic::from_bytes(bytes)
}
pub fn bitcoin30_to_bitcoin29_network_magic(magic: &bitcoin::network::Magic) -> u32 {
let bytes = magic.to_bytes();
// Invert the byte order when converting from v0.30 to v0.29.
// See the following bitcoin v0.29 and v0.30 code:
// https://docs.rs/bitcoin/0.29.2/src/bitcoin/network/constants.rs.html#81-84
// https://docs.rs/bitcoin/0.30.2/src/bitcoin/network/constants.rs.html#251-258
((bytes[3] as u32) << 24)
| ((bytes[2] as u32) << 16)
| ((bytes[1] as u32) << 8)
| (bytes[0] as u32)
}

  1. bitcoin::hashes::hex::format_hex was removed in v30. For simplicity, we've simply left v29 around to rely on this single function. Let's find a way to retain this behavior without needing v29.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions