pub struct ScriptBuilder { /* private fields */ }
Expand description
ScriptBuilder provides a facility for building custom scripts. It allows you to push opcodes, ints, and data while respecting canonical encoding. In general it does not ensure the script will execute correctly, however any data pushes which would exceed the maximum allowed script engine limits and are therefore guaranteed not to execute will not be pushed and will result in the Script function returning an error.
For example, the following would build a 2-of-3 multisig script for usage in a pay-to-script-hash (although in this situation MultiSigScript() would be a better choice to generate the script):
use kaspa_txscript::opcodes::codes::*;
use kaspa_txscript::script_builder::{ScriptBuilderResult, ScriptBuilder};
fn build_multisig_script(pub_key1: &[u8], pub_key2: &[u8], pub_key3: &[u8]) -> ScriptBuilderResult<Vec<u8>> {
Ok(ScriptBuilder::new()
.add_op(Op2)?
.add_data(pub_key1)?.add_data(pub_key2)?.add_data(pub_key3)?
.add_op(Op3)?
.add_op(OpCheckMultiSig)?
.drain())
}
Implementations§
Source§impl ScriptBuilder
impl ScriptBuilder
pub fn new() -> Self
pub fn script(&self) -> &[u8] ⓘ
pub fn drain(&mut self) -> Vec<u8> ⓘ
Sourcepub fn add_op(&mut self, opcode: u8) -> ScriptBuilderResult<&mut Self>
pub fn add_op(&mut self, opcode: u8) -> ScriptBuilderResult<&mut Self>
Pushes the passed opcode to the end of the script. The script will not be modified if pushing the opcode would cause the script to exceed the maximum allowed script engine size.
pub fn add_ops(&mut self, opcodes: &[u8]) -> ScriptBuilderResult<&mut Self>
Sourcepub fn canonical_data_size(data: &[u8]) -> usize
pub fn canonical_data_size(data: &[u8]) -> usize
Returns the number of bytes the canonical encoding of the data will take.
Sourcepub fn add_data(&mut self, data: &[u8]) -> ScriptBuilderResult<&mut Self>
pub fn add_data(&mut self, data: &[u8]) -> ScriptBuilderResult<&mut Self>
AddData pushes the passed data to the end of the script. It automatically chooses canonical opcodes depending on the length of the data.
A zero length buffer will lead to a push of empty data onto the stack (Op0 = OpFalse)
and any push of data greater than MAX_SCRIPT_ELEMENT_SIZE
will not modify
the script since that is not allowed by the script engine.
Also, the script will not be modified if pushing the data would cause the script to
exceed the maximum allowed script engine size MAX_SCRIPTS_SIZE
.
pub fn add_i64(&mut self, val: i64) -> ScriptBuilderResult<&mut Self>
Sourcepub fn add_lock_time(
&mut self,
lock_time: u64,
) -> ScriptBuilderResult<&mut Self>
pub fn add_lock_time( &mut self, lock_time: u64, ) -> ScriptBuilderResult<&mut Self>
Gets a u64 lock time, converts it to byte array in little-endian, and then used the add_data function.
Sourcepub fn add_sequence(&mut self, sequence: u64) -> ScriptBuilderResult<&mut Self>
pub fn add_sequence(&mut self, sequence: u64) -> ScriptBuilderResult<&mut Self>
Gets a u64 sequence, converts it to byte array in little-endian, and then used the add_data function.
Sourcepub fn hex_view_builder(&self) -> HexViewBuilder<'_>
pub fn hex_view_builder(&self) -> HexViewBuilder<'_>
Return HexViewBuilder
for the script
Trait Implementations§
Auto Trait Implementations§
impl Freeze for ScriptBuilder
impl RefUnwindSafe for ScriptBuilder
impl Send for ScriptBuilder
impl Sync for ScriptBuilder
impl Unpin for ScriptBuilder
impl UnwindSafe for ScriptBuilder
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more