feat: apply redeemers and datum to script

This commit is contained in:
rvcas 2022-09-03 17:10:51 -04:00
parent c9072deb09
commit cf27c0c755
No known key found for this signature in database
GPG Key ID: C09B64E263F7D68C
5 changed files with 60 additions and 62 deletions

60
Cargo.lock generated
View File

@ -9,7 +9,7 @@ dependencies = [
"anyhow", "anyhow",
"clap", "clap",
"hex", "hex",
"pallas-primitives 0.13.2", "pallas-primitives",
"pallas-traverse", "pallas-traverse",
"uplc", "uplc",
] ]
@ -318,20 +318,11 @@ dependencies = [
"base58", "base58",
"bech32 0.8.1", "bech32 0.8.1",
"hex", "hex",
"pallas-codec 0.13.2", "pallas-codec",
"pallas-crypto 0.13.2", "pallas-crypto",
"thiserror", "thiserror",
] ]
[[package]]
name = "pallas-codec"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0dce0ea17341c1a0e43e2bb4a637740198dcb09826879ce3ac5ae1c6f4398a5d"
dependencies = [
"minicbor 0.17.1",
]
[[package]] [[package]]
name = "pallas-codec" name = "pallas-codec"
version = "0.13.2" version = "0.13.2"
@ -341,19 +332,6 @@ dependencies = [
"minicbor 0.17.1", "minicbor 0.17.1",
] ]
[[package]]
name = "pallas-crypto"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "051226367cd851895c73e3115d378b58495ade1ee60c3a154c0d0c30554565fa"
dependencies = [
"cryptoxide",
"hex",
"pallas-codec 0.12.0",
"rand_core",
"thiserror",
]
[[package]] [[package]]
name = "pallas-crypto" name = "pallas-crypto"
version = "0.13.2" version = "0.13.2"
@ -362,27 +340,11 @@ checksum = "e17a13efbe2609916de03c063d5bbef840616b02c658f3db5222785a18b63362"
dependencies = [ dependencies = [
"cryptoxide", "cryptoxide",
"hex", "hex",
"pallas-codec 0.13.2", "pallas-codec",
"rand_core", "rand_core",
"thiserror", "thiserror",
] ]
[[package]]
name = "pallas-primitives"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97a0fcc7d5a7120bc2b2e203ec5e7f8088107c500c0eb665569d0e77a910d3c0"
dependencies = [
"base58",
"bech32 0.9.0",
"hex",
"log",
"pallas-codec 0.12.0",
"pallas-crypto 0.12.0",
"serde",
"serde_json",
]
[[package]] [[package]]
name = "pallas-primitives" name = "pallas-primitives"
version = "0.13.2" version = "0.13.2"
@ -393,8 +355,8 @@ dependencies = [
"bech32 0.9.0", "bech32 0.9.0",
"hex", "hex",
"log", "log",
"pallas-codec 0.13.2", "pallas-codec",
"pallas-crypto 0.13.2", "pallas-crypto",
"serde", "serde",
"serde_json", "serde_json",
] ]
@ -407,9 +369,9 @@ checksum = "0549db2f8bbaf22d13fc35791dd50fb13a50a1290a342a98929c8ce6c422ed86"
dependencies = [ dependencies = [
"hex", "hex",
"pallas-addresses", "pallas-addresses",
"pallas-codec 0.13.2", "pallas-codec",
"pallas-crypto 0.13.2", "pallas-crypto",
"pallas-primitives 0.13.2", "pallas-primitives",
"thiserror", "thiserror",
] ]
@ -722,8 +684,8 @@ dependencies = [
"flat-rs", "flat-rs",
"hex", "hex",
"minicbor 0.18.0", "minicbor 0.18.0",
"pallas-codec 0.12.0", "pallas-codec",
"pallas-primitives 0.12.0", "pallas-primitives",
"peg", "peg",
"pretty", "pretty",
"proptest", "proptest",

View File

@ -2,7 +2,7 @@ use std::{fmt::Write as _, fs};
use pallas_traverse::{Era, MultiEraTx}; use pallas_traverse::{Era, MultiEraTx};
use uplc::{ use uplc::{
ast::{DeBruijn, FakeNamedDeBruijn, Name, NamedDeBruijn, Program, Term}, ast::{Constant, DeBruijn, FakeNamedDeBruijn, Name, NamedDeBruijn, Program, Term},
machine::cost_model::ExBudget, machine::cost_model::ExBudget,
parser, parser,
}; };
@ -30,17 +30,30 @@ fn main() -> anyhow::Result<()> {
println!("Simulating: {}", tx.hash()); println!("Simulating: {}", tx.hash());
println!("\nPlutus Data:"); let witnesses = tx.witnesses();
println!("{:#?}", tx.witnesses().plutus_data()); if let Some(((datums, redeemers), scripts)) = witnesses
.plutus_data()
.zip(witnesses.redeemer())
.zip(witnesses.plutus_v1_script())
{
for ((datum, redeemer), script) in
datums.iter().zip(redeemers.iter()).zip(scripts.iter())
{
let program: Program<NamedDeBruijn> = {
let mut buffer = Vec::new();
println!("\nRedeemer:"); let prog =
Program::<FakeNamedDeBruijn>::from_cbor(&script.0, &mut buffer)?;
println!("{:#?}", tx.witnesses().redeemer()); prog.into()
};
println!("\nPlutus V1 Script:"); program
.apply_data(datum.clone())
println!("{:#?}", tx.witnesses().plutus_v1_script()); .apply_data(redeemer.data.clone());
}
}
println!("\nPlutus V2 Script:"); println!("\nPlutus V2 Script:");

View File

@ -17,8 +17,8 @@ cryptoxide = "0.4.2"
flat-rs = { path = "../flat", version = "0.0.10" } flat-rs = { path = "../flat", version = "0.0.10" }
hex = "0.4.3" hex = "0.4.3"
minicbor = { version = "0.18.0", features = ["std"] } minicbor = { version = "0.18.0", features = ["std"] }
pallas-codec = "0.12.0" pallas-codec = "0.13.2"
pallas-primitives = "0.12.0" pallas-primitives = "0.13.2"
peg = "0.8.0" peg = "0.8.0"
pretty = "0.11.3" pretty = "0.11.3"
thiserror = "1.0.31" thiserror = "1.0.31"

View File

@ -54,6 +54,18 @@ where
term: applied_term, term: applied_term,
} }
} }
pub fn apply_data(&self, plutus_data: PlutusData) -> Self {
let applied_term = Term::Apply {
function: Rc::new(self.term.clone()),
argument: Rc::new(Term::Constant(Constant::Data(plutus_data))),
};
Program {
version: self.version,
term: applied_term,
}
}
} }
impl<'a, T> Display for Program<T> impl<'a, T> Display for Program<T>

