Merge rust-bitcoin/rust-bitcoin#4302: Add push_relative_lock_time() and deprecate push_sequence()

ebaf162a96 Add push_relative_lock_time() and deprecate push_sequence() (Erick Cestari)

Pull request description:

  This pr improves the script builder API to better align with Bitcoin semantics when working with relative timelocks:

  - Add `push_relative_lock_time()` method that takes a `relative::LockTime` parameter, which correctly represents the semantic meaning when working with CHECKSEQUENCEVERIFY

  - Deprecate `push_sequence()` in favor of `push_relative_lock_time()` to avoid confusion between sequence numbers and relative timelocks

  This addresses a potential confusion point in the API where developers might incorrectly push raw sequence numbers in scripts when what they actually need is to push a relative locktime value that will be checked against the transaction's sequence numbers by CHECKSEQUENCEVERIFY.

  Closes #4301

ACKs for top commit:
  apoelstra:
    ACK ebaf162a962494329c6cb5f6d375a6a4a97fe83b; successfully ran local tests
  tcharding:
    ACK ebaf162a96

Tree-SHA512: 52c37b6e8bbcaa3f9346c5fd5db26eba69169bce13f915906df95fdc65204067fd75f803f8b5adad76978c9baad553c99281628736db4d1d317b149ab257d81f
This commit is contained in:
merge-script 2025-04-03 19:23:52 +00:00
commit 9f7f659591
No known key found for this signature in database
GPG Key ID: C588D63CE41B97C1
1 changed files with 21 additions and 0 deletions

View File

@ -2,6 +2,8 @@
use core::fmt; use core::fmt;
use primitives::relative;
use super::{opcode_to_verify, write_scriptint, Error, PushBytes, Script, ScriptBuf}; use super::{opcode_to_verify, write_scriptint, Error, PushBytes, Script, ScriptBuf};
use crate::locktime::absolute; use crate::locktime::absolute;
use crate::opcodes::all::*; use crate::opcodes::all::*;
@ -115,7 +117,26 @@ impl Builder {
self.push_int_unchecked(lock_time.to_consensus_u32().into()) self.push_int_unchecked(lock_time.to_consensus_u32().into())
} }
/// Adds instructions to push a relative lock time onto the stack.
///
/// This is used when creating scripts that use CHECKSEQUENCEVERIFY (CSV) to enforce
/// relative time locks.
pub fn push_relative_lock_time(self, lock_time: relative::LockTime) -> Builder {
self.push_int_unchecked(lock_time.to_consensus_u32().into())
}
/// Adds instructions to push a sequence number onto the stack. /// Adds instructions to push a sequence number onto the stack.
///
/// # Deprecated
/// This method is deprecated in favor of `push_relative_lock_time`.
///
/// In Bitcoin script semantics, when using CHECKSEQUENCEVERIFY, you typically
/// want to push a relative locktime value to be compared against the input's
/// sequence number, not the sequence number itself.
#[deprecated(
since = "TBD",
note = "Use push_relative_lock_time instead for working with timelocks in scripts"
)]
pub fn push_sequence(self, sequence: Sequence) -> Builder { pub fn push_sequence(self, sequence: Sequence) -> Builder {
self.push_int_unchecked(sequence.to_consensus_u32().into()) self.push_int_unchecked(sequence.to_consensus_u32().into())
} }