1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
use crate::crypto::PublicKey; use std::{ borrow::Cow, fmt::{self, Debug, Formatter}, ops::Deref, }; pub mod builder; pub mod engine; pub mod error; pub mod op; mod stack; pub use self::builder::*; pub use self::engine::*; pub use self::error::*; pub use self::op::*; pub const MAX_FRAME_STACK: usize = 64; #[derive(Clone, PartialEq)] pub struct Script(Vec<u8>); impl Script { #[inline] pub fn new(byte_code: Vec<u8>) -> Self { Script(byte_code) } } impl Debug for Script { fn fmt(&self, f: &mut Formatter) -> fmt::Result { let digest = faster_hex::hex_string(self.as_ref()).unwrap(); f.debug_tuple("Script").field(&digest).finish() } } impl From<&[u8]> for Script { #[inline] fn from(slice: &[u8]) -> Self { Script::new(slice.to_owned()) } } impl From<Vec<u8>> for Script { #[inline] fn from(vec: Vec<u8>) -> Self { Script::new(vec) } } impl From<Builder> for Script { #[inline] fn from(b: Builder) -> Self { b.build() } } impl From<PublicKey> for Script { fn from(key: PublicKey) -> Self { let builder = Builder::new() .push(OpFrame::PubKey(key)) .push(OpFrame::OpCheckSig); builder.build() } } impl<'a> Into<Cow<'a, Script>> for Script { #[inline] fn into(self) -> Cow<'a, Script> { Cow::Owned(self) } } impl<'a> Into<Cow<'a, Script>> for &'a Script { #[inline] fn into(self) -> Cow<'a, Script> { Cow::Borrowed(self) } } impl AsRef<[u8]> for Script { #[inline] fn as_ref(&self) -> &[u8] { &self.0 } } impl Deref for Script { type Target = [u8]; #[inline] fn deref(&self) -> &[u8] { &self.0 } }