View File

@ -31,8 +31,11 @@ where
T: Binder<'b> + Debug, T: Binder<'b> + Debug,
{ {
pub fn from_cbor(bytes: &'b [u8], buffer: &'b mut Vec<u8>) -> Result<Self, de::Error> { pub fn from_cbor(bytes: &'b [u8], buffer: &'b mut Vec<u8>) -> Result<Self, de::Error> {
let flat_bytes: Vec<u8> = let mut cbor_decoder = minicbor::Decoder::new(bytes);
minicbor::decode(bytes).map_err(|err| de::Error::Message(err.to_string()))?;
let flat_bytes = cbor_decoder
.bytes()
.map_err(|err| de::Error::Message(err.to_string()))?;
buffer.extend(flat_bytes); buffer.extend(flat_bytes);
@ -58,7 +61,15 @@ where
pub fn to_cbor(&self) -> Result<Vec<u8>, en::Error> { pub fn to_cbor(&self) -> Result<Vec<u8>, en::Error> {
let flat_bytes = self.flat()?; let flat_bytes = self.flat()?;
minicbor::to_vec(&flat_bytes).map_err(|err| en::Error::Message(err.to_string())) let mut bytes = Vec::new();
let mut cbor_encoder = minicbor::Encoder::new(&mut bytes);
cbor_encoder
.bytes(&flat_bytes)
.map_err(|err| en::Error::Message(err.to_string()))?;
Ok(bytes)
} }
// convenient so that people don't need to depend on the flat crate // convenient so that people don't need to depend on the flat crate