From b3be9b5477e45837edfb9384525e9710b042fa99 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Wed, 18 Sep 2024 10:25:52 +0200 Subject: [PATCH 01/70] validator: improve handling of anchor and bundle close method mismatch --- src/validation/validator.rs | 58 ++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/src/validation/validator.rs b/src/validation/validator.rs index 38908243..65e936c0 100644 --- a/src/validation/validator.rs +++ b/src/validation/validator.rs @@ -395,14 +395,17 @@ impl< // [VALIDATION]: We validate that the seals were properly defined on BP-type layers let (seals, input_map) = self.validate_seal_definitions(witness_id.layer1(), bundle); + if anchor.method != bundle.close_method { + self.status + .borrow_mut() + .add_failure(Failure::AnchorMethodMismatch(bundle_id)); + continue; + } + // [VALIDATION]: We validate that the seals were properly closed on BP-type layers - let Some(witness_tx) = self.validate_seal_commitments( - &seals, - bundle_id, - witness_id, - bundle.close_method, - anchor, - ) else { + let Some(witness_tx) = + self.validate_seal_commitments(&seals, bundle_id, witness_id, anchor) + else { continue; }; @@ -455,7 +458,6 @@ impl< seals: impl AsRef<[XOutputSeal]>, bundle_id: BundleId, witness_id: XWitnessId, - close_method: CloseMethod, anchor: &EAnchor, ) -> Option { // Check that the anchor is committed into a transaction spending all the @@ -480,38 +482,34 @@ impl< } Ok(pub_witness) => { let seals = seals.as_ref(); - for seal in seals.iter().filter(|seal| seal.method() != close_method) { + for seal in seals.iter().filter(|seal| seal.method() != anchor.method) { self.status .borrow_mut() .add_failure(Failure::SealInvalidMethod(bundle_id, *seal)); } - match (close_method, anchor.clone()) { - ( - CloseMethod::TapretFirst, - EAnchor { - mpc_proof, - dbc_proof: DbcProof::Tapret(tapret), - .. - }, - ) => { + match anchor.clone() { + EAnchor { + mpc_proof, + dbc_proof: DbcProof::Tapret(tapret), + method: CloseMethod::TapretFirst, + } => { let witness = pub_witness.clone().map(|tx| Witness::with(tx, tapret)); self.validate_seal_closing(seals, bundle_id, witness, mpc_proof) } - ( - CloseMethod::OpretFirst, - EAnchor { - mpc_proof, - dbc_proof: DbcProof::Opret(opret), - .. - }, - ) => { + EAnchor { + mpc_proof, + dbc_proof: DbcProof::Opret(opret), + method: CloseMethod::OpretFirst, + } => { let witness = pub_witness.clone().map(|tx| Witness::with(tx, opret)); self.validate_seal_closing(seals, bundle_id, witness, mpc_proof) } - (_, _) => { - self.status - .borrow_mut() - .add_failure(Failure::AnchorMethodMismatch(bundle_id)); + _ => { + panic!( + "RGB standard library consignment implementation provides with \ + anchors which DBC proof method doesn't match the anchor method. The \ + RGB standard library used by this software is broken" + ) } } From 6ea499ddadf24c98b806b9a7342ca5d3fa5d5b70 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sat, 12 Oct 2024 13:13:25 +0200 Subject: [PATCH 02/70] validation: use new closing method API from DBC --- Cargo.lock | 12 ++++-------- Cargo.toml | 6 ++++++ src/stl.rs | 4 ++-- src/validation/commitments.rs | 8 +++++++- src/validation/validator.rs | 22 +++++++++------------- 5 files changed, 28 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cb5520c3..85901ddb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -203,8 +203,7 @@ dependencies = [ [[package]] name = "bp-consensus" version = "0.11.0-beta.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae3a99a46063d23d20a3177a04923652b245f31c2a04a6d0c47d5a93dc201a80" +source = "git+https://github.com/BP-WG/bp-core?branch=methods#725a24e3ec1d5e3951cb317eae95c200115295ff" dependencies = [ "amplify", "chrono", @@ -218,8 +217,7 @@ dependencies = [ [[package]] name = "bp-core" version = "0.11.0-beta.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b8caf04291e2703ce267b1f8baf14f03879a6d1a5afe76e011ada489f172f9" +source = "git+https://github.com/BP-WG/bp-core?branch=methods#725a24e3ec1d5e3951cb317eae95c200115295ff" dependencies = [ "amplify", "bp-consensus", @@ -237,8 +235,7 @@ dependencies = [ [[package]] name = "bp-dbc" version = "0.11.0-beta.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11fc4081db2147411381b9650765ce683e5065559f1125508696f79cc4cbfedf" +source = "git+https://github.com/BP-WG/bp-core?branch=methods#725a24e3ec1d5e3951cb317eae95c200115295ff" dependencies = [ "amplify", "base85", @@ -252,8 +249,7 @@ dependencies = [ [[package]] name = "bp-seals" version = "0.11.0-beta.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d607238c2bf2c34d048d14cd798a6365306e0fb6b02211235f3ccad0bc7fa8f1" +source = "git+https://github.com/BP-WG/bp-core?branch=methods#725a24e3ec1d5e3951cb317eae95c200115295ff" dependencies = [ "amplify", "baid64", diff --git a/Cargo.toml b/Cargo.toml index efaf1d9b..d4aab4e2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -60,3 +60,9 @@ wasm-bindgen-test = "0.3" [package.metadata.docs.rs] features = ["all"] + +[patch.crates-io] +bp-consensus = { git = "https://github.com/BP-WG/bp-core", branch = "methods" } +bp-dbc = { git = "https://github.com/BP-WG/bp-core", branch = "methods" } +bp-seals = { git = "https://github.com/BP-WG/bp-core", branch = "methods" } +bp-core = { git = "https://github.com/BP-WG/bp-core", branch = "methods" } diff --git a/src/stl.rs b/src/stl.rs index 6063f0ba..592adb35 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -37,10 +37,10 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_COMMIT: &str = - "stl:ZMTVCU25-QDo98xR-wI91wcu-ydb7kui-QfZbF$n-0KDS2ow#tuna-safari-design"; + "stl:IFcnrPeI-TANxLfZ-feJax6Q-1TUM4Hq-AjI161s-3tbmxak#harvest-person-orion"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:bioTBozT-NqelHGE-SPbnpMA-XBNSbXZ-6X0dANE-WHVirL8#explain-marvin-bless"; + "stl:i$!X9ANw-DGnAZEL-Tyvq9T1-n$BTbIG-DpcR!s1-mwKtnXA#rapid-baboon-satire"; fn _rgb_commit_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_COMMIT), tiny_bset! { diff --git a/src/validation/commitments.rs b/src/validation/commitments.rs index de19afb2..6ca98014 100644 --- a/src/validation/commitments.rs +++ b/src/validation/commitments.rs @@ -86,7 +86,13 @@ impl StrictDeserialize for DbcProof {} impl dbc::Proof for DbcProof { type Error = DbcError; - const METHOD: Method = Method::OpretFirst; + + fn method(&self) -> Method { + match self { + DbcProof::Tapret(_) => Method::TapretFirst, + DbcProof::Opret(_) => Method::OpretFirst, + } + } fn verify(&self, msg: &Commitment, tx: &Tx) -> Result<(), Self::Error> { match self { diff --git a/src/validation/validator.rs b/src/validation/validator.rs index 65e936c0..015ba56f 100644 --- a/src/validation/validator.rs +++ b/src/validation/validator.rs @@ -24,8 +24,8 @@ use std::cell::RefCell; use std::collections::{BTreeMap, BTreeSet}; use std::rc::Rc; -use bp::dbc::Anchor; -use bp::seals::txout::{CloseMethod, TxoSeal, Witness}; +use bp::dbc::{Anchor, Proof}; +use bp::seals::txout::{TxoSeal, Witness}; use bp::{dbc, Outpoint}; use commit_verify::mpc; use single_use_seals::SealWitness; @@ -395,7 +395,7 @@ impl< // [VALIDATION]: We validate that the seals were properly defined on BP-type layers let (seals, input_map) = self.validate_seal_definitions(witness_id.layer1(), bundle); - if anchor.method != bundle.close_method { + if anchor.dbc_proof.method() != bundle.close_method { self.status .borrow_mut() .add_failure(Failure::AnchorMethodMismatch(bundle_id)); @@ -482,7 +482,10 @@ impl< } Ok(pub_witness) => { let seals = seals.as_ref(); - for seal in seals.iter().filter(|seal| seal.method() != anchor.method) { + for seal in seals + .iter() + .filter(|seal| seal.method() != anchor.dbc_proof.method()) + { self.status .borrow_mut() .add_failure(Failure::SealInvalidMethod(bundle_id, *seal)); @@ -491,7 +494,7 @@ impl< EAnchor { mpc_proof, dbc_proof: DbcProof::Tapret(tapret), - method: CloseMethod::TapretFirst, + .. } => { let witness = pub_witness.clone().map(|tx| Witness::with(tx, tapret)); self.validate_seal_closing(seals, bundle_id, witness, mpc_proof) @@ -499,18 +502,11 @@ impl< EAnchor { mpc_proof, dbc_proof: DbcProof::Opret(opret), - method: CloseMethod::OpretFirst, + .. } => { let witness = pub_witness.clone().map(|tx| Witness::with(tx, opret)); self.validate_seal_closing(seals, bundle_id, witness, mpc_proof) } - _ => { - panic!( - "RGB standard library consignment implementation provides with \ - anchors which DBC proof method doesn't match the anchor method. The \ - RGB standard library used by this software is broken" - ) - } } Some(pub_witness) From 0f4db244db8cc7504c1b35ad8f095a9c94c2ac9c Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 29 Sep 2024 20:50:35 +0200 Subject: [PATCH 03/70] vm: fix consensus ordering for regtests, testnet testnet may have blocks which timestamps are not aligned with their heights --- src/stl.rs | 2 +- src/vm/contract.rs | 106 ++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 97 insertions(+), 11 deletions(-) diff --git a/src/stl.rs b/src/stl.rs index 6063f0ba..b174236b 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -40,7 +40,7 @@ pub const LIB_ID_RGB_COMMIT: &str = "stl:ZMTVCU25-QDo98xR-wI91wcu-ydb7kui-QfZbF$n-0KDS2ow#tuna-safari-design"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:bioTBozT-NqelHGE-SPbnpMA-XBNSbXZ-6X0dANE-WHVirL8#explain-marvin-bless"; + "stl:IKFjGiNg-4MC4DKp-6XBvG0D-FCMXfqx-OnKhuRH-nb75Mcs#sector-season-anatomy"; fn _rgb_commit_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_COMMIT), tiny_bset! { diff --git a/src/vm/contract.rs b/src/vm/contract.rs index 9bf0e2f5..149555e4 100644 --- a/src/vm/contract.rs +++ b/src/vm/contract.rs @@ -38,8 +38,8 @@ use strict_encoding::{StrictDecode, StrictDumb, StrictEncode}; use crate::{ AssetTags, AssignmentType, Assignments, AssignmentsRef, AttachState, ContractId, DataState, ExposedSeal, Extension, ExtensionType, FungibleState, Genesis, GlobalState, GlobalStateType, - GraphSeal, Impossible, Inputs, Metadata, OpFullType, OpId, OpType, Operation, Transition, - TransitionType, TxoSeal, TypedAssigns, Valencies, XChain, XOutpoint, XOutputSeal, + GraphSeal, Impossible, Inputs, Layer1, Metadata, OpFullType, OpId, OpType, Operation, + Transition, TransitionType, TxoSeal, TypedAssigns, Valencies, XChain, XOutpoint, XOutputSeal, LIB_NAME_RGB_LOGIC, }; @@ -290,8 +290,8 @@ impl<'op> Operation for OrdOpRef<'op> { } } -#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, Display)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[derive(Getters, Copy, Clone, PartialEq, Eq, Hash, Debug, Display)] +#[derive(StrictType, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB_LOGIC)] #[cfg_attr( feature = "serde", @@ -300,19 +300,63 @@ impl<'op> Operation for OrdOpRef<'op> { )] #[display("{height}@{timestamp}")] pub struct WitnessPos { - height: u32, + #[getter(as_copy)] + layer1: Layer1, + + // TODO: Move BlockHeight from bp-wallet to bp-consensus and use it here + #[getter(as_copy)] + height: NonZeroU32, + + #[getter(as_copy)] timestamp: i64, } +impl StrictDumb for WitnessPos { + fn strict_dumb() -> Self { + Self { + layer1: Layer1::Bitcoin, + height: NonZeroU32::MIN, + timestamp: 1231006505, + } + } +} + +// Sat Jan 03 18:15:05 2009 UTC +const BITCOIN_GENESIS_TIMESTAMP: i64 = 1231006505; + +// Sat Jan 03 18:15:05 2009 UTC +const LIQUID_GENESIS_TIMESTAMP: i64 = 1296692202; + impl WitnessPos { - pub fn new(height: u32, timestamp: i64) -> Option { - if height == 0 || timestamp < 1231006505 { + #[deprecated( + since = "0.11.0-beta.9", + note = "please use `WitnessPos::bitcoin` or `WitnessPos::liquid` instead" + )] + pub fn new(height: NonZeroU32, timestamp: i64) -> Option { + Self::bitcoin(height, timestamp) + } + + pub fn bitcoin(height: NonZeroU32, timestamp: i64) -> Option { + if timestamp < BITCOIN_GENESIS_TIMESTAMP { return None; } - Some(WitnessPos { height, timestamp }) + Some(WitnessPos { + layer1: Layer1::Bitcoin, + height, + timestamp, + }) } - pub fn height(&self) -> NonZeroU32 { NonZeroU32::new(self.height).expect("invariant") } + pub fn liquid(height: NonZeroU32, timestamp: i64) -> Option { + if timestamp < LIQUID_GENESIS_TIMESTAMP { + return None; + } + Some(WitnessPos { + layer1: Layer1::Liquid, + height, + timestamp, + }) + } } impl PartialOrd for WitnessPos { @@ -327,7 +371,21 @@ impl Ord for WitnessPos { fn cmp(&self, other: &Self) -> Ordering { assert!(self.timestamp > 0); assert!(other.timestamp > 0); - self.timestamp.cmp(&other.timestamp) + const BLOCK_TIME: i64 = 10 /*min*/ * 60 /*secs*/; + match (self.layer1, other.layer1) { + (a, b) if a == b => self.height.cmp(&other.height), + (Layer1::Bitcoin, Layer1::Liquid) + if (self.timestamp - other.timestamp).abs() >= BLOCK_TIME => + { + Ordering::Greater + } + (Layer1::Liquid, Layer1::Bitcoin) + if (other.timestamp - self.timestamp).abs() >= BLOCK_TIME => + { + Ordering::Less + } + _ => self.timestamp.cmp(&other.timestamp), + } } } @@ -672,3 +730,31 @@ impl<'op> OpInfo<'op> { } } } + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn witness_post_timestamp() { + assert_eq!(WitnessPos::bitcoin(NonZeroU32::MIN, BITCOIN_GENESIS_TIMESTAMP - 1), None); + assert_eq!(WitnessPos::liquid(NonZeroU32::MIN, LIQUID_GENESIS_TIMESTAMP - 1), None); + assert_eq!(WitnessPos::liquid(NonZeroU32::MIN, BITCOIN_GENESIS_TIMESTAMP), None); + assert!(WitnessPos::bitcoin(NonZeroU32::MIN, BITCOIN_GENESIS_TIMESTAMP).is_some()); + assert!(WitnessPos::liquid(NonZeroU32::MIN, LIQUID_GENESIS_TIMESTAMP).is_some()); + assert!(WitnessPos::bitcoin(NonZeroU32::MIN, LIQUID_GENESIS_TIMESTAMP).is_some()); + } + + #[test] + fn witness_pos_getters() { + let pos = WitnessPos::bitcoin(NonZeroU32::MIN, BITCOIN_GENESIS_TIMESTAMP).unwrap(); + assert_eq!(pos.height(), NonZeroU32::MIN); + assert_eq!(pos.timestamp(), BITCOIN_GENESIS_TIMESTAMP); + assert_eq!(pos.layer1(), Layer1::Bitcoin); + + let pos = WitnessPos::liquid(NonZeroU32::MIN, LIQUID_GENESIS_TIMESTAMP).unwrap(); + assert_eq!(pos.height(), NonZeroU32::MIN); + assert_eq!(pos.timestamp(), LIQUID_GENESIS_TIMESTAMP); + assert_eq!(pos.layer1(), Layer1::Liquid); + } +} From 4d4078a12a81153e1cd474856bd94f7cf511cf04 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 29 Sep 2024 20:52:12 +0200 Subject: [PATCH 04/70] vm: improve WitnessPos Display implementation --- src/vm/contract.rs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/vm/contract.rs b/src/vm/contract.rs index 149555e4..633c3492 100644 --- a/src/vm/contract.rs +++ b/src/vm/contract.rs @@ -23,7 +23,7 @@ use std::borrow::Borrow; use std::cell::RefCell; use std::cmp::Ordering; -use std::fmt::Debug; +use std::fmt::{self, Debug, Display, Formatter}; use std::num::NonZeroU32; use std::rc::Rc; @@ -31,6 +31,7 @@ use amplify::confinement; use amplify::num::u24; use bp::seals::txout::{CloseMethod, ExplicitSeal, VerifyError, Witness}; use bp::{dbc, Tx, Txid}; +use chrono::{MappedLocalTime, TimeZone, Utc}; use commit_verify::mpc; use single_use_seals::SealWitness; use strict_encoding::{StrictDecode, StrictDumb, StrictEncode}; @@ -290,7 +291,7 @@ impl<'op> Operation for OrdOpRef<'op> { } } -#[derive(Getters, Copy, Clone, PartialEq, Eq, Hash, Debug, Display)] +#[derive(Getters, Copy, Clone, PartialEq, Eq, Hash, Debug)] #[derive(StrictType, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB_LOGIC)] #[cfg_attr( @@ -298,7 +299,6 @@ impl<'op> Operation for OrdOpRef<'op> { derive(Serialize, Deserialize), serde(crate = "serde_crate", rename_all = "camelCase") )] -#[display("{height}@{timestamp}")] pub struct WitnessPos { #[getter(as_copy)] layer1: Layer1, @@ -389,6 +389,16 @@ impl Ord for WitnessPos { } } +impl Display for WitnessPos { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + write!(f, "{}:{}, ", self.layer1, self.height)?; + match Utc.timestamp_opt(self.timestamp, 0) { + MappedLocalTime::Single(time) => write!(f, "{}", time.format("%Y-%m-%d %H:%M:%S")), + _ => f.write_str("invalid timestamp"), + } + } +} + /// RGB consensus information about the status of a witness transaction. This /// information is used in ordering state transition and state extension /// processing in the AluVM during the validation, as well as consensus ordering From 0450760dbae554de0d7623691aed7630f1b60a60 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sat, 12 Oct 2024 14:16:51 +0200 Subject: [PATCH 05/70] stl: update --- Cargo.lock | 8 ++++---- Cargo.toml | 8 ++++---- src/stl.rs | 2 +- stl/RGBCommit@0.1.0.sta | 30 ++++++++++++++-------------- stl/RGBCommit@0.1.0.stl | Bin 16309 -> 16309 bytes stl/RGBCommit@0.1.0.sty | 16 +++++++-------- stl/RGBLogic@0.1.0.sta | 43 ++++++++++++++++++++-------------------- stl/RGBLogic@0.1.0.stl | Bin 1548 -> 1659 bytes stl/RGBLogic@0.1.0.sty | 13 +++++++----- 9 files changed, 62 insertions(+), 58 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 85901ddb..cfa4bd54 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -203,7 +203,7 @@ dependencies = [ [[package]] name = "bp-consensus" version = "0.11.0-beta.8" -source = "git+https://github.com/BP-WG/bp-core?branch=methods#725a24e3ec1d5e3951cb317eae95c200115295ff" +source = "git+https://github.com/BP-WG/bp-core?branch=develop#6ae56d5a005f0e0fc761516fb96c2c47bb13de46" dependencies = [ "amplify", "chrono", @@ -217,7 +217,7 @@ dependencies = [ [[package]] name = "bp-core" version = "0.11.0-beta.8" -source = "git+https://github.com/BP-WG/bp-core?branch=methods#725a24e3ec1d5e3951cb317eae95c200115295ff" +source = "git+https://github.com/BP-WG/bp-core?branch=develop#6ae56d5a005f0e0fc761516fb96c2c47bb13de46" dependencies = [ "amplify", "bp-consensus", @@ -235,7 +235,7 @@ dependencies = [ [[package]] name = "bp-dbc" version = "0.11.0-beta.8" -source = "git+https://github.com/BP-WG/bp-core?branch=methods#725a24e3ec1d5e3951cb317eae95c200115295ff" +source = "git+https://github.com/BP-WG/bp-core?branch=develop#6ae56d5a005f0e0fc761516fb96c2c47bb13de46" dependencies = [ "amplify", "base85", @@ -249,7 +249,7 @@ dependencies = [ [[package]] name = "bp-seals" version = "0.11.0-beta.8" -source = "git+https://github.com/BP-WG/bp-core?branch=methods#725a24e3ec1d5e3951cb317eae95c200115295ff" +source = "git+https://github.com/BP-WG/bp-core?branch=develop#6ae56d5a005f0e0fc761516fb96c2c47bb13de46" dependencies = [ "amplify", "baid64", diff --git a/Cargo.toml b/Cargo.toml index d4aab4e2..edcd5472 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,7 +62,7 @@ wasm-bindgen-test = "0.3" features = ["all"] [patch.crates-io] -bp-consensus = { git = "https://github.com/BP-WG/bp-core", branch = "methods" } -bp-dbc = { git = "https://github.com/BP-WG/bp-core", branch = "methods" } -bp-seals = { git = "https://github.com/BP-WG/bp-core", branch = "methods" } -bp-core = { git = "https://github.com/BP-WG/bp-core", branch = "methods" } +bp-consensus = { git = "https://github.com/BP-WG/bp-core", branch = "develop" } +bp-dbc = { git = "https://github.com/BP-WG/bp-core", branch = "develop" } +bp-seals = { git = "https://github.com/BP-WG/bp-core", branch = "develop" } +bp-core = { git = "https://github.com/BP-WG/bp-core", branch = "develop" } diff --git a/src/stl.rs b/src/stl.rs index 592adb35..bbc97c6f 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -40,7 +40,7 @@ pub const LIB_ID_RGB_COMMIT: &str = "stl:IFcnrPeI-TANxLfZ-feJax6Q-1TUM4Hq-AjI161s-3tbmxak#harvest-person-orion"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:i$!X9ANw-DGnAZEL-Tyvq9T1-n$BTbIG-DpcR!s1-mwKtnXA#rapid-baboon-satire"; + "stl:mqltqlPk-O9$pYOd-BACRI70-DOMJ6cp-TFvhcK1-ibrOI9U#import-boxer-seminar"; fn _rgb_commit_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_COMMIT), tiny_bset! { diff --git a/stl/RGBCommit@0.1.0.sta b/stl/RGBCommit@0.1.0.sta index bddb58fd..67979284 100644 --- a/stl/RGBCommit@0.1.0.sta +++ b/stl/RGBCommit@0.1.0.sta @@ -1,18 +1,18 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:ZMTVCU25-QDo98xR-wI91wcu-ydb7kui-QfZbF$n-0KDS2ow#tuna-safari-design +Id: stl:IFcnrPeI-TANxLfZ-feJax6Q-1TUM4Hq-AjI161s-3tbmxak#harvest-person-orion Name: RGBCommit Dependencies: StrictTypes#century-comrade-chess, + BPCore#austin-story-retro, AluVM#congo-archive-folio, CommitVerify#miller-pancake-elastic, - BPCore#totem-holiday-helena, Std#ralph-blue-lucky, Bitcoin#signal-color-cipher -Check-SHA256: bca1c6f36dad26f2d0a6f0c23ed8bd7a3c2584bf1f60a4f1ded87de9f8fafa87 +Check-SHA256: 1d68b2a0bcfecf99effcecd7c9c35f870a1300e71a3ce3da8144587537895235 -2~tNwLvL+uX>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI)Q*?4^V{}w`aAk91a5aA+<>R2X -hQO_4{AcS-HH^7AVzASV8M4NYxyCjHL2PwaO?m?z-)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCJaMw -ZEb0ER%LQ&W_hMrvQRIBF~gy)hQg^4yxce6i-HaxmCGKABZpBR?$8E8P(yEWWy&lbZ-bfLFbqC#o>4E? +2~tNwLvL+uX>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI)Q*?4^V{}w`aAk8=6V}(%hjW>8 +uUwNXi!t*yd7K}=K!`A`1OPgv%fUznLQq3*a%Ez0HGd)H4E? M+l67UG^w8*<_XZ#%uyqCj(P-Wc6$lVk7oBr%DNv+($;q`HHK!gIHa)*%m(-e#9sm3I{@IbYpL6ZUzNG Y;{&m0sw9Ap(f$Hb>aU=OZ$bvG|>z)+>9PT;Au-7)~D;-++hbyX<}1pbY-V7RRS&fT*&Z=qeY@Wmfle* z!SF)@h8|JkU^FEQwjx4X<|ua20~CnZ*pY?04}!>CAn^87TS9h9ibhaZ&^Bcn*B*;w|~I;-PD|t>jq6_ @@ -228,7 +228,7 @@ Ll(1e@}~9=0-ijXfD2)Bb7^O8ZDnqBa{)s3lIz?v1U>x&T2C;PAKlCCveQ{N4udSh#@3Dqj&%ukVQgh? V`*h`0o{dW0B>Pr5ftu@@z<*O39}j`u&O7io3b$Is?RA$O$l~kY-wa+bZ>G3dIKHbX?@G`sCP;~6&DQw R5(-fxrUo0Th*%N~j&hfyEy&@Q(SCAn^8 +bZKvHLUnFrY-I)m3uA0=b7f6sbZBp60#*~&*VKn|nRBmPlPrrd^EP>$AHP6|FsuXsI;G3ONG`V!CAn^8 7TS9h9ibhaZ&^Bcn*B*;w|~I;-PD|t>j-IXaCLM|VQ>KznP+6nwW~k}RP!NmuV?G015$>$mV(;bz)!CmQ_M(k?Vd!kfCo{nDM?)_qK{868FUc))-~W22H5+ SDrhMohTRsfLT>C1dS{r3#^{o?N>fE0RR9100000|Nj60000005L9wuZgXjLX>V>*V`yb&L00;qEk8=qnO(R<<%JIK< 1B78x*e6}1oxDzJ3ElvocGBqp0000000030{{R30000303So3~VPj}*Wo~o;1pxpE0aMUzRzj^*Tk1C) pGbjYG7000000RR600000000~xMY-Mg^X=QT-0RRaBM(yUq2ps*m=2xUD T;RqCgn#@WzFu~@adfH5^@&-|0000000000{{R30000003szxlWo~16RC#b^1pxp60tr@cX=GD$VRU5$ -0RR916j(!OVQFqcY-w&}Q)OXnRCrKyas&bZ2V!Y-V{d7000jX8rdhI3FM~0|p{<6(sS&)~H{Xkb4j+}v -9*QG}Q6KKmMklB)P_)|`Y=H7dO_e!^G2i>0SdC0NppV!6v|_i_0S0Voadl~A00jX8rdhI3FM~0|p{<6( -sS&)~H{Xkb4j+}v9*QG}Q6KKmMklB)P_)|`Y=H7dO_e!^G2i>0SdC0NppV!6v|_i_6IerNVQFqcY-w&} -Q)OXnRCsA*1OfmDVrg_^Z)t7-1pxx4S+Y5xm?t-;06{AC=10daZB@{PThHqO25f0@b!lV(1pxx4S+Y5xm?t-;06{AC=10daZB@{PThHqdSVL%GX>L5xm?t-;06{AC=15xm?t-;06{AC=1MoHhG*Mzd(pE +tONi$rOUxcMklB)P_)|`Y=H7dO_e!^G2i>0SdC0NppV!6v|_i_0S0Voadl~A00jX8Ruk6O)Q5AKbFW;J +EQ>MoHhG*Mzd(pEtONi$rOUxcMklB)P_)|`Y=H7dO_e!^G2i>0SdC0NppV!6v|_i_6IerNVQFqcY-w&} +Q)OXnRCsA*1OfmDVrg_^Z)t7-1pxw96V}(%hjW>8uUwNXi!t*yd7K}=K!`A`1OPgv%fU#n#&NEOd)wn+ +n#11fGQ~$X901P7x>0daZB@{PThHqO25f0@b!lV(1pxw96V}(%hjW>8uUwNXi!t*yd7K}=K!`A`1OPgv +%fU#n#&NEOd)wn+n#11fGQ~$X901P7x>0daZB@{PThHqdSVL%GX>L8uUwNXi!t*yd7K}=K!`A`1OPgv%fU!!8SA{&vly$FvzVnzHf7z~rv`86=_Ka^V5yX| +y#`JJ25f0@b!lV(1pxw96V}(%hjW>8uUwNXi!t*yd7K}=K!`A`1OPgv%fU!!8SA{&vly$FvzVnzHf7z~ rv`86=_Ka^V5yX|y#`JSSVL%GX>L?_X=DTf00&}ebYpL6ZU6-V0`+VYVk7oBr%DNv+($;q`HHK!gIHa) *%m(-e#9sm3ZsHT^UK%K(4i9Ajp1M~R@C@!4#dQE#lUD;OiKi1RsjZVX>oOFWB>&L0`+VYVk7oBr%DNv +($;q`HHK!gIHa)*%m(-e#9sm3ZsHT^UK%K(4i9Ajp1M~R@C@!4#dQE#lUD;OiKi1Rs diff --git a/stl/RGBCommit@0.1.0.stl b/stl/RGBCommit@0.1.0.stl index 1ffee9d2025eae086b2dba8f3a72259911e232d2..00268c220657856b0314c5aed58a888bef289d44 100644 GIT binary patch delta 353 zcmdm5zqNjXxq6uJwd+^fi)R+EkD08~ZTQ)&a*q6dhYo`^EDTmlPapJPa|&?IFG`&( zr>-zD+<4>07p4k?v`mg=RM>pe%%6?0N)KBdViYM%-eRjvSm8ZJ1sz7VoXo<~%oGMz ZMkay|1!|a_Y^Oljpe%%6?0N)KBdViYM%-eRjvSm8ZJ1sz7VoXo<~%oGMzMkay| V1!|a_Y^Oljja}LTPkk +2vSEvOmAmtV*?;pC#?5~OapN(_Fs6GvFQy{P|gRa2*}s1Y~I%9#iMoHhG*Mzd(pEtONi$rOUxc20~CnZ*pbzY!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkk Z)t7=20~CnZ*pY?00DdlT>wB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 wjY>38tto&d&=eG4cRAF#( @@ -17,21 +17,22 @@ Wpq+$XJ~Xna$#;`Xh%-ZT+rxDK6vW;JU&?LxLM72H?wDC1Zo}=N}D)4mkLjCa%FT-a&K>D2SRCdV{d70 DJ{*3f84s>#k$1lf7uIEVQ@}wWMxQUb7)_z*=^-NPQ?`2v5jYd+6t@dEhY>7H!Y*UdZb-BpG^u(WnpGh V{&P5bg6}ecT=8d`>?<6$C@F;S3|*6`1-v+nBdcqJ?FPKcnV2wbY*gGVQf%qwlfK-7{9iX4Q|L-q$GzU Mp|h#f#{Gz8SzLEaTf~c{WkYggkPIjuQHS#3Ua|L6d7%qre2Ut&TYs@(?%#f7ArN-=Rj?7Ns(14peesZgXjLX>V>+d2nT9bsj>g -6`?#s5rWnKhSeO?L~x^!;Y#eFP|P}0Z%Ez^MR;^&ZgXjGZd7@2WtGV0dLDIRU(}XWLTZugenOC;Z(5k~ -zEJnJiX;;E#RN}qNn`~82t;CIP;zf?W&{EO26SO?a%FS?1pxx4S+Y5xm?t-;06{AC=1< -iX(?nAMVf(wjY>38tto&d&=eV=-1_TFpX>@L7b8`Xq3nQ8ri$WPp5w@a4b3LR7M69fMnD+{F6rHCsWOZ=@ba?_~#MKE+ -xj;HS^AvC+-Eea3oo~4=i3iziU+2)E(%Otg6`?#s5rWnKhSeO?L~x^!;Y#eFP|P}0Z%Ez+Zf|a5 -WdHyO1aEL@WCCQw)d@|xKsr716mTQmaB}ROZ@Dgs2ia_2=g^?i+KiRR=6W7=VqesjRYGc!>wZFzp>JB4 -@xD;^wu&SY_r?DTbaG*Cb7^#GZ*Bkv1P6C%bZ%vHa{=}XBbpbBLK#dEwxUFHJ){RjtgLvL_X>0rou@Kn -b#Vf8c>-j_)d@|xKsr716mTQmaB}ROZ@Dgs2ia_2=g^?i+Ke<(53UoI8eY9A{1GERg--GiI0S#x1is&) -M%fmnGH3;EZ*F5{000OCZ*Xa30%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u(4f-VjFrgddLDIRU(}XW -LTZugenOC;Z(5k~zEJnJiX;;E#R^wxbZ%vHb5C+)1OosFVRB<=X?A5~000011#M|=Wn=&a0Raxbxa~M% -Zlr^{H1ibsRCVcA*+(@K+$R_oJY%-uiLn9+bY*UIVRUJBWdHyG3Rh`#Ze??GP;YYv0tRShX=iA3000CD -bZKp6b97;CZ~y>E +2~tNwLvL+uX>s@(?%#f7ArN-=Rj?7Ns(14peesZgXjLX>V>+d2nT9bsj>g +6`?#s5rWnKhSeO?L~x^!;Y#eFP|P}0Z%Ez^MR;^&ZgXjGZd7@2WqHKdNeFB= +iRT*14O40w5C%+Pd1Z1jmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<1W#~DWCZ{SL}Fu5a&K>D +1OfpDbYXCEWpn@q0RmPN*4NaBbD49mT$3z|G4nQgoFBhHh%l@K06L}1!AK9bADBNH?W>M^%H|xc>sh|D +n*!v8^Ea7rh?dzC2n+%RZ*X#DbN~eb0#*~&*VKn|nRBmPlPrrd^EP>$AHP6|FsuXsI;G3ONJmc3T+rxD +K6vW;JU&?LxLM72H?wDC1Zo}=N}D)4mkCE~Z(?C=PjX}i0tIhyPjX}d{&9|4h)I8ST&b@+9Xb*9;C#?5~OapN(_Fs6GvFQy{P|gRa2*}s1Y~I%9 +#i?X<9zv-Vp*%wog4O?q)g04AaHEjnO6;Ie%sNwVNZti*Z*F5{000OCZ*Xa30w7l>toMja192_(UwD?W +=?zm*&IhOn$k(lG-qz;Dsg=m)dLDIRU(}XWLTZugenOC;Z(5k~zEJnJiX;;E#s3O)a$#@6CZU6=Z +2X|?7Ze??G0dl)S$QV;yG0%+u`Lqfm#|FpRuujhTP8r)T_J?np;R1Ad0w7l>toMja192_(UwD?W=?zm* +&IhOn$k(lG-qz;DsWeg#t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zcaA{-$AXg`> +_lQgbaV_>=c$Ts04O39g2dD_h*R5>c*5<{jmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<3Rh`# +Ze??GPjX}g0{{qNa${&|c4cG$00036ZE0?0WB>&L0bJY;BNZ=sBHM?<`J6+Fr=A_lQgbaV_>=c$Ts04O39g2dD_h*R5>c +*5<{jdBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W)00aqiX>Db5bYX39002k -----END STRICT TYPE LIB----- diff --git a/stl/RGBLogic@0.1.0.stl b/stl/RGBLogic@0.1.0.stl index 8cf2fe5f58e293e707c4292f39d87203791a68e5..24ed32dcaf2d1780f0739aa2747b186da33cf42c 100644 GIT binary patch delta 634 zcmeC-`OOo;5#;XVlb@cM%&ZWuzUF&}4|AdJxA=-_8(;DU2b^PH!ExgH+MIjWo*iAu z2~_EvpPQRm5+;1@`jz(LnZ@g4ChK$?em1L|BfsCF!(a^ygVoa02R$~1m@zT3Ozvii zQ?ER7!;>S&tbOVtPY3sVQ%)4y-FtkcBd+tg)G6NJEGYptpTx@4BE!k6SQI96GRr9t zGJ4{E1#KqQ{DPv?5(ZXACPK<5`!Xs_-oz}d@UO5hs>8FsG-l;`YgsE{-;-IF&pf?j z%k)vr=Cxw*j`x$FG8?%R?RGjL5gcoHzUTkXEnG^+*^b}Z;CJq)pX6=*Z|(WB9x|0w zG7$=;$Et;g_t{h%A)#}O1Ik&|D5C8wS1oR z1sxB|q;D19x12h`&>%GV7OPYOGg}TgS_t} Date: Sun, 13 Oct 2024 13:15:56 +0200 Subject: [PATCH 06/70] chore: add patches --- Cargo.lock | 10 ++++++++++ Cargo.toml | 2 ++ 2 files changed, 12 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index cfa4bd54..08afbb7b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1198,3 +1198,13 @@ dependencies = [ "quote", "syn 2.0.77", ] + +[[patch.unused]] +name = "commit_verify" +version = "0.11.0-beta.9" +source = "git+https://github.com/LNP-BP/client_side_validation?branch=develop#4015f1fb9e99fdc536c69b957fa5727da9cfa6a9" + +[[patch.unused]] +name = "single_use_seals" +version = "0.11.0-beta.9" +source = "git+https://github.com/LNP-BP/client_side_validation?branch=develop#4015f1fb9e99fdc536c69b957fa5727da9cfa6a9" diff --git a/Cargo.toml b/Cargo.toml index edcd5472..4777f9df 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,6 +62,8 @@ wasm-bindgen-test = "0.3" features = ["all"] [patch.crates-io] +commit_verify = { git = "https://github.com/LNP-BP/client_side_validation", branch = "develop" } +single_use_seals = { git = "https://github.com/LNP-BP/client_side_validation", branch = "develop" } bp-consensus = { git = "https://github.com/BP-WG/bp-core", branch = "develop" } bp-dbc = { git = "https://github.com/BP-WG/bp-core", branch = "develop" } bp-seals = { git = "https://github.com/BP-WG/bp-core", branch = "develop" } From 4e7a7b95a1d06fe21c16322eb2039dbbff581797 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 13 Oct 2024 13:18:02 +0200 Subject: [PATCH 07/70] chore: fix fmt with new style_edition fmt keeps changing all the time. Now they introduced new "editions" feature, which by default does a lot of changes to the codebase by mingling with alphabetical sorting of all imports, doing them in case-insentive way. This PR allows to avoid that dramatic changes --- .rustfmt.toml | 2 +- src/operation/commit.rs | 4 +++- src/schema/state.rs | 6 +++++- src/validation/validator.rs | 12 +++++------ src/vm/macroasm.rs | 40 +++++++++++++++++++++++++++---------- 5 files changed, 45 insertions(+), 19 deletions(-) diff --git a/.rustfmt.toml b/.rustfmt.toml index 9017cd7d..6d14899a 100644 --- a/.rustfmt.toml +++ b/.rustfmt.toml @@ -1,5 +1,5 @@ edition = "2021" -version = "Two" +style_edition = "2021" max_width = 100 array_width = 100 diff --git a/src/operation/commit.rs b/src/operation/commit.rs index 2a84b383..93796a4d 100644 --- a/src/operation/commit.rs +++ b/src/operation/commit.rs @@ -386,7 +386,9 @@ impl Assign { impl MerkleLeaves for Assignments { type Leaf = AssignmentCommitment; - type LeafIter<'tmp> = vec::IntoIter where Seal: 'tmp; + type LeafIter<'tmp> + = vec::IntoIter + where Seal: 'tmp; fn merkle_leaves(&self) -> Self::LeafIter<'_> { self.iter() diff --git a/src/schema/state.rs b/src/schema/state.rs index f74a79de..27db9a15 100644 --- a/src/schema/state.rs +++ b/src/schema/state.rs @@ -80,7 +80,11 @@ impl OwnedStateSchema { } pub fn sem_id(&self) -> Option { - if let Self::Structured(id) = self { Some(*id) } else { None } + if let Self::Structured(id) = self { + Some(*id) + } else { + None + } } } diff --git a/src/validation/validator.rs b/src/validation/validator.rs index 015ba56f..941bc14f 100644 --- a/src/validation/validator.rs +++ b/src/validation/validator.rs @@ -143,12 +143,12 @@ pub struct Validator< } impl< - 'consignment, - 'resolver, - S: ContractStateAccess + ContractStateEvolve, - C: ConsignmentApi, - R: ResolveWitness, -> Validator<'consignment, 'resolver, S, C, R> + 'consignment, + 'resolver, + S: ContractStateAccess + ContractStateEvolve, + C: ConsignmentApi, + R: ResolveWitness, + > Validator<'consignment, 'resolver, S, C, R> { fn init(consignment: &'consignment C, resolver: &'resolver R, context: S::Context<'_>) -> Self { // We use validation status object to store all detected failures and diff --git a/src/vm/macroasm.rs b/src/vm/macroasm.rs index f05a3d71..0422e4a0 100644 --- a/src/vm/macroasm.rs +++ b/src/vm/macroasm.rs @@ -33,14 +33,34 @@ macro_rules! rgbasm { #[macro_export] macro_rules! isa_instr { - (pcvs $no:ident) => {{ RgbIsa::Contract(ContractOp::Pcvs($no)) }}; - (pcas $no:ident) => {{ RgbIsa::Contract(ContractOp::Pcas($no)) }}; - (pcps $no:ident) => {{ RgbIsa::Contract(ContractOp::Pcps($no)) }}; - (cng $t:ident,a8[$a_idx:literal]) => {{ RgbIsa::Contract(ContractOp::CnG($t, Reg32::from(u5::with($a_idx)))) }}; - (cnc $t:ident,a16[$a_idx:literal]) => {{ RgbIsa::Contract(ContractOp::CnC($t, Reg32::from(u5::with($a_idx)))) }}; - (ldm $t:ident,s16[$s_idx:literal]) => {{ RgbIsa::Contract(ContractOp::LdM($t, RegS::from($s_idx))) }}; - (ldg $t:ident,a8[$a_idx:literal],s16[$s_idx:literal]) => {{ RgbIsa::Contract(ContractOp::LdG($t, Reg16::from(u4::with($a_idx)), RegS::from($s_idx))) }}; - (ldp $t:ident,a16[$a_idx:literal],s16[$s_idx:literal]) => {{ RgbIsa::Contract(ContractOp::LdP($t, Reg16::from(u4::with($a_idx)), RegS::from($s_idx))) }}; - (lds $t:ident,a16[$a_idx:literal],s16[$s_idx:literal]) => {{ RgbIsa::Contract(ContractOp::LdS($t, Reg16::from(u4::with($a_idx)), RegS::from($s_idx))) }}; - ($op:ident $($tt:tt)+) => {{ compile_error!(concat!("unknown RGB assembly opcode `", stringify!($op), "`")) }}; + (pcvs $no:ident) => {{ + RgbIsa::Contract(ContractOp::Pcvs($no)) + }}; + (pcas $no:ident) => {{ + RgbIsa::Contract(ContractOp::Pcas($no)) + }}; + (pcps $no:ident) => {{ + RgbIsa::Contract(ContractOp::Pcps($no)) + }}; + (cng $t:ident,a8[$a_idx:literal]) => {{ + RgbIsa::Contract(ContractOp::CnG($t, Reg32::from(u5::with($a_idx)))) + }}; + (cnc $t:ident,a16[$a_idx:literal]) => {{ + RgbIsa::Contract(ContractOp::CnC($t, Reg32::from(u5::with($a_idx)))) + }}; + (ldm $t:ident,s16[$s_idx:literal]) => {{ + RgbIsa::Contract(ContractOp::LdM($t, RegS::from($s_idx))) + }}; + (ldg $t:ident,a8[$a_idx:literal],s16[$s_idx:literal]) => {{ + RgbIsa::Contract(ContractOp::LdG($t, Reg16::from(u4::with($a_idx)), RegS::from($s_idx))) + }}; + (ldp $t:ident,a16[$a_idx:literal],s16[$s_idx:literal]) => {{ + RgbIsa::Contract(ContractOp::LdP($t, Reg16::from(u4::with($a_idx)), RegS::from($s_idx))) + }}; + (lds $t:ident,a16[$a_idx:literal],s16[$s_idx:literal]) => {{ + RgbIsa::Contract(ContractOp::LdS($t, Reg16::from(u4::with($a_idx)), RegS::from($s_idx))) + }}; + ($op:ident $($tt:tt)+) => {{ + compile_error!(concat!("unknown RGB assembly opcode `", stringify!($op), "`")) + }}; } From 966d409c124d9b90fc628602bfdc8c6eb319168c Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 13 Oct 2024 13:21:20 +0200 Subject: [PATCH 08/70] chore: update dependencies, bump version --- Cargo.lock | 231 +++++++++++++++++++++++++++++------------------------ Cargo.toml | 11 +-- 2 files changed, 133 insertions(+), 109 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 08afbb7b..c201786d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,8 @@ version = 3 [[package]] name = "aluvm" -version = "0.11.0-beta.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db04c1d697d7f5b86d935bfe06cfd0310fd8a6c491b043118bec228597dcede9" +version = "0.11.0-beta.9" +source = "git+https://github.com/AluVM/rust-aluvm?branch=develop#24bff9f61570ea26d14e86aa5e127937aa122440" dependencies = [ "amplify", "ascii-armor", @@ -101,9 +100,9 @@ dependencies = [ [[package]] name = "arrayref" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" @@ -135,9 +134,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "baid64" @@ -166,12 +165,28 @@ dependencies = [ "thiserror", ] +[[package]] +name = "bitcoin-io" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "340e09e8399c7bd8912f495af6aa58bea0c9214773417ffaa8f6460f93aaee56" + [[package]] name = "bitcoin-private" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73290177011694f38ec25e165d0387ab7ea749a4b81cd4c80dae5988229f7a57" +[[package]] +name = "bitcoin_hashes" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" +dependencies = [ + "bitcoin-io", + "hex-conservative", +] + [[package]] name = "bitflags" version = "2.6.0" @@ -202,13 +217,13 @@ dependencies = [ [[package]] name = "bp-consensus" -version = "0.11.0-beta.8" -source = "git+https://github.com/BP-WG/bp-core?branch=develop#6ae56d5a005f0e0fc761516fb96c2c47bb13de46" +version = "0.11.0-beta.9" +source = "git+https://github.com/BP-WG/bp-core?branch=develop#59e41d4dd80fcbb27583d5f32b342873dc917602" dependencies = [ "amplify", "chrono", "commit_verify", - "secp256k1", + "secp256k1 0.30.0", "serde", "strict_encoding", "strict_types", @@ -216,8 +231,8 @@ dependencies = [ [[package]] name = "bp-core" -version = "0.11.0-beta.8" -source = "git+https://github.com/BP-WG/bp-core?branch=develop#6ae56d5a005f0e0fc761516fb96c2c47bb13de46" +version = "0.11.0-beta.9" +source = "git+https://github.com/BP-WG/bp-core?branch=develop#59e41d4dd80fcbb27583d5f32b342873dc917602" dependencies = [ "amplify", "bp-consensus", @@ -234,22 +249,22 @@ dependencies = [ [[package]] name = "bp-dbc" -version = "0.11.0-beta.8" -source = "git+https://github.com/BP-WG/bp-core?branch=develop#6ae56d5a005f0e0fc761516fb96c2c47bb13de46" +version = "0.11.0-beta.9" +source = "git+https://github.com/BP-WG/bp-core?branch=develop#59e41d4dd80fcbb27583d5f32b342873dc917602" dependencies = [ "amplify", "base85", "bp-consensus", "commit_verify", - "secp256k1", + "secp256k1 0.30.0", "serde", "strict_encoding", ] [[package]] name = "bp-seals" -version = "0.11.0-beta.8" -source = "git+https://github.com/BP-WG/bp-core?branch=develop#6ae56d5a005f0e0fc761516fb96c2c47bb13de46" +version = "0.11.0-beta.9" +source = "git+https://github.com/BP-WG/bp-core?branch=develop#59e41d4dd80fcbb27583d5f32b342873dc917602" dependencies = [ "amplify", "baid64", @@ -276,9 +291,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "cc" -version = "1.1.16" +version = "1.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9d013ecb737093c0e86b151a7b837993cf9ec6c502946cfb44bedc392421e0b" +checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" dependencies = [ "shlex", ] @@ -305,9 +320,8 @@ dependencies = [ [[package]] name = "commit_encoding_derive" -version = "0.11.0-beta.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea07c5ad73a637276dc4f8a957f8285764018d45bdefef35eb9137f32d0e3c81" +version = "0.11.0-beta.9" +source = "git+https://github.com/LNP-BP/client_side_validation?branch=develop#4015f1fb9e99fdc536c69b957fa5727da9cfa6a9" dependencies = [ "amplify", "amplify_syn", @@ -318,9 +332,8 @@ dependencies = [ [[package]] name = "commit_verify" -version = "0.11.0-beta.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82a1982dc6c54d2dcfa2bf4398d97e4e80a93f24d2537e58d6110b2b272cff0c" +version = "0.11.0-beta.9" +source = "git+https://github.com/LNP-BP/client_side_validation?branch=develop#4015f1fb9e99fdc536c69b957fa5727da9cfa6a9" dependencies = [ "amplify", "commit_encoding_derive", @@ -357,9 +370,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] @@ -431,9 +444,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" [[package]] name = "heck" @@ -441,11 +454,20 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hex-conservative" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" +dependencies = [ + "arrayvec", +] + [[package]] name = "iana-time-zone" -version = "0.1.60" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -466,9 +488,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", "hashbrown", @@ -482,18 +504,18 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] [[package]] name = "libc" -version = "0.2.158" +version = "0.2.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" [[package]] name = "log" @@ -540,9 +562,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "paste" @@ -561,9 +583,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" dependencies = [ "unicode-ident", ] @@ -609,7 +631,7 @@ dependencies = [ [[package]] name = "rgb-core" -version = "0.11.0-beta.8" +version = "0.11.0-beta.9" dependencies = [ "aluvm", "amplify", @@ -661,10 +683,22 @@ checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" [[package]] name = "secp256k1" -version = "0.29.0" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" +dependencies = [ + "rand", + "secp256k1-sys", + "serde", +] + +[[package]] +name = "secp256k1" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0cc0f1cf93f4969faf3ea1c7d8a9faed25918d96affa959720823dfe86d4f3" +checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" dependencies = [ + "bitcoin_hashes", "rand", "secp256k1-sys", "serde", @@ -672,9 +706,9 @@ dependencies = [ [[package]] name = "secp256k1-sys" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1433bd67156263443f14d603720b082dd3121779323fce20cba2aa07b874bc1b" +checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" dependencies = [ "cc", ] @@ -687,7 +721,7 @@ checksum = "52a44aed3002b5ae975f8624c5df3a949cfbf00479e18778b6058fcd213b76e3" dependencies = [ "bitcoin-private", "rand", - "secp256k1", + "secp256k1 0.29.1", "secp256k1-zkp-sys", "serde", ] @@ -704,29 +738,29 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.209" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.209" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "serde_json" -version = "1.0.127" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ "itoa", "memchr", @@ -736,9 +770,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -785,9 +819,8 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "single_use_seals" -version = "0.11.0-beta.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1a4c51f21507cf63984c367507f281215073e85b08711ed7da4fc63dbd709e0" +version = "0.11.0-beta.9" +source = "git+https://github.com/LNP-BP/client_side_validation?branch=develop#4015f1fb9e99fdc536c69b957fa5727da9cfa6a9" dependencies = [ "amplify_derive", ] @@ -862,9 +895,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.77" +version = "2.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" dependencies = [ "proc-macro2", "quote", @@ -873,22 +906,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -914,9 +947,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.20" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ "indexmap", "serde", @@ -933,9 +966,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unsafe-libyaml" @@ -977,9 +1010,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", "once_cell", @@ -988,24 +1021,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.43" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" dependencies = [ "cfg-if", "js-sys", @@ -1015,9 +1048,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1025,28 +1058,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "wasm-bindgen-test" -version = "0.3.43" +version = "0.3.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68497a05fb21143a08a7d24fc81763384a3072ee43c44e86aad1744d6adef9d9" +checksum = "d381749acb0943d357dcbd8f0b100640679883fcdeeef04def49daf8d33a5426" dependencies = [ "console_error_panic_hook", "js-sys", @@ -1059,20 +1092,20 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.43" +version = "0.3.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8220be1fa9e4c889b30fd207d4906657e7e90b12e0e6b0c8b8d8709f5de021" +checksum = "c97b2ef2c8d627381e51c071c2ab328eac606d3f69dd82bcbca20a9e389d95f0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "web-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" dependencies = [ "js-sys", "wasm-bindgen", @@ -1171,9 +1204,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.18" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] @@ -1196,15 +1229,5 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] - -[[patch.unused]] -name = "commit_verify" -version = "0.11.0-beta.9" -source = "git+https://github.com/LNP-BP/client_side_validation?branch=develop#4015f1fb9e99fdc536c69b957fa5727da9cfa6a9" - -[[patch.unused]] -name = "single_use_seals" -version = "0.11.0-beta.9" -source = "git+https://github.com/LNP-BP/client_side_validation?branch=develop#4015f1fb9e99fdc536c69b957fa5727da9cfa6a9" diff --git a/Cargo.toml b/Cargo.toml index 4777f9df..7c06b551 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rgb-core" -version = "0.11.0-beta.8" +version = "0.11.0-beta.9" authors = ["Dr Maxim Orlovsky "] description = "RGB Core Library: confidential & scalable smart contracts on Bitcoin & Lightning (consensus layer)" repository = "https://github.com/RGB-WG/rgb-core" @@ -26,10 +26,10 @@ amplify = { version = "~4.7.0", features = ["rand"] } baid64 = "~0.2.2" strict_encoding = "~2.7.0" strict_types = { version = "~2.7.0", features = ["armor"] } -aluvm = { version = "~0.11.0-beta.8", features = ["std", "ascii-armor"] } -commit_verify = { version = "~0.11.0-beta.8", features = ["rand", "derive"] } -single_use_seals = "~0.11.0-beta.8" -bp-core = { version = "~0.11.0-beta.8" } +aluvm = { version = "~0.11.0-beta.9", features = ["std", "ascii-armor"] } +commit_verify = { version = "~0.11.0-beta.9", features = ["rand", "derive"] } +single_use_seals = "~0.11.0-beta.9" +bp-core = { version = "~0.11.0-beta.9" } secp256k1-zkp = { version = "0.11.0", features = ["rand", "rand-std", "global-context"] } # TODO: Update version before the release mime = "~0.3.17" serde_crate = { package = "serde", version = "1", features = ["derive"], optional = true } @@ -64,6 +64,7 @@ features = ["all"] [patch.crates-io] commit_verify = { git = "https://github.com/LNP-BP/client_side_validation", branch = "develop" } single_use_seals = { git = "https://github.com/LNP-BP/client_side_validation", branch = "develop" } +aluvm = { git = "https://github.com/AluVM/rust-aluvm", branch = "develop" } bp-consensus = { git = "https://github.com/BP-WG/bp-core", branch = "develop" } bp-dbc = { git = "https://github.com/BP-WG/bp-core", branch = "develop" } bp-seals = { git = "https://github.com/BP-WG/bp-core", branch = "develop" } From 58c81b3d99f858ada5b03678fe78071e4e7eaa26 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 13 Oct 2024 13:22:06 +0200 Subject: [PATCH 09/70] chore: bump MSRV due to rustfix dependency --- .github/workflows/build.yml | 2 +- Cargo.toml | 2 +- MANIFEST.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1e23eae6..b9277def 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -57,7 +57,7 @@ jobs: strategy: fail-fast: false matrix: - toolchain: [ nightly, beta, stable, 1.76.0 ] + toolchain: [ nightly, beta, stable, 1.77.0 ] steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@master diff --git a/Cargo.toml b/Cargo.toml index 7c06b551..ce5303e5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ categories = ["cryptography::cryptocurrencies"] readme = "README.md" license = "Apache-2.0" edition = "2021" -rust-version = "1.76.0" +rust-version = "1.77.0" # Due to `rustfix` exclude = [".github"] [lib] diff --git a/MANIFEST.yml b/MANIFEST.yml index 05b4196b..5d9baa92 100644 --- a/MANIFEST.yml +++ b/MANIFEST.yml @@ -3,7 +3,7 @@ Type: Library Kind: Free software License: Apache-2.0 Language: Rust -Compiler: 1.76 +Compiler: 1.77 Author: Maxim Orlovsky Maintained: LNP/BP Standards Association, Switzerland Maintainers: From 93867bc57e6d4b64dfdcad2de52f67930355927c Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 13 Oct 2024 13:56:01 +0200 Subject: [PATCH 10/70] ci: update branch selection criteria --- .github/workflows/build.yml | 4 ++-- .github/workflows/codecov.yml | 4 ++-- .github/workflows/lint.yml | 2 +- .github/workflows/test.yml | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b9277def..db0669f1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,12 +5,12 @@ on: branches: - master tags: - - 'v[0-9]+\.*' + - 'v\d+\.*' pull_request: branches: - master - develop - - 'v[0-9]+.[0-9]+' + - 'v\d+(\.\d+)*' env: CARGO_TERM_COLOR: always diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml index 3711d7ad..8624aba9 100644 --- a/.github/workflows/codecov.yml +++ b/.github/workflows/codecov.yml @@ -5,12 +5,12 @@ on: branches: - master tags: - - 'v[0-9]+\.*' + - 'v\d+\.*' pull_request: branches: - master - develop - - 'v[0-9]+.[0-9]+' + - 'v\d+(\.\d+)*' env: CARGO_TERM_COLOR: always diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index ab5249d1..29e0ebc0 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -5,7 +5,7 @@ on: branches: - master - develop - - 'v[0-9]+.[0-9]+' + - 'v\d+(\.\d+)*' env: CARGO_TERM_COLOR: always diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9821d00e..b6bd2c74 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -5,12 +5,12 @@ on: branches: - master tags: - - 'v[0-9]+\.*' + - 'v\d+\.*' pull_request: branches: - master - develop - - 'v[0-9]+.[0-9]+' + - 'v\d+(\.\d+)*' env: CARGO_TERM_COLOR: always From 5ff9821c4843c44fd3292d4d7fc0ee82156a124f Mon Sep 17 00:00:00 2001 From: "Dr. Maxim Orlovsky" Date: Tue, 15 Oct 2024 12:16:56 +0200 Subject: [PATCH 11/70] vm: fix checks for the blocktime window in consensus ordering Co-authored-by: Stefano Pellegrini <33753050+St333p@users.noreply.github.com> --- src/vm/contract.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vm/contract.rs b/src/vm/contract.rs index 633c3492..e0d5534f 100644 --- a/src/vm/contract.rs +++ b/src/vm/contract.rs @@ -375,12 +375,12 @@ impl Ord for WitnessPos { match (self.layer1, other.layer1) { (a, b) if a == b => self.height.cmp(&other.height), (Layer1::Bitcoin, Layer1::Liquid) - if (self.timestamp - other.timestamp).abs() >= BLOCK_TIME => + if (self.timestamp - other.timestamp).abs() < BLOCK_TIME => { Ordering::Greater } (Layer1::Liquid, Layer1::Bitcoin) - if (other.timestamp - self.timestamp).abs() >= BLOCK_TIME => + if (other.timestamp - self.timestamp).abs() < BLOCK_TIME => { Ordering::Less } From 476c9e78ef0e71519daf4357dfd7ff49fbe68f37 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Tue, 15 Oct 2024 21:42:52 +0200 Subject: [PATCH 12/70] chore: update dependencies, fix lints --- Cargo.lock | 87 +++++++++++++++++++---------------- Cargo.toml | 11 +---- src/operation/xchain.rs | 7 +-- src/validation/consignment.rs | 6 +-- src/vm/op_contract.rs | 18 ++++++-- stl/RGBCommit@0.1.0.sty | 8 ++-- 6 files changed, 69 insertions(+), 68 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c201786d..761d4752 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5,7 +5,8 @@ version = 3 [[package]] name = "aluvm" version = "0.11.0-beta.9" -source = "git+https://github.com/AluVM/rust-aluvm?branch=develop#24bff9f61570ea26d14e86aa5e127937aa122440" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2a6767842958f458dc7010a2a1005db96dfaceadd366d07532c5045bbc81f24" dependencies = [ "amplify", "ascii-armor", @@ -218,7 +219,8 @@ dependencies = [ [[package]] name = "bp-consensus" version = "0.11.0-beta.9" -source = "git+https://github.com/BP-WG/bp-core?branch=develop#59e41d4dd80fcbb27583d5f32b342873dc917602" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54db63118d55e32ea78f8775e98871d442a33e3bdef6419c7964d71b308316c0" dependencies = [ "amplify", "chrono", @@ -232,7 +234,8 @@ dependencies = [ [[package]] name = "bp-core" version = "0.11.0-beta.9" -source = "git+https://github.com/BP-WG/bp-core?branch=develop#59e41d4dd80fcbb27583d5f32b342873dc917602" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e51a329150531b12243adf51d978490c796a6a20ec76c506b41c8e1226022bc" dependencies = [ "amplify", "bp-consensus", @@ -250,7 +253,8 @@ dependencies = [ [[package]] name = "bp-dbc" version = "0.11.0-beta.9" -source = "git+https://github.com/BP-WG/bp-core?branch=develop#59e41d4dd80fcbb27583d5f32b342873dc917602" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9286fb448160672148262317f4647ebdcdd4699ed2bd34401f9799d0920cc376" dependencies = [ "amplify", "base85", @@ -264,7 +268,8 @@ dependencies = [ [[package]] name = "bp-seals" version = "0.11.0-beta.9" -source = "git+https://github.com/BP-WG/bp-core?branch=develop#59e41d4dd80fcbb27583d5f32b342873dc917602" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9873cfe420f4ce5cc539c394c75df0669cdbe2c23eed1930dffe024cb0f13a57" dependencies = [ "amplify", "baid64", @@ -291,9 +296,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "cc" -version = "1.1.30" +version = "1.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" +checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" dependencies = [ "shlex", ] @@ -320,8 +325,9 @@ dependencies = [ [[package]] name = "commit_encoding_derive" -version = "0.11.0-beta.9" -source = "git+https://github.com/LNP-BP/client_side_validation?branch=develop#4015f1fb9e99fdc536c69b957fa5727da9cfa6a9" +version = "0.11.0-beta.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea07c5ad73a637276dc4f8a957f8285764018d45bdefef35eb9137f32d0e3c81" dependencies = [ "amplify", "amplify_syn", @@ -333,7 +339,8 @@ dependencies = [ [[package]] name = "commit_verify" version = "0.11.0-beta.9" -source = "git+https://github.com/LNP-BP/client_side_validation?branch=develop#4015f1fb9e99fdc536c69b957fa5727da9cfa6a9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bf08c4941e147937551f6a3d370552d67f98cf72c9eb18948142596beadd31e" dependencies = [ "amplify", "commit_encoding_derive", @@ -494,6 +501,7 @@ checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", "hashbrown", + "serde", ] [[package]] @@ -513,9 +521,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.159" +version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "log" @@ -537,9 +545,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "minicov" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c71e683cd655513b99affab7d317deb690528255a0d5f717f1024093c12b169" +checksum = "def6d99771d7c499c26ad4d40eb6645eafd3a1553b35fc26ea5a489a45e82d9a" dependencies = [ "cc", "walkdir", @@ -583,9 +591,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.87" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] @@ -728,9 +736,9 @@ dependencies = [ [[package]] name = "secp256k1-zkp-sys" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c6eea7919e0cab992510edfbf40bd9342c0a3c2bb910f2c51355c2cb2d69839" +checksum = "57f08b2d0b143a22e07f798ae4f0ab20d5590d7c68e0d090f2088a48a21d1654" dependencies = [ "cc", "secp256k1-sys", @@ -738,29 +746,29 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.210" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] name = "serde_json" -version = "1.0.128" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ "itoa", "memchr", @@ -820,7 +828,8 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "single_use_seals" version = "0.11.0-beta.9" -source = "git+https://github.com/LNP-BP/client_side_validation?branch=develop#4015f1fb9e99fdc536c69b957fa5727da9cfa6a9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec071f3b3153217f1cb2bca5ba7ac87eeafc446cb35a5c0643dec33495a37244" dependencies = [ "amplify_derive", ] @@ -853,9 +862,9 @@ dependencies = [ [[package]] name = "strict_types" -version = "2.7.0" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f16e8855a575633815f01482ac927ebaca3d2485aec8e17226c6826de29154e" +checksum = "8bae7475fc901144d8a35d25e36d76aa020b840f233d60532d6d52318718781b" dependencies = [ "amplify", "ascii-armor", @@ -895,9 +904,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.79" +version = "2.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" dependencies = [ "proc-macro2", "quote", @@ -906,22 +915,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.64" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" +checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.64" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" +checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -1030,7 +1039,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", "wasm-bindgen-shared", ] @@ -1064,7 +1073,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1098,7 +1107,7 @@ checksum = "c97b2ef2c8d627381e51c071c2ab328eac606d3f69dd82bcbca20a9e389d95f0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -1229,5 +1238,5 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] diff --git a/Cargo.toml b/Cargo.toml index ce5303e5..a87ec3bf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,7 +25,7 @@ required-features = ["stl"] amplify = { version = "~4.7.0", features = ["rand"] } baid64 = "~0.2.2" strict_encoding = "~2.7.0" -strict_types = { version = "~2.7.0", features = ["armor"] } +strict_types = { version = "~2.7.2", features = ["armor"] } aluvm = { version = "~0.11.0-beta.9", features = ["std", "ascii-armor"] } commit_verify = { version = "~0.11.0-beta.9", features = ["rand", "derive"] } single_use_seals = "~0.11.0-beta.9" @@ -60,12 +60,3 @@ wasm-bindgen-test = "0.3" [package.metadata.docs.rs] features = ["all"] - -[patch.crates-io] -commit_verify = { git = "https://github.com/LNP-BP/client_side_validation", branch = "develop" } -single_use_seals = { git = "https://github.com/LNP-BP/client_side_validation", branch = "develop" } -aluvm = { git = "https://github.com/AluVM/rust-aluvm", branch = "develop" } -bp-consensus = { git = "https://github.com/BP-WG/bp-core", branch = "develop" } -bp-dbc = { git = "https://github.com/BP-WG/bp-core", branch = "develop" } -bp-seals = { git = "https://github.com/BP-WG/bp-core", branch = "develop" } -bp-core = { git = "https://github.com/BP-WG/bp-core", branch = "develop" } diff --git a/src/operation/xchain.rs b/src/operation/xchain.rs index 81fc737d..91a606a1 100644 --- a/src/operation/xchain.rs +++ b/src/operation/xchain.rs @@ -42,12 +42,7 @@ pub const XCHAIN_LIQUID_PREFIX: &str = "lq"; #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Display)] #[display(lowercase)] -#[derive( - strict_encoding::StrictType, - StrictDumb, - strict_encoding::StrictEncode, - strict_encoding::StrictDecode -)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB_COMMIT, tags = repr, into_u8, try_from_u8)] #[cfg_attr( feature = "serde", diff --git a/src/validation/consignment.rs b/src/validation/consignment.rs index 9499d2e1..93800981 100644 --- a/src/validation/consignment.rs +++ b/src/validation/consignment.rs @@ -24,10 +24,8 @@ //! state transitions, extensions, genesis, outputs, assignments & //! single-use-seal data. -use std::collections::BTreeMap; - use aluvm::library::{Lib, LibId}; -use amplify::confinement::Confined; +use amplify::confinement::ConfinedOrdMap; use strict_types::TypeSystem; use super::EAnchor; @@ -40,7 +38,7 @@ use crate::{ pub const CONSIGNMENT_MAX_LIBS: usize = 1024; -pub type Scripts = Confined, 0, CONSIGNMENT_MAX_LIBS>; +pub type Scripts = ConfinedOrdMap; #[derive(Copy, Clone, PartialEq, Eq, Debug, From)] pub enum OpRef<'op> { diff --git a/src/vm/op_contract.rs b/src/vm/op_contract.rs index 5d971ff9..040277ec 100644 --- a/src/vm/op_contract.rs +++ b/src/vm/op_contract.rs @@ -340,7 +340,11 @@ impl InstructionSet for ContractOp { fail!() }; let state = state.map(|s| s.value.as_inner()); - regs.set_s(*reg, state); + if let Some(state) = state { + regs.set_s16(*reg, state); + } else { + regs.clr_s16(*reg); + } } ContractOp::LdS(state_type, reg_32, reg) => { let Some(reg_32) = *regs.get_n(RegA::A16, *reg_32) else { @@ -357,7 +361,11 @@ impl InstructionSet for ContractOp { fail!() }; let state = state.map(|s| s.value.into_inner()); - regs.set_s(*reg, state); + if let Some(state) = state { + regs.set_s16(*reg, state); + } else { + regs.clr_s16(*reg); + } } ContractOp::LdF(state_type, reg_32, reg) => { let Some(reg_32) = *regs.get_n(RegA::A16, *reg_32) else { @@ -389,7 +397,7 @@ impl InstructionSet for ContractOp { else { fail!() }; - regs.set_s(*reg_s, Some(state.as_inner())); + regs.set_s16(*reg_s, state.as_inner()); } ContractOp::LdC(state_type, reg_32, reg_s) => { @@ -407,13 +415,13 @@ impl InstructionSet for ContractOp { let Some(state) = global.nth(index) else { fail!() }; - regs.set_s(*reg_s, Some(state.borrow().as_inner())); + regs.set_s16(*reg_s, state.borrow().as_inner()); } ContractOp::LdM(type_id, reg) => { let Some(meta) = context.op_info.metadata.get(type_id) else { fail!() }; - regs.set_s(*reg, Some(meta.to_inner())); + regs.set_s16(*reg, meta.to_inner()); } ContractOp::Pcvs(state_type) => { diff --git a/stl/RGBCommit@0.1.0.sty b/stl/RGBCommit@0.1.0.sty index 4fbfa1e5..2f28c663 100644 --- a/stl/RGBCommit@0.1.0.sty +++ b/stl/RGBCommit@0.1.0.sty @@ -45,7 +45,7 @@ import Bitcoin#signal-color-cipher @mnemonic(edison-survive-nitro) -data AltLayer1 : liquid#1 +data AltLayer1 : liquid#1 | (|) @mnemonic(almond-office-pulse) @@ -239,10 +239,10 @@ data ExtensionType : U16 data Ffv : U16 @mnemonic(guide-poker-coconut) -data FungibleState : bits64#8 U64 +data FungibleState : bits64#8 U64 | (|) @mnemonic(matrix-optimal-sinatra) -data FungibleType : unsigned64Bit#8 +data FungibleType : unsigned64Bit#8 | (|) @mnemonic(fashion-delta-polka) @@ -294,7 +294,7 @@ data InputMap : {Bitcoin.Vout -> ^ 1.. OpId} data Inputs : {Input} @mnemonic(isabel-heaven-north) -data MediaType : any#255 +data MediaType : any#255 | (|) @mnemonic(quebec-mission-quota) From 91a270cfb0a07e3ff1122c5a6732af3a5f740f4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Mon, 13 Jan 2025 15:20:48 +0100 Subject: [PATCH 13/70] chore: lint code with rust 1.84.0 --- src/validation/consignment.rs | 2 +- src/vm/contract.rs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/validation/consignment.rs b/src/validation/consignment.rs index 93800981..3db37d6e 100644 --- a/src/validation/consignment.rs +++ b/src/validation/consignment.rs @@ -162,7 +162,7 @@ impl<'consignment, C: ConsignmentApi> CheckedConsignment<'consignment, C> { pub fn new(consignment: &'consignment C) -> Self { Self(consignment) } } -impl<'consignment, C: ConsignmentApi> ConsignmentApi for CheckedConsignment<'consignment, C> { +impl ConsignmentApi for CheckedConsignment<'_, C> { fn schema(&self) -> &Schema { self.0.schema() } fn types(&self) -> &TypeSystem { self.0.types() } diff --git a/src/vm/contract.rs b/src/vm/contract.rs index e0d5534f..4bb5d4cb 100644 --- a/src/vm/contract.rs +++ b/src/vm/contract.rs @@ -148,15 +148,15 @@ pub enum OrdOpRef<'op> { Extension(&'op Extension, XWitnessId, WitnessOrd), } -impl<'op> PartialOrd for OrdOpRef<'op> { +impl PartialOrd for OrdOpRef<'_> { fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } } -impl<'op> Ord for OrdOpRef<'op> { +impl Ord for OrdOpRef<'_> { fn cmp(&self, other: &Self) -> Ordering { self.op_ord().cmp(&other.op_ord()) } } -impl<'op> OrdOpRef<'op> { +impl OrdOpRef<'_> { pub fn witness_id(&self) -> Option { match self { OrdOpRef::Genesis(_) => None, From e1f04810362f7dd2e6e7491d971d5d484be113d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Wed, 4 Dec 2024 11:05:40 +0100 Subject: [PATCH 14/70] schema: remove support for alt layers --- doc/Commitments.md | 8 +- src/operation/commit.rs | 2 - src/operation/mod.rs | 4 +- src/operation/operations.rs | 20 +- src/operation/xchain.rs | 42 +--- src/stl.rs | 4 +- src/validation/validator.rs | 13 +- stl/RGBCommit@0.1.0.sta | 469 ++++++++++++++++++------------------ stl/RGBCommit@0.1.0.stl | Bin 16309 -> 16103 bytes stl/RGBCommit@0.1.0.sty | 15 +- stl/RGBLogic@0.1.0.sta | 26 +- stl/RGBLogic@0.1.0.stl | Bin 1659 -> 1659 bytes stl/RGBLogic@0.1.0.sty | 14 +- stl/Transition.vesper | 1 - 14 files changed, 286 insertions(+), 332 deletions(-) diff --git a/doc/Commitments.md b/doc/Commitments.md index 9eb90d18..2c789f4c 100644 --- a/doc/Commitments.md +++ b/doc/Commitments.md @@ -201,10 +201,9 @@ assignments are concealed before the merklization, and range proofs are removed from the commitment, such that an aggregation of the historical proofs can be applied without changing the operation ids. -To ensure succinctness, other types of collections, such as redeemed and -defined valencies and list of alternate layer 1 in genesis are not merklized -and strict-serialized producing `StrictHash`, which participates in the final -`OpCommitment` structure. +To ensure succinctness, other types of collections, such as redeemed and +defined valencies in genesis are not merklized and strict-serialized producing +`StrictHash`, which participates in the final `OpCommitment` structure. ```mermaid flowchart LR @@ -222,7 +221,6 @@ flowchart LR subgraph "Genesis" schemaId --> BaseCommitment testnet --> BaseCommitment - altLayers1 -- StrictHash --> BaseCommitment end subgraph "Transition" diff --git a/src/operation/commit.rs b/src/operation/commit.rs index 93796a4d..88d77de9 100644 --- a/src/operation/commit.rs +++ b/src/operation/commit.rs @@ -237,7 +237,6 @@ pub struct BaseCommitment { pub timestamp: i64, pub issuer: StrictHash, pub testnet: bool, - pub alt_layers1: StrictHash, pub asset_tags: StrictHash, } @@ -281,7 +280,6 @@ impl Genesis { schema_id: self.schema_id, timestamp: self.timestamp, testnet: self.testnet, - alt_layers1: self.alt_layers1.commit_id(), issuer: self.issuer.commit_id(), asset_tags: self.asset_tags.commit_id(), }; diff --git a/src/operation/mod.rs b/src/operation/mod.rs index c13450be..61a04c77 100644 --- a/src/operation/mod.rs +++ b/src/operation/mod.rs @@ -60,6 +60,6 @@ pub use seal::{ }; pub use state::{ConcealedState, ConfidentialState, ExposedState, RevealedState, StateType}; pub use xchain::{ - AltLayer1, AltLayer1Set, Impossible, Layer1, XChain, XChainParseError, XOutpoint, - XCHAIN_BITCOIN_PREFIX, XCHAIN_LIQUID_PREFIX, + Impossible, Layer1, XChain, XChainParseError, XOutpoint, XCHAIN_BITCOIN_PREFIX, + XCHAIN_LIQUID_PREFIX, }; diff --git a/src/operation/operations.rs b/src/operation/operations.rs index e4ed6cf2..29018a46 100644 --- a/src/operation/operations.rs +++ b/src/operation/operations.rs @@ -37,10 +37,10 @@ use strict_encoding::{RString, StrictDeserialize, StrictEncode, StrictSerialize} use crate::schema::{self, ExtensionType, OpFullType, OpType, SchemaId, TransitionType}; use crate::{ - AltLayer1Set, AssetTag, Assign, AssignmentIndex, AssignmentType, Assignments, AssignmentsRef, + AssetTag, Assign, AssignmentIndex, AssignmentType, Assignments, AssignmentsRef, ConcealedAttach, ConcealedData, ConcealedValue, ContractId, DiscloseHash, ExposedState, Ffv, - GenesisSeal, GlobalState, GraphSeal, Metadata, OpDisclose, OpId, SecretSeal, TypedAssigns, - VoidState, XChain, LIB_NAME_RGB_COMMIT, + GenesisSeal, GlobalState, GraphSeal, Layer1, Metadata, OpDisclose, OpId, SecretSeal, + TypedAssigns, VoidState, XChain, LIB_NAME_RGB_COMMIT, }; #[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display)] @@ -360,7 +360,6 @@ pub struct Genesis { pub timestamp: i64, pub issuer: Identity, pub testnet: bool, - pub alt_layers1: AltLayer1Set, pub asset_tags: AssetTags, pub metadata: Metadata, pub globals: GlobalState, @@ -372,6 +371,19 @@ pub struct Genesis { impl StrictSerialize for Genesis {} impl StrictDeserialize for Genesis {} +impl Genesis { + pub fn layer1(&self) -> Option { + if let Some((_, typed_assigns)) = self.assignments.iter().next() { + typed_assigns + .to_confidential_seals() + .first() + .map(|cs| cs.layer1()) + } else { + None + } + } +} + #[derive(Clone, PartialEq, Eq, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB_COMMIT)] diff --git a/src/operation/xchain.rs b/src/operation/xchain.rs index 91a606a1..8178aaaf 100644 --- a/src/operation/xchain.rs +++ b/src/operation/xchain.rs @@ -26,9 +26,8 @@ use std::fmt::{Debug, Display, Formatter}; use std::str::FromStr; use std::{fmt, io}; -use amplify::confinement::TinyOrdSet; use bp::{Bp, Outpoint}; -use commit_verify::{Conceal, StrictHash}; +use commit_verify::Conceal; use strict_encoding::{ DecodeError, DefineUnion, ReadTuple, ReadUnion, StrictDecode, StrictDumb, StrictEncode, StrictEnum, StrictSum, StrictType, StrictUnion, TypedRead, TypedWrite, VariantError, @@ -105,31 +104,6 @@ mod _serde { } } -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Display)] -#[display(lowercase)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT, tags = repr, into_u8, try_from_u8)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", rename_all = "camelCase") -)] -#[repr(u8)] -pub enum AltLayer1 { - #[strict_type(dumb)] - Liquid = 1, - // Abraxas = 0x10, - // Prime = 0x11, -} - -impl AltLayer1 { - pub fn layer1(&self) -> Layer1 { - match self { - AltLayer1::Liquid => Layer1::Liquid, - } - } -} - #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] #[cfg_attr( feature = "serde", @@ -180,20 +154,6 @@ impl FromStr for Impossible { fn from_str(_: &str) -> Result { panic!("must not be parsed") } } -#[derive(Wrapper, WrapperMut, Clone, PartialEq, Eq, Hash, Debug, Default, From)] -#[wrapper(Deref)] -#[wrapper_mut(DerefMut)] -#[derive(StrictType, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT)] -#[derive(CommitEncode)] -#[commit_encode(strategy = strict, id = StrictHash)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", transparent) -)] -pub struct AltLayer1Set(TinyOrdSet); - #[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] #[cfg_attr( feature = "serde", diff --git a/src/stl.rs b/src/stl.rs index bbc97c6f..98bbfee7 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -37,10 +37,10 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_COMMIT: &str = - "stl:IFcnrPeI-TANxLfZ-feJax6Q-1TUM4Hq-AjI161s-3tbmxak#harvest-person-orion"; + "stl:bJ8Swut6-fEFixNt-bJuRY6D-ZNyYV2D-aNfTFnN-68w5Ngk#point-ariel-kinetic"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:mqltqlPk-O9$pYOd-BACRI70-DOMJ6cp-TFvhcK1-ibrOI9U#import-boxer-seminar"; + "stl:lvwcOo0a-!8WJfTD-eeERZkb-hZFG$r5-W2uKv!P-Oujw$hM#regular-moment-north"; fn _rgb_commit_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_COMMIT), tiny_bset! { diff --git a/src/validation/validator.rs b/src/validation/validator.rs index 941bc14f..e0c25234 100644 --- a/src/validation/validator.rs +++ b/src/validation/validator.rs @@ -36,8 +36,8 @@ use crate::vm::{ ContractStateAccess, ContractStateEvolve, OrdOpRef, WitnessOrd, XWitnessId, XWitnessTx, }; use crate::{ - validation, AltLayer1, BundleId, ContractId, Layer1, OpId, OpType, Operation, Opout, Schema, - SchemaId, TransitionBundle, XChain, XOutpoint, XOutputSeal, + validation, BundleId, ContractId, Layer1, OpId, OpType, Operation, Opout, Schema, SchemaId, + TransitionBundle, XChain, XOutpoint, XOutputSeal, }; #[derive(Clone, PartialEq, Eq, Debug, Display, Error, From)] @@ -134,7 +134,7 @@ pub struct Validator< schema_id: SchemaId, contract_id: ContractId, - layers1: BTreeSet, + layer1: Option, contract_state: Rc>, validated_op_seals: RefCell>, @@ -164,15 +164,14 @@ impl< // Prevent repeated validation of single-use seals let validated_op_seals = RefCell::new(BTreeSet::::new()); - let mut layers1 = bset! { Layer1::Bitcoin }; - layers1.extend(genesis.alt_layers1.iter().map(AltLayer1::layer1)); + let layer1 = genesis.layer1(); Self { consignment, status: RefCell::new(status), schema_id, contract_id, - layers1, + layer1, validated_op_seals, resolver: CheckedWitnessResolver::from(resolver), contract_state: Rc::new(RefCell::new(S::init(context))), @@ -581,7 +580,7 @@ impl< }); continue; } - if !self.layers1.contains(&seal.layer1()) { + if self.layer1 != Some(seal.layer1()) { self.status .borrow_mut() .add_failure(Failure::SealLayerMismatch(seal.layer1(), seal)); diff --git a/stl/RGBCommit@0.1.0.sta b/stl/RGBCommit@0.1.0.sta index 67979284..6d9e7b7f 100644 --- a/stl/RGBCommit@0.1.0.sta +++ b/stl/RGBCommit@0.1.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:IFcnrPeI-TANxLfZ-feJax6Q-1TUM4Hq-AjI161s-3tbmxak#harvest-person-orion +Id: stl:bJ8Swut6-fEFixNt-bJuRY6D-ZNyYV2D-aNfTFnN-68w5Ngk#point-ariel-kinetic Name: RGBCommit Dependencies: StrictTypes#century-comrade-chess, @@ -8,7 +8,7 @@ Dependencies: CommitVerify#miller-pancake-elastic, Std#ralph-blue-lucky, Bitcoin#signal-color-cipher -Check-SHA256: 1d68b2a0bcfecf99effcecd7c9c35f870a1300e71a3ce3da8144587537895235 +Check-SHA256: 82a24c15af2ab669424b2ec84616a7e10732d416be18db9d5eb70b1ce9711603 2~tNwLvL+uX>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI)Q*?4^V{}w`aAk8=6V}(%hjW>8 uUwNXi!t*yd7K}=K!`A`1OPgv%fUznLQq3*a%Ez0HGd)Hmb;*F>vukd; =m`ygb@x#_>`RmOO$0)3Z)}yry~#}iVEJ)s5j^%uEnQ9{n2s|9Fa^ps+HG#`XS5DMY;b5{PIYZeZ)9O} Xt{%a=RmHK6WZ%EWRm@*ULd%lgGoFTxUTU 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 +6&DQwR5(-fxrUo0ThEiz^#2Wm1QOk9#fajy(iy +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 -6oKLk -F4~iax8KK|47hp+cWHEPWpi@^dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0Thxis%Ku=2wF+7z(Wqt=tdZk`V^s(Ana000000093000000000Ma -Wn^V#ZF2w#0Y>fS!w4MxxaL=+DqP^k2!wz9AHH68xp8!<%Jqp^&Hw-a000000RI300000001IJrb7^O8 -ZDnqBa{vkfhyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB! -)|10-o)0prc>n+a000000RI3000000010+sY-Mg^X=QT&2?0j!=EDda{kY~=q$*tC#t4Le{2#tvcDZqM -smk?aU=OZ$bvG|>z)+>9PT;Au-7)~D;-++htxcywiMb7^mG -RC#b^1pxp60s}^7b_D?d00Iq0b#7;AVr*qobYXO51OW&JVrg`9HZ%YQ0RR993`TWsXK7+=WmI`^Wdi{X -b#8NMXKrO=HZ($MbO;AWWo~72X>$e*17>D+0ot2U6Id2jc94hrndMfLayEe1ISdA&%p{mB1!VWk)d+KA -Xk~3-Nn`<(Qq$W5tE;F{pQrXd&=l*`O?@#x{Qdy?T_k!`1dtE~W^7?+a{_t;9p7nv%krpqNDb5bYX39002k^X>)UR -WpV+w=zxYCD0L!x4tB5Hm3vFbl?lapNXe%XU~*fKJ0+Y4bY*jNZe?@=$}AplgPGkh3_fq3Q7_j=2#kPT -_9!;lWR>~GYywm#VTK~nd#>BpbEf7FA*KKfDWJb8~5DZf#|5baMe=>KFFSbgda38zdDXQa{=9jW&m$tWDykZj`7#3_zANbB(SO{shhGe=&H{tM@n+a000000RI300000001IJrb7^O8ZDnqBa{vkfhyLPaScq)s9KMExvw34D -6J>+NwrBxfixd_%u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a000000RI3000000 -010+sY-Mg^X=QT&2?0j!=EDda{kY~=q$*tC#t4Le{2#tvcDZqMsmk?aU=OZ$bvG|>z)+>9PT;Au-7)~D;-++hnxY;R&=Y*Tb$bY%qr015%s?vf5kh_h+&YE#h%O8d1V -_{UOl9{V;uR#^q%$8ES^HwOl>wiJc;WmI`^ -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 -R5(-fxrUo0Th$AHP6|FsuXsI;G3ONG`V!CAn^8 -7TS9h9ibhaZ&^Bcn*B*;w|~I;-PD|t>j-IXaCLM|VQ>KznP+6nwW~k}RP!NmuV?G015$>$mV(;bz)!CmQ_M(k?Vd!kfCo{nDM?)_qK{868FUc))-~W22H5+ -SDrhMohTRsfLT>C1dS{r3#^{o?N>fE0RR9100000|Nj60000005L9wuZgXjLX>V>*V`ybMdwWnpYocxhw=1ONKtpQ8M_qJyiO1VIUJ=H=)@ii_1#@&^bY%f9vZekPz%WEGnBZKS8(M7E9_@AwVcyGt +Cevi|7U8=DY;R+00(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCd;@jJLYKfb7gWS-+`&{Sr=yk +NJ#YFTr_BQwWqKF0Ra(XZ*FF3WMyu2X<=+rbYXO500sjDb7f&{0fGz-uWS7@0e2{MdwWnpYocu;h51pxpG0f+wLWmt%8=p4R=gtK{L +Clh6Z#kObxUW*hKHnBv9xdD5!HElq4!)_b{H>!()nCt8iM0hjp5N|z=I>OKHojw2n000000093000000 +000<4b8~5DZf#|5baO&%X>MdwWnpYocxhw>0RRdChyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt +0a|Zqvn9UYMO^sD;_GhXtp2ftG%R;OfdN~vO`zH70ssI2000000RI300000000=>JbYWv?Nn`~900#g7 +Kp+4ML3DIsV`x)!VRU5%0s?7d0fcc4lPpg3!?y@aX^XIja4CK{WF&t@k=WXUZP9(YI0Db5bYX39002k^X>)URWpV;~10COKearHw +cS=7M7YzYaI8*bvhMOc?)(rkC#nUEjudT)PryvH%qoUf%jN6#Tx81sfg4O?s`uaep_R|IjbY*jNZe?@= +$}AplgPGkh3_fq3Q7_j=2#kPT_9!;lWR>~GYywm#VTK~nd#>@I6Zgc@iy&7&8`-VFfe10Wf +HD}v`L+>hHy6d9F3e5?wo>3YKa$#;~Wl(Z&Z)O2Vy&7&8`-VFfe10WfHD}v`L+>hHy6d9F3e5?wo>3YK +LvL<$a$#e1Nn`~900#g7Kp+4KL}7GcQ*>c;Wd#8M2mk;;0000000000|Nj60000002}O8xWo~n6Z*B$) +17>D+0ot2U6Id2jc94hrndMfLayEe1ISdA&%p{mB1!VWk)e2*8Zgg^CV{}Pm0iOsgNjk^^qPoT1+zTRn +Ag`3vXv9d*8d@RXy~6c6G6imLZewKt00<3bcywiMb7^mGRC#b^0c3R^La7y@JVOzJ)&GXo9MeQ_qmbcB +?4VH0I#X{*-Uw}FbYWy+bYTJYdQCW4e)%xftOSp9TD)g5B;KO;Krzd=y+`rt_<1!4XKZg`VQg~&-XoD~ +rmTY45rxNKIl#GTd$5`Bk}o71wcZw0Vevn_3t@9}X=iS2Wo~qH0b%MF_RVyy866uW6(UoUJMwlSx^W#R +ES3wGAo{t~Y6x;=WMyS-Wn=;0ρ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 -b98cbV{~&L00;qEk8=qnO(R<<%JIK< -1B78x*e6}1oxDzJ3ElvocGBqp0000000030{{R30000303So3~VPj}*Wo~o;1pxpE0aMUzRzj^*Tk1C) -pGbjYG7000000RR600000000~xMY-Mg^X=QT-0RRaBM(yUq2ps*m=2xUD -T;RqCgn#@WzFu~@adfH5^@&-|0000000000{{R30000003szxlWo~16RC#b^1pxp60tr@cX=GD$VRU5$ -0RR916j(!OVQFqcY-w&}Q)OXnRCrKyas&bZ2V!Y-V{d7000jX8Ruk6O)Q5AKbFW;JEQ>MoHhG*Mzd(pE -tONi$rOUxcMklB)P_)|`Y=H7dO_e!^G2i>0SdC0NppV!6v|_i_0S0Voadl~A00jX8Ruk6O)Q5AKbFW;J -EQ>MoHhG*Mzd(pEtONi$rOUxcMklB)P_)|`Y=H7dO_e!^G2i>0SdC0NppV!6v|_i_6IerNVQFqcY-w&} -Q)OXnRCsA*1OfmDVrg_^Z)t7-1pxw96V}(%hjW>8uUwNXi!t*yd7K}=K!`A`1OPgv%fU#n#&NEOd)wn+ -n#11fGQ~$X901P7x>0daZB@{PThHqO25f0@b!lV(1pxw96V}(%hjW>8uUwNXi!t*yd7K}=K!`A`1OPgv -%fU#n#&NEOd)wn+n#11fGQ~$X901P7x>0daZB@{PThHqdSVL%GX>L8uUwNXi!t*yd7K}=K!`A`1OPgv%fU!!8SA{&vly$FvzVnzHf7z~rv`86=_Ka^V5yX| -y#`JJ25f0@b!lV(1pxw96V}(%hjW>8uUwNXi!t*yd7K}=K!`A`1OPgv%fU!!8SA{&vly$FvzVnzHf7z~ -rv`86=_Ka^V5yX|y#`JSSVL%GX>L?_X=DTf00&}ebYpL6ZU6-V0`+VYVk7oBr%DNv+($;q`HHK!gIHa) -*%m(-e#9sm3ZsHT^UK%K(4i9Ajp1M~R@C@!4#dQE#lUD;OiKi1RsjZVX>oOFWB>&L0`+VYVk7oBr%DNv -+($;q`HHK!gIHa)*%m(-e#9sm3ZsHT^UK%K(4i9Ajp1M~R@C@!4#dQE#lUD;OiKi1Rs +GOBq10000000030000000000BVRLh7XKrm}Zgg`13IT`y;$>KfZ0H=mhJ>?uVa{vhe +M(yUq2ps*m=2xUDT;RqCgn#@WzFu~@adfH5^@&-|0000000000{{R300000033g#@X=Gt^Z*l+x0ssVV +Z*FA(00035b8l^B00jX8VsJHoA?4$swuZp1Wc+9AOf`(TIbyKWjTy4WkGaM+ZSSEb;k|42*wg~2q@ +3^Lq|9zft}OB~jx>)hO73rB2kVqt7kbYXO51pxpG0oCr34oQf!Y4K`P(FaQVwIle)QgI&pHa%8Z1>xis +%K-|*_9BKowP1qopf1fvG|`fdOK000000093000000000q3Y;R&=Y*Tb$bY)Xx +Xk~3-1_KCkWpib6c4cG&dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThNn`>=>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HJ_1fvw5rj-B| +XP@r^w5ufb=C_Ju$l1`nW&GEpSWb-yZDDvxbY*RG0009IM{I9mVQf=$VRU6wd2nR~0RR933`cBlVqt7n +VQh6}a|Hna2mvylR#67|O%*Grnxkw0HI;&$`LH+T3zWkAaKFZV1cd@r70RRO80?I5NZ-bfLFbqC#o>4E?M+l67UG^w8*<_XZ#%uyqCrG{{7b@t4MVjY>G@u4Q3HlB(d+LiL +Jm-R=h;`?dxBv(O$}AplgPGkh3_fq3Q7_j=2#kPT_9!;lWR>~GYywm#NWLQ%D(Hkon&*Qwpawq)`VKLB +>Wd>h=Ype%b?2720000000000{|^8F000001xapjb#w*-2XJy_c29M50h18CfUz`Mi!Z}iQtl5;XwV(E +`Zdd&WRj~^37Yhpmk4rYb7gXNWn=<+10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPr +awgw_sqk4BX8}k^^xj-FXm+)yumJ%GNp5g;bWLG!1pxpG0`+VYVk7oBr%DNv+($;q`HHK!gIHa)*%m(- +e#9sm3L)b@L&d6G@+l`%qd385?K@+fP1(-9sgE>i7rMzqbpe&g=6W7=VqesjRYGc!>wZFzp>JB4@xD;^ +wu&SY_r(DK000000096000000000I_Zg6#Ua|Hna2?5oOUkD7Ff~JZGMgrhZ&rP2gYrktY!x$bpv=qCl +=HdVV000000096000000000S1Wn^h#RC#b^0|5hJZh8L*O=WapRC#b^1pxp60troJbYWIuY;|P?0RRX9 +06+i$000000096000000000P0WprU=VRT^y0RRdCb>vO>-_DBy8`Vb0jGrW9$=2qSMXvL3Hj|@I6Zgd6<17>D+0ot2U6Id2jc94hrndMfLayEe1ISdA&%p{mB1!VWk +)dg;EZewKt00;(ea8!A4WdYSb4B3PHh|WkAY6xeVK8Ndn*Q3fqTpm6dMbjJNIZg;|WprU=VRT^vdIKHb +X?@G`sCP;~6&DQwR5(-fxrUo0ThsZfv!yd427@;7veO2 +zMB=|GX`mHaCLNZ0(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCODo$h9?yTI7S;;e;>sZfv!yd +427@;7veO2zMB=|GYesJb7^O8ZDnqBa{_t;9p7nv%krpqNWpe_010COKearHwcS=7M7YzYa +I8*bvhMOc?)(rkC#nUEjudT)PryvH%qoUf%jN6#Tx81sfg4O?s`uaep_R|IjcWHEPWpi@^dIKHbX?@G` +sCP;~6&DQwR5(-fxrUo0ThClv)aMjKgwAH@`bu1x<7g|G$};xvA~n-$_S33g#@X=Gt^ +Z*l^910COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUEjudT)PryvH%qoUf%jN6#Tx81sfg4O?s`uaep +_R|IgPjE?O1pxpD002NB00mEQZ*_DA0|IYw0hP$+dLDIRU(}XWLTZugenOC;Z(5k~zEJnJiX;;E#R7DB +0f+wLWmt%8=p4R=gtK{LClh6Z#kObxUW*hKHnBv9xdLu)0006IPj_x*WK(oubY)XxXk~3-1OxyJWMyM) +VRB(~X?A4*00039W_507X<}?;00jX7`Sh#^X0AbZX4L%*5q$))*;M@wXI>IJVg&1PPwC}G0t$0L +b#i5700jX8Me3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*rYXqYdo~D%m7H6OD0<^0n_2##VWXRdj +y=DB@qgYOj0}5eubYWv?ZDnqB00jX7LNH;4h{)8d6ed8&{mBRDiWpZ<6 +ZbNTvZE19EWo~o@0RRU806-xC2vTKaWo2z;WCZ~L3IRs#=EDda{kY~=q$*tC#t4Le{2#tvcDZqMsmk?< +SMl$g}C@DyY!@{4YR*L +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 +smk?c;Wd#8M000zNLug@XZbEEn +Ze&wsVQf@*P;_zx0sseMX>?<6X>I@o0RmPN*4NaBbD49mT$3z|G4nQgoFBhHh%l@K06L}1!AM3Ys4h^n ++Zt?u@<&aTIfpUd`<+;gOgf;C*Zs6&x77g#Y-w?IX=DHe0RmPN*4NaBbD49mT$3z|G4nQgoFBhHh%l@K +06L}1!AM3Ys4h^n+Zt?u@<&aTIfpUd`<+;gOgf;C*Zs6&x78C^Lug@XZbEEnZe&wsVQf@*X=DTf00&}e +bYpL6ZU6-V0#*~&*VKn|nRBmPlPrrd^EP>$AHP6|FsuXsI;G3ONU+9nu7-Qt<6xS@-s>{OM>iY*&c?b? +aZznm(1lyi>j4IAX>oOFWB>&L0#*~&*VKn|nRBmPlPrrd^EP>$AHP6|FsuXsI;G3ONU+9nu7-Qt<6xS@ +-s>{OM>iY*&c?b?aZznm(1lyi>kwE&Xklq?Q)OdvWpq$AHP6|FsuXsI;G3ONN5@Byw$T9tCzEwrAszt-P)%HZ|LbH=L2A=l(W4CP5}mNX>oOFWB>&L +0#*~&*VKn|nRBmPlPrrd^EP>$AHP6|FsuXsI;G3ONN5@Byw$T9tCzEwrAszt-P)%HZ|LbH=L2A=l(W4C +P6}8jc*fjc*fC6j$4@3WXB2nQh5J`CA|{D{s-6>11)nm&i?f7heRLtGv{8Aa0@ x;yF&Uz$@JiAoY?D0SxZ85si_pxMhH9pMR%K?)7+bCIvMdqJX)Fjw_yuFlI~o80 delta 283 zcmaD}yS08pA4|9!1E*t7iBDo>YLOu`BU?^pVQFRxBM)3GIJJb8k%5!(M0Qg(cU0}M zi7YBbPnFdBFPuLr6`rxc+kTaygS1VZG6NL+htQk*Sr&>jvTrt&;b-LLN`%@_Y&f}5 zOmT9*j>2XK*;3ZYj0S3xZ!5jmK~lh|5*~CTwc*2@Q(4O9Awn(+2{ns#>ffFDC?dd+ z&&8?Lv-y-V2fOC;kCQZ4KbCpuzw*@``;FHNHH+qYT`cJHvJamY8dL9M&5@g0l9-ZM zk_fd>akH)VBwhvMl*oX;_ZnrCKVIH?$I0)Xli9O`uLYJiuXKNkRXO~T-~8U<2P*)j C{%R8d diff --git a/stl/RGBCommit@0.1.0.sty b/stl/RGBCommit@0.1.0.sty index 2f28c663..f44fef37 100644 --- a/stl/RGBCommit@0.1.0.sty +++ b/stl/RGBCommit@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:IFcnrPeI-TANxLfZ-feJax6Q-1TUM4Hq-AjI161s-3tbmxak#harvest-person-orion + Id: stl:bJ8Swut6-fEFixNt-bJuRY6D-ZNyYV2D-aNfTFnN-68w5Ngk#point-ariel-kinetic Name: RGBCommit Version: 0.1.0 Description: Consensus commitment layer for RGB smart contracts @@ -44,13 +44,6 @@ import Bitcoin#signal-color-cipher use Txid#shallow-light-reverse -@mnemonic(edison-survive-nitro) -data AltLayer1 : liquid#1 | (|) - - -@mnemonic(almond-office-pulse) -data AltLayer1Set : {AltLayer1 ^ ..0xff} - @mnemonic(slang-amber-club) data AssetTag : [Byte ^ 32] @@ -184,13 +177,12 @@ data AttachId : [Byte ^ 32] @mnemonic(harvard-burma-bicycle) data AttachState : id AttachId, mediaType MediaType -@mnemonic(amadeus-sunday-casino) +@mnemonic(needle-minute-harvest) data BaseCommitment : flags CommitVerify.ReservedBytes1 , schemaId SchemaId , timestamp I64 , issuer CommitVerify.StrictHash , testnet Std.Bool - , altLayers1 CommitVerify.StrictHash , assetTags CommitVerify.StrictHash @mnemonic(animal-plume-minus) @@ -245,14 +237,13 @@ data FungibleState : bits64#8 U64 | (|) data FungibleType : unsigned64Bit#8 | (|) -@mnemonic(fashion-delta-polka) +@mnemonic(gossip-daniel-under) data Genesis : ffv Ffv , schemaId SchemaId , flags CommitVerify.ReservedBytes1 , timestamp I64 , issuer Identity , testnet Std.Bool - , altLayers1 AltLayer1Set , assetTags AssetTags , metadata Metadata , globals GlobalState diff --git a/stl/RGBLogic@0.1.0.sta b/stl/RGBLogic@0.1.0.sta index b84bc9fd..801484bb 100644 --- a/stl/RGBLogic@0.1.0.sta +++ b/stl/RGBLogic@0.1.0.sta @@ -1,14 +1,14 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:mqltqlPk-O9$pYOd-BACRI70-DOMJ6cp-TFvhcK1-ibrOI9U#import-boxer-seminar +Id: stl:lvwcOo0a-!8WJfTD-eeERZkb-hZFG$r5-W2uKv!P-Oujw$hM#regular-moment-north Name: RGBLogic Dependencies: - RGBCommit#harvest-person-orion, BPCore#austin-story-retro, + RGBCommit#point-ariel-kinetic, Bitcoin#signal-color-cipher -Check-SHA256: 1c7df052c1790167b3a2f4748d4a8d602f3c8473195826c02efa6efc43b7f396 +Check-SHA256: 0f523c2ad78b34ba09423c41e6c93499f38a3ae3e23c24ae9b3f8a55a6ec4ebb -2vSEvOmAmtV*?;pC#?5~OapN(_Fs6GvFQy{P|gRa2*}s1Y~I%9#iMoHhG*Mzd(pEtONi$rOUxc20~CnZ*pbzY!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkk +2vSEvOmAmtV*^$b*4NaBbD49mT$3z|G4nQgoFBhHh%l@K06L}1!AJ%|P(yEWWo(}k!s~i`L1M()TPEaK +=r&Esg?0_2Urbre>&!Ve2?ja}LTPkk Z)t7=20~CnZ*pY?00DdlT>wB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 wjY>38tto&d&=eG4cRAF#( @@ -24,15 +24,15 @@ iRT*14O40w5C%+Pd1Z1jmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<1W#~DWCZ{SL}Fu5a&K>D n*!v8^Ea7rh?dzC2n+%RZ*X#DbN~eb0#*~&*VKn|nRBmPlPrrd^EP>$AHP6|FsuXsI;G3ONJmc3T+rxD K6vW;JU&?LxLM72H?wDC1Zo}=N}D)4mkCE~Z(?C=PjX}i0tIhyPjX}d{&9|4h)I8ST&b@+9Xb*9;C#?5~OapN(_Fs6GvFQy{P|gRa2*}s1Y~I%9 -#i?X<9zv-Vp*%wog4O?q)g04AaHEjnO6;Ie%sNwVNZti*Z*F5{000OCZ*Xa30w7l>toMja192_(UwD?W -=?zm*&IhOn$k(lG-qz;Dsg=m)dLDIRU(}XWLTZugenOC;Z(5k~zEJnJiX;;E#s3O)a$#@6CZU6=Z -2X|?7Ze??G0dl)S$QV;yG0%+u`Lqfm#|FpRuujhTP8r)T_J?np;R1Ad0w7l>toMja192_(UwD?W=?zm* -&IhOn$k(lG-qz;DsWeg#t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zcaA{-$AXg`> -_lQgbaV_>=c$Ts04O39g2dD_h*R5>c*5<{jmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<3Rh`# +LdY0XT`|v$|M|2EBF6^D+OST}`A!+zFZPFTn&AR;c>-*o62j|xd_iKw+gm2&Sm-uQ$%S?eqhCx}&FjoL +HVI^P9zv-Vp*%wog4O?q)g04AaHEjnO6;Ie%sNwVNZti*Z*F5{000OCZ*Xa30&JfW!s~i`L1M()TPEaK +=r&Esg?0_2Urbre>&!Ve36;p^dLDIRU(}XWLTZugenOC;Z(5k~zEJnJiX;;E#s3O)a$#@6CZU6=Z +2X|?7Ze??G0dl)S$QV;yG0%+u`Lqfm#|FpRuujhTP8r)T_J?np;R1Ad0&JfW!s~i`L1M()TPEaK=r&Es +g?0_2Urbre>&!Ve2{cjZewKt00;zcaA{-$Y@ZUs +>w0`aV#M29CgfP?HciQeb`7InOj*tA%sDm*mB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<3Rh`# Ze??GPjX}g0{{qNa${&|c4cG$00036ZE0?0WB>&L0bJY;BNZ=sBHM?<`J6+Fr=A_lQgbaV_>=c$Ts04O39g2dD_h*R5>c -*5<{jdBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W)00aqiX>Db5bYX39002k +5&{WyWo~p~bZK^F0000AS7~%^Wpi^-Z*v9%25ez@WpXhBY@ZUs>w0`aV#M29CgfP?HciQeb`7InOj*tA +%sDm*dBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W)00aqiX>Db5bYX39002k -----END STRICT TYPE LIB----- diff --git a/stl/RGBLogic@0.1.0.stl b/stl/RGBLogic@0.1.0.stl index 24ed32dcaf2d1780f0739aa2747b186da33cf42c..4cb4f049131be20ef1330ad5d5892dcc3319b9ba 100644 GIT binary patch delta 281 zcmey(^P7i@Bgoy!CqF$inR&7wvw|U;Q-E`RQEJY7p+m2$Y8;b}+>Taz67j;!_hf4s z@8Wo$$g{7{SekKi0(Cj(=jLXXY>Z}SQ6Qvz@@^&teb&7EyyR2{1`d||g3J^qf_g5p e#1J;vmsOvzqKhmFllQP@5LWn-NpW&2n-~DRFL@gP delta 281 zcmey(^P9(nBgoy!CqF$inOPxRea-g{ALc^cZ}An=HooKy4miiYg5$*XwK?~$Jv+LR z6R6TTKQ}kCWU?Q#0y~>ifOCFP>c(hx76n3DC+}ub&}Yrd&r42aVBlcMFUU+`BB Date: Wed, 4 Dec 2024 14:49:05 +0100 Subject: [PATCH 15/70] schema: make contract commit to a close method --- doc/Commitments.md | 1 + src/operation/commit.rs | 3 + src/operation/operations.rs | 2 + src/operation/seal.rs | 19 +- src/stl.rs | 4 +- src/validation/status.rs | 10 +- src/validation/validator.rs | 31 +++- src/vm/contract.rs | 19 +- stl/AnchoredBundle.vesper | 17 -- stl/RGBCommit@0.1.0.sta | 343 ++++++++++++++++++------------------ stl/RGBCommit@0.1.0.stl | Bin 16103 -> 16257 bytes stl/RGBCommit@0.1.0.sty | 26 +-- stl/RGBLogic@0.1.0.sta | 32 ++-- stl/RGBLogic@0.1.0.stl | Bin 1659 -> 1659 bytes stl/RGBLogic@0.1.0.sty | 16 +- stl/Transition.vesper | 16 -- 16 files changed, 258 insertions(+), 281 deletions(-) diff --git a/doc/Commitments.md b/doc/Commitments.md index 2c789f4c..df0eac2e 100644 --- a/doc/Commitments.md +++ b/doc/Commitments.md @@ -221,6 +221,7 @@ flowchart LR subgraph "Genesis" schemaId --> BaseCommitment testnet --> BaseCommitment + closeMethod --> BaseCommitment end subgraph "Transition" diff --git a/src/operation/commit.rs b/src/operation/commit.rs index 88d77de9..31f5be0f 100644 --- a/src/operation/commit.rs +++ b/src/operation/commit.rs @@ -30,6 +30,7 @@ use amplify::hex::{FromHex, ToHex}; use amplify::num::u256; use amplify::{hex, ByteArray, Bytes32, FromSliceError, Wrapper}; use baid64::{Baid64ParseError, DisplayBaid64, FromBaid64Str}; +use bp::seals::txout::CloseMethod; use commit_verify::{ mpc, CommitEncode, CommitEngine, CommitId, CommitmentId, Conceal, DigestExt, MerkleHash, MerkleLeaves, ReservedBytes, Sha256, StrictHash, @@ -237,6 +238,7 @@ pub struct BaseCommitment { pub timestamp: i64, pub issuer: StrictHash, pub testnet: bool, + pub close_method: CloseMethod, pub asset_tags: StrictHash, } @@ -280,6 +282,7 @@ impl Genesis { schema_id: self.schema_id, timestamp: self.timestamp, testnet: self.testnet, + close_method: self.close_method, issuer: self.issuer.commit_id(), asset_tags: self.asset_tags.commit_id(), }; diff --git a/src/operation/operations.rs b/src/operation/operations.rs index 29018a46..1d383f26 100644 --- a/src/operation/operations.rs +++ b/src/operation/operations.rs @@ -28,6 +28,7 @@ use std::str::FromStr; use amplify::confinement::{Confined, SmallOrdSet, TinyOrdMap, TinyOrdSet}; use amplify::{hex, Wrapper}; +use bp::seals::txout::CloseMethod; use commit_verify::{ CommitEncode, CommitEngine, CommitId, Conceal, MerkleHash, MerkleLeaves, ReservedBytes, StrictHash, @@ -360,6 +361,7 @@ pub struct Genesis { pub timestamp: i64, pub issuer: Identity, pub testnet: bool, + pub close_method: CloseMethod, pub asset_tags: AssetTags, pub metadata: Metadata, pub globals: GlobalState, diff --git a/src/operation/seal.rs b/src/operation/seal.rs index 186af74c..ffa8564e 100644 --- a/src/operation/seal.rs +++ b/src/operation/seal.rs @@ -23,10 +23,9 @@ use core::fmt::Debug; use std::hash::Hash; -use bp::dbc::Method; pub use bp::seals::txout::blind::{ChainBlindSeal, ParseError, SingleBlindSeal}; pub use bp::seals::txout::TxoSeal; -use bp::seals::txout::{BlindSeal, CloseMethod, ExplicitSeal, SealTxid}; +use bp::seals::txout::{BlindSeal, ExplicitSeal, SealTxid}; pub use bp::seals::SecretSeal; use bp::{Outpoint, Txid, Vout}; use commit_verify::Conceal; @@ -34,10 +33,10 @@ use strict_encoding::{StrictDecode, StrictDumb, StrictEncode}; use crate::{XChain, XOutpoint}; -pub type GenesisSeal = SingleBlindSeal; -pub type GraphSeal = ChainBlindSeal; +pub type GenesisSeal = SingleBlindSeal; +pub type GraphSeal = ChainBlindSeal; -pub type OutputSeal = ExplicitSeal; +pub type OutputSeal = ExplicitSeal; pub type XGenesisSeal = XChain; pub type XGraphSeal = XChain; @@ -62,13 +61,6 @@ impl ExposedSeal for GraphSeal {} impl ExposedSeal for GenesisSeal {} impl TxoSeal for XChain { - fn method(&self) -> CloseMethod { - match self { - XChain::Bitcoin(seal) | XChain::Liquid(seal) => seal.method(), - XChain::Other(_) => unreachable!(), - } - } - fn txid(&self) -> Option { match self { XChain::Bitcoin(seal) | XChain::Liquid(seal) => seal.txid(), @@ -146,7 +138,6 @@ mod test { #[test] fn secret_seal_is_sha256d() { let reveal = XChain::Bitcoin(BlindSeal { - method: CloseMethod::TapretFirst, blinding: 54683213134637, txid: TxPtr::Txid( Txid::from_hex("646ca5c1062619e2a2d60771c9dfd820551fb773e4dc8c4ed67965a8d1fae839") @@ -157,7 +148,7 @@ mod test { let secret = reveal.to_secret_seal(); assert_eq!( secret.to_string(), - "bc:utxob:lD72u61i-sxCEKth-vqjH0mI-kcEwa1Q-fbnPLon-tDtXveO-keHh0" + "bc:utxob:nBRVm39A-ioJydHE-ug2d90m-aZyfPI0-MCc0ZNM-oMXMs2O-opKQ7" ); assert_eq!(reveal.to_secret_seal(), reveal.conceal()) } diff --git a/src/stl.rs b/src/stl.rs index 98bbfee7..051e3273 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -37,10 +37,10 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_COMMIT: &str = - "stl:bJ8Swut6-fEFixNt-bJuRY6D-ZNyYV2D-aNfTFnN-68w5Ngk#point-ariel-kinetic"; + "stl:IJ8ChpTj-XMVz1y3-z15BDBB-huKjqsO-YswXmFV-XxCnB0Y#pamela-polka-corona"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:lvwcOo0a-!8WJfTD-eeERZkb-hZFG$r5-W2uKv!P-Oujw$hM#regular-moment-north"; + "stl:MGoAZ!ex-Mxxzq!6-Iwump4Y-K$enNGN-!Aa52Ms-b1r7WF8#satire-herbert-nato"; fn _rgb_commit_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_COMMIT), tiny_bset! { diff --git a/src/validation/status.rs b/src/validation/status.rs index f77c6a0a..3907e251 100644 --- a/src/validation/status.rs +++ b/src/validation/status.rs @@ -24,6 +24,7 @@ use core::ops::AddAssign; use std::fmt::{self, Display, Formatter}; use amplify::num::u24; +use bp::seals::txout::CloseMethod; use commit_verify::mpc::InvalidProof; use strict_types::SemId; @@ -32,7 +33,7 @@ use crate::validation::WitnessResolverError; use crate::vm::XWitnessId; use crate::{ BundleId, ContractId, Layer1, OccurrencesMismatch, OpFullType, OpId, Opout, StateType, Vin, - XGraphSeal, XOutputSeal, + XGraphSeal, }; #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Display)] @@ -291,8 +292,6 @@ pub enum Failure { /// seal {1} is defined on {0} which is not in the set of layers allowed /// by the contract genesis. SealLayerMismatch(Layer1, XGraphSeal), - /// seal {1} has a different closing method from the bundle {0} requirement. - SealInvalidMethod(BundleId, XOutputSeal), /// transition bundle {0} doesn't close seal with the witness {1}. Details: /// {2} SealsInvalid(BundleId, XWitnessId, String), @@ -306,6 +305,11 @@ pub enum Failure { /// Details: {2} MpcInvalid(BundleId, XWitnessId, InvalidProof), + /// anchor close method {0} is different from the one of the contract {1} + AnchorInvalidMethod(CloseMethod, CloseMethod), + /// bundle close method {0} is different from the one of the contract {1} + BundleInvalidMethod(CloseMethod, CloseMethod), + // State extensions errors /// valency {valency} redeemed by state extension {opid} references /// non-existing operation {prev_id} diff --git a/src/validation/validator.rs b/src/validation/validator.rs index e0c25234..d47cbcf5 100644 --- a/src/validation/validator.rs +++ b/src/validation/validator.rs @@ -25,7 +25,7 @@ use std::collections::{BTreeMap, BTreeSet}; use std::rc::Rc; use bp::dbc::{Anchor, Proof}; -use bp::seals::txout::{TxoSeal, Witness}; +use bp::seals::txout::{CloseMethod, Witness}; use bp::{dbc, Outpoint}; use commit_verify::mpc; use single_use_seals::SealWitness; @@ -135,6 +135,7 @@ pub struct Validator< schema_id: SchemaId, contract_id: ContractId, layer1: Option, + close_method: CloseMethod, contract_state: Rc>, validated_op_seals: RefCell>, @@ -160,6 +161,7 @@ impl< let genesis = consignment.genesis(); let contract_id = genesis.contract_id(); let schema_id = genesis.schema_id; + let close_method = genesis.close_method; // Prevent repeated validation of single-use seals let validated_op_seals = RefCell::new(BTreeSet::::new()); @@ -172,6 +174,7 @@ impl< schema_id, contract_id, layer1, + close_method, validated_op_seals, resolver: CheckedWitnessResolver::from(resolver), contract_state: Rc::new(RefCell::new(S::init(context))), @@ -394,6 +397,24 @@ impl< // [VALIDATION]: We validate that the seals were properly defined on BP-type layers let (seals, input_map) = self.validate_seal_definitions(witness_id.layer1(), bundle); + if self.close_method != anchor.dbc_proof.method() { + self.status + .borrow_mut() + .add_failure(Failure::AnchorInvalidMethod( + anchor.dbc_proof.method(), + self.close_method, + )); + continue; + } + if self.close_method != bundle.close_method { + self.status + .borrow_mut() + .add_failure(Failure::BundleInvalidMethod( + bundle.close_method, + self.close_method, + )); + continue; + } if anchor.dbc_proof.method() != bundle.close_method { self.status .borrow_mut() @@ -481,14 +502,6 @@ impl< } Ok(pub_witness) => { let seals = seals.as_ref(); - for seal in seals - .iter() - .filter(|seal| seal.method() != anchor.dbc_proof.method()) - { - self.status - .borrow_mut() - .add_failure(Failure::SealInvalidMethod(bundle_id, *seal)); - } match anchor.clone() { EAnchor { mpc_proof, diff --git a/src/vm/contract.rs b/src/vm/contract.rs index 4bb5d4cb..8f00c5eb 100644 --- a/src/vm/contract.rs +++ b/src/vm/contract.rs @@ -29,7 +29,7 @@ use std::rc::Rc; use amplify::confinement; use amplify::num::u24; -use bp::seals::txout::{CloseMethod, ExplicitSeal, VerifyError, Witness}; +use bp::seals::txout::{ExplicitSeal, VerifyError, Witness}; use bp::{dbc, Tx, Txid}; use chrono::{MappedLocalTime, TimeZone, Utc}; use commit_verify::mpc; @@ -95,26 +95,17 @@ impl SealWitness for XChain> } impl XChain { - pub fn method(self) -> CloseMethod - where U: TxoSeal { - match self { - XChain::Bitcoin(seal) => seal.method(), - XChain::Liquid(seal) => seal.method(), - XChain::Other(_) => unreachable!(), - } - } - #[inline] pub fn to_output_seal(self) -> Option where U: TxoSeal { Some(match self { XChain::Bitcoin(seal) => { let outpoint = seal.outpoint()?; - XChain::Bitcoin(ExplicitSeal::new(seal.method(), outpoint)) + XChain::Bitcoin(ExplicitSeal::new(outpoint)) } XChain::Liquid(seal) => { let outpoint = seal.outpoint()?; - XChain::Liquid(ExplicitSeal::new(seal.method(), outpoint)) + XChain::Liquid(ExplicitSeal::new(outpoint)) } XChain::Other(_) => unreachable!(), }) @@ -125,10 +116,10 @@ impl XChain { self.to_output_seal() .or(match (self, witness_id) { (XChain::Bitcoin(seal), XWitnessId::Bitcoin(txid)) => { - Some(XChain::Bitcoin(ExplicitSeal::new(seal.method(), seal.outpoint_or(txid)))) + Some(XChain::Bitcoin(ExplicitSeal::new(seal.outpoint_or(txid)))) } (XChain::Liquid(seal), XWitnessId::Liquid(txid)) => { - Some(XChain::Liquid(ExplicitSeal::new(seal.method(), seal.outpoint_or(txid)))) + Some(XChain::Liquid(ExplicitSeal::new(seal.outpoint_or(txid)))) } _ => None, }) diff --git a/stl/AnchoredBundle.vesper b/stl/AnchoredBundle.vesper index 70188880..68efaa32 100644 --- a/stl/AnchoredBundle.vesper +++ b/stl/AnchoredBundle.vesper @@ -20,7 +20,6 @@ DbcProof union opret is Unit wrapped aka=OpretProof tag=1 TransitionBundle rec - closeMethod enum Method opretFirst=0 tapretFirst=1 inputMap map len=1..MAX16 aka=InputMap key is U32 aka=Vout value bytes len=32 aka=OpId @@ -59,14 +58,12 @@ TransitionBundle rec confidentialState rec tag=1 seal union XChainBlindSealTxPtr bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 @@ -83,14 +80,12 @@ TransitionBundle rec revealed rec tag=3 seal union XChainBlindSealTxPtr bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 @@ -111,14 +106,12 @@ TransitionBundle rec confidentialState rec tag=1 seal union XChainBlindSealTxPtr bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 @@ -141,14 +134,12 @@ TransitionBundle rec revealed rec tag=3 seal union XChainBlindSealTxPtr bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 @@ -171,14 +162,12 @@ TransitionBundle rec confidentialState rec tag=1 seal union XChainBlindSealTxPtr bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 @@ -197,14 +186,12 @@ TransitionBundle rec revealed rec tag=3 seal union XChainBlindSealTxPtr bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 @@ -225,14 +212,12 @@ TransitionBundle rec confidentialState rec tag=1 seal union XChainBlindSealTxPtr bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 @@ -253,14 +238,12 @@ TransitionBundle rec revealed rec tag=3 seal union XChainBlindSealTxPtr bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 diff --git a/stl/RGBCommit@0.1.0.sta b/stl/RGBCommit@0.1.0.sta index 6d9e7b7f..9f2491ab 100644 --- a/stl/RGBCommit@0.1.0.sta +++ b/stl/RGBCommit@0.1.0.sta @@ -1,24 +1,24 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:bJ8Swut6-fEFixNt-bJuRY6D-ZNyYV2D-aNfTFnN-68w5Ngk#point-ariel-kinetic +Id: stl:IJ8ChpTj-XMVz1y3-z15BDBB-huKjqsO-YswXmFV-XxCnB0Y#pamela-polka-corona Name: RGBCommit Dependencies: + BPCore#symbol-tropic-grand, StrictTypes#century-comrade-chess, - BPCore#austin-story-retro, AluVM#congo-archive-folio, CommitVerify#miller-pancake-elastic, Std#ralph-blue-lucky, Bitcoin#signal-color-cipher -Check-SHA256: 82a24c15af2ab669424b2ec84616a7e10732d416be18db9d5eb70b1ce9711603 +Check-SHA256: 80a904a49a049eacffb1c80ef08d1317819f5588ad46544493dc828cc01297dd -2~tNwLvL+uX>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI)Q*?4^V{}w`aAk8=6V}(%hjW>8 -uUwNXi!t*yd7K}=K!`A`1OPgv%fUznLQq3*a%Ez0HGd)H4E? M+l67UG^w8*<_XZ#%uyqCj(P-Wc6$lVk7oBr%DNv+($;q`HHK!gIHa)*%m(-e#9sm3I{@IbYpL6ZUzNG Y;{&m0sw9Ap(f$Hb>aU=OZ$bvG|>z)+>9PT;Au-7)~D;-++hbyX<}1pbY-V7RRS&fT*&Z=qeY@Wmfle* -z!SF)@h8|JkU^FEQwjx4X<|ua20~CnZ*pY?04}!>CAn^87TS9h9ibhaZ&^Bcn*B*;w|~I;-PD|t>jq6_ -bZBp6MklB)P_)|`Y=H7dO_e!^G2i>0SdC0NppV!6v|_i_4nk~cZe&wsVQf@*P;_!=8SA{&vly$FvzVnz -Hf7z~rv`86=_Ka^V5yX|y#`JSQ)OdvWpq?<6X>I}lA>%$n +z!SF)@h8|JkU^FEQwjx4X<|ua20~CnZ*pY?04xKINJ~fc1UzTDb_LBRjrSXj?;k=^zm6d~Uh7!wPz^$C +X>MdwWnpYocxhxVw-6<{ZeNoKcy!1~?PoRaGXO=WawZ)9j0>%7&o7^|1Fn59cL +W!>7R25;!;BbW>$vY^SL5xdReUg_1Rxg;i+MdwWnpYocu;h5vE?{96bd-L@NXK=z8qksZ{gweeRv2cdB4&6(-0xu1yp!YbaDqmX>?<6X>I}lA>%$n #j0HLDJN5-IKgM_J7b(p+0MPGk2Gl)y2(Rz1Xgc#bfbbo^UK%K(4i9Ajp1M~R@C@!4#dQE#lUD;OiKi1 Rs>XdX=DsTZ*6U9bXH|@X=Zr^063mQh9?yTI7S;;e;>sZfv!yd427@;7veO2zMB=|GYU;*a%*g5NMUnm ZLh7x^`{^P$fKg#%8c8X#<$(NgM!uni2C|Kr}onZ3R84)X=8LqVRLAc_h5K%L=laq&yA1JoJ^{7>oKLk @@ -33,235 +33,238 @@ Clh6Z#kObxUW*hKHnBv9xdF+KnyJGEOB((CXB(HiD*XOTXpbLr$Svz}Z|7;7BCh}d000000093000000 001IEb8~5DZc=4-WnpY(WI=RvVPj}QY-w&}Q)OXnRCrKyas&hb3}bI@W@%()Zggp3YybuW1aoC!YysPf S{i~B5OpZ>_>4e9YQ#rfba;u!+d5tm#=h2RwFCuobYXO50sJ&Y-CxfQ3;(PYq10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^ -^xj-FXm+)yumJ%95o2#|W@%()Zggp3Y*Tb$bY%br0|awrVQc}9yTa&4noi_R;$3lnz4{Zl)X|Z&ZIQtM -A_g1big7gsb97;JWdZy&McrS|4GaIQ6{LE)1tQ>Eiz^#2Wm1QOk9#fajy(iyZ)0l$dIKHbX?@G`sCP;~ +^xj-FXm+)yumJ%95o2#|W@%()Zggp3Y*Tb$bY%br0|awrVQc}buAyhdo%dUA4Eiz^#2Wm1QOk9#fajy(iyZ)0l$dIKHbX?@G`sCP;~ 6&DQwR5(-fxrUo0ThEiz^#2Wm1QOk9#fajy(iy Z)0l$dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThYyC6yAAHY;R+00(t`--)Viz@~C%8KNS}Z0aQ3s ^SOqbBwN-D{wl@OCd;@jJLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF0Rj+XZ*FF3WMyu2X<=+rWnpXp 1_K0hWnpXq+lpEmf)o&SDDwD>KtpQ8M_qJyiO1VIUJ=H=)@ii_1#@&^bY%hOC5!%-N13CfsTw#uNYyC6?Q(lLJ=>rBY$70^roXTE)+&>InpFZ)0l$dIKHb X?@G`sCP;~6&DQwR5(-fxrUo0ThxYW^+v~7{W03rq(;firJ1#@&^bY%f> +Zf0p@Wo~q7VQf=$VRU5x1_K0hWnpXqtFEDE#GUtBZVw=Tgw0^L(zrtm5XPgGpH 4P_9rf`M-zw>{+&W0M0{2&GbCtpecGzFNi4r|Jm=Y;R+00(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D {wl@OCd;@jJLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF0Rj+XZ*FF3WMyu2X<=+rWnpXp1_K0hWnpXq +lpEmf)o&SDDwD>KtpQ8M_qJyiO1VIUJ=H=)@ii_1#@&^bY%hmXk);5Qh;gshq!{{oTC#gIzF4hFN<*P 1RquLWiVd^Y;R+00(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCd;@jJLYKfb7gWS-+`&{Sr=yk -NJ#YFTr_BQwWqKF0RsqfWp-s@Y-MBs1_K0hWnpXqkGsO?N19ILP2yc~f4%w>xYW^+v~7{W03rq(;firJ +NJ#YFTr_BQwWqKF0RsqfWp-s@Y-MBs1_K0hWnpXqtFEDE#GUtBZVw=Tgw0^L(zrtm5XPgGpH_>4e9YQ#rfba;u!+d5tm #=h2RwFCuobYXO50dNgv5VC@SZy&ck10COKearHwcS=7M 7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%95o2#|W@%()Zggp3 -Y*Tb$bY%br0|awrVQc|{3=OYq{WJl0D5$WZob97;JWdU#vWe~E0fo~tT +Y*Tb$bY%br0|awrVQc|zz!8ZmxG0SMPZTc4w%!w3d}4CRtg5Jm=n8Q-roiL{b97;JWdU#vWe~E0fo~tT J>?Q(lLJ=>rBY$70^roXTE)+&>InpFZ)0l$dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThWZob97;JWdZ+a +r?3G50|;_uc4c8~Wn=&b0|awrVQc|zz!8ZmxG0SMPZTc4w%!w3d}4CRtg5Jm=n8Q-roiL{b97;JWdZ+a W59S)fNA-MxPs%HqZ2GTKAXWWi*W4(A64;XFkb|0Z)0l$dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThF91B-Lz;+I~gZl(*Z)0l$dIKHbX?@G`sCP;~6&DQwR5(-f xrUo0ThxYW^+v~7{W03rq(;firJ1#@&^bY%fbXnF^bIJ{KZXKtpQ8 M_qJyiO1VIUJ=H=)@ii_1#@&^bY%f;M8@xYW^+v~7{W03rq(;firJ1#@&^bY%f;M8@F91B-Lz;+I~gZl(*Z)0l$dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThYyC6KtpQ8M_qJyiO1VI UJ=H=)@ii_1#@&^bY%f;M8@YyC6c;WkPIeZe&wsVQf@*P;_zx1ONKtpQ8M_qJyiO1VIUJ=H=)@ii_1#@&^bY%f9vZekPz%WEGnBZKS 8(M7E9_@AwVcyGtCevi|7U8=DY;R+00(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCd;@jJLYKf -b7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF0Ra(XZ*FF3WMyu2X<=+rbYXO500sjDb7f&{0gt=F=tr7PMdwWnpYocxhw=1ONKtpQ8M_qJyiO1VIUJ=H=)@ii_1#@&^bY%f9vZekPz%WEGnBZKS8(M7E9_@AwVcyGt Cevi|7U8=DY;R+00(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCd;@jJLYKfb7gWS-+`&{Sr=yk -NJ#YFTr_BQwWqKF0Ra(XZ*FF3WMyu2X<=+rbYXO500sjDb7f&{0fGz-uWS7@0e2{=Z! +sD=Z!sDMdwWnpYocu;h51pxpG0f+wLWmt%8=p4R=gtK{L -Clh6Z#kObxUW*hKHnBv9xdD5!HElq4!)_b{H>!()nCt8iM0hjp5N|z=I>OKHojw2n000000093000000 +Clh6Z#kObxUW*hKHnBv9xdBcS_=xNn3+*j&3EB`h=Q;HL6-=_dAy)KHu*0U!7R3Mn000000093000000 000<4b8~5DZf#|5baO&%X>MdwWnpYocxhw>0RRdChyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt -0a|Zqvn9UYMO^sD;_GhXtp2ftG%R;OfdN~vO`zH70ssI2000000RI300000000=>JbYWv?Nn`~900#g7 +0R##hIKJeu_DJbYWv?Nn`~900#g7 Kp+4ML3DIsV`x)!VRU5%0s?7d0fcc4lPpg3!?y@aX^XIja4CK{WF&t@k=WXUZP9(YI0Db5bYX39002k^X>)URWpV;~10COKearHw cS=7M7YzYaI8*bvhMOc?)(rkC#nUEjudT)PryvH%qoUf%jN6#Tx81sfg4O?s`uaep_R|IjbY*jNZe?@= $}AplgPGkh3_fq3Q7_j=2#kPT_9!;lWR>~GYywm#VTK~nd#>@I6Zgc@iy&7&8`-VFfe10Wf -HD}v`L+>hHy6d9F3e5?wo>3YKa$#;~Wl(Z&Z)O2Vy&7&8`-VFfe10WfHD}v`L+>hHy6d9F3e5?wo>3YK -LvL<$a$#e1Nn`~900#g7Kp+4KL}7GcQ*>c;Wd#8M2mk;;0000000000|Nj60000002}O8xWo~n6Z*B$) -17>D+0ot2U6Id2jc94hrndMfLayEe1ISdA&%p{mB1!VWk)e2*8Zgg^CV{}Pm0iOsgNjk^^qPoT1+zTRn -Ag`3vXv9d*8d@RXy~6c6G6imLZewKt00<3bcywiMb7^mGRC#b^0c3R^La7y@JVOzJ)&GXo9MeQ_qmbcB -?4VH0I#X{*-Uw}FbYWy+bYTJYdQCW4e)%xftOSp9TD)g5B;KO;Krzd=y+`rt_<1!4XKZg`VQg~&-XoD~ -rmTY45rxNKIl#GTd$5`Bk}o71wcZw0Vevn_3t@9}X=iS2Wo~qH0b%MF_RVyy866uW6(UoUJMwlSx^W#R -ES3wGAo{t~Y6x;=WMyS-Wn=;0ρhviK~w*eJg04e;HYn$=SsX>loIF_owDud_=c42H~ZewX>a{=9j -W&m$tWDykZj`7#3_zANbB(SO{shhGe=&H{tM@vO>-_DBy8`Vb0jGrW9$=2qSMXvL3HGEG0000000000{{R30000002XbX(Wo2!100{v`?dHP>9R0ZFSEMRj;Km4qfBYZ5UUs>0 -bg9bqiCNA70000000030000000000BVRLh7XKrm}Zgg`13IT`y;$>KfZ0H=mhJ>?uV -a{vheM(yUq2ps*m=2xUDT;RqCgn#@WzFu~@adfH5^@&-|0000000000{{R300000033g#@X=Gt^Z*l+x -0ssVVZ*FA(00035b8l^B00jX8VsJHoA?4$swuZp1Wc+9AOf`(TIbyKWjTy4WkGaM+ZSSEb;k|42*w -g~2q@3^Lq|9zft}OB~jx>)hO74Mli#Wo~n6Z*Ek1aAgGn00065MrL*e0RR934MuftXK7+=Wm9xvbY%nq -2nJ$lbaOT|00jX600<05b#7;AVr*qpd2nR|0S$F-b7^O8Wn?xqLTPje2S;UYWpinB1`GpcW_AJEn^6;3 -7FKqUhx?i3R+Mr!fY&(;2BFL(m@EZk_srD@b7N>_ZDC1d0hChH+XJhss8OG%_CC-Q>(otsF+cqN0Qy}d -dQ=3E5CvvzVP|s!dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0Th~Wpi|4ZEyepNCs(hb9H5M0k-IXh8!q$B6|*YuiTY;OURW8#d%1{rxIXtTaY^? -oCkDeb98QHbOOpO9&dx0-7pM3Z=O*v*GCA9fL-<|HrZsA`NnJlR3~AEBGG%U@MZ$v=XJ?|;InIPy66cF -fOYp#JM2r7_Du<4b8}^MRAFax0VyR82Em!ld>cVuZ*8Se%j3y;5n>eohpw0DA7$}d%m{5|bYWy+bYTJY -dQCW4e)%xftOSp9TD)g5B;KO;Krzd=y+`rt_<1!4XKZg`VQg~&-XoD~rmTY45rxNKIl#GTd$5`Bk}o71 -wcZw0Vevn_3t@9}X=iS2Wo~qH0b%MF_RVyy866uW6(UoUJMwlSx^W#RES3wGAo{t~Y6*5>Y-Mg^X=QT( --GycVZ((E+6z-1k*Q)plvl=9@swb(NvM}hX&nZVu33g#@X=Gt^Z*l^910COKearHwcS=7M7YzYaI8*bv -hMOc?)(rkC#nUE}_h5K%L=laq&yA1JoJ^{7>oKLkF4~iax8KK|47hp?M`dnhb7^x^V`ybVZDn*} -WMOn+00{wgKfZ0H=mhJ>?uVa{vhe -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 -SMl$g}C@DyY!@{4YR*L -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 -smk?c;Wd#8M000zNLug@XZbEEn -Ze&wsVQf@*P;_zx0sseMX>?<6X>I@o0RmPN*4NaBbD49mT$3z|G4nQgoFBhHh%l@K06L}1!AM3Ys4h^n -+Zt?u@<&aTIfpUd`<+;gOgf;C*Zs6&x77g#Y-w?IX=DHe0RmPN*4NaBbD49mT$3z|G4nQgoFBhHh%l@K -06L}1!AM3Ys4h^n+Zt?u@<&aTIfpUd`<+;gOgf;C*Zs6&x78C^Lug@XZbEEnZe&wsVQf@*X=DTf00&}e -bYpL6ZU6-V0#*~&*VKn|nRBmPlPrrd^EP>$AHP6|FsuXsI;G3ONU+9nu7-Qt<6xS@-s>{OM>iY*&c?b? -aZznm(1lyi>j4IAX>oOFWB>&L0#*~&*VKn|nRBmPlPrrd^EP>$AHP6|FsuXsI;G3ONU+9nu7-Qt<6xS@ --s>{OM>iY*&c?b?aZznm(1lyi>kwE&Xklq?Q)OdvWpq$AHP6|FsuXsI;G3ONN5@Byw$T9tCzEwrAszt-P)%HZ|LbH=L2A=l(W4CP5}mNX>oOFWB>&L -0#*~&*VKn|nRBmPlPrrd^EP>$AHP6|FsuXsI;G3ONN5@Byw$T9tCzEwrAszt-P)%HZ|LbH=L2A=l(W4C -P6}8jc*fjc*fj`0Vb7gc?VP|s!dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThG60RRU806-uB4?}NmV`X7%Wn@8gbYWv? +1pxpD002NB01ZQLZewL(Y-MCbVRT^y0RRU806-uB5kqfoV`X7%Wn@NmZf9v?Y-I)l3S)0=ZE19EWo~o< +NWB_v7yE`g7JPmsUNvXifV=@3j=0mb^+R(Q4?4eR(6nw`S$_F2)vN@Mb6UJ-F(lri_dqerx4lR4>iBsz +2WM<=Vqt7^0p25#Yo@G%*b#-tU^&3KX?w7l?~*Sh8@1jRRblZzybED-b7^O8ZDnqBa{+$huy3?0v&8b0-V>p(oz$%02 +33g#@Wo~0>Wpe@Dg=PS6VPp{$?vC--s`v@B8YHl)C#jpVFzBk!DMw8Sc42I3WMOn~asqk-9p7nv%krpq +N@L7b8`ZE +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 +44ZlVPs)+VFdvI3ITQGP59r= +ivkR6Lh9EroO>_;00000 +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 +00960000000006Cb98cbV{~?nZ&L00;r& +RmTdUadnMQziE5xZZH-mc~-fzS41y+p{^_ku%R9R0000000030{{R30000303So3~VPj}*Wo~o;1pxpE +0XeIl<1VPcybH9KM*xoq&Zg2Gr#Z;y7!6fzc?JkK3;+NC000000RR600000000~xMY-Mg^X=QT-0RRaB +M(yUq2ps*m=2xUDT;RqCgn#@WzFu~@adfH5^@&-|0000000000{{R30000003szxlWo~16RC#b^1pxp6 +0tr@cX=GD$VRU5$0RR916j(!OVQFqcY-w&}Q)OXnRCrKyas&bZ2V!Y-V{d7000jX8A#kgq^`I&ZzC?)! +&R01Y?(H9FO$CR6P1%k7c67A-r>OF|0}@Y#k~NrxRcQq+F$P2q2)nlUE64L7%3W7R0S0Voadl~A00jX8 +A#kgq^`I&ZzC?)!&R01Y?(H9FO$CR6P1%k7c67A-r>OF|0}@Y#k~NrxRcQq+F$P2q2)nlUE64L7%3W7R +6IerNVQFqcY-w&}Q)OXnRCsA*1OfmDVrg_^Z)t7-1pxvfaI2y9pehZ%M2QE^S2-B&?H_1O1&4u6*^T^m +bhP{|1C2;aNA(0eXS#L;%_oib8;tKCLQ=nuAv#{`SnN;%25f0@b!lV(1pxvfaI2y9pehZ%M2QE^S2-B& +?H_1O1&4u6*^T^mbhP{|1C2;aNA(0eXS#L;%_oib8;tKCLQ=nuAv#{`SnN;`SVL%GX>LL?_X=DTf00&}ebYpL6ZU6-V0`+VYVk7oBr%DNv ++($;q`HHK!gIHa)*%m(-e#9sm3ZsHT^UK%K(4i9Ajp1M~R@C@!4#dQE#lUD;OiKi1RsjZVX>oOFWB>&L +0`+VYVk7oBr%DNv+($;q`HHK!gIHa)*%m(-e#9sm3ZsHT^UK%K(4i9Ajp1M~R@C@!4#dQE#lUD;OiKi1 +Rs -----END STRICT TYPE LIB----- diff --git a/stl/RGBCommit@0.1.0.stl b/stl/RGBCommit@0.1.0.stl index c13429e7e901cce23e5b1cbb16514d8989b9e7f9..8fde7fe9afe4287ef43e6bcade16559aa4f0476a 100644 GIT binary patch delta 1992 zcmaD}+gNYJ8RYKdoS&PUS;D4RuzKOw1zNoOTsqm$g|^ zY)%2r`9-M{xpgK7s3}aWyRWCi-0R`({*}cheODRlS@quU(mn6xor3oFDO$z7j(8Km z>y(q3mlB+sm=jWwnKC(+QGK$aouXxMYI0F(2}pSPicdS4h5TD5na*ep&1BUzWOL!; z*uCwC_VLdOr((n1_>c?;C@I>^!*rWjVfDI&=||>%kIv&)sBbx&u>H~wXC8rLi>J;H zy>VEYmFLms0~{KRgjM;o2Qn(;9T4o)+M&_&*Iz{M__lk(Q8h_LC)cc6(fWd`&|=wv zClIp;shYf=EqC%jAi3@~@aiW1x01-|En?=xx69jW7hl)NR7nKvNR~{hc;;fU|_s_R}}^ti4NocewQK%X{prKV?1VQC{wC)~??*H+RbG zFi&PQP@8;P={@O|Og^RDP0)_XZ%oQIzgBt9s%f);#gJZ5K(+|-i9l*E$6$&F%)llyfPH`{9Wb1EFoY2`4Mtd5u6GU@pd^K<{E z2I)>(Q&L~~dYym#22rh*Knw0G5ECYoxy|AgRu)dQKGE5t8#G%^KfZ1`;pMiBXA4+(j%E(D>=F9qgvZp~txv7MAt~?9Z%zoo67XRvET)bGVCs^}=;J z>>C!!f!$=edfsEb6$kckZ<+4S(9dyh*(KTKmM5M|@P_7AvT>O6Og?Tsxt>tm5Gv~# z*>W-qOEXg#SQ!bXeJp12qEsA{pV=rAbP=KIixd}OF^dQ4cbb5r delta 1893 zcmZpye_qSY8RYKdoS&PUS;98?qq>4IcW_BjW^zeLWkG6jnDDjhSK5nb7O#()tkZ4y z*{pJo{C4Vae*)~PBah-Ai{}Yvj{qIf?)3CP|*hj zLvQj%$=u1hoKBN>NLCW3m`mb5!Kg+tm7rS#r4A}oZ!*nwC_9`d!)(5)yK%_g!Ot9DnpW@9~;{8(U0t${iXRqc`|2xcQQ4 z@+>UR#H}4MN}zxvh}AjrCo)x>N?Z7rz`y0c_nM} zHF+IoMxM!MSrx9@@!V|w({av2G>apBmRD5uSSL+JdY zz{&D9N($HZ7;ijS7R+(~)9lKPhyTv}W~`&|=7nWVvCXeypPj7YlkKeS6(%2;5+gJ% zyuILhMrrPQCz-kTw`}P-SLr%?@rPZRwkPz!Zu)=8{aJg+?BTqZ6?0i00=c|bpQYW diff --git a/stl/RGBCommit@0.1.0.sty b/stl/RGBCommit@0.1.0.sty index f44fef37..dbffa7e1 100644 --- a/stl/RGBCommit@0.1.0.sty +++ b/stl/RGBCommit@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:bJ8Swut6-fEFixNt-bJuRY6D-ZNyYV2D-aNfTFnN-68w5Ngk#point-ariel-kinetic + Id: stl:IJ8ChpTj-XMVz1y3-z15BDBB-huKjqsO-YswXmFV-XxCnB0Y#pamela-polka-corona Name: RGBCommit Version: 0.1.0 Description: Consensus commitment layer for RGB smart contracts @@ -11,17 +11,17 @@ @context typelib RGBCommit -import StrictTypes#century-comrade-chess - use TypeName#edgar-carol-mystery - use SemId#logic-absorb-hilton - -import BPCore#austin-story-retro +import BPCore#symbol-tropic-grand + use BlindSealTxid#halt-crash-valid use Method#bali-boris-plasma - use BlindSealTxPtr#fortune-iron-salmon use SecretSeal#dollar-iris-wizard - use BlindSealTxid#media-judge-anita + use BlindSealTxPtr#content-paradox-dominic use TxPtr#italian-july-eddie +import StrictTypes#century-comrade-chess + use TypeName#edgar-carol-mystery + use SemId#logic-absorb-hilton + import AluVM#congo-archive-folio use LibSite#ultra-grace-message use LibId#germany-culture-olivia @@ -177,12 +177,13 @@ data AttachId : [Byte ^ 32] @mnemonic(harvard-burma-bicycle) data AttachState : id AttachId, mediaType MediaType -@mnemonic(needle-minute-harvest) +@mnemonic(europe-basil-compare) data BaseCommitment : flags CommitVerify.ReservedBytes1 , schemaId SchemaId , timestamp I64 , issuer CommitVerify.StrictHash , testnet Std.Bool + , closeMethod BPCore.Method , assetTags CommitVerify.StrictHash @mnemonic(animal-plume-minus) @@ -237,13 +238,14 @@ data FungibleState : bits64#8 U64 | (|) data FungibleType : unsigned64Bit#8 | (|) -@mnemonic(gossip-daniel-under) +@mnemonic(havana-motor-nina) data Genesis : ffv Ffv , schemaId SchemaId , flags CommitVerify.ReservedBytes1 , timestamp I64 , issuer Identity , testnet Std.Bool + , closeMethod BPCore.Method , assetTags AssetTags , metadata Metadata , globals GlobalState @@ -417,11 +419,11 @@ data ValencyType : U16 @mnemonic(email-snow-safari) data VoidState : () -@mnemonic(senator-limbo-raymond) +@mnemonic(poem-heaven-chicken) data XChainBlindSealTxPtr : bitcoin BPCore.BlindSealTxPtr | liquid BPCore.BlindSealTxPtr -@mnemonic(dynamic-life-brown) +@mnemonic(vision-promise-user) data XChainBlindSealTxid : bitcoin BPCore.BlindSealTxid | liquid BPCore.BlindSealTxid diff --git a/stl/RGBLogic@0.1.0.sta b/stl/RGBLogic@0.1.0.sta index 801484bb..d71ed190 100644 --- a/stl/RGBLogic@0.1.0.sta +++ b/stl/RGBLogic@0.1.0.sta @@ -1,14 +1,14 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:lvwcOo0a-!8WJfTD-eeERZkb-hZFG$r5-W2uKv!P-Oujw$hM#regular-moment-north +Id: stl:MGoAZ!ex-Mxxzq!6-Iwump4Y-K$enNGN-!Aa52Ms-b1r7WF8#satire-herbert-nato Name: RGBLogic Dependencies: - BPCore#austin-story-retro, - RGBCommit#point-ariel-kinetic, + RGBCommit#pamela-polka-corona, + BPCore#symbol-tropic-grand, Bitcoin#signal-color-cipher -Check-SHA256: 0f523c2ad78b34ba09423c41e6c93499f38a3ae3e23c24ae9b3f8a55a6ec4ebb +Check-SHA256: 2a460fc4e9b361c79ca4e34dce01cc1cce04f3798d69c556fae018fa7370f3cf -2vSEvOmAmtV*^$b*4NaBbD49mT$3z|G4nQgoFBhHh%l@K06L}1!AJ%|P(yEWWo(}k!s~i`L1M()TPEaK -=r&Esg?0_2Urbre>&!Ve2?ja}LTPkk +2vSEvOmAmtV*?ja}LTPkk Z)t7=20~CnZ*pY?00DdlT>wB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 wjY>38tto&d&=eG4cRAF#( @@ -20,19 +20,19 @@ Mp|h#f#{Gz8SzLEaTf~c{WkYggkPIjuQHS#3Ua|L6d7%qre2Ut&TYs@(?%#f7ArN-=Rj?7Ns(14peesZgXjLX>V>+d2nT9bsj>g 6`?#s5rWnKhSeO?L~x^!;Y#eFP|P}0Z%Ez^MR;^&ZgXjGZd7@2WqHKdNeFB= iRT*14O40w5C%+Pd1Z1jmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<1W#~DWCZ{SL}Fu5a&K>D -1OfpDbYXCEWpn@q0RmPN*4NaBbD49mT$3z|G4nQgoFBhHh%l@K06L}1!AK9bADBNH?W>M^%H|xc>sh|D -n*!v8^Ea7rh?dzC2n+%RZ*X#DbN~eb0#*~&*VKn|nRBmPlPrrd^EP>$AHP6|FsuXsI;G3ONJmc3T+rxD +1OfpDbYXCEWpn@q0Rka#tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPdYADBNH?W>M^%H|xc>sh|D +n*!v8^Ea7rh?dzC2n+%RZ*X#DbN~eb0wHj#q4l6D4ZcK)2hLYH81C&KXiWu&flb+s{C0G-{6|jDT+rxD K6vW;JU&?LxLM72H?wDC1Zo}=N}D)4mkCE~Z(?C=PjX}i0tIhyPjX}d{&9|4h)I8ST&b@+9Xb-*o62j|xd_iKw+gm2&Sm-uQ$%S?eqhCx}&FjoL -HVI^P9zv-Vp*%wog4O?q)g04AaHEjnO6;Ie%sNwVNZti*Z*F5{000OCZ*Xa30&JfW!s~i`L1M()TPEaK -=r&Esg?0_2Urbre>&!Ve36;p^dLDIRU(}XWLTZugenOC;Z(5k~zEJnJiX;;E#s3O)a$#@6CZU6=Z -2X|?7Ze??G0dl)S$QV;yG0%+u`Lqfm#|FpRuujhTP8r)T_J?np;R1Ad0&JfW!s~i`L1M()TPEaK=r&Es -g?0_2Urbre>&!Ve2{cjZewKt00;zcaA{-$Y@ZUs ->w0`aV#M29CgfP?HciQeb`7InOj*tA%sDm*mB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<3Rh`# +LdY0XT`|v$|M|2EBF6^D+OST}`A!+zFZPFTn&AR;c>*Ax0)~|1T*Y(OE%VoqLj)LZDmtt=i!fecRbLRN +2S#Ld9zv-Vp*%wog4O?q)g04AaHEjnO6;Ie%sNwVNZti*Z*F5{000OCZ*Xa30wA9PhLq!6#dFs!^Vg6= +1Q>2AI;=U1FkWF*Ul6AUMwQ6sdLDIRU(}XWLTZugenOC;Z(5k~zEJnJiX;;E#s3O)a$#@6CZU6=Z +2X|?7Ze??G0dl)S$QV;yG0%+u`Lqfm#|FpRuujhTP8r)T_J?np;R1Ad0wA9PhLq!6#dFs!^Vg6=1Q>2A +I;=U1FkWF*Ul6AUMl@0nt`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zcaA{-$AfEz; +l;d2*bJs2N*N{U57;Y*$tT~G?USU;V5T^%5mB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<3Rh`# Ze??GPjX}g0{{qNa${&|c4cG$00036ZE0?0WB>&L0bJY;BNZ=sBHM?<`J6+Fr=Aw0`aV#M29CgfP?HciQeb`7InOj*tA -%sDm*dBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W)00aqiX>Db5bYX39002k +5&{WyWo~p~bZK^F0000AS7~%^Wpi^-Z*v9%25ez@WpXhBAfEz;l;d2*bJs2N*N{U57;Y*$tT~G?USU;V +5T^%5dBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W)00aqiX>Db5bYX39002k -----END STRICT TYPE LIB----- diff --git a/stl/RGBLogic@0.1.0.stl b/stl/RGBLogic@0.1.0.stl index 4cb4f049131be20ef1330ad5d5892dcc3319b9ba..b99aea8e180328f4ccfab1077c0590bb0742f489 100644 GIT binary patch delta 389 zcmey(^P4A{Bgoy!CqF$inOR{zQ`?lsF-ME9>wdmI!I?!OPs?hJWw$|GVraa;a&|XP zpi1Zb+}z9(#e&rfzb???-RIKDelFZn;@w;M3}4pvM&Fygf67X>{9$tnaLzAE-5C9u zNr8~siTf2M_c3!5R5#g|QDO2;=1v7d&YZlPNkN}AFF!9im4ShSCBGmug^8e^i!3pO c4fbW#C#>iqi^AkRtQmwAzGPCIoXRE!08Q1NHvj+t delta 389 zcmey(^P4A{Bgoy!CqF$inK?}O+Vv~##WRc7$4u7gHvDW>IY)lKLx;f{76z-Orw@9t zIR!Z97p3OR7drI1s>U(t$n9vgClN2qd{4HP@h*<{i9GxIjHMYTC(uCW{M_8kl8w=y znG^__I&r_k-pQ Date: Fri, 13 Dec 2024 15:11:38 +0100 Subject: [PATCH 16/70] vm: handle RGB reorgs --- src/validation/validator.rs | 2 +- src/vm/contract.rs | 21 ++++++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/validation/validator.rs b/src/validation/validator.rs index d47cbcf5..8a6b6df1 100644 --- a/src/validation/validator.rs +++ b/src/validation/validator.rs @@ -282,7 +282,7 @@ impl< } }; for op in bundle.known_transitions.values() { - ops.insert(OrdOpRef::Transition(op, witness_id, witness_ord)); + ops.insert(OrdOpRef::Transition(op, witness_id, witness_ord, bundle_id)); for input in &op.inputs { // We will error in `validate_operations` below on the absent extension from the // consignment. diff --git a/src/vm/contract.rs b/src/vm/contract.rs index 8f00c5eb..58f49faf 100644 --- a/src/vm/contract.rs +++ b/src/vm/contract.rs @@ -37,11 +37,11 @@ use single_use_seals::SealWitness; use strict_encoding::{StrictDecode, StrictDumb, StrictEncode}; use crate::{ - AssetTags, AssignmentType, Assignments, AssignmentsRef, AttachState, ContractId, DataState, - ExposedSeal, Extension, ExtensionType, FungibleState, Genesis, GlobalState, GlobalStateType, - GraphSeal, Impossible, Inputs, Layer1, Metadata, OpFullType, OpId, OpType, Operation, - Transition, TransitionType, TxoSeal, TypedAssigns, Valencies, XChain, XOutpoint, XOutputSeal, - LIB_NAME_RGB_LOGIC, + AssetTags, AssignmentType, Assignments, AssignmentsRef, AttachState, BundleId, ContractId, + DataState, ExposedSeal, Extension, ExtensionType, FungibleState, Genesis, GlobalState, + GlobalStateType, GraphSeal, Impossible, Inputs, Layer1, Metadata, OpFullType, OpId, OpType, + Operation, Transition, TransitionType, TxoSeal, TypedAssigns, Valencies, XChain, XOutpoint, + XOutputSeal, LIB_NAME_RGB_LOGIC, }; pub type XWitnessId = XChain; @@ -135,7 +135,7 @@ impl XChain { pub enum OrdOpRef<'op> { #[from] Genesis(&'op Genesis), - Transition(&'op Transition, XWitnessId, WitnessOrd), + Transition(&'op Transition, XWitnessId, WitnessOrd, BundleId), Extension(&'op Extension, XWitnessId, WitnessOrd), } @@ -157,10 +157,17 @@ impl OrdOpRef<'_> { } } + pub fn bundle_id(&self) -> Option { + match self { + OrdOpRef::Genesis(_) | OrdOpRef::Extension(..) => None, + OrdOpRef::Transition(_, _, _, bundle_id) => Some(*bundle_id), + } + } + pub fn op_ord(&self) -> OpOrd { match self { OrdOpRef::Genesis(_) => OpOrd::Genesis, - OrdOpRef::Transition(op, _, witness_ord) => OpOrd::Transition { + OrdOpRef::Transition(op, _, witness_ord, _) => OpOrd::Transition { witness: *witness_ord, ty: op.transition_type, nonce: op.nonce, From b4544bd644160f4095f01eba703127967e3da50c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Sat, 11 Jan 2025 16:26:24 +0100 Subject: [PATCH 17/70] fix(validation): detect double spend --- src/validation/status.rs | 2 ++ src/validation/validator.rs | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/src/validation/status.rs b/src/validation/status.rs index 3907e251..a00a9669 100644 --- a/src/validation/status.rs +++ b/src/validation/status.rs @@ -252,6 +252,8 @@ pub enum Failure { WitnessUnresolved(BundleId, XWitnessId, WitnessResolverError), /// operation {0} is under a different contract {1}. ContractMismatch(OpId, ContractId), + /// opout {0} appears more than once as input + DoubleSpend(Opout), // Errors checking bundle commitments /// transition bundle {0} references state transition {1} which is not diff --git a/src/validation/validator.rs b/src/validation/validator.rs index 8a6b6df1..824045d2 100644 --- a/src/validation/validator.rs +++ b/src/validation/validator.rs @@ -139,6 +139,7 @@ pub struct Validator< contract_state: Rc>, validated_op_seals: RefCell>, + input_assignments: RefCell>, resolver: CheckedWitnessResolver<&'resolver R>, } @@ -165,6 +166,7 @@ impl< // Prevent repeated validation of single-use seals let validated_op_seals = RefCell::new(BTreeSet::::new()); + let input_transitions = RefCell::new(BTreeSet::::new()); let layer1 = genesis.layer1(); @@ -176,6 +178,7 @@ impl< layer1, close_method, validated_op_seals, + input_assignments: input_transitions, resolver: CheckedWitnessResolver::from(resolver), contract_state: Rc::new(RefCell::new(S::init(context))), } @@ -550,6 +553,11 @@ impl< // outputs. for input in &transition.inputs { let Opout { op, ty, no } = input.prev_out; + if !self.input_assignments.borrow_mut().insert(input.prev_out) { + self.status + .borrow_mut() + .add_failure(Failure::DoubleSpend(input.prev_out)); + } let Some(prev_op) = self.consignment.operation(op) else { // Node, referenced as the ancestor, was not found in the consignment. From b461511ed65b84a3e1ad32df126b8b81d2051347 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Thu, 16 Jan 2025 16:48:34 +0100 Subject: [PATCH 18/70] operation: add layer1 to Genesis --- src/operation/commit.rs | 4 +- src/operation/operations.rs | 14 +- src/operation/xchain.rs | 5 +- src/validation/status.rs | 5 +- src/validation/validator.rs | 9 +- stl/RGBCommit@0.1.0.sta | 283 ++++++++++++++++++------------------ stl/RGBCommit@0.1.0.stl | Bin 16257 -> 16363 bytes stl/RGBCommit@0.1.0.sty | 12 +- stl/RGBLogic@0.1.0.sta | 26 ++-- stl/RGBLogic@0.1.0.stl | Bin 1659 -> 1659 bytes stl/RGBLogic@0.1.0.sty | 14 +- stl/Transition.vesper | 1 + 12 files changed, 185 insertions(+), 188 deletions(-) diff --git a/src/operation/commit.rs b/src/operation/commit.rs index 31f5be0f..0209cb17 100644 --- a/src/operation/commit.rs +++ b/src/operation/commit.rs @@ -40,7 +40,7 @@ use strict_encoding::StrictDumb; use crate::{ impl_serde_baid64, Assign, AssignmentType, Assignments, BundleId, ConcealedAttach, ConcealedData, ConcealedState, ConfidentialState, DataState, ExposedSeal, ExposedState, - Extension, ExtensionType, Ffv, Genesis, GlobalState, GlobalStateType, Operation, + Extension, ExtensionType, Ffv, Genesis, GlobalState, GlobalStateType, Layer1, Operation, PedersenCommitment, Redeemed, SchemaId, SecretSeal, Transition, TransitionBundle, TransitionType, TypedAssigns, XChain, LIB_NAME_RGB_COMMIT, }; @@ -237,6 +237,7 @@ pub struct BaseCommitment { pub schema_id: SchemaId, pub timestamp: i64, pub issuer: StrictHash, + pub layer1: Layer1, pub testnet: bool, pub close_method: CloseMethod, pub asset_tags: StrictHash, @@ -281,6 +282,7 @@ impl Genesis { flags: self.flags, schema_id: self.schema_id, timestamp: self.timestamp, + layer1: self.layer1, testnet: self.testnet, close_method: self.close_method, issuer: self.issuer.commit_id(), diff --git a/src/operation/operations.rs b/src/operation/operations.rs index 1d383f26..8b8bd092 100644 --- a/src/operation/operations.rs +++ b/src/operation/operations.rs @@ -360,6 +360,7 @@ pub struct Genesis { pub flags: ReservedBytes<1, 0>, pub timestamp: i64, pub issuer: Identity, + pub layer1: Layer1, pub testnet: bool, pub close_method: CloseMethod, pub asset_tags: AssetTags, @@ -373,19 +374,6 @@ pub struct Genesis { impl StrictSerialize for Genesis {} impl StrictDeserialize for Genesis {} -impl Genesis { - pub fn layer1(&self) -> Option { - if let Some((_, typed_assigns)) = self.assignments.iter().next() { - typed_assigns - .to_confidential_seals() - .first() - .map(|cs| cs.layer1()) - } else { - None - } - } -} - #[derive(Clone, PartialEq, Eq, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB_COMMIT)] diff --git a/src/operation/xchain.rs b/src/operation/xchain.rs index 8178aaaf..f4397aa7 100644 --- a/src/operation/xchain.rs +++ b/src/operation/xchain.rs @@ -41,7 +41,7 @@ pub const XCHAIN_LIQUID_PREFIX: &str = "lq"; #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Display)] #[display(lowercase)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[derive(StrictType, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB_COMMIT, tags = repr, into_u8, try_from_u8)] #[cfg_attr( feature = "serde", @@ -49,8 +49,9 @@ pub const XCHAIN_LIQUID_PREFIX: &str = "lq"; serde(crate = "serde_crate", rename_all = "camelCase") )] #[repr(u8)] +#[derive(Default)] pub enum Layer1 { - #[strict_type(dumb)] + #[default] Bitcoin = 0, Liquid = 1, } diff --git a/src/validation/status.rs b/src/validation/status.rs index a00a9669..a813ec04 100644 --- a/src/validation/status.rs +++ b/src/validation/status.rs @@ -291,9 +291,8 @@ pub enum Failure { SealNoPubWitness(BundleId, XWitnessId, WitnessResolverError), /// witness layer 1 {anchor} doesn't match seal definition {seal}. SealWitnessLayer1Mismatch { seal: Layer1, anchor: Layer1 }, - /// seal {1} is defined on {0} which is not in the set of layers allowed - /// by the contract genesis. - SealLayerMismatch(Layer1, XGraphSeal), + /// seal {0} is defined on {1} which is not the layer 1 defined by the contract genesis ({2}). + SealLayerMismatch(XGraphSeal, Layer1, Layer1), /// transition bundle {0} doesn't close seal with the witness {1}. Details: /// {2} SealsInvalid(BundleId, XWitnessId, String), diff --git a/src/validation/validator.rs b/src/validation/validator.rs index 824045d2..fe6a4f8a 100644 --- a/src/validation/validator.rs +++ b/src/validation/validator.rs @@ -134,7 +134,7 @@ pub struct Validator< schema_id: SchemaId, contract_id: ContractId, - layer1: Option, + layer1: Layer1, close_method: CloseMethod, contract_state: Rc>, @@ -162,14 +162,13 @@ impl< let genesis = consignment.genesis(); let contract_id = genesis.contract_id(); let schema_id = genesis.schema_id; + let layer1 = genesis.layer1; let close_method = genesis.close_method; // Prevent repeated validation of single-use seals let validated_op_seals = RefCell::new(BTreeSet::::new()); let input_transitions = RefCell::new(BTreeSet::::new()); - let layer1 = genesis.layer1(); - Self { consignment, status: RefCell::new(status), @@ -601,10 +600,10 @@ impl< }); continue; } - if self.layer1 != Some(seal.layer1()) { + if self.layer1 != seal.layer1() { self.status .borrow_mut() - .add_failure(Failure::SealLayerMismatch(seal.layer1(), seal)); + .add_failure(Failure::SealLayerMismatch(seal, seal.layer1(), self.layer1)); continue; } diff --git a/stl/RGBCommit@0.1.0.sta b/stl/RGBCommit@0.1.0.sta index 9f2491ab..abaf688c 100644 --- a/stl/RGBCommit@0.1.0.sta +++ b/stl/RGBCommit@0.1.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:IJ8ChpTj-XMVz1y3-z15BDBB-huKjqsO-YswXmFV-XxCnB0Y#pamela-polka-corona +Id: stl:0OQ7gS8R-XmQg8MV-smgBZ5o-B$ZJvp5-S4xxB51-PpdNPZU#julius-square-inch Name: RGBCommit Dependencies: BPCore#symbol-tropic-grand, @@ -8,7 +8,7 @@ Dependencies: CommitVerify#miller-pancake-elastic, Std#ralph-blue-lucky, Bitcoin#signal-color-cipher -Check-SHA256: 80a904a49a049eacffb1c80ef08d1317819f5588ad46544493dc828cc01297dd +Check-SHA256: 7925a1919f797fc87e27c949a10fcd603ce362399d4808729b93fcef8e96d919 2~tNwLvL+uX>mb;*F>vukd; =m`ygb@x#_>`RmOO$0)3Z)}yry~#}iVEJ)s5j^%uEnQ9{n2s|9Fa^ps+HG#`XS5DMY;b5{PIYZeZ)9O} Xt{%a=RmHK6WZ%EWRm@*ULd%lgGoFTxUTU 76^nC$%1sKzB<;EQA|)S-x88IWKN#S$#@T&w`gPtRC#b^PGN0jYXqYdo~D%m7H6OD0<^0n_2##VWXRdj -y=DB@qgYOj1yf~hNn}I-2tjjmWpq?wX9WQO2LJ#-AOHzLb8}^MRAFax1pxpG0f+wLWmt%8=p4R=gtK{L +y=DB@qgYOj1yf~hNn}L;2tjjmWpq?wX9WQO2LJ#-AOHzLb8}^MRAFax1pxpG0f+wLWmt%8=p4R=gtK{L Clh6Z#kObxUW*hKHnBv9xdF+KnyJGEOB((CXB(HiD*XOTXpbLr$Svz}Z|7;7BCh}d000000093000000 001IEb8~5DZc=4-WnpY(WI=RvVPj}QY-w&}Q)OXnRCrKyas&hb3}bI@W@%()Zggp3YybuW1aoC!YysPf S{i~B5OpZ>_>4e9YQ#rfba;u!+d5tm#=h2RwFCuobYXO50sJ&Y-CxfQ3;(PYqMdwWnpYocxhw>0RRdChyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt 0R##hIKJeu_DJbYWv?Nn`~900#g7 Kp+4ML3DIsV`x)!VRU5%0s?7d0fcc4lPpg3!?y@aX^XIja4CK{WF&t@k=WXUZP9(YI0Db5bYX39002k^X>)URWpV;~10COKearHw -cS=7M7YzYaI8*bvhMOc?)(rkC#nUEjudT)PryvH%qoUf%jN6#Tx81sfg4O?s`uaep_R|IjbY*jNZe?@= -$}AplgPGkh3_fq3Q7_j=2#kPT_9!;lWR>~GYywm#VTK~nd#>j`0Vb7gc?VP|s!dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThG60RRU806-uB4?}NmV`X7%Wn@8gbYWv? -1pxpD002NB01ZQLZewL(Y-MCbVRT^y0RRU806-uB5kqfoV`X7%Wn@NmZf9v?Y-I)l3S)0=ZE19EWo~o< -NWB_v7yE`g7JPmsUNvXifV=@3j=0mb^+R(Q4?4eR(6nw`S$_F2)vN@Mb6UJ-F(lri_dqerx4lR4>iBsz -2WM<=Vqt7^0p25#Yo@G%*b#-tU^&3KX?w7l?~*Sh8@1jRRblZzybED-b7^O8ZDnqBa{+$huy3?0v&8b0-V>p(oz$%02 -33g#@Wo~0>Wpe@Dg=PS6VPp{$?vC--s`v@B8YHl)C#jpVFzBk!DMw8Sc42I3WMOn~asqk-9p7nv%krpq -N@L7b8`ZE -10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%N -MR;^&ZgXjGZc}4uWo=;w1_*6sbYWy+bYTDq0d?d}_}|Wp0vpvv$c&#PW69R$ltr%da5t5w^x+8!q5uE@ -000000RI300000000(DmZ(?C=a{vkf)$WoGNrn+a000000RI300000000(kqWMyS-a{vheM(yUq2ps*m=2xUD -T;RqCgn#@WzFu~@adfH5^@&-|0000000000{{R30000003t@9}X=iS2Wo~qH015$z{^Dg=h-~N_zJ`Re +cS=7M7YzYaI8*bvhMOc?)(rkC#nUEjudT)PryvH%qoUf%jN6#Tx81sfg4O?s`uaep_R|IiY+-q2axnpU +#Mns)Y&M6LqDeqU-jv95KHlThh+c{38p;h*Y8ns+bY*jNZe?@=$}AplgPGkh3_fq3Q7_j=2#kPT_9!;l +WR>~GYywm#VTK~nd#>j`0Vb7gc?VP|s! +dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThG60RRU806-uB4?}NmV`X7%Wn@8gbYWv?1pxpD002NB01ZQLZewL(Y-MCbVRT^y +0RRU806-uB5kqfoV`X7%Wn@NmZf9v?Y-I)l3S)0=ZE19EWo~oV=@3j=0mb^+R(Q4?4e +R(6nw`S$_F2)vN@Mb6UJ-F(lri_dqerx4lR4>iBsz2WM<=Vqt7^0p25#Yo@G%*b#-tU^&3K +X?w7l?~*Sh8@1jRRblZzybED-b7^O8ZDnqBa{+$huy3?0v&8b0-V>p(oz$%0233g#@Wo~0>Wpe@Dg=PS6VPp{$?vC-- +s`v@B8YHl)C#jpVFzBk!DMw8Sc42I3WMOn~asqk-9p7nv%krpqN@L7b8`ZE10COKearHwcS=7M7YzYaI8*bvhMOc? +)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%NMR;^&ZgXjGZc}4uWo=;w1_*6sbYWy+ +bYTDq0d?d}_}|Wp0vpvv$c&#PW69R$ltr%da5t5w^x+8!q5uE@000000RI300000000(DmZ(?C=a{vkf +)$WoGNrn+a000000RI300000000(kqWMyS-a{vheM(yUq2ps*m=2xUDT;RqCgn#@WzFu~@adfH5^@&-|00000 +00000{{R30000003t@9}X=iS2Wo~qH015$z{^Dg=h-~N_zJ`Red1EINWrM}GXaQb}6c#qIM2EQnHo-KZ +`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4>GEG0000000000{{R300000033g#@Wo~0>Wpe-t0Y>fS!w4Mx +xaL=+DqP^k2!wz9AHH68xp8!<%Jqp^&Hw-a000000RI3000000010+sY-wa+bZ>G11OfmAZf|a700001 +1aog~WdH>M0%CAAe<9`Lptgpr6F_xjAC6(~TLj#*ewiHf`^rCgHqw;r~cW`-QV>+d2nR~0RR9314d?c1pxp60u4rWZf9v?Y-Lk)VRU5#0SE?SX>@ZoGynww +000OKMs;pyX<}?;RC#b^0|5bs~EXcCXx(drQcb3B`Fx$)^%va$Ar)C7cFqVR>b8F#&nR +*hvU%Hiwm>NkB*5l*n^F-s9AWUWw-#$_-O$8W0C`Wpi|HWpo0{EFN!zncXl9K5w2;FV{y1jDTJCC^p$- +mHEbO0#qkqh9c2>uJC38-{*D7fZ(%hZo23R4S;p`Q9JBQllDyuV{C78Wld#tXm4Z!A#kgq^`I&ZzC?)! +&R01Y?(H9FO$CR6P1%k7c67A-F1HXRxo%|^+Itiop&gxXSvq){{YhrGf57_P)SQy*31M?{Wpq?wXLA85 +B@PC`naz9~L0@lerBKV`$$1fC6#s{=m+2p6@mtIYZDn*}WMOn+0rh%KI9Y!AFx9LCk8@hQXE7w+qW3^C +%eTEp@#^?_H3w&GZ(?C=a{=BXk!z-`g4hv-$6z_YxoLZ_neUP>BpbEf7FA*KKfDWJb8~5DZf#|5baMfI +;;?VDE9LAz1&yRlxI~Sa{=9jW&m$tWDykZj`7#3_zANbB(SO{ +shhGe=&H{tM@n+a000000RI300000001IJr +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 +smk?Ml$g}C@DyY!@{ +4YR*LMYs=?Zg_*ktx|21^lzg9sBTBv19V|$0m+Y=slx_K8vXre8<)H){QgX6j~{c$E$eY_=V_ZFuLe_N +Xk~3-1`PvdW_AJEn^6;37FKqUhx?i3R+Mr!fY&(;2BFL(m@EZk_srD=W^7?+a{_t;9p7nv%krpqNC`}q*rQx*t>6v={gsJ=SZlTl1iF5eQ8IAl(q%E@>So406W33O>~Wpi|4 +ZEyepNC{+Rc4cgDaAk4ioJpYH;+t0eX2w~A!Q+0eaZ{MVycPK^Kn000000093000000000YTY;R&=Y*cx0Wpe-u0oCr3 +4oQf!Y4K`P(FaQVwIle)QgI&pHa%8Z1>xis%K=jn%|ogzQLxC5#{z1Bs(ImjcZKu%4y_xMoB3q3{22fM +000000093000000000VacWz~5RC#b^a{vkfhyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0VPFr +zQMU~Cv3(oCX8r!*SiR9zOp;)>$$b(q=dpw@&Et;000000RI300000001S3vY-Mg^c~p6DWpe-t0Y>fS +!w4MxxaL=+DqP^k2!wz9AHH68xp8!<%Jqp^&Hw-a000000RI300000000(DfZe??6a{(Ag)zidWvABmX +&uCxQ{9vUAsn@)h(<^=)@3p(i4Fw8icywiMb7^mGa{vkfWOW`wsTH9-LlJ`2|Ay5Z(?oEikl{+~pis;@ +Q*TJ#0Rw0P%&6V>N}#h955#ht!=;R2Lj=uo+MI7C_W0!u+yDRo000000RI300000001I?-VQzD2bZKvH +a{vkfG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(10d}<;Xp5rzopjE#5h98`u~h0v`BV8NkLOrp +Fzp4z*Z=?k000000RI300000000?qrb7gXNWn=<+10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUGK +f)+{Nc)mXTm=OBn8@DNvJ^I(u7Ttc@lJ^C)`OzK-Q)6glZDC1d1pxpD002NB018xcVQzD2bZKvH1`7jb +W_AJEn^6;37FKqUhx?i3R+Mr!fY&(;2BFL(m@EZk_srD_V{dMBa$#e1Nn`<^2rNlD$O59e#ogQsB77jP +l+h5j^*S;IZf|a5WdHyO4s>#1ZgXjLX>V>+d2nR`G*S<)6P6lYy(#<=BR_>s@(?%#f7ArN +-=Rj?7Ns(12yJC_VPs)+VFC4eO*mP8`7qV21dnrCyk{{a-lF$FG0V5TNAc?Tc{K-TY;R&=Y;ytLBav&S +tb*7Pg~wnyz`1FAu$k|YFC-ha-WFA1@jtuM?JbaMfzqIy@8$eYR~OKp92)%PJ48iGR>vvBgJ_74J{ +JehzCVRLh7XKrm}Zgg`2#cYKLGZ}kd9ki0?#5d0Vl~OH|taN{Q>#k2Wpe@Dg=PS6 +VPp{$?vC--s`v@B8YHl)C#jpVFzBk!DMw8Sc42I3WMOn~asqk-9p7nv%krpqN@L7b8`ZE10COKearHwcS=7M7YzYa +I8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%ORB~Z%b7^#GZ*D?$Ze(m_ +1_KLYY;SXAO=WawZ)5@?aI2y9pehZ%M2QE^S2-B&?H_1O1&4u6*^T^mbhP{~w-6<{ZeNoKcy!1~?PoRaGZX>M?JbWLG!0Tr2NWXrXyKnGOwA#t$mH2bG7pQ)aE=^FQF!@KkQh!AUTZ+C7~ +a$#@6CZgT(%0hP$+dLDIRU(}XWLTZugenOC;Z(5k~zEJnJiX;;E#Q~{tkvqtVge_8=9u&qKNa|cJ +vT4_ho$INOTl)(Qg;)Uq000000096000000000nFa$#@6CZc}4uWo=;w1_*6sbYWy+bYTDq0d?d} +_}|Wp0vpvv$c&#PW69R$ltr%da5t5w^x+8!q5uE@000000RI300000000(DmZ(?C=a{vkf)$WoGNrn+a00000 +0RI300000000wDpaCLNZ015$z{^Dg=h-~N_zJ`Red1EINWrM}GXaQb}6c#qIM2EQnHo-KZ`k;Xmr`<4s +JYKN!!u{G5u+^j1lf!PF4>GEG0000000000{{R30000003t@9}X=iS2Wo~qH015$z{^Dg=h-~N_zJ`Re d1EINWrM}GXaQb}6c#qIM2EQnHo-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4>GEG0000000000{{R30 0000033g#@Wo~0>Wpe-t0Y>fS!w4MxxaL=+DqP^k2!wz9AHH68xp8!<%Jqp^&Hw-a000000RI3000000 010+sY-wa+bZ>G11OfmAZf|a7000011aog~WdH>M0%CAAe<9`Lptgpr6F_xjAC6(~TLj#*ewi -Hf`^rCgHqw;r~cW`-QV>+d2nR~0RR9314d?c1pxp60u4rW -Zf9v?Y-Lk)VRU5#0SE?SX>@ZoGynww000OKMs;pyX<}?;RC#b^0|5bs~EXcCXx(drQcb -3B`Fx$)^%va$Ar)C7cIzWpi|HWpo0{EFN!zncXl9K5w2;FV{y1jDTJCC^p$-mHEbO0#qkqh9c2>uJC38 --{*D7fZ(%hZo23R4S;p`Q9JBQllDyuV{C78Wld#tXm4Z!A#kgq^`I&ZzC?)!&R01Y?(H9FO$CR6P1%k7 -c67A-F1HXRxo%|^+Itiop&gxXSvq){{YhrGf57_P)SQy*31M?{Wpq?wXLA85B@PC`naz9~L0@lerBKV` -$$1fC6#s{=m+2p6@mtIYZDn*}WMOn+0rh%KI9Y!AFx9LCk8@hQXE7w+qW3^C%eTEp@#^?_H3w&GZ(?C= -a{=BXk!z-`g4hv-$6z_YxoLZ_neUP>BpbEf7FA*KKfDWJb8~5DZf#|5baMfI;;?VDE9LAz1&yRlxI~S< -ZsScal&=ZJ4GXqAMfWKQc42H~ZewX>a{=9jW&m$tWDykZj`7#3_zANbB(SO{shhGe=&H{tM@n+a000000RI300000001IJrb7^O8ZDnqBa{vkfhyLPa -Scq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a -000000RI3000000010+sY-Mg^X=QT&2?0j!=EDda{kY~=q$*tC#t4Le{2#tvcDZqMsmk?aU=OZ$bvG|>z)+>9PT;Au-7)~D;-++hnxY;R&=Y*Tb$bY%qr015%s?vf5k -h_h+&YE#h%O8d1V_{UOl9{V;uR#^q%$8ES^HwOl>wiJc;WmI`^Wd#8M00In0Y;R&=Y*t}xb!Bq}0RRXAGM-jZ2Kh}DE2o;HYydTtf}Q!WH{}bI!u)W* -#(e~Z0RR9100000|Nj60000002uWmRZggpMc?AIg1p)%fEFN!zncXl9K5w2;FV{y1jDTJCC^p$-mHEbO -0#qkRz9SbZ=!8X@=Yuq$20sb<4l#S`iz7Vef}@Ca=a#qt2m;D19&dx0-7pM3Z=O*v*GCA9fL-<|HrZsA -`NnJlR3}KjBNr;@ghiU?gEXK9KMDE{F?;HZBRuDVqlk6qmbd@_000000093F00000000F^Zg6#U1_B3g -a%FZ;b#wuf5WIk~G+K)5%bR49t5yk`^qQ9la%FR6a&~280(t`--)Viz@~C%8KNS}Z -0aQ3s^SOqbBwN-D{wl@OCd;@jJLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF0SHNMaCLM|VQ>Wj015*2 -Y!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>jbO<32;hs$B9ZCsU(1!DsC|W1LOd&b_IRG-(&Q$wPGk -mB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<0RR9100000|Nj600000021#ykb#!wD0RRaB)s0^W -44ZlVPs)+VFdvI3ITQGP59r= -ivkR6Lh9EroO>_;00000 -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 -00960000000006Cb98cbV{~?nZ&L00;r& -RmTdUadnMQziE5xZZH-mc~-fzS41y+p{^_ku%R9R0000000030{{R30000303So3~VPj}*Wo~o;1pxpE -0XeIl<1VPcybH9KM*xoq&Zg2Gr#Z;y7!6fzc?JkK3;+NC000000RR600000000~xMY-Mg^X=QT-0RRaB -M(yUq2ps*m=2xUDT;RqCgn#@WzFu~@adfH5^@&-|0000000000{{R30000003szxlWo~16RC#b^1pxp6 -0tr@cX=GD$VRU5$0RR916j(!OVQFqcY-w&}Q)OXnRCrKyas&bZ2V!Y-V{d7000jX8A#kgq^`I&ZzC?)! -&R01Y?(H9FO$CR6P1%k7c67A-r>OF|0}@Y#k~NrxRcQq+F$P2q2)nlUE64L7%3W7R0S0Voadl~A00jX8 -A#kgq^`I&ZzC?)!&R01Y?(H9FO$CR6P1%k7c67A-r>OF|0}@Y#k~NrxRcQq+F$P2q2)nlUE64L7%3W7R -6IerNVQFqcY-w&}Q)OXnRCsA*1OfmDVrg_^Z)t7-1pxvfaI2y9pehZ%M2QE^S2-B&?H_1O1&4u6*^T^m -bhP{|1C2;aNA(0eXS#L;%_oib8;tKCLQ=nuAv#{`SnN;%25f0@b!lV(1pxvfaI2y9pehZ%M2QE^S2-B& -?H_1O1&4u6*^T^mbhP{|1C2;aNA(0eXS#L;%_oib8;tKCLQ=nuAv#{`SnN;`SVL%GX>LL?_X=DTf00&}ebYpL6ZU6-V0`+VYVk7oBr%DNv -+($;q`HHK!gIHa)*%m(-e#9sm3ZsHT^UK%K(4i9Ajp1M~R@C@!4#dQE#lUD;OiKi1RsjZVX>oOFWB>&L -0`+VYVk7oBr%DNv+($;q`HHK!gIHa)*%m(-e#9sm3ZsHT^UK%K(4i9Ajp1M~R@C@!4#dQE#lUD;OiKi1 -Rs +Hf`^rCgHqw;r~cW`-Qb7^w`1pxsvNrrQS*~6@ru6{)oTV8mlXkYRmE;-;If!d#6MTk}b3UqQ|ZgXjLX>V=- +1p)z|2rNlD$O59e#ogQsB77jPl+h5j^*S;EG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj? +7Ns(10tsb!bY*UHX>V=-1p)z|2rNlD$O59e#ogQsB77jPl+h5j^*S;EWOW`wsTH9-LlJ`2 +|Ay5Z(?oEikl{+~pis;@Q*TJ#8dQ03Wn@8fb7^O8b3$xsZe&wsVQf@*P;_zx1ON+UWn*k%a$$67c4Yts +0RRXARovLN-1VM0&1XW>!!rJWS%Z0(Vs*!l02xplFMU>Ch&EIH!6g0000000000|Nj60000000t$0Lb#i57 +00jX62mu3wOUJL|l)XnJ|Y?0+bJM00;pF_({(KlnKsjJXoamR?*B6I&N>4Ho!h0 +1BO0000000030{{R30000012xfI|XK7+=WdH>M00;r)^6oE1@AfMySS7tF=XZL8+<@a?ghGPH +U7;{2`9QY-0000000030{{R30000023UhRFbz^jOa%E%y1pxpE0pnH23ZZdzjZnX7d+Tm67AARCxwBV9 +FMFY`EC;Zm9smFU000000RR60000000RIYMbaY{3Xl-R~bN~eb00;p&tDfU7sKC4nw3kN!j|k4D(jBKc +$mbXhRc(0&2saD>0000000030{{R3000009R$**qZewX>a|Hna2?0j!=EDda{kY~=q$*tC#t4Le{2#tv +cDZqMsmk?c;Wd#8M000zNLug@X +ZbEEnZe&wsVQf@*P;_zx0sseMX>?<6X>I@o0Rka#tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEU;2 +^0@;NPlb{-n1xko1uZcKL=FhMw)iW@^B~GyS4IH_Y-w?IX=DHe0Rka#tD*IvDh<9wi3iSCIT-HkA81Vl +hk;Gmjr?|WwEU;2^0@;NPlb{-n1xko1uZcKL=FhMw)iW@^B~GyS4I<9Lug@XZbEEnZe&wsVQf@*X=DTf +00&}ebYpL6ZU6-V0wHj#q4l6D4ZcK)2hLYH81C&KXiWu&flb+s{C0G-{44{FNJ~fc1UzTDb_LBRjrSXj +?;k=^zm6d~Uh7!wPyq&PX>oOFWB>&L0wHj#q4l6D4ZcK)2hLYH81C&KXiWu&flb+s{C0G-{44{FNJ~fc +1UzTDb_LBRjrSXj?;k=^zm6d~Uh7!wP!L!{Xklq?Q)OdvWpqoOF +WB>&L0wHj#q4l6D4ZcK)2hLYH81C&KXiWu&flb+s{C0G-{Ad~Lyw$T9tCzEwrAszt-P)%HZ|LbH=L2A= +l(W4CP6}8jc* +fjc*fwGSCiZ?h*N?`IiGv#>NXg>i9?7NbJ@rcL>7r@|F4K8jd(_2-=9*5CJK^Uc=cbt{yAcSB=d y-sT?dySxfUo^8d=HxI9wx~|SuG&-(gc}Dyv1wG3L@{PCV$GdifZSJ)E!3qGiykc+w delta 137 zcmV;40CxZDe}R9njsyWjvyTL!7Xb&8F&xIT9~}z@0S%L&Dn}X z)+zxhJfH~4J1RFM{f83T#AUKa?s ^ 1.. OpId} @mnemonic(sector-charlie-diagram) data Inputs : {Input} +@mnemonic(camilla-basket-justin) +data Layer1 : bitcoin | liquid + + @mnemonic(isabel-heaven-north) data MediaType : any#255 | (|) diff --git a/stl/RGBLogic@0.1.0.sta b/stl/RGBLogic@0.1.0.sta index d71ed190..a45279ae 100644 --- a/stl/RGBLogic@0.1.0.sta +++ b/stl/RGBLogic@0.1.0.sta @@ -1,14 +1,14 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:MGoAZ!ex-Mxxzq!6-Iwump4Y-K$enNGN-!Aa52Ms-b1r7WF8#satire-herbert-nato +Id: stl:UrhM408a-L6A2m5B-NJsufkB-2v8qfwZ-ZdPzm67-gTH3xGM#brother-sushi-savage Name: RGBLogic Dependencies: - RGBCommit#pamela-polka-corona, BPCore#symbol-tropic-grand, + RGBCommit#julius-square-inch, Bitcoin#signal-color-cipher -Check-SHA256: 2a460fc4e9b361c79ca4e34dce01cc1cce04f3798d69c556fae018fa7370f3cf +Check-SHA256: 944b12a51dc50a5d0ac66ba13a1ad2f12bcbffffcb5d0177fab30b5de555abf1 -2vSEvOmAmtV*?ja}LTPkk +2vSEvOmAmtV*?>@tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPA_P(yEWWzgh1fiDqWWFYXxY?=UB +=74`>o9X2)F~lBqK9@~Bl?hTuLPKwDZE1A%Y!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkk Z)t7=20~CnZ*pY?00DdlT>wB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 wjY>38tto&d&=eG4cRAF#( @@ -24,15 +24,15 @@ iRT*14O40w5C%+Pd1Z1jmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<1W#~DWCZ{SL}Fu5a&K>D n*!v8^Ea7rh?dzC2n+%RZ*X#DbN~eb0wHj#q4l6D4ZcK)2hLYH81C&KXiWu&flb+s{C0G-{6|jDT+rxD K6vW;JU&?LxLM72H?wDC1Zo}=N}D)4mkCE~Z(?C=PjX}i0tIhyPjX}d{&9|4h)I8ST&b@+9Xb*Ax0)~|1T*Y(OE%VoqLj)LZDmtt=i!fecRbLRN -2S#Ld9zv-Vp*%wog4O?q)g04AaHEjnO6;Ie%sNwVNZti*Z*F5{000OCZ*Xa30wA9PhLq!6#dFs!^Vg6= -1Q>2AI;=U1FkWF*Ul6AUMwQ6sdLDIRU(}XWLTZugenOC;Z(5k~zEJnJiX;;E#s3O)a$#@6CZU6=Z -2X|?7Ze??G0dl)S$QV;yG0%+u`Lqfm#|FpRuujhTP8r)T_J?np;R1Ad0wA9PhLq!6#dFs!^Vg6=1Q>2A -I;=U1FkWF*Ul6AUMl@0nt`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zcaA{-$AfEz; -l;d2*bJs2N*N{U57;Y*$tT~G?USU;V5T^%5mB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<3Rh`# +LdY0XT`|v$|M|2EBF6^D+OST}`A!+zFZPFTn&AR;c>>VnJAp3|USuHf#cY}YS>}L$WSi;bE-}O&bv~C( +J(Xm29zv-Vp*%wog4O?q)g04AaHEjnO6;Ie%sNwVNZti*Z*F5{000OCZ*Xa30?_0;fiDqWWFYXxY?=UB +=74`>o9X2)F~lBqK9@~Bm6gcmdLDIRU(}XWLTZugenOC;Z(5k~zEJnJiX;;E#s3O)a$#@6CZU6=Z +2X|?7Ze??G0dl)S$QV;yG0%+u`Lqfm#|FpRuujhTP8r)T_J?np;R1Ad0?_0;fiDqWWFYXxY?=UB=74`> +o9X2)F~lBqK9@~Bl{8Wht`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zcaA{-$(BwOT +FA-j3An?U(ngChmfPZA0>E$jl#2$4%mrXsDmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<3Rh`# Ze??GPjX}g0{{qNa${&|c4cG$00036ZE0?0WB>&L0bJY;BNZ=sBHM?<`J6+Fr=ADb5bYX39002k +5&{WyWo~p~bZK^F0000AS7~%^Wpi^-Z*v9%25ez@WpXhB(BwOTFA-j3An?U(ngChmfPZA0>E$jl#2$4% +mrXsDdBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W)00aqiX>Db5bYX39002k -----END STRICT TYPE LIB----- diff --git a/stl/RGBLogic@0.1.0.stl b/stl/RGBLogic@0.1.0.stl index b99aea8e180328f4ccfab1077c0590bb0742f489..14aba3d859120fe0fc648181ae9f5334c303b925 100644 GIT binary patch delta 281 zcmey(^P7i@Bgoy!CqF$inR&7wvw|U;Q-E`RQR;;!){XjtaVZKPj^@l_hZ}SQ6Qvz@@^&teb&7EyyR2{1`d||g3J^qf_g5p e#1J;vmsOvzqKhmFllQP@5LWn-NpW&2n-~DhS9Nm$ delta 281 zcmey(^P9(nBgoy!CqF$inOR{zQ`?lsF-ME9>wdmI!I?!OPs?hJWw$|GVraa;a&|XP zpi1Zb+}zBP$$rcV>}*Z}&iO^D8>87-6bNaZyqifupEWN(FFBQgfrBN#ATx!Dpq`5? eF@z2FWz{FF=pu{4 Date: Fri, 17 Jan 2025 12:02:11 +0100 Subject: [PATCH 19/70] schema: remove pedersen commitments --- Cargo.lock | 46 +--- Cargo.toml | 4 +- src/operation/commit.rs | 14 +- src/operation/fungible.rs | 515 +----------------------------------- src/operation/mod.rs | 9 +- src/operation/operations.rs | 27 +- src/operation/state.rs | 3 +- src/schema/state.rs | 7 - src/stl.rs | 4 +- src/validation/logic.rs | 49 +--- src/validation/status.rs | 9 - src/vm/contract.rs | 11 +- src/vm/macroasm.rs | 12 +- src/vm/op_contract.rs | 148 +++++------ src/vm/opcodes.rs | 6 +- stl/AnchoredBundle.vesper | 14 +- stl/RGBCommit@0.1.0.sta | 464 ++++++++++++++++---------------- stl/RGBCommit@0.1.0.stl | Bin 16363 -> 15969 bytes stl/RGBCommit@0.1.0.sty | 28 +- stl/RGBLogic@0.1.0.sta | 26 +- stl/RGBLogic@0.1.0.stl | Bin 1659 -> 1659 bytes stl/RGBLogic@0.1.0.sty | 4 +- stl/Transition.vesper | 15 +- 23 files changed, 396 insertions(+), 1019 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 761d4752..cff088e1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -172,12 +172,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "340e09e8399c7bd8912f495af6aa58bea0c9214773417ffaa8f6460f93aaee56" -[[package]] -name = "bitcoin-private" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73290177011694f38ec25e165d0387ab7ea749a4b81cd4c80dae5988229f7a57" - [[package]] name = "bitcoin_hashes" version = "0.14.0" @@ -225,7 +219,7 @@ dependencies = [ "amplify", "chrono", "commit_verify", - "secp256k1 0.30.0", + "secp256k1", "serde", "strict_encoding", "strict_types", @@ -260,7 +254,7 @@ dependencies = [ "base85", "bp-consensus", "commit_verify", - "secp256k1 0.30.0", + "secp256k1", "serde", "strict_encoding", ] @@ -650,7 +644,7 @@ dependencies = [ "getrandom", "mime", "rand", - "secp256k1-zkp", + "secp256k1", "serde", "single_use_seals", "strict_encoding", @@ -689,17 +683,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" -[[package]] -name = "secp256k1" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" -dependencies = [ - "rand", - "secp256k1-sys", - "serde", -] - [[package]] name = "secp256k1" version = "0.30.0" @@ -721,29 +704,6 @@ dependencies = [ "cc", ] -[[package]] -name = "secp256k1-zkp" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52a44aed3002b5ae975f8624c5df3a949cfbf00479e18778b6058fcd213b76e3" -dependencies = [ - "bitcoin-private", - "rand", - "secp256k1 0.29.1", - "secp256k1-zkp-sys", - "serde", -] - -[[package]] -name = "secp256k1-zkp-sys" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57f08b2d0b143a22e07f798ae4f0ab20d5590d7c68e0d090f2088a48a21d1654" -dependencies = [ - "cc", - "secp256k1-sys", -] - [[package]] name = "serde" version = "1.0.214" diff --git a/Cargo.toml b/Cargo.toml index a87ec3bf..2a9f5ea6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,7 +30,7 @@ aluvm = { version = "~0.11.0-beta.9", features = ["std", "ascii-armor"] } commit_verify = { version = "~0.11.0-beta.9", features = ["rand", "derive"] } single_use_seals = "~0.11.0-beta.9" bp-core = { version = "~0.11.0-beta.9" } -secp256k1-zkp = { version = "0.11.0", features = ["rand", "rand-std", "global-context"] } # TODO: Update version before the release +secp256k1 = { version = "0.30.0", features = ["global-context"] } mime = "~0.3.17" serde_crate = { package = "serde", version = "1", features = ["derive"], optional = true } chrono = "0.4.38" @@ -47,7 +47,7 @@ serde = [ "commit_verify/serde", "bp-core/serde", "aluvm/serde", - "secp256k1-zkp/serde" + "secp256k1/serde" ] [target.'cfg(target_arch = "wasm32")'.dependencies] diff --git a/src/operation/commit.rs b/src/operation/commit.rs index 0209cb17..59cf3f73 100644 --- a/src/operation/commit.rs +++ b/src/operation/commit.rs @@ -39,10 +39,10 @@ use strict_encoding::StrictDumb; use crate::{ impl_serde_baid64, Assign, AssignmentType, Assignments, BundleId, ConcealedAttach, - ConcealedData, ConcealedState, ConfidentialState, DataState, ExposedSeal, ExposedState, - Extension, ExtensionType, Ffv, Genesis, GlobalState, GlobalStateType, Layer1, Operation, - PedersenCommitment, Redeemed, SchemaId, SecretSeal, Transition, TransitionBundle, - TransitionType, TypedAssigns, XChain, LIB_NAME_RGB_COMMIT, + ConcealedData, ConcealedState, ConcealedValue, ConfidentialState, DataState, ExposedSeal, + ExposedState, Extension, ExtensionType, Ffv, Genesis, GlobalState, GlobalStateType, Layer1, + Operation, Redeemed, SchemaId, SecretSeal, Transition, TransitionBundle, TransitionType, + TypedAssigns, XChain, LIB_NAME_RGB_COMMIT, }; /// Unique contract identifier equivalent to the contract genesis commitment @@ -190,7 +190,7 @@ impl AssignmentIndex { pub struct OpDisclose { pub id: OpId, pub seals: MediumOrdMap>, - pub fungible: MediumOrdMap, + pub fungible: MediumOrdMap, pub data: MediumOrdMap, pub attach: MediumOrdMap, } @@ -240,7 +240,6 @@ pub struct BaseCommitment { pub layer1: Layer1, pub testnet: bool, pub close_method: CloseMethod, - pub asset_tags: StrictHash, } #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] @@ -286,7 +285,6 @@ impl Genesis { testnet: self.testnet, close_method: self.close_method, issuer: self.issuer.commit_id(), - asset_tags: self.asset_tags.commit_id(), }; OpCommitment { ffv: self.ffv, @@ -346,7 +344,7 @@ impl ConcealedState { fn commit_encode(&self, e: &mut CommitEngine) { match self { ConcealedState::Void => {} - ConcealedState::Fungible(val) => e.commit_to_serialized(&val.commitment), + ConcealedState::Fungible(val) => e.commit_to_serialized(&val), ConcealedState::Structured(dat) => e.commit_to_serialized(dat), ConcealedState::Attachment(att) => e.commit_to_serialized(att), } diff --git a/src/operation/fungible.rs b/src/operation/fungible.rs index 1af77801..182dc12a 100644 --- a/src/operation/fungible.rs +++ b/src/operation/fungible.rs @@ -30,76 +30,16 @@ //! properties regarding their total sum and, thus, can be made confidential //! using elliptic curve homomorphic cryptography such as Pedesen commitments. -use core::cmp::Ordering; use core::fmt::Debug; use core::num::ParseIntError; -use core::ops::Deref; use core::str::FromStr; use std::hash::Hash; -use std::io; -use amplify::confinement::U8; -use amplify::hex::ToHex; -// We do not import particular modules to keep aware with namespace prefixes -// that we do not use the standard secp256k1zkp library -use amplify::{hex, Array, Bytes32, Wrapper}; -use bp::secp256k1::rand::thread_rng; -use chrono::{DateTime, Utc}; -use commit_verify::{ - CommitVerify, CommitmentProtocol, Conceal, DigestExt, Sha256, UntaggedProtocol, -}; -use secp256k1_zkp::rand::{Rng, RngCore}; -use secp256k1_zkp::SECP256K1; -use strict_encoding::{ - DecodeError, ReadTuple, StrictDecode, StrictDumb, StrictEncode, TypedRead, TypedWrite, - WriteTuple, -}; +use commit_verify::Conceal; +use strict_encoding::{StrictDecode, StrictDumb, StrictEncode}; use super::{ConfidentialState, ExposedState}; -use crate::{ - schema, AssignmentType, ConcealedState, RevealedState, StateType, LIB_NAME_RGB_COMMIT, -}; - -#[derive(Wrapper, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From)] -#[wrapper(Deref, BorrowSlice, Hex, Index, RangeOps)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", transparent) -)] -pub struct AssetTag( - #[from] - #[from([u8; 32])] - Bytes32, -); - -impl AssetTag { - pub fn new_random(contract_domain: impl AsRef, assignment_type: AssignmentType) -> Self { - AssetTag::new_deterministic( - contract_domain, - assignment_type, - Utc::now(), - thread_rng().next_u64(), - ) - } - - pub fn new_deterministic( - contract_domain: impl AsRef, - assignment_type: AssignmentType, - timestamp: DateTime, - salt: u64, - ) -> Self { - let timestamp = timestamp.timestamp(); - let mut hasher = Sha256::default(); - hasher.input_with_len::(contract_domain.as_ref().as_bytes()); - hasher.input_raw(&assignment_type.to_le_bytes()); - hasher.input_raw(×tamp.to_le_bytes()); - hasher.input_raw(&salt.to_le_bytes()); - AssetTag::from(hasher.finish()) - } -} +use crate::{schema, ConcealedState, RevealedState, StateType, LIB_NAME_RGB_COMMIT}; /// An atom of an additive state, which thus can be monomorphically encrypted. #[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display, From)] @@ -150,177 +90,23 @@ impl FungibleState { pub fn as_u64(&self) -> u64 { (*self).into() } } -/// value provided for a blinding factor overflows prime field order for -/// Secp256k1 curve. -#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug, Display, Error, From)] -#[display(doc_comments)] -#[from(secp256k1_zkp::UpstreamError)] -pub struct InvalidFieldElement; - -/// Errors parsing string representation of a blinding factor. -#[derive(Copy, Clone, Eq, PartialEq, Debug, Display, Error, From)] -#[display(doc_comments)] -pub enum BlindingParseError { - /// invalid blinding factor hex representation - {0} - #[from] - Hex(hex::Error), - - /// blinding factor value is invalid and does not belong to the Secp256k1 - /// curve field. - #[from(InvalidFieldElement)] - InvalidFieldElement, -} - -/// Blinding factor used in creating Pedersen commitment to an [`AtomicValue`]. -/// -/// Knowledge of the blinding factor is important to reproduce the commitment -/// process if the original value is kept. -#[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display)] -#[display(Self::to_hex)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", try_from = "secp256k1_zkp::SecretKey") -)] -pub struct BlindingFactor(Bytes32); - -impl BlindingFactor { - pub const EMPTY: Self = BlindingFactor(Bytes32::from_array([0x7E; 32])); -} - -impl Deref for BlindingFactor { - type Target = [u8; 32]; - fn deref(&self) -> &Self::Target { self.0.as_inner() } -} - -impl ToHex for BlindingFactor { - fn to_hex(&self) -> String { self.0.to_hex() } -} - -impl FromStr for BlindingFactor { - type Err = BlindingParseError; - fn from_str(s: &str) -> Result { - let bytes = Bytes32::from_str(s)?; - Self::try_from(bytes).map_err(BlindingParseError::from) - } -} - -impl From for BlindingFactor { - fn from(key: secp256k1_zkp::SecretKey) -> Self { Self(Bytes32::from_inner(*key.as_ref())) } -} - -impl From for secp256k1_zkp::SecretKey { - fn from(bf: BlindingFactor) -> Self { bf.to_secret_key() } -} - -impl BlindingFactor { - /// Creates a random blinding factor. - #[inline] - pub fn random() -> Self { Self::random_custom(&mut thread_rng()) } - - /// Generates a random blinding factor using custom random number generator. - #[inline] - pub fn random_custom(rng: &mut R) -> Self { - secp256k1_zkp::SecretKey::new(rng).into() - } - - /// Generates new blinding factor which balances a given set of negatives - /// and positives into zero. - /// - /// # Errors - /// - /// * if negatives are empty set; - /// * if any subset of the negatives or positives are inverses of other negatives or positives, - /// * if the balancing factor is zero (sum of negatives already equal to the sum of positives). - pub fn zero_balanced( - negative: impl IntoIterator, - positive: impl IntoIterator, - ) -> Result { - let mut blinding_neg_sum = secp256k1_zkp::Scalar::ZERO; - let mut blinding_pos_sum = secp256k1_zkp::Scalar::ZERO; - for neg in negative { - blinding_neg_sum = neg.to_secret_key().add_tweak(&blinding_neg_sum)?.into(); - } - let blinding_neg_sum = - secp256k1_zkp::SecretKey::from_slice(&blinding_neg_sum.to_be_bytes())?.negate(); - for pos in positive { - blinding_pos_sum = pos.to_secret_key().add_tweak(&blinding_pos_sum)?.into(); - } - let blinding_correction = blinding_neg_sum.add_tweak(&blinding_pos_sum)?.negate(); - Ok(blinding_correction.into()) - } - - fn to_secret_key(self) -> secp256k1_zkp::SecretKey { - secp256k1_zkp::SecretKey::from_slice(self.0.as_slice()) - .expect("blinding factor is an invalid secret key") - } -} - -impl TryFrom<[u8; 32]> for BlindingFactor { - type Error = InvalidFieldElement; - - fn try_from(array: [u8; 32]) -> Result { - secp256k1_zkp::SecretKey::from_slice(&array) - .map_err(|_| InvalidFieldElement) - .map(Self::from) - } -} - -impl TryFrom for BlindingFactor { - type Error = InvalidFieldElement; - - fn try_from(bytes: Bytes32) -> Result { - Self::try_from(bytes.to_byte_array()) - } -} - /// State item for a homomorphically-encryptable state. /// /// Consists of the 64-bit value and -#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, PartialOrd, Ord)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB_COMMIT, rename = "RevealedFungible")] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(crate = "serde_crate"))] pub struct RevealedValue { /// Original value in smallest indivisible units pub value: FungibleState, - - /// Blinding factor used in Pedersen commitment - pub blinding: BlindingFactor, - - /// Asset-specific tag preventing mixing assets of different type. - pub tag: AssetTag, } impl RevealedValue { - /// Constructs new state using the provided value using random blinding - /// factor. - pub fn new_random_blinding(value: impl Into, tag: AssetTag) -> Self { - Self::with_blinding(value, BlindingFactor::random(), tag) - } - - /// Constructs new state using the provided value and random generator for - /// creating blinding factor. - pub fn with_rng( - value: impl Into, - rng: &mut R, - tag: AssetTag, - ) -> Self { - Self::with_blinding(value, BlindingFactor::random_custom(rng), tag) - } - /// Convenience constructor. - pub fn with_blinding( - value: impl Into, - blinding: BlindingFactor, - tag: AssetTag, - ) -> Self { + pub fn new(value: impl Into) -> Self { Self { value: value.into(), - blinding, - tag, } } } @@ -334,140 +120,15 @@ impl ExposedState for RevealedValue { impl Conceal for RevealedValue { type Concealed = ConcealedValue; - fn conceal(&self) -> Self::Concealed { ConcealedValue::commit(self) } -} - -impl PartialOrd for RevealedValue { - fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } -} - -impl Ord for RevealedValue { - fn cmp(&self, other: &Self) -> Ordering { - match self.value.cmp(&other.value) { - Ordering::Equal => self.blinding.0.cmp(&other.blinding.0), - other => other, + fn conceal(&self) -> Self::Concealed { + ConcealedValue { + value: self.value, + concealed_dummy: (), } } } -/// Opaque type holding pedersen commitment for an [`FungibleState`]. -#[derive(Wrapper, Copy, Clone, Eq, PartialEq, Hash, Debug, From)] -#[wrapper(Deref, FromStr, Display, LowerHex)] -#[derive(StrictType)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", transparent) -)] -pub struct PedersenCommitment(secp256k1_zkp::PedersenCommitment); - -impl StrictDumb for PedersenCommitment { - fn strict_dumb() -> Self { - secp256k1_zkp::PedersenCommitment::from_slice(&[0x08; 33]) - .expect("hardcoded pedersen commitment value") - .into() - } -} - -impl StrictEncode for PedersenCommitment { - fn strict_encode(&self, writer: W) -> io::Result { - writer.write_tuple::(|w| Ok(w.write_field(&self.0.serialize())?.complete())) - } -} - -impl StrictDecode for PedersenCommitment { - fn strict_decode(reader: &mut impl TypedRead) -> Result { - reader.read_tuple(|r| { - let commitment = r.read_field::<[u8; 33]>()?; - secp256k1_zkp::PedersenCommitment::from_slice(&commitment) - .map_err(|_| { - DecodeError::DataIntegrityError(s!("invalid pedersen commitment data")) - }) - .map(PedersenCommitment::from_inner) - }) - } -} - -impl CommitVerify for PedersenCommitment { - fn commit(revealed: &RevealedValue) -> Self { - use secp256k1_zkp::{Generator, Tag, Tweak}; - - let blinding = Tweak::from_inner(revealed.blinding.0.into_inner()) - .expect("type guarantees of BlindingFactor are broken"); - let FungibleState::Bits64(value) = revealed.value; - - let tag = Tag::from(revealed.tag.to_byte_array()); - let generator = Generator::new_unblinded(SECP256K1, tag); - - secp256k1_zkp::PedersenCommitment::new(SECP256K1, value, blinding, generator).into() - } -} - -/// A dumb placeholder for a future bulletproofs. -#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)] -#[derive(StrictType, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", transparent) -)] -pub struct NoiseDumb(Array); - -impl Default for NoiseDumb { - fn default() -> Self { - let mut dumb = [0u8; 512]; - thread_rng().fill(&mut dumb); - NoiseDumb(dumb.into()) - } -} - -/// Range proof value. -/// -/// Range proofs must be used alongside [`PedersenCommitment`]s to ensure that -/// the value do not overflow on arithmetic operations with the commitments. -#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)] -#[derive(StrictType)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT, tags = custom)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", rename_all = "camelCase", untagged) -)] -pub enum RangeProof { - /// Value used when bulletproofs library is not available. - /// - /// Always fails validation if no source value is given. - #[strict_type(tag = 0xFF)] - Placeholder(NoiseDumb), -} - -impl Default for RangeProof { - fn default() -> Self { RangeProof::Placeholder(default!()) } -} - -impl StrictEncode for RangeProof { - fn strict_encode(&self, writer: W) -> io::Result { - eprintln!("bulletproof dummies must never be stored"); - Ok(writer) - } -} - -impl StrictDecode for RangeProof { - fn strict_decode(_: &mut impl TypedRead) -> Result { - panic!("bulletproofs dummies must never be read") - } -} - -pub struct PedersenProtocol; - -impl CommitmentProtocol for PedersenProtocol {} - -/// Confidential version of the additive state. -/// -/// See also revealed version [`RevealedValue`]. -#[derive(Clone, Copy, Eq, Debug)] +#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB_COMMIT, rename = "ConcealedFungible")] #[cfg_attr( @@ -476,161 +137,13 @@ impl CommitmentProtocol for PedersenProtocol {} serde(crate = "serde_crate", rename_all = "camelCase") )] pub struct ConcealedValue { - /// Pedersen commitment to the original [`FungibleState`]. - pub commitment: PedersenCommitment, - /// Range proof for the [`FungibleState`] not exceeding type boundaries. - pub range_proof: RangeProof, -} - -impl PartialEq for ConcealedValue { - fn eq(&self, other: &Self) -> bool { self.commitment == other.commitment } + /// Original value in smallest indivisible units + pub value: FungibleState, + /// Field necessary only to avoid clash with RevealedValue during yaml deserialization + pub concealed_dummy: (), } impl ConfidentialState for ConcealedValue { fn state_type(&self) -> StateType { StateType::Fungible } fn state_commitment(&self) -> ConcealedState { ConcealedState::Fungible(*self) } } - -impl CommitVerify for ConcealedValue { - fn commit(revealed: &RevealedValue) -> Self { - let commitment = PedersenCommitment::commit(revealed); - // TODO: Do actual conceal upon integration of bulletproofs library - let range_proof = RangeProof::default(); - ConcealedValue { - commitment, - range_proof, - } - } -} - -/// Errors verifying range proofs. -#[derive(Copy, Clone, PartialEq, Eq, Debug, Display, Error)] -#[display(doc_comments)] -pub enum RangeProofError { - /// invalid blinding factor {0}. - InvalidBlinding(BlindingFactor), - - /// bulletproofs verification is not implemented in RGB Core v0.10. Please - /// update your software and try again, or ask your software producer to use - /// latest RGB release. - BulletproofsAbsent, -} - -impl ConcealedValue { - /// Verifies validity of the range proof. - pub fn verify_range_proof(&self) -> Result { - // We always fail here - Err(RangeProofError::BulletproofsAbsent) - } -} - -#[cfg(test)] -mod test { - use amplify::ByteArray; - - use super::*; - - #[test] - fn pedersen_blinding_mismatch() { - let mut r = thread_rng(); - let tag = AssetTag::from_byte_array([1u8; 32]); - - let a = PedersenCommitment::commit(&RevealedValue::with_rng(15, &mut r, tag)).into_inner(); - let b = PedersenCommitment::commit(&RevealedValue::with_rng(7, &mut r, tag)).into_inner(); - - let c = PedersenCommitment::commit(&RevealedValue::with_rng(13, &mut r, tag)).into_inner(); - let d = PedersenCommitment::commit(&RevealedValue::with_rng(9, &mut r, tag)).into_inner(); - - assert!(!secp256k1_zkp::verify_commitments_sum_to_equal(SECP256K1, &[a, b], &[c, d])) - } - - #[test] - fn pedersen_blinding_same() { - let blinding = - BlindingFactor::from(secp256k1_zkp::SecretKey::from_slice(&[1u8; 32]).unwrap()); - let tag = AssetTag::from_byte_array([1u8; 32]); - - let a = PedersenCommitment::commit(&RevealedValue::with_blinding(15, blinding, tag)) - .into_inner(); - let b = PedersenCommitment::commit(&RevealedValue::with_blinding(7, blinding, tag)) - .into_inner(); - - let c = PedersenCommitment::commit(&RevealedValue::with_blinding(13, blinding, tag)) - .into_inner(); - let d = PedersenCommitment::commit(&RevealedValue::with_blinding(9, blinding, tag)) - .into_inner(); - - assert!(secp256k1_zkp::verify_commitments_sum_to_equal(SECP256K1, &[a, b], &[c, d])) - } - - #[test] - fn pedersen_blinding_same_tag_differ() { - let blinding = - BlindingFactor::from(secp256k1_zkp::SecretKey::from_slice(&[1u8; 32]).unwrap()); - let tag = AssetTag::from_byte_array([1u8; 32]); - let tag2 = AssetTag::from_byte_array([2u8; 32]); - - let a = PedersenCommitment::commit(&RevealedValue::with_blinding(15, blinding, tag2)) - .into_inner(); - let b = PedersenCommitment::commit(&RevealedValue::with_blinding(7, blinding, tag)) - .into_inner(); - - let c = PedersenCommitment::commit(&RevealedValue::with_blinding(13, blinding, tag2)) - .into_inner(); - let d = PedersenCommitment::commit(&RevealedValue::with_blinding(9, blinding, tag)) - .into_inner(); - - assert!(!secp256k1_zkp::verify_commitments_sum_to_equal(SECP256K1, &[a, b], &[c, d])) - } - - #[test] - fn pedersen_two_tags() { - let blinding = - BlindingFactor::from(secp256k1_zkp::SecretKey::from_slice(&[1u8; 32]).unwrap()); - let tag = AssetTag::from_byte_array([1u8; 32]); - let tag2 = AssetTag::from_byte_array([2u8; 32]); - - let a = PedersenCommitment::commit(&RevealedValue::with_blinding(15, blinding, tag2)) - .into_inner(); - let b = PedersenCommitment::commit(&RevealedValue::with_blinding(7, blinding, tag2)) - .into_inner(); - let c = PedersenCommitment::commit(&RevealedValue::with_blinding(2, blinding, tag)) - .into_inner(); - let d = PedersenCommitment::commit(&RevealedValue::with_blinding(4, blinding, tag)) - .into_inner(); - - let e = PedersenCommitment::commit(&RevealedValue::with_blinding(13, blinding, tag2)) - .into_inner(); - let f = PedersenCommitment::commit(&RevealedValue::with_blinding(9, blinding, tag2)) - .into_inner(); - let g = PedersenCommitment::commit(&RevealedValue::with_blinding(1, blinding, tag)) - .into_inner(); - let h = PedersenCommitment::commit(&RevealedValue::with_blinding(5, blinding, tag)) - .into_inner(); - - assert!(secp256k1_zkp::verify_commitments_sum_to_equal(SECP256K1, &[a, b, c, d], &[ - e, f, g, h - ])) - } - - #[test] - fn pedersen_blinding_balance() { - let blinding1 = BlindingFactor::random(); - let blinding2 = BlindingFactor::random(); - let blinding3 = BlindingFactor::random(); - let blinding4 = BlindingFactor::zero_balanced([blinding1, blinding2], [blinding3]).unwrap(); - let tag = AssetTag::from_byte_array([1u8; 32]); - - let a = PedersenCommitment::commit(&RevealedValue::with_blinding(15, blinding1, tag)) - .into_inner(); - let b = PedersenCommitment::commit(&RevealedValue::with_blinding(7, blinding2, tag)) - .into_inner(); - - let c = PedersenCommitment::commit(&RevealedValue::with_blinding(13, blinding3, tag)) - .into_inner(); - let d = PedersenCommitment::commit(&RevealedValue::with_blinding(9, blinding4, tag)) - .into_inner(); - - assert!(secp256k1_zkp::verify_commitments_sum_to_equal(SECP256K1, &[a, b], &[c, d])) - } -} diff --git a/src/operation/mod.rs b/src/operation/mod.rs index 61a04c77..6ab64acc 100644 --- a/src/operation/mod.rs +++ b/src/operation/mod.rs @@ -44,15 +44,12 @@ pub use commit::{ DiscloseHash, GlobalCommitment, OpCommitment, OpDisclose, OpId, TypeCommitment, }; pub use data::{ConcealedData, DataState, RevealedData, VoidState}; -pub use fungible::{ - AssetTag, BlindingFactor, BlindingParseError, ConcealedValue, FungibleState, - InvalidFieldElement, NoiseDumb, PedersenCommitment, RangeProof, RangeProofError, RevealedValue, -}; +pub use fungible::{ConcealedValue, FungibleState, RevealedValue}; pub use global::{GlobalState, GlobalValues}; pub use meta::{MetaValue, Metadata, MetadataError}; pub use operations::{ - AssetTags, Extension, Genesis, Identity, Input, Inputs, Operation, Opout, OpoutParseError, - Redeemed, Transition, Valencies, + Extension, Genesis, Identity, Input, Inputs, Operation, Opout, OpoutParseError, Redeemed, + Transition, Valencies, }; pub use seal::{ ExposedSeal, GenesisSeal, GraphSeal, OutputSeal, SecretSeal, TxoSeal, XGenesisSeal, XGraphSeal, diff --git a/src/operation/operations.rs b/src/operation/operations.rs index 8b8bd092..db0676d4 100644 --- a/src/operation/operations.rs +++ b/src/operation/operations.rs @@ -38,10 +38,10 @@ use strict_encoding::{RString, StrictDeserialize, StrictEncode, StrictSerialize} use crate::schema::{self, ExtensionType, OpFullType, OpType, SchemaId, TransitionType}; use crate::{ - AssetTag, Assign, AssignmentIndex, AssignmentType, Assignments, AssignmentsRef, - ConcealedAttach, ConcealedData, ConcealedValue, ContractId, DiscloseHash, ExposedState, Ffv, - GenesisSeal, GlobalState, GraphSeal, Layer1, Metadata, OpDisclose, OpId, SecretSeal, - TypedAssigns, VoidState, XChain, LIB_NAME_RGB_COMMIT, + Assign, AssignmentIndex, AssignmentType, Assignments, AssignmentsRef, ConcealedAttach, + ConcealedData, ConcealedValue, ContractId, DiscloseHash, ExposedState, Ffv, GenesisSeal, + GlobalState, GraphSeal, Layer1, Metadata, OpDisclose, OpId, SecretSeal, TypedAssigns, + VoidState, XChain, LIB_NAME_RGB_COMMIT, }; #[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display)] @@ -96,20 +96,6 @@ impl FromStr for Opout { } } -#[derive(Wrapper, WrapperMut, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Default, From)] -#[wrapper(Deref)] -#[wrapper_mut(DerefMut)] -#[derive(StrictType, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT)] -#[derive(CommitEncode)] -#[commit_encode(strategy = strict, id = StrictHash)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", transparent) -)] -pub struct AssetTags(TinyOrdMap); - #[derive(Wrapper, WrapperMut, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Default, From)] #[wrapper(Deref)] #[wrapper_mut(DerefMut)] @@ -300,9 +286,7 @@ pub trait Operation { OpDisclose { id: self.id(), seals: Confined::from_checked(seals), - fungible: Confined::from_iter_checked( - fungible.into_iter().map(|(k, s)| (k, s.commitment)), - ), + fungible: Confined::from_iter_checked(fungible), data: Confined::from_checked(data), attach: Confined::from_checked(attach), } @@ -363,7 +347,6 @@ pub struct Genesis { pub layer1: Layer1, pub testnet: bool, pub close_method: CloseMethod, - pub asset_tags: AssetTags, pub metadata: Metadata, pub globals: GlobalState, pub assignments: Assignments, diff --git a/src/operation/state.rs b/src/operation/state.rs index db230257..294c9ffb 100644 --- a/src/operation/state.rs +++ b/src/operation/state.rs @@ -65,8 +65,7 @@ pub enum StateType { /// No state data Void, - /// Value-based state, i.e. which can be committed to with a Pedersen - /// commitment + /// Value-based state Fungible, /// State defined with custom data diff --git a/src/schema/state.rs b/src/schema/state.rs index 27db9a15..d793e395 100644 --- a/src/schema/state.rs +++ b/src/schema/state.rs @@ -88,13 +88,6 @@ impl OwnedStateSchema { } } -/// Today we support only a single format of confidential data, because of the -/// limitations of the underlying secp256k1-zkp library: it works only with -/// u64 numbers. Nevertheless, homomorphic commitments can be created to -/// everything that has up to 256 bits and commutative arithmetics, so in the -/// future we plan to support more types. We reserve this possibility by -/// internally encoding [`ConfidentialFormat`] with the same type specification -/// details as used for [`DateFormat`] #[derive(Copy, Clone, PartialEq, Eq, Debug, Default, Display)] #[derive(StrictType, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB_COMMIT, tags = repr, into_u8, try_from_u8)] diff --git a/src/stl.rs b/src/stl.rs index 051e3273..33669e3b 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -37,10 +37,10 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_COMMIT: &str = - "stl:IJ8ChpTj-XMVz1y3-z15BDBB-huKjqsO-YswXmFV-XxCnB0Y#pamela-polka-corona"; + "stl:mh8Ebzz!-9Trq2j8-Q2kUCyh-L4P1E80-HNp6Uct-LDLlJNo#victor-guru-philips"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:MGoAZ!ex-Mxxzq!6-Iwump4Y-K$enNGN-!Aa52Ms-b1r7WF8#satire-herbert-nato"; + "stl:ndyP5b78-MGzBwge-spi5HS7-vd!8qHQ-UUJrsgP-ieX$j1c#break-analog-postal"; fn _rgb_commit_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_COMMIT), tiny_bset! { diff --git a/src/validation/logic.rs b/src/validation/logic.rs index 0afd7f93..00f2befa 100644 --- a/src/validation/logic.rs +++ b/src/validation/logic.rs @@ -39,7 +39,7 @@ use crate::{ validation, Assign, AssignmentType, Assignments, AssignmentsRef, ConcealedState, ConfidentialState, ExposedSeal, ExposedState, Extension, GlobalState, GlobalStateSchema, GlobalValues, GraphSeal, Inputs, MetaSchema, Metadata, OpId, Operation, Opout, - OwnedStateSchema, RevealedState, Schema, StateType, Transition, TypedAssigns, Valencies, + OwnedStateSchema, RevealedState, Schema, Transition, TypedAssigns, Valencies, }; impl Schema { @@ -69,31 +69,16 @@ impl Schema { validator, ty, ) = match op { - OrdOpRef::Genesis(genesis) => { - for id in genesis.asset_tags.keys() { - if !matches!(self.owned_types.get(id), Some(OwnedStateSchema::Fungible(_))) { - status.add_failure(validation::Failure::AssetTagNoState(*id)); - } - } - for (id, ss) in &self.owned_types { - if ss.state_type() == StateType::Fungible - && !genesis.asset_tags.contains_key(id) - { - status.add_failure(validation::Failure::FungibleStateNoTag(*id)); - } - } - - ( - &self.genesis.metadata, - &self.genesis.globals, - &empty_assign_schema, - &empty_valency_schema, - &self.genesis.assignments, - &self.genesis.valencies, - self.genesis.validator, - None::, - ) - } + OrdOpRef::Genesis(_) => ( + &self.genesis.metadata, + &self.genesis.globals, + &empty_assign_schema, + &empty_valency_schema, + &self.genesis.assignments, + &self.genesis.valencies, + self.genesis.validator, + None::, + ), OrdOpRef::Transition( Transition { transition_type, .. @@ -199,7 +184,6 @@ impl Schema { let op_info = OpInfo::with(opid, &op, &prev_state, &redeemed); let context = VmContext { contract_id: genesis.contract_id(), - asset_tags: &genesis.asset_tags, op_info, contract_state, }; @@ -584,16 +568,7 @@ impl OwnedStateSchema { Assign::Confidential { state, .. } | Assign::ConfidentialState { state, .. } => { match (self, state.state_commitment()) { (OwnedStateSchema::Declarative, ConcealedState::Void) => {} - (OwnedStateSchema::Fungible(_), ConcealedState::Fungible(value)) => { - // [SECURITY-CRITICAL]: Bulletproofs validation - if let Err(err) = value.verify_range_proof() { - status.add_failure(validation::Failure::BulletproofsInvalid( - opid, - state_type, - err.to_string(), - )); - } - } + (OwnedStateSchema::Fungible(_), ConcealedState::Fungible(_)) => {} (OwnedStateSchema::Structured(_), ConcealedState::Structured(_)) => { status.add_warning(validation::Warning::UncheckableConfidentialState( opid, state_type, diff --git a/src/validation/status.rs b/src/validation/status.rs index a813ec04..02d44d02 100644 --- a/src/validation/status.rs +++ b/src/validation/status.rs @@ -266,13 +266,6 @@ pub enum Failure { /// which is an input of the state transition {3}. BundleInvalidCommitment(BundleId, Vin, XWitnessId, OpId), - // Errors checking asset tags - /// asset type provided in genesis references unknown fungible state of type - /// {0}. - AssetTagNoState(schema::AssignmentType), - /// fungible state {0} has no asset tag defined. - FungibleStateNoTag(schema::AssignmentType), - // Errors checking seal closing /// transition {opid} references state type {state_type} absent in the /// outputs of previous state transition {prev_id}. @@ -352,8 +345,6 @@ pub enum Failure { expected: schema::FungibleType, found: schema::FungibleType, }, - /// invalid bulletproofs in {0}:{1}: {2} - BulletproofsInvalid(OpId, schema::AssignmentType, String), /// evaluation of AluVM script for operation {0} has failed with the code /// {1:?} and message {2:?}. ScriptFailure(OpId, Option, Option), diff --git a/src/vm/contract.rs b/src/vm/contract.rs index 58f49faf..df4d4b45 100644 --- a/src/vm/contract.rs +++ b/src/vm/contract.rs @@ -37,11 +37,11 @@ use single_use_seals::SealWitness; use strict_encoding::{StrictDecode, StrictDumb, StrictEncode}; use crate::{ - AssetTags, AssignmentType, Assignments, AssignmentsRef, AttachState, BundleId, ContractId, - DataState, ExposedSeal, Extension, ExtensionType, FungibleState, Genesis, GlobalState, - GlobalStateType, GraphSeal, Impossible, Inputs, Layer1, Metadata, OpFullType, OpId, OpType, - Operation, Transition, TransitionType, TxoSeal, TypedAssigns, Valencies, XChain, XOutpoint, - XOutputSeal, LIB_NAME_RGB_LOGIC, + AssignmentType, Assignments, AssignmentsRef, AttachState, BundleId, ContractId, DataState, + ExposedSeal, Extension, ExtensionType, FungibleState, Genesis, GlobalState, GlobalStateType, + GraphSeal, Impossible, Inputs, Layer1, Metadata, OpFullType, OpId, OpType, Operation, + Transition, TransitionType, TxoSeal, TypedAssigns, Valencies, XChain, XOutpoint, XOutputSeal, + LIB_NAME_RGB_LOGIC, }; pub type XWitnessId = XChain; @@ -703,7 +703,6 @@ pub trait ContractStateEvolve { pub struct VmContext<'op, S: ContractStateAccess> { pub contract_id: ContractId, - pub asset_tags: &'op AssetTags, pub op_info: OpInfo<'op>, pub contract_state: Rc>, } diff --git a/src/vm/macroasm.rs b/src/vm/macroasm.rs index 0422e4a0..e28aca82 100644 --- a/src/vm/macroasm.rs +++ b/src/vm/macroasm.rs @@ -33,14 +33,14 @@ macro_rules! rgbasm { #[macro_export] macro_rules! isa_instr { - (pcvs $no:ident) => {{ - RgbIsa::Contract(ContractOp::Pcvs($no)) + (svs $no:ident) => {{ + RgbIsa::Contract(ContractOp::Svs($no)) }}; - (pcas $no:ident) => {{ - RgbIsa::Contract(ContractOp::Pcas($no)) + (sas $no:ident) => {{ + RgbIsa::Contract(ContractOp::Sas($no)) }}; - (pcps $no:ident) => {{ - RgbIsa::Contract(ContractOp::Pcps($no)) + (sps $no:ident) => {{ + RgbIsa::Contract(ContractOp::Sps($no)) }}; (cng $t:ident,a8[$a_idx:literal]) => {{ RgbIsa::Contract(ContractOp::CnG($t, Reg32::from(u5::with($a_idx)))) diff --git a/src/vm/op_contract.rs b/src/vm/op_contract.rs index 040277ec..ce9af66a 100644 --- a/src/vm/op_contract.rs +++ b/src/vm/op_contract.rs @@ -33,14 +33,10 @@ use aluvm::library::{CodeEofError, IsaSeg, LibSite, Read, Write}; use aluvm::reg::{CoreRegs, Reg, Reg16, Reg32, RegA, RegS}; use amplify::num::{u24, u3, u4}; use amplify::Wrapper; -use commit_verify::CommitVerify; use super::opcodes::*; use super::{ContractStateAccess, VmContext}; -use crate::{ - Assign, AssignmentType, BlindingFactor, GlobalStateType, MetaType, PedersenCommitment, - RevealedValue, TypedAssigns, -}; +use crate::{Assign, AssignmentType, GlobalStateType, MetaType, TypedAssigns}; #[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display)] pub enum ContractOp { @@ -137,7 +133,7 @@ pub enum ContractOp { #[display("ldm {0},{1}")] LdM(MetaType, RegS), - /// Verify sum of pedersen commitments from inputs and outputs. + /// Verify sum of inputs and outputs are equal. /// /// The only argument specifies owned state type for the sum operation. If /// this state does not exist, or either inputs or outputs does not have @@ -145,11 +141,10 @@ pub enum ContractOp { /// /// If verification succeeds, doesn't change `st0` value; otherwise sets it /// to `false` and stops execution. - #[display("pcvs {0}")] - Pcvs(AssignmentType), + #[display("svs {0}")] + Svs(AssignmentType), - /// Verifies equivalence of a sum of pedersen commitments for the list of - /// assignment outputs to a value from `a64[0]` register. + /// Verify sum of outputs and value in `a64[0]` register are equal. /// /// The first argument specifies owned state type for the sum operation. If /// this state does not exist, or either inputs or outputs does not have @@ -159,11 +154,10 @@ pub enum ContractOp { /// /// If verification succeeds, doesn't change `st0` value; otherwise sets it /// to `false` and stops execution. - #[display("pcas {0}")] - Pcas(/** owned state type */ AssignmentType), + #[display("sas {0}")] + Sas(/** owned state type */ AssignmentType), - /// Verifies equivalence of a sum of pedersen commitments for the list of - /// inputs to a value from `a64[0]` register. + /// Verify sum of inputs and value in `a64[0]` register are equal. /// /// The first argument specifies owned state type for the sum operation. If /// this state does not exist, or either inputs or outputs does not have @@ -173,8 +167,8 @@ pub enum ContractOp { /// /// If verification succeeds, doesn't change `st0` value; otherwise sets it /// to `false` and stops execution. - #[display("pcps {0}")] - Pcps(/** owned state type */ AssignmentType), + #[display("sps {0}")] + Sps(/** owned state type */ AssignmentType), /// All other future unsupported operations, which must set `st0` to /// `false` and stop the execution. @@ -200,8 +194,8 @@ impl InstructionSet for ContractOp { | ContractOp::CnG(_, _) | ContractOp::CnC(_, _) | ContractOp::LdM(_, _) => bset![], - ContractOp::Pcvs(_) => bset![], - ContractOp::Pcas(_) | ContractOp::Pcps(_) => bset![Reg::A(RegA::A64, Reg32::Reg0)], + ContractOp::Svs(_) => bset![], + ContractOp::Sas(_) | ContractOp::Sps(_) => bset![Reg::A(RegA::A64, Reg32::Reg0)], ContractOp::Fail(_, _) => bset![], } } @@ -224,7 +218,7 @@ impl InstructionSet for ContractOp { | ContractOp::LdM(_, reg) => { bset![Reg::S(*reg)] } - ContractOp::Pcvs(_) | ContractOp::Pcas(_) | ContractOp::Pcps(_) => { + ContractOp::Svs(_) | ContractOp::Sas(_) | ContractOp::Sps(_) => { bset![] } ContractOp::Fail(_, _) => bset![], @@ -243,8 +237,7 @@ impl InstructionSet for ContractOp { | ContractOp::LdG(_, _, _) | ContractOp::LdC(_, _, _) => 8, ContractOp::LdM(_, _) => 6, - ContractOp::Pcvs(_) => 1024, - ContractOp::Pcas(_) | ContractOp::Pcps(_) => 512, + ContractOp::Svs(_) | ContractOp::Sas(_) | ContractOp::Sps(_) => 20, ContractOp::Fail(_, _) => u64::MAX, } } @@ -256,32 +249,42 @@ impl InstructionSet for ContractOp { return ExecStep::Stop; }}; } - macro_rules! load_inputs { + macro_rules! load_revealed_inputs { ($state_type:ident) => {{ let Some(prev_state) = context.op_info.prev_state.get($state_type) else { fail!() }; match prev_state { - TypedAssigns::Fungible(state) => state - .iter() - .map(Assign::to_confidential_state) - .map(|s| s.commitment.into_inner()) - .collect::>(), + TypedAssigns::Fungible(state) => { + let mut values = vec![]; + for assign in state.iter().map(Assign::as_revealed_state) { + match assign { + Some(rev) => values.push(rev.value.as_u64()), + None => fail!(), + } + } + values + } _ => fail!(), } }}; } - macro_rules! load_outputs { + macro_rules! load_revealed_outputs { ($state_type:ident) => {{ let Some(new_state) = context.op_info.owned_state.get(*$state_type) else { fail!() }; match new_state { - TypedAssigns::Fungible(state) => state - .iter() - .map(Assign::to_confidential_state) - .map(|s| s.commitment.into_inner()) - .collect::>(), + TypedAssigns::Fungible(state) => { + let mut values = vec![]; + for assign in state.iter().map(Assign::as_revealed_state) { + match assign { + Some(rev) => values.push(rev.value.as_u64()), + None => fail!(), + } + } + values + } _ => fail!(), } }}; @@ -423,61 +426,54 @@ impl InstructionSet for ContractOp { }; regs.set_s16(*reg, meta.to_inner()); } - - ContractOp::Pcvs(state_type) => { - let inputs = load_inputs!(state_type); - let outputs = load_outputs!(state_type); - if !secp256k1_zkp::verify_commitments_sum_to_equal( - secp256k1_zkp::SECP256K1, - &inputs, - &outputs, - ) { + ContractOp::Svs(state_type) => { + let Some(input_amt) = load_revealed_inputs!(state_type) + .iter() + .try_fold(0u64, |acc, &x| acc.checked_add(x)) + else { + fail!() + }; + let Some(output_amt) = load_revealed_outputs!(state_type) + .iter() + .try_fold(0u64, |acc, &x| acc.checked_add(x)) + else { + fail!() + }; + if input_amt != output_amt { fail!() } } - - ContractOp::Pcas(owned_state) => { + ContractOp::Sas(owned_state) => { let Some(sum) = *regs.get_n(RegA::A64, Reg32::Reg0) else { fail!() }; let sum = u64::from(sum); - let Some(tag) = context.asset_tags.get(owned_state) else { + let Some(output_amt) = load_revealed_outputs!(owned_state) + .iter() + .try_fold(0u64, |acc, &x| acc.checked_add(x)) + else { fail!() }; - let sum = RevealedValue::with_blinding(sum, BlindingFactor::EMPTY, *tag); - - let inputs = [PedersenCommitment::commit(&sum).into_inner()]; - let outputs = load_outputs!(owned_state); - if !secp256k1_zkp::verify_commitments_sum_to_equal( - secp256k1_zkp::SECP256K1, - &inputs, - &outputs, - ) { + if sum != output_amt { fail!() } } - - ContractOp::Pcps(owned_state) => { + ContractOp::Sps(owned_state) => { let Some(sum) = *regs.get_n(RegA::A64, Reg32::Reg0) else { fail!() }; let sum = u64::from(sum); - let Some(tag) = context.asset_tags.get(owned_state) else { + let Some(input_amt) = load_revealed_inputs!(owned_state) + .iter() + .try_fold(0u64, |acc, &x| acc.checked_add(x)) + else { fail!() }; - let sum = RevealedValue::with_blinding(sum, BlindingFactor::EMPTY, *tag); - - let inputs = [PedersenCommitment::commit(&sum).into_inner()]; - let outputs = load_inputs!(owned_state); - if !secp256k1_zkp::verify_commitments_sum_to_equal( - secp256k1_zkp::SECP256K1, - &inputs, - &outputs, - ) { + if sum != input_amt { fail!() } } @@ -505,9 +501,9 @@ impl Bytecode for ContractOp { ContractOp::LdC(_, _, _) => INSTR_LDC, ContractOp::LdM(_, _) => INSTR_LDM, - ContractOp::Pcvs(_) => INSTR_PCVS, - ContractOp::Pcas(_) => INSTR_PCAS, - ContractOp::Pcps(_) => INSTR_PCPS, + ContractOp::Svs(_) => INSTR_SVS, + ContractOp::Sas(_) => INSTR_SAS, + ContractOp::Sps(_) => INSTR_SPS, ContractOp::Fail(other, _) => *other, } @@ -567,9 +563,9 @@ impl Bytecode for ContractOp { writer.write_u4(u4::ZERO)?; } - ContractOp::Pcvs(state_type) => writer.write_u16(*state_type)?, - ContractOp::Pcas(owned_type) => writer.write_u16(*owned_type)?, - ContractOp::Pcps(owned_type) => writer.write_u16(*owned_type)?, + ContractOp::Svs(state_type) => writer.write_u16(*state_type)?, + ContractOp::Sas(owned_type) => writer.write_u16(*owned_type)?, + ContractOp::Sps(owned_type) => writer.write_u16(*owned_type)?, ContractOp::Fail(_, _) => {} } @@ -634,9 +630,9 @@ impl Bytecode for ContractOp { i } - INSTR_PCVS => Self::Pcvs(reader.read_u16()?.into()), - INSTR_PCAS => Self::Pcas(reader.read_u16()?.into()), - INSTR_PCPS => Self::Pcps(reader.read_u16()?.into()), + INSTR_SVS => Self::Svs(reader.read_u16()?.into()), + INSTR_SAS => Self::Sas(reader.read_u16()?.into()), + INSTR_SPS => Self::Sps(reader.read_u16()?.into()), x => Self::Fail(x, PhantomData), }) @@ -658,7 +654,7 @@ mod test { #[test] fn encoding() { let code = - [Instr::ExtensionCodes(RgbIsa::Contract(ContractOp::Pcvs(AssignmentType::from(4000))))]; + [Instr::ExtensionCodes(RgbIsa::Contract(ContractOp::Svs(AssignmentType::from(4000))))]; let alu_lib = Lib::assemble(&code).unwrap(); eprintln!("{alu_lib}"); let alu_id = alu_lib.id(); diff --git a/src/vm/opcodes.rs b/src/vm/opcodes.rs index b1db3ea4..e14d370a 100644 --- a/src/vm/opcodes.rs +++ b/src/vm/opcodes.rs @@ -43,9 +43,9 @@ pub const INSTR_LDC: u8 = 0b11_001_001; pub const INSTR_LDM: u8 = 0b11_001_010; // Reserved 0b11_001_111 -pub const INSTR_PCVS: u8 = 0b11_010_000; -pub const INSTR_PCAS: u8 = 0b11_010_001; -pub const INSTR_PCPS: u8 = 0b11_010_010; +pub const INSTR_SVS: u8 = 0b11_010_000; +pub const INSTR_SAS: u8 = 0b11_010_001; +pub const INSTR_SPS: u8 = 0b11_010_010; // Reserved 0b11_010_011 pub const INSTR_CONTRACT_FROM: u8 = 0b11_000_000; pub const INSTR_CONTRACT_TO: u8 = 0b11_010_011; diff --git a/stl/AnchoredBundle.vesper b/stl/AnchoredBundle.vesper index 68efaa32..1559f38c 100644 --- a/stl/AnchoredBundle.vesper +++ b/stl/AnchoredBundle.vesper @@ -100,8 +100,9 @@ TransitionBundle rec bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 liquid bytes len=32 wrapped aka=SecretSeal tag=1 state rec ConcealedFungible - commitment bytes len=33 aka=PedersenCommitment - rangeProof bytes len=33 aka=PedersenCommitment + value union FungibleState + bits64 is U64 wrapped tag=0 + concealedDummy is Unit lock bytes len=2 aka=ReservedBytes2 confidentialState rec tag=1 seal union XChainBlindSealTxPtr @@ -118,8 +119,9 @@ TransitionBundle rec vout is U32 aka=Vout blinding is U64 state rec ConcealedFungible - commitment bytes len=33 aka=PedersenCommitment - rangeProof bytes len=33 aka=PedersenCommitment + value union FungibleState + bits64 is U64 wrapped tag=0 + concealedDummy is Unit lock bytes len=2 aka=ReservedBytes2 confidentialSeal rec tag=2 seal union XChainSecretSeal @@ -128,8 +130,6 @@ TransitionBundle rec state rec RevealedFungible value union FungibleState bits64 is U64 wrapped tag=0 - blinding bytes len=32 aka=BlindingFactor - tag bytes len=32 aka=AssetTag lock bytes len=2 aka=ReservedBytes2 revealed rec tag=3 seal union XChainBlindSealTxPtr @@ -148,8 +148,6 @@ TransitionBundle rec state rec RevealedFungible value union FungibleState bits64 is U64 wrapped tag=0 - blinding bytes len=32 aka=BlindingFactor - tag bytes len=32 aka=AssetTag lock bytes len=2 aka=ReservedBytes2 structured list len=0..MAX16 wrapped tag=2 AssignRevealedDataBlindSealTxPtr union diff --git a/stl/RGBCommit@0.1.0.sta b/stl/RGBCommit@0.1.0.sta index abaf688c..58cf44fd 100644 --- a/stl/RGBCommit@0.1.0.sta +++ b/stl/RGBCommit@0.1.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:0OQ7gS8R-XmQg8MV-smgBZ5o-B$ZJvp5-S4xxB51-PpdNPZU#julius-square-inch +Id: stl:mh8Ebzz!-9Trq2j8-Q2kUCyh-L4P1E80-HNp6Uct-LDLlJNo#victor-guru-philips Name: RGBCommit Dependencies: BPCore#symbol-tropic-grand, @@ -8,7 +8,7 @@ Dependencies: CommitVerify#miller-pancake-elastic, Std#ralph-blue-lucky, Bitcoin#signal-color-cipher -Check-SHA256: 7925a1919f797fc87e27c949a10fcd603ce362399d4808729b93fcef8e96d919 +Check-SHA256: ff8e7d8563394d581dba462eb3ccbac6c5cc1338cf3c04a9d7b97f562197189d 2~tNwLvL+uX>mb;*F>vukd; =m`ygb@x#_>`RmOO$0)3Z)}yry~#}iVEJ)s5j^%uEnQ9{n2s|9Fa^ps+HG#`XS5DMY;b5{PIYZeZ)9O} Xt{%a=RmHK6WZ%EWRm@*ULd%lgGoFTxUTU 76^nC$%1sKzB<;EQA|)S-x88IWKN#S$#@T&w`gPtRC#b^PGN0jYXqYdo~D%m7H6OD0<^0n_2##VWXRdj -y=DB@qgYOj1yf~hNn}L;2tjjmWpq?wX9WQO2LJ#-AOHzLb8}^MRAFax1pxpG0f+wLWmt%8=p4R=gtK{L -Clh6Z#kObxUW*hKHnBv9xdF+KnyJGEOB((CXB(HiD*XOTXpbLr$Svz}Z|7;7BCh}d000000093000000 -001IEb8~5DZc=4-WnpY(WI=RvVPj}QY-w&}Q)OXnRCrKyas&hb3}bI@W@%()Zggp3YybuW1aoC!YysPf -S{i~B5OpZ>_>4e9YQ#rfba;u!+d5tm#=h2RwFCuobYXO50sJ&Y-CxfQ3;(PYq10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^ -^xj-FXm+)yumJ%95o2#|W@%()Zggp3Y*Tb$bY%br0|awrVQc}buAyhdo%dUA4Eiz^#2Wm1QOk9#fajy(iyZ)0l$dIKHbX?@G`sCP;~ -6&DQwR5(-fxrUo0ThEiz^#2Wm1QOk9#fajy(iy -Z)0l$dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThyAAHY;R+00(t`--)Viz@~C%8KNS}Z0aQ3s -^SOqbBwN-D{wl@OCd;@jJLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF0Rj+XZ*FF3WMyu2X<=+rWnpXp -1_K0hWnpXq+lpEmf)o&SDDwD>KtpQ8M_qJyiO1VIUJ=H=)@ii_1#@&^bY%hOC5!%-N13CfsTw#uN?Q(lLJ=>rBY$70^roXTE)+&>InpFZ)0l$dIKHb -X?@G`sCP;~6&DQwR5(-fxrUo0Th -4P_9rf`M-zw>{+&W0M0{2&GbCtpecGzFNi4r|Jm=Y;R+00(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D -{wl@OCd;@jJLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF0Rj+XZ*FF3WMyu2X<=+rWnpXp1_K0hWnpXq -+lpEmf)o&SDDwD>KtpQ8M_qJyiO1VIUJ=H=)@ii_1#@&^bY%hmXk);5Qh;gshq!{{oTC#gIzF4hFN<*P -1RquLWiVd^Y;R+00(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCd;@jJLYKfb7gWS-+`&{Sr=yk -NJ#YFTr_BQwWqKF0RsqfWp-s@Y-MBs1_K0hWnpXqtFEDE#GUtBZVw=Tgw0^L(zrtm5XPgGpH_>4e9YQ#rfba;u!+d5tm -#=h2RwFCuobYXO50dNgv5VC@SZy&ck10COKearHwcS=7M -7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%95o2#|W@%()Zggp3 -Y*Tb$bY%br0|awrVQc|zz!8ZmxG0SMPZTc4w%!w3d}4CRtg5Jm=n8Q-roiL{b97;JWdU#vWe~E0fo~tT -J>?Q(lLJ=>rBY$70^roXTE)+&>InpFZ)0l$dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThF91B-Lz;+I~gZl(*Z)0l$dIKHbX?@G`sCP;~6&DQwR5(-f -xrUo0ThKtpQ8 -M_qJyiO1VIUJ=H=)@ii_1#@&^bY%f;M8@F91B-Lz;+I~gZl(*Z)0l$dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThKtpQ8M_qJyiO1VI -UJ=H=)@ii_1#@&^bY%f;M8@c;WkPIeZe&wsVQf@*P;_zx1ONKtpQ8M_qJyiO1VIUJ=H=)@ii_1#@&^bY%f9vZekPz%WEGnBZKS -8(M7E9_@AwVcyGtCevi|7U8=DY;R+00(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCd;@jJLYKf +y=DB@qgYOj1yf~hNn}9)B0+O=X=iRyWp-s@Y-MCYbaY{3XhLjhZe&wsVQf@*P;_zx1ONKtpQ8M_qJyiO1VIUJ=H=)@ii_1#@&^bY%hjG)3KC&kYOztQDks +x&yAAHY;R+00(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCd;@jJLYKf b7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF0Ra(XZ*FF3WMyu2X<=+rbYXO500sjDb7f&{0jsW|XT+WNTW${^ -e}v6ox6-&n3=qbnm7i7E!y5$*;stYbVRU5yF0!Tm7r-z?Fqq(6n;Tke)*kJ44PoBPfF{#q^A_Q|1Z;0( +e}v6ox6-&n3=qbnm7i7E!y5$*;stYbVRU5y{4_<~U(XE-|Ev|Hdb$N7;9H9;8!%;3hl7uME$faw1Z;0( YXW)$9p7nv%krpqNJW4?*h+3X!X@fjr@d0IimUQ-Q1Z;0(YXW)$9p7nv%krpqNMdwWnpYocxhw=1ONKtpQ8M_qJyiO1VIUJ=H=)@ii_1#@&^bY%f9vZekPz%WEGnBZKS8(M7E9_@AwVcyGt -Cevi|7U8=DY;R+00(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCd;@jJLYKfb7gWS-+`&{Sr=yk -NJ#YFTr_BQwWqKF0Ra(XZ*FF3WMyu2X<=+rbYXO500sjDb7f&{0dBw%i7L1#jQvj(F2}as6Iy&?a>=Z! -sD=Z!sDMdwWnpYocu;h51pxpG0f+wLWmt%8=p4R=gtK{L -Clh6Z#kObxUW*hKHnBv9xdBcS_=xNn3+*j&3EB`h=Q;HL6-=_dAy)KHu*0U!7R3Mn000000093000000 -000<4b8~5DZf#|5baO&%X>MdwWnpYocxhw>0RRdChyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt -0R##hIKJeu_DJbYWv?Nn`~900#g7 -Kp+4ML3DIsV`x)!VRU5%0s?7d0fcc4lPpg3!?y@aX^XIja4CK{WF&t@k=WXUZP9(YI0Db5bYX39002k^X>)URWpV;~10COKearHw -cS=7M7YzYaI8*bvhMOc?)(rkC#nUEjudT)PryvH%qoUf%jN6#Tx81sfg4O?s`uaep_R|IiY+-q2axnpU -#Mns)Y&M6LqDeqU-jv95KHlThh+c{38p;h*Y8ns+bY*jNZe?@=$}AplgPGkh3_fq3Q7_j=2#kPT_9!;l -WR>~GYywm#VTK~nd#>j`0Vb7gc?VP|s! -dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThG60RRU806-uB4?}NmV`X7%Wn@8gbYWv?1pxpD002NB01ZQLZewL(Y-MCbVRT^y -0RRU806-uB5kqfoV`X7%Wn@NmZf9v?Y-I)l3S)0=ZE19EWo~oV=@3j=0mb^+R(Q4?4e -R(6nw`S$_F2)vN@Mb6UJ-F(lri_dqerx4lR4>iBsz2WM<=Vqt7^0p25#Yo@G%*b#-tU^&3K -X?w7l?~*Sh8@1jRRblZzybED-b7^O8ZDnqBa{+$huy3?0v&8b0-V>p(oz$%0233g#@Wo~0>Wpe@Dg=PS6VPp{$?vC-- -s`v@B8YHl)C#jpVFzBk!DMw8Sc42I3WMOn~asqk-9p7nv%krpqN@L7b8`ZE10COKearHwcS=7M7YzYaI8*bvhMOc? -)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%NMR;^&ZgXjGZc}4uWo=;w1_*6sbYWy+ -bYTDq0d?d}_}|Wp0vpvv$c&#PW69R$ltr%da5t5w^x+8!q5uE@000000RI300000000(DmZ(?C=a{vkf -)$WoGNrn+a000000RI300000000(kqWMyS-a{vheM(yUq2ps*m=2xUDT;RqCgn#@WzFu~@adfH5^@&-|00000 -00000{{R30000003t@9}X=iS2Wo~qH015$z{^Dg=h-~N_zJ`Red1EINWrM}GXaQb}6c#qIM2EQnHo-KZ -`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4>GEG0000000000{{R300000033g#@Wo~0>Wpe-t0Y>fS!w4Mx -xaL=+DqP^k2!wz9AHH68xp8!<%Jqp^&Hw-a000000RI3000000010+sY-wa+bZ>G11OfmAZf|a700001 -1aog~WdH>M0%CAAe<9`Lptgpr6F_xjAC6(~TLj#*ewiHf`^rCgHqw;r~cW`-QV>+d2nR~0RR9314d?c1pxp60u4rWZf9v?Y-Lk)VRU5#0SE?SX>@ZoGynww -000OKMs;pyX<}?;RC#b^0|5bs~EXcCXx(drQcb3B`Fx$)^%va$Ar)C7cFqVR>b8F#&nR -*hvU%Hiwm>NkB*5l*n^F-s9AWUWw-#$_-O$8W0C`Wpi|HWpo0{EFN!zncXl9K5w2;FV{y1jDTJCC^p$- -mHEbO0#qkqh9c2>uJC38-{*D7fZ(%hZo23R4S;p`Q9JBQllDyuV{C78Wld#tXm4Z!A#kgq^`I&ZzC?)! -&R01Y?(H9FO$CR6P1%k7c67A-F1HXRxo%|^+Itiop&gxXSvq){{YhrGf57_P)SQy*31M?{Wpq?wXLA85 -B@PC`naz9~L0@lerBKV`$$1fC6#s{=m+2p6@mtIYZDn*}WMOn+0rh%KI9Y!AFx9LCk8@hQXE7w+qW3^C -%eTEp@#^?_H3w&GZ(?C=a{=BXk!z-`g4hv-$6z_YxoLZ_neUP>BpbEf7FA*KKfDWJb8~5DZf#|5baMfI -;;?VDE9LAz1&yRlxI~Sa{=9jW&m$tWDykZj`7#3_zANbB(SO{ -shhGe=&H{tM@n+a000000RI300000001IJr -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 +XKqquc4c8~Wn@HQbYVhlX>MdwWnpYocxhw=1ON +KtpQ8M_qJyiO1VIUJ=H=)@ii_1#@&^bY%f>4P_9rf`M-zw>{+&W0M0{2&GbCtpecGzFNi4r|Jm=Y;R+0 0(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCd;@jJLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF -0SHNMaCLM|VQ>Wj015*2Y!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>jbO<32;hs$B9ZCsU(1!DsC| -W1LOd&b_IRG-(&Q$wPGkmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<0RR9100000|Nj6000000 -21#ykb#!wD0RRaB)s0^W44ZsX>oOFWC00HWn^h#RC#b^0|5hJZh8L*O=WapRC#b^1pxp60troJbYWIuY;|P? -0RRX906+i$000000096000000000P0WprU=VRT^y0RRdCb>vO>-_DBy8`Vb0jGrW9$=2qSMXvL3Hj|@I6Zgd6<17>D+0ot2U6Id2jc94hrndMfLayEe1ISdA&%p{mB -1!VWk)dg;EZewKt00;(ea8!A4WdVn>vTsJpS0T~jSgzIioX0!&zH1JfDh)<)AMV&Fo^A+jWprU=VRT^v -dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThsZfv!yd427@; -7veO2zMB=|GX`mHaCLNZ0(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCODo$h9?yTI7S;;e;>sZ -fv!yd427@;7veO2zMB=|GYesJb7^O8ZDnqBa{_t;9p7nv%krpqNWpe_010COKearHwcS=7M -7YzYaI8*bvhMOc?)(rkC#nUEjudT)PryvH%qoUf%jN6#Tx81sfg4O?s`uaep_R|IjcWHEPWpi@^dIKHb -X?@G`sCP;~6&DQwR5(-fxrUo0ThClv)aMjKgwAH@`bu1x<7g|G$};xvA~n-$_S33g#@ -X=Gt^Z*l^910COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUEjudT)PryvH%qoUf%jN6#Tx81sfg4O?s -`uaep_R|IgPjE?O1pxpD002NB00mEQZ*_DA0|IYw0hP$+dLDIRU(}XWLTZugenOC;Z(5k~zEJnJiX;;E -#R7DB0f+wLWmt%8=p4R=gtK{LClh6Z#kObxUW*hKHnBv9xdLu)0006IPj_x*WK(oubY)XxXk~3-1OxyJ -WMyM)VRB(~X?A4*00039W_507X<}?;00jX7`Sh#^X0AbZX4L%*5q$))*;M@wXI>IJVg&1PPwC}G0t$0< -a&=>Lb#i5700jX8Me3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*rYXqYdo~D%m7H6OD0<^0n_2##V -WXRdjy=DB@qgYOj0}5eubYWv?ZDnqB00jX7LNH;4h{)8d6ed8&{mBRDi -WpZ<6ZbNTvZE19EWo~o@0RRU806-xC2vTKaWo2z;WCZ~L3IRs#=EDda{kY~=q$*tC#t4Le{2#tvcDZqM -smk?Ml$g}C@DyY!@{ -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 -cDZqMsmk?c;Wd#8M000zNLug@X -ZbEEnZe&wsVQf@*P;_zx0sseMX>?<6X>I@o0Rka#tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEU;2 -^0@;NPlb{-n1xko1uZcKL=FhMw)iW@^B~GyS4IH_Y-w?IX=DHe0Rka#tD*IvDh<9wi3iSCIT-HkA81Vl -hk;Gmjr?|WwEU;2^0@;NPlb{-n1xko1uZcKL=FhMw)iW@^B~GyS4I<9Lug@XZbEEnZe&wsVQf@*X=DTf -00&}ebYpL6ZU6-V0wHj#q4l6D4ZcK)2hLYH81C&KXiWu&flb+s{C0G-{44{FNJ~fc1UzTDb_LBRjrSXj -?;k=^zm6d~Uh7!wPyq&PX>oOFWB>&L0wHj#q4l6D4ZcK)2hLYH81C&KXiWu&flb+s{C0G-{44{FNJ~fc -1UzTDb_LBRjrSXj?;k=^zm6d~Uh7!wP!L!{Xklq?Q)OdvWpqoOF -WB>&L0wHj#q4l6D4ZcK)2hLYH81C&KXiWu&flb+s{C0G-{Ad~Lyw$T9tCzEwrAszt-P)%HZ|LbH=L2A= -l(W4CP6}8jc* -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 +oRaGgLvLn+a +3PW#hbaG*1bV+0d0RRU806-uB2}EIZVN-NrbY%qr00;m8KmY&$000000RR600000000~8SbY*UHX>V=@ +3j=0mb^+R(Q4?4eR(6nw`S$_F2)vN@Mb6UJ-F(lri_dqerx4lR4>iBsz2WM<=Vqt7^0p25# +Yo@G%*b#-tU^&3KX?w7l?~*Sh8@1jRRblZzybED-b7^O8ZDnqBa{+B8dRRT6v^+Utq2R*LPciBoh`YBV +A5APO#~wOBdpZbmWn^V#ZDnKu-_NO$^@rt6M7IGITmUKjm1~>v&8b0-V>p(oz$%0233g#@Wo~0>Wpe@D +g=PS6VPp{$?vC--s`v@B8YHl)C#jpVFzBk!DMw8Sc42I3WMOn~asqk-9p7nv%krpqN@L7b8`ZE10COKearHwcS=7M +7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%NMR;^&ZgXjGZc}4u +Wo=;w1_*6sbYWy+bYTDq0d?d}_}|Wp0vpvv$c&#PW69R$ltr%da5t5w^x+8!q5uE@000000RI3000000 +00(DmZ(?C=a{vkf)$WoGNrn+a000000RI300000000(kqWMyS-a{vheM(yUq2ps*m=2xUDT;RqCgn#@WzFu~@ +adfH5^@&-|0000000000{{R30000003t@9}X=iS2Wo~qH015$z{^Dg=h-~N_zJ`Red1EINWrM}GXaQb} +6c#qIM2EQnHo-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4>GEG0000000000{{R300000033g#@Wo~0> +Wpe-t0Y>fS!w4MxxaL=+DqP^k2!wz9AHH68xp8!<%Jqp^&Hw-a000000RI3000000010+sY-wa+bZ>G1 +1OfmAZf|a7000011aog~WdH>M0%CAAe<9`Lptgpr6F_xjAC6(~TLj#*ewiHf`^rCgHqw;r~cW +`-QV>+d2nR~0RR9314d?c1pxp60u4rWZf9v?Y-Lk)VRU5# +0SE?SX>@ZoGynww000OKMs;pyX<}?;RC#b^0|5bs~EXcCXx(drQcb3B`Fx$)^%va$Ar) +C7cFqVR>b8F#&nR*hvU%Hiwm>NkB*5l*n^F-s9AWUWw-#$_-O$8W0C`Wpi|HWpo0{EFN!zncXl9K5w2; +FV{y1jDTJCC^p$-mHEbO0#qkqh9c2>uJC38-{*D7fZ(%hZo23R4S;p`Q9JBQllDyuV{C78Wld#tXm4Z! +A#kgq^`I&ZzC?)!&R01Y?(H9FO$CR6P1%k7c67A-F1HXRxo%|^+Itiop&gxXSvq){{YhrGf57_P)SQy* +2yJC_VPs)+VFC4eO*mP8`7qV21dnrCyk{{a-lF$FG0V5TNAc?Tc{K-TY;R&=Y;ytLBav&Stb*7Pg~wny +z`1FAu$k|YFC-ha-WFA1@jtu^VRLh7XKrm}Zgg`2Z6Kur>w<8}-EGowyIzW3m +33g#@Wo~0>Wpe@Dg=PS6VPp{$?vC--s`v@B8YHl)C#jpVFzBk!DMw8Sc42I3WMOn~asqk-9p7nv%krpq +N(I! +Xk~3-1_cOhWprU=VRT^t2?2HFP59r=ivkxis%Ku=2wF ++7z(Wqt=tdZk`V^s(Ana000000093000000000YNb8~5DZf#|5baMa-0f+wLWmt%8=p4R=gtK{LClh6Z +#kObxUW*hKHnBv9xdAr8G@<&SffJ|QFn~N>u=2wF+7z(Wqt=tdZk`V^s(Ana000000093000000000Sg +VQgh?V`*h`00{v`?dHP>9R0ZFSEMRj;Km4qfBYZ5UUs>0bg9bqiCNA700000000300000000009c42I3 +WMOn~asUJZ00eGtZe;)f009JZZ*64&1pxwLa5aA+<>R2XhQO_4{AcS-HH^7AVzASV8M4NYxyCka@1Z8) +ymjIKNK5;L!8FkfGTe+FK;UUh9M-4n+}vRcM{I9mVQf=$VRU5$0RRdC)$WoGNrWQHGZU6uP000000RI300000001-!Q +Z(?C=Q*>c;Wm98lWo=;w0|;_ub7gXNWn=<+10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUE}_h5K% +L=laq&yA1JoJ^{7>oKLkF4~iax8KK|47hp)b7gHwWCBI%qhH(hioJpYH;+t0eX2w~A!Q+0eaZ{MVycPK^j{VR%V&Wo>f+00R$4Y;R&=Y*Tb$bY)a|aAgGn +0006EM{I9mVQf}mY;|RG1pxpE0WzLeQ3m-<6)UHjqig^*m4co5us7ukl*0UQzs7w8g#iEn000000RR60 +0000000>EBWo~q7ba@2<00ja9$}AplgPGkh3_fq3Q7_j=2#kPT_9!;lWR>~GYywm#NWLQ%D(Hkon&*Qw +pawq)`VKLB>Wd>h=Ype%b?27200;ugEFN!zncXl9K5w2;FV{y1jDTJCC^p$-mHEbO0#qkRz9SbZ=!8X@ +=Yuq$20sb<4l#S`iz7Vef}@Ca=a#qt00000000304*&oF00005Np5g;bOr(kaB^jKPjz$wlMuXsu{2tX +FT+?;?hj39&>gq>HOrf1lB-q;n)I5N2y$g}WpZ|9WCD5v9p7nv%krpqN%$n#j0HLDJN5-IKgM_J7b(p+0MPGk2Gl)y2(Rz0hP$+dLDIRU(}XWLTZug +enOC;Z(5k~zEJnJiX;;E#Q^{S000000RR600000000v2JaCLNZ1pxpF0o9FP2n?Horiuqf0^m>2O`jNR +ziT$b7#=ya6uYYC;s5{u000000RR600000000vB9d1Z1j0|EzPX>?<6X>I@pY-w?IX=DKjO=VlVN`i=Wd#8M00Ie3WprUyVQh6}1pxpE002M$0000000030{{R3000008O=WapWMOn+ +1pxpG0d?d}_}|Wp0vpvv$c&#PW69R$ltr%da5t5w^x+8!q5%{oJdRMsrjHBJ^EIe4enz&iEACnc`NWk% +>en!wdoTb1000000093000000000Y5V`Fu4a%FB~Wpf4s18r$;00065ZDDu-00In8a6@lxZE19EWo~o^ +3j=0mb^+R(Q4?4eR(6nw`MZ*F5{000OEZ*Ww3aAg5e7%8g>mNAq~ +6HF>1W#;Gy1&akla$y^tAD1n$toKU@ZDn*}WMOn+0(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@O +CT*{+#r3Bk2FRnL+RBXEn8vr=x`Tq%|A_kfK&ST81_x(sZ(?C=a{_t;9p7nv%krpqN0-0(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCT*{+#r3Bk2FRnL+RBXEn8vr=x`Tq% +|A_kfK&ST81_^dyY-Mg^X=QT)dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThsZfv!yd427@;7veO2zMB=|GYNKKY-wa+bZ>G3dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0 +ThV1_J_b +Z~>Lb=6W7=VqesjRYGc!>wZFzp>JB4@xD;^wu&SY_r(Hqc>#z1;$>KfZ0H=mhJ>?uVM0r~W- +2xhK9cV^W63=w?&L0!8YhU)%QMkO4aJ;_ZeCe;xE! +X<$x_Fs4If6Z`oP*=q!&6rQG)02XJT?*g=|B=zREie$*y(7k2+*P~cYjROi{baY{3Xl-R~bN~eb0YWfg +g^0-1s}v?c$Nk9{EX~mW5dRI6fB-~%h??EZc?eQvWMyS-Wn={b015#{?dHP>9R0ZFSEMRj;Km4qfBYZ5 +UUs>0bg9bqiCNA8mB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<0000000000{{R30000004pL=y +WnpY(WI=RvVPj|p0t9AhY-Irnwto`e>uZ$?1z+)WysMU3t2e*Ffe9Y;*ts5D-#jc4c8~ +Wn@NmZf9v?Y-I)k1$JRKwa1v8ba_B>T#2Nxy=Q)6glZD9rt17>D+ +0ot2U6Id2jc94hrndMfLayEe1ISdA&%p{mB1!VWk)dgm3VP|s!dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0 +ThOi(W05|TJ%PM*ricn_PmXk-a=X>Db5bYX39002k{WMy_` +Y;SO7asjsJfQB3>bs~EXcCXx(drQcb3B`Fx$)^%va$Ar)C7cOuWprUwd2nTO015$hC`}q*rYXqYdo~D%m7H6OD +0<^0n_2##VWXRdjy=DB@qgYOj0000000000{{R30000003ukO^Vqt7ld2nTO015%s?vf5kh_h+&YE#h% +O8d1V_{UOl9{V;uR#^q%KfZ0H=mhJ>?uV9R0ZFSEMRj +;Km4qfBYZ5UUs>0bg9bqiCNA700000000300000000007XJu|>b7^w{7)aIA#9XnshcC})U)TI#r3b0k +yqD7}ejM+$yUGm(3T1e7Wo~n6Z*Fq{3ISww9zv-Vp*%wog4O?q)g04AaHEjnO6;Ie%sNwVNZtVhXadZr +-SPY!h`6Z9%SYt5l1;p3@00000 +000300000000008a%FR6a&~280(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCjNpJN#A(BKKz&v +`r;e6DUv<<*U}cD+0ot2U6Id2j +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 -----END STRICT TYPE LIB----- diff --git a/stl/RGBCommit@0.1.0.stl b/stl/RGBCommit@0.1.0.stl index 158e9e0198fd8503c39265ca486695245bf86cad..2e711c76c058df64a49a215cebf3118ca9932295 100644 GIT binary patch delta 810 zcmaD||FC959}A=7W=2+5ZiV^F9#4M4IzjuirD9C=zh!9?U8dLBGZ{`epJc^Q`Qlmf zWCKaJ$!8^GCP#3q6Qj68!PKfv?2oG}w^+|r}<*CQi>LdGY@xM-PBa zl#>#kynsiYIK^{?5{a=IQzjqc zDQP-+p>#hZ`({I#7RJdEaxRnG4b+ABlJoPDQxkJiQ(Q`Ob1NAb7&dQ_(_&P}RjZ1y zU9iQ*GHKz1L+AYsU&(ar-mWa~tD|*X&dQ4D;j}`tKMSL2lms*WfaX!h@2_jh~*VhbGv6>Q-Fqc;QK~xqj%4ti4M& zwYhig`|7&+gJ~V3Li3fbM;i98U%CBgvR&SxHA!>lCduGkhb``grDd;q6v42$&)k(s zp(@u(Zt98)hLvIxJxAnN<(JG=-Fx3I*sH?m(K`)+9|@a3TM9BNFlUz@cx`06x}ZOh zrRdkyCqK4`FWLM-IZLEP*l^2fgZGo&ZImXvSwB>mx;TFB6OrRCm8O9;pL{Meep`5> XY|8hz$6+p2oS~N#CT(`NS;7nex7c7U delta 1176 zcmaD@^SXXRAB%!31BYXAacW6OVmd1$13LqQg8~C5Or)5Vak9UmivG#|St}2-c}xBM zn=UJvmXdlNd#AlLN$@6mngTebLWiwQ?5aU-s;f&XE^YPj#mJ zV7tPz^iKP?(%uC?)7&PnkrbY+$D>Z1Vr`*BVysV^tjD2Fj6#y!X+@M9H$N8H%c|ff z{G;QI1ovCrLe5(P=Fcs^{1f%rv{y0gi~okh%g%}&oqRybUx9^7#$w--jo0`tF@4dN!Ihk!o10mZo0?a`=&@HSPyBbAwOCD^YMg2M?I!2< zT5-ExFFML~mUG>_Kq;=G#Ju#>fTH~TG=ge3ACT2zRH%EjA%BbZ(>M04y-R#|xb*JJ zd+e(}Wj*InUhZwyuHQ8`bII#4GxAMllvCXtqm;s^4R?Jpqoyh!+rgPtx*2m4UKtu9J#3_i7AOCiIWeqDuTjnv!b>Qvy4zcYD#KRacZ73JdB`$r^qll zR_`4n^JE`=^$3n6X!tU=?)ag-`^%DLyqoviyYAqhl2_4ucx_Pb6YN>5rq`!nk;b=}Php}XJyzG`q&ySd&`!_X6chZ`Y`pVbq z{Np!>YOS2?pi;K^jtK{&!pg#l)+ah!bc1Hgi5!#mcon0!Df4>I+}A7nqknVrwnl7b zF>_^7F!F3GZoYYV&D3>uuAj%E(D>=Fee+(cCCmW+?ex6> diff --git a/stl/RGBCommit@0.1.0.sty b/stl/RGBCommit@0.1.0.sty index d70fa149..d22019a1 100644 --- a/stl/RGBCommit@0.1.0.sty +++ b/stl/RGBCommit@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:0OQ7gS8R-XmQg8MV-smgBZ5o-B$ZJvp5-S4xxB51-PpdNPZU#julius-square-inch + Id: stl:mh8Ebzz!-9Trq2j8-Q2kUCyh-L4P1E80-HNp6Uct-LDLlJNo#victor-guru-philips Name: RGBCommit Version: 0.1.0 Description: Consensus commitment layer for RGB smart contracts @@ -44,12 +44,6 @@ import Bitcoin#signal-color-cipher use Txid#shallow-light-reverse -@mnemonic(slang-amber-club) -data AssetTag : [Byte ^ 32] - -@mnemonic(crash-singer-corner) -data AssetTags : {AssignmentType -> ^ ..0xff AssetTag} - @mnemonic(airport-ladder-joseph) data AssignRevealedAttachBlindSealTxPtr : confidential (seal XChainSecretSeal , state ConcealedAttach @@ -177,7 +171,7 @@ data AttachId : [Byte ^ 32] @mnemonic(harvard-burma-bicycle) data AttachState : id AttachId, mediaType MediaType -@mnemonic(chess-rabbit-aztec) +@mnemonic(status-magnum-school) data BaseCommitment : flags CommitVerify.ReservedBytes1 , schemaId SchemaId , timestamp I64 @@ -185,10 +179,6 @@ data BaseCommitment : flags CommitVerify.ReservedBytes1 , layer1 Layer1 , testnet Std.Bool , closeMethod BPCore.Method - , assetTags CommitVerify.StrictHash - -@mnemonic(animal-plume-minus) -data BlindingFactor : [Byte ^ 32] @mnemonic(meter-arizona-albino) data ConcealedAttach : [Byte ^ 32] @@ -196,8 +186,8 @@ data ConcealedAttach : [Byte ^ 32] @mnemonic(ivan-tripod-young) data ConcealedData : [Byte ^ 32] -@mnemonic(arizona-basic-moment) -data ConcealedFungible : commitment PedersenCommitment, rangeProof PedersenCommitment +@mnemonic(justice-border-griffin) +data ConcealedFungible : value FungibleState, concealedDummy () @mnemonic(uniform-welcome-papa) data ContractId : [Byte ^ 32] @@ -239,7 +229,7 @@ data FungibleState : bits64#8 U64 | (|) data FungibleType : unsigned64Bit#8 | (|) -@mnemonic(amigo-vatican-happy) +@mnemonic(letter-tribal-father) data Genesis : ffv Ffv , schemaId SchemaId , flags CommitVerify.ReservedBytes1 @@ -248,7 +238,6 @@ data Genesis : ffv Ffv , layer1 Layer1 , testnet Std.Bool , closeMethod BPCore.Method - , assetTags AssetTags , metadata Metadata , globals GlobalState , assignments AssignmentsBlindSealTxid @@ -335,9 +324,6 @@ data OwnedStateSchema : declarative () | structured StrictTypes.SemId | attachment MediaType -@mnemonic(pupil-scale-jerome) -data PedersenCommitment : [Byte ^ 33] - @mnemonic(anita-vega-pirate) data Redeemed : {ValencyType -> ^ ..0xff OpId} @@ -347,10 +333,8 @@ data RevealedAttach : file AttachState, salt U64 @mnemonic(sleep-source-figure) data RevealedData : value DataState, salt U128 -@mnemonic(source-contact-member) +@mnemonic(escape-nylon-client) data RevealedFungible : value FungibleState - , blinding BlindingFactor - , tag AssetTag @mnemonic(corona-igloo-sierra) data Schema : ffv Ffv diff --git a/stl/RGBLogic@0.1.0.sta b/stl/RGBLogic@0.1.0.sta index a45279ae..5255382b 100644 --- a/stl/RGBLogic@0.1.0.sta +++ b/stl/RGBLogic@0.1.0.sta @@ -1,14 +1,14 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:UrhM408a-L6A2m5B-NJsufkB-2v8qfwZ-ZdPzm67-gTH3xGM#brother-sushi-savage +Id: stl:ndyP5b78-MGzBwge-spi5HS7-vd!8qHQ-UUJrsgP-ieX$j1c#break-analog-postal Name: RGBLogic Dependencies: BPCore#symbol-tropic-grand, - RGBCommit#julius-square-inch, + RGBCommit#victor-guru-philips, Bitcoin#signal-color-cipher -Check-SHA256: 944b12a51dc50a5d0ac66ba13a1ad2f12bcbffffcb5d0177fab30b5de555abf1 +Check-SHA256: 5b3df08bfa14b311d3560d4eee3ba98972699c7e04321fc41cbe060b65dcef36 -2vSEvOmAmtV*?>@tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPA_P(yEWWzgh1fiDqWWFYXxY?=UB -=74`>o9X2)F~lBqK9@~Bl?hTuLPKwDZE1A%Y!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkk +2vSEvOmAmtV*?>@tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPA_P(yEWWttxZZ#@3>I_la#5ZXlo +$`bfLQ9RIdY3WBTEHdRJ+6hueLPKwDZE1A%Y!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkk Z)t7=20~CnZ*pY?00DdlT>wB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 wjY>38tto&d&=eG4cRAF#( @@ -24,15 +24,15 @@ iRT*14O40w5C%+Pd1Z1jmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<1W#~DWCZ{SL}Fu5a&K>D n*!v8^Ea7rh?dzC2n+%RZ*X#DbN~eb0wHj#q4l6D4ZcK)2hLYH81C&KXiWu&flb+s{C0G-{6|jDT+rxD K6vW;JU&?LxLM72H?wDC1Zo}=N}D)4mkCE~Z(?C=PjX}i0tIhyPjX}d{&9|4h)I8ST&b@+9Xb>VnJAp3|USuHf#cY}YS>}L$WSi;bE-}O&bv~C( -J(Xm29zv-Vp*%wog4O?q)g04AaHEjnO6;Ie%sNwVNZti*Z*F5{000OCZ*Xa30?_0;fiDqWWFYXxY?=UB -=74`>o9X2)F~lBqK9@~Bm6gcmdLDIRU(}XWLTZugenOC;Z(5k~zEJnJiX;;E#s3O)a$#@6CZU6=Z -2X|?7Ze??G0dl)S$QV;yG0%+u`Lqfm#|FpRuujhTP8r)T_J?np;R1Ad0?_0;fiDqWWFYXxY?=UB=74`> -o9X2)F~lBqK9@~Bl{8Wht`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zcaA{-$(BwOT -FA-j3An?U(ngChmfPZA0>E$jl#2$4%mrXsDmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<3Rh`# +LdY0XT`|v$|M|2EBF6^D+OST}`A!+zFZPFTn&AR;c>KM>kQ0?HEjKT$l;b7|>EEi5wS +B-&(k9zv-Vp*%wog4O?q)g04AaHEjnO6;Ie%sNwVNZti*Z*F5{000OCZ*Xa30-7HLZ#@3>I_la#5ZXlo +$`bfLQ9RIdY3WBTEHdRJ+Lg%WdLDIRU(}XWLTZugenOC;Z(5k~zEJnJiX;;E#s3O)a$#@6CZU6=Z +2X|?7Ze??G0dl)S$QV;yG0%+u`Lqfm#|FpRuujhTP8r)T_J?np;R1Ad0-7HLZ#@3>I_la#5ZXlo$`bfL +Q9RIdY3WBTEHdRJ+B8xRt`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zcaA{-$njZvj +JpT1M>e@dL+C>7&68Jw+JkWD#=|?RrGUX)NmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<3Rh`# Ze??GPjX}g0{{qNa${&|c4cG$00036ZE0?0WB>&L0bJY;BNZ=sBHM?<`J6+Fr=AE$jl#2$4% -mrXsDdBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W)00aqiX>Db5bYX39002k +5&{WyWo~p~bZK^F0000AS7~%^Wpi^-Z*v9%25ez@WpXhBnjZvjJpT1M>e@dL+C>7&68Jw+JkWD#=|?Rr +GUX)NdBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W)00aqiX>Db5bYX39002k -----END STRICT TYPE LIB----- diff --git a/stl/RGBLogic@0.1.0.stl b/stl/RGBLogic@0.1.0.stl index 14aba3d859120fe0fc648181ae9f5334c303b925..01454c397c690f9941903b38a002ad9bb9b6b3b9 100644 GIT binary patch delta 251 zcmey(^P6Xap~5VAmVBFkU#(u0J`sA%$T zCIx-gy!^c6R0akPmi&Uu6edCjPrk?!L)c(nR(-;XF0v?0-ou(fSm8@1#mT8`VgQaA BYWV;F delta 251 zcmey(^P6Xap~8hH){XjtaVZKPj^@l_h0J`sA%$T zCIx-gy!^c6R0akPmi&Uu6edCjPrk?!L)c(nR(-;XF0v?0-ou(fSm8@1#mT8`VgQ(J BY|{V$ diff --git a/stl/RGBLogic@0.1.0.sty b/stl/RGBLogic@0.1.0.sty index cddcb91a..49cda4ec 100644 --- a/stl/RGBLogic@0.1.0.sty +++ b/stl/RGBLogic@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:UrhM408a-L6A2m5B-NJsufkB-2v8qfwZ-ZdPzm67-gTH3xGM#brother-sushi-savage + Id: stl:ndyP5b78-MGzBwge-spi5HS7-vd!8qHQ-UUJrsgP-ieX$j1c#break-analog-postal Name: RGBLogic Version: 0.1.0 Description: Consensus logic layer for RGB smart contracts @@ -18,7 +18,7 @@ import BPCore#symbol-tropic-grand use TapretRightBranch#miracle-patriot-touch use OpretProof#good-village-flex -import RGBCommit#julius-square-inch +import RGBCommit#victor-guru-philips use TransitionType#picture-reflex-brigade use ExtensionType#apropos-scoop-viva use Layer1#camilla-basket-justin diff --git a/stl/Transition.vesper b/stl/Transition.vesper index 302194b2..4d23266e 100644 --- a/stl/Transition.vesper +++ b/stl/Transition.vesper @@ -21,7 +21,6 @@ OpCommitment rec issuer bytes len=32 aka=StrictHash layer1 enum Layer1 bitcoin=0 liquid=1 testnet enum Bool false=0 true=1 - assetTags bytes len=32 aka=StrictHash transition tuple tag=1 _ bytes len=32 aka=ContractId _ is U16 aka=TransitionType @@ -112,8 +111,9 @@ Transition rec bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 liquid bytes len=32 wrapped aka=SecretSeal tag=1 state rec ConcealedFungible - commitment bytes len=33 aka=PedersenCommitment - rangeProof bytes len=33 aka=PedersenCommitment + value union FungibleState + bits64 is U64 wrapped tag=0 + concealedDummy is Unit lock bytes len=2 aka=ReservedBytes2 confidentialState rec tag=1 seal union XChainBlindSealTxPtr @@ -130,8 +130,9 @@ Transition rec vout is U32 aka=Vout blinding is U64 state rec ConcealedFungible - commitment bytes len=33 aka=PedersenCommitment - rangeProof bytes len=33 aka=PedersenCommitment + value union FungibleState + bits64 is U64 wrapped tag=0 + concealedDummy is Unit lock bytes len=2 aka=ReservedBytes2 confidentialSeal rec tag=2 seal union XChainSecretSeal @@ -140,8 +141,6 @@ Transition rec state rec RevealedFungible value union FungibleState bits64 is U64 wrapped tag=0 - blinding bytes len=32 aka=BlindingFactor - tag bytes len=32 aka=AssetTag lock bytes len=2 aka=ReservedBytes2 revealed rec tag=3 seal union XChainBlindSealTxPtr @@ -160,8 +159,6 @@ Transition rec state rec RevealedFungible value union FungibleState bits64 is U64 wrapped tag=0 - blinding bytes len=32 aka=BlindingFactor - tag bytes len=32 aka=AssetTag lock bytes len=2 aka=ReservedBytes2 structured list len=0..MAX16 wrapped tag=2 AssignRevealedDataBlindSealTxPtr union From f1e1d07ad8b60661e007a032291ab3a966be9782 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Tue, 21 Jan 2025 14:47:16 +0100 Subject: [PATCH 20/70] vm: add WitnessOrd::Ignored --- src/stl.rs | 2 +- src/vm/contract.rs | 2 ++ stl/RGBLogic@0.1.0.sta | 19 ++++++++++--------- stl/RGBLogic@0.1.0.stl | Bin 1659 -> 1671 bytes stl/RGBLogic@0.1.0.sty | 7 ++++--- 5 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/stl.rs b/src/stl.rs index 33669e3b..8b2ae1d4 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -40,7 +40,7 @@ pub const LIB_ID_RGB_COMMIT: &str = "stl:mh8Ebzz!-9Trq2j8-Q2kUCyh-L4P1E80-HNp6Uct-LDLlJNo#victor-guru-philips"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:ndyP5b78-MGzBwge-spi5HS7-vd!8qHQ-UUJrsgP-ieX$j1c#break-analog-postal"; + "stl:ZVsDEEZJ-cDK203!-ys2wf2h-QMU18pN-fEl49v9-qOTytWA#armor-roman-zigzag"; fn _rgb_commit_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_COMMIT), tiny_bset! { diff --git a/src/vm/contract.rs b/src/vm/contract.rs index df4d4b45..165bf939 100644 --- a/src/vm/contract.rs +++ b/src/vm/contract.rs @@ -412,6 +412,8 @@ impl Display for WitnessPos { serde(crate = "serde_crate", rename_all = "camelCase") )] pub enum WitnessOrd { + /// Witness transaction must be ignored by the update witnesses process. + Ignored, /// Witness transaction must be excluded from the state processing. /// /// Cases for the exclusion: diff --git a/stl/RGBLogic@0.1.0.sta b/stl/RGBLogic@0.1.0.sta index 5255382b..93631e40 100644 --- a/stl/RGBLogic@0.1.0.sta +++ b/stl/RGBLogic@0.1.0.sta @@ -1,11 +1,11 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:ndyP5b78-MGzBwge-spi5HS7-vd!8qHQ-UUJrsgP-ieX$j1c#break-analog-postal +Id: stl:ZVsDEEZJ-cDK203!-ys2wf2h-QMU18pN-fEl49v9-qOTytWA#armor-roman-zigzag Name: RGBLogic Dependencies: BPCore#symbol-tropic-grand, RGBCommit#victor-guru-philips, Bitcoin#signal-color-cipher -Check-SHA256: 5b3df08bfa14b311d3560d4eee3ba98972699c7e04321fc41cbe060b65dcef36 +Check-SHA256: b4085e8f4b916ed0130fb3120d191196edab4fe2df707cddc8d35f5b8f582c31 2vSEvOmAmtV*?>@tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPA_P(yEWWttxZZ#@3>I_la#5ZXlo $`bfLQ9RIdY3WBTEHdRJ+6hueLPKwDZE1A%Y!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkk @@ -22,17 +22,18 @@ Mp|h#f#{Gz8SzLEaTf~c{WkYggkPIjuQHS#3Ua|L6d7%qre2Ut&TYD 1OfpDbYXCEWpn@q0Rka#tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPdYADBNH?W>M^%H|xc>sh|D n*!v8^Ea7rh?dzC2n+%RZ*X#DbN~eb0wHj#q4l6D4ZcK)2hLYH81C&KXiWu&flb+s{C0G-{6|jDT+rxD -K6vW;JU&?LxLM72H?wDC1Zo}=N}D)4mkCE~Z(?C=PjX}i0tIhyPjX}d{&9|4h)I8ST&b@+9XbKM>kQ0?HEjKT$l;b7|>EEi5wS +K6vW;JU&?LxLM72H?wDC1Zo}=N}D)4mkCE~Z(?C=PjX}i0tIhyPjX}dBrRR>2@LcryZYc>KM>kQ0?HEjKT$l;b7|>EEi5wS B-&(k9zv-Vp*%wog4O?q)g04AaHEjnO6;Ie%sNwVNZti*Z*F5{000OCZ*Xa30-7HLZ#@3>I_la#5ZXlo $`bfLQ9RIdY3WBTEHdRJ+Lg%WdLDIRU(}XWLTZugenOC;Z(5k~zEJnJiX;;E#s3O)a$#@6CZU6=Z -2X|?7Ze??G0dl)S$QV;yG0%+u`Lqfm#|FpRuujhTP8r)T_J?np;R1Ad0-7HLZ#@3>I_la#5ZXlo$`bfL +2X|?7Ze??G0gF(#a06?0nLd|SC|>c2?4}E((!U1rl;i3pNx$ZJGXivZ0-7HLZ#@3>I_la#5ZXlo$`bfL Q9RIdY3WBTEHdRJ+B8xRt`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zcaA{-$njZvj JpT1M>e@dL+C>7&68Jw+JkWD#=|?RrGUX)NmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<3Rh`# -Ze??GPjX}g0{{qNa${&|c4cG$00036ZE0?0WB>&L0bJY;BNZ=sBHM?<`J6+Fr=Ae@dL+C>7&68Jw+JkWD#=|?Rr -GUX)NdBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W)00aqiX>Db5bYX39002k +Ze??GPjX}g1ONwVXKrtDWn=&V009VLa${&|c4cG$00067ZE0?0WB>&L0bJY;BNZ=sBHM?<`J6+Fr=Ae@dL+C>7& +68Jw+JkWD#=|?RrGUX)NdBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W)00aqiX>Db5 +bYX39002k -----END STRICT TYPE LIB----- diff --git a/stl/RGBLogic@0.1.0.stl b/stl/RGBLogic@0.1.0.stl index 01454c397c690f9941903b38a002ad9bb9b6b3b9..5466d7bda8ac8c4821cc85d87904f687645d21d1 100644 GIT binary patch delta 160 zcmey()6To$4YPuZZtO=+p)L1+a~$9PVam;y8?+W*)=1)9XuHFB@yG6+b0+h!7%6lI zY%gHWE}LmLJzOL1W9OS?+)FO)XZtwi@her&{m&|lC&#g@CPtCUWM9^5X%+_d%=Enc fqSO=y1_nls#G>Sk%rY>CY4UYeEk@?aOl*|^rbt8c delta 148 zcmZqY{mrxC4YR_(!oH{u&-&7smFul#t%Q9~W?eq>^o}jlM>U(*iorYHPv&7UQYhN( zbV4FH*6@7K|DRj9l#a6 Date: Thu, 23 Jan 2025 18:37:50 +0100 Subject: [PATCH 21/70] operation: remove XChain --- src/lib.rs | 2 +- src/operation/assignments.rs | 28 +- src/operation/commit.rs | 6 +- src/operation/layer1.rs | 42 +++ src/operation/mod.rs | 12 +- src/operation/operations.rs | 6 +- src/operation/seal.rs | 85 ++---- src/operation/xchain.rs | 536 ---------------------------------- src/stl.rs | 9 +- src/validation/consignment.rs | 12 +- src/validation/status.rs | 23 +- src/validation/validator.rs | 124 +++----- src/vm/contract.rs | 109 +------ src/vm/mod.rs | 2 +- stl/AnchoredBundle.vesper | 184 ++++-------- stl/RGBCommit@0.1.0.sta | 201 ++++++------- stl/RGBCommit@0.1.0.stl | Bin 15969 -> 16304 bytes stl/RGBCommit@0.1.0.sty | 98 +++---- stl/RGBLogic@0.1.0.sta | 26 +- stl/RGBLogic@0.1.0.stl | Bin 1671 -> 1671 bytes stl/RGBLogic@0.1.0.sty | 4 +- stl/Transition.vesper | 184 ++++-------- 22 files changed, 421 insertions(+), 1272 deletions(-) create mode 100644 src/operation/layer1.rs delete mode 100644 src/operation/xchain.rs diff --git a/src/lib.rs b/src/lib.rs index 22194544..4ca1c337 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -44,10 +44,10 @@ pub mod vm; pub mod stl; pub mod prelude { + pub use bp::Txid; pub use commit_verify::ReservedBytes; pub use operation::*; pub use schema::*; - pub use vm::XWitnessId; #[cfg(feature = "stl")] pub use super::stl; diff --git a/src/operation/assignments.rs b/src/operation/assignments.rs index 7e719423..a47019cb 100644 --- a/src/operation/assignments.rs +++ b/src/operation/assignments.rs @@ -33,7 +33,7 @@ use super::ExposedState; use crate::operation::seal::GenesisSeal; use crate::{ AssignmentType, ExposedSeal, GraphSeal, RevealedAttach, RevealedData, RevealedValue, - SecretSeal, StateType, VoidState, XChain, LIB_NAME_RGB_COMMIT, + SecretSeal, StateType, VoidState, LIB_NAME_RGB_COMMIT, }; #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Display, Error)] @@ -71,25 +71,25 @@ pub type AssignAttach = Assign; pub enum Assign { #[strict_type(tag = 0x00)] Confidential { - seal: XChain, + seal: SecretSeal, state: State::Confidential, lock: ReservedBytes<2, 0>, }, #[strict_type(tag = 0x03)] Revealed { - seal: XChain, + seal: Seal, state: State, lock: ReservedBytes<2, 0>, }, #[strict_type(tag = 0x02)] ConfidentialSeal { - seal: XChain, + seal: SecretSeal, state: State, lock: ReservedBytes<2, 0>, }, #[strict_type(tag = 0x01)] ConfidentialState { - seal: XChain, + seal: Seal, state: State::Confidential, lock: ReservedBytes<2, 0>, }, @@ -120,7 +120,7 @@ impl PartialEq for Assign { impl Eq for Assign {} impl Assign { - pub fn revealed(seal: XChain, state: State) -> Self { + pub fn revealed(seal: Seal, state: State) -> Self { Assign::Revealed { seal, state, @@ -128,7 +128,7 @@ impl Assign { } } - pub fn with_seal_replaced(assignment: &Self, seal: XChain) -> Self { + pub fn with_seal_replaced(assignment: &Self, seal: Seal) -> Self { match assignment { Assign::Confidential { seal: _, @@ -161,7 +161,7 @@ impl Assign { } } - pub fn to_confidential_seal(&self) -> XChain { + pub fn to_confidential_seal(&self) -> SecretSeal { match self { Assign::Revealed { seal, .. } | Assign::ConfidentialState { seal, .. } => { seal.conceal() @@ -170,7 +170,7 @@ impl Assign { } } - pub fn revealed_seal(&self) -> Option> { + pub fn revealed_seal(&self) -> Option { match self { Assign::Revealed { seal, .. } | Assign::ConfidentialState { seal, .. } => Some(*seal), Assign::Confidential { .. } | Assign::ConfidentialSeal { .. } => None, @@ -207,21 +207,21 @@ impl Assign { } } - pub fn as_revealed(&self) -> Option<(&XChain, &State)> { + pub fn as_revealed(&self) -> Option<(&Seal, &State)> { match self { Assign::Revealed { seal, state, .. } => Some((seal, state)), _ => None, } } - pub fn to_revealed(&self) -> Option<(XChain, State)> { + pub fn to_revealed(&self) -> Option<(Seal, State)> { match self { Assign::Revealed { seal, state, .. } => Some((*seal, state.clone())), _ => None, } } - pub fn into_revealed(self) -> Option<(XChain, State)> { + pub fn into_revealed(self) -> Option<(Seal, State)> { match self { Assign::Revealed { seal, state, .. } => Some((seal, state)), _ => None, @@ -445,7 +445,7 @@ impl TypedAssigns { /// If seal definition does not exist, returns [`UnknownDataError`]. If the /// seal is confidential, returns `Ok(None)`; otherwise returns revealed /// seal data packed as `Ok(Some(`[`Seal`]`))` - pub fn revealed_seal_at(&self, index: u16) -> Result>, UnknownDataError> { + pub fn revealed_seal_at(&self, index: u16) -> Result, UnknownDataError> { Ok(match self { TypedAssigns::Declarative(vec) => vec .get(index as usize) @@ -466,7 +466,7 @@ impl TypedAssigns { }) } - pub fn to_confidential_seals(&self) -> Vec> { + pub fn to_confidential_seals(&self) -> Vec { match self { TypedAssigns::Declarative(s) => s .iter() diff --git a/src/operation/commit.rs b/src/operation/commit.rs index 59cf3f73..f476cca6 100644 --- a/src/operation/commit.rs +++ b/src/operation/commit.rs @@ -42,7 +42,7 @@ use crate::{ ConcealedData, ConcealedState, ConcealedValue, ConfidentialState, DataState, ExposedSeal, ExposedState, Extension, ExtensionType, Ffv, Genesis, GlobalState, GlobalStateType, Layer1, Operation, Redeemed, SchemaId, SecretSeal, Transition, TransitionBundle, TransitionType, - TypedAssigns, XChain, LIB_NAME_RGB_COMMIT, + TypedAssigns, LIB_NAME_RGB_COMMIT, }; /// Unique contract identifier equivalent to the contract genesis commitment @@ -189,7 +189,7 @@ impl AssignmentIndex { #[commit_encode(strategy = strict, id = DiscloseHash)] pub struct OpDisclose { pub id: OpId, - pub seals: MediumOrdMap>, + pub seals: MediumOrdMap, pub fungible: MediumOrdMap, pub data: MediumOrdMap, pub attach: MediumOrdMap, @@ -355,7 +355,7 @@ impl ConcealedState { pub struct AssignmentCommitment { pub ty: AssignmentType, pub state: ConcealedState, - pub seal: XChain, + pub seal: SecretSeal, pub lock: ReservedBytes<2, 0>, } diff --git a/src/operation/layer1.rs b/src/operation/layer1.rs new file mode 100644 index 00000000..051c6a4c --- /dev/null +++ b/src/operation/layer1.rs @@ -0,0 +1,42 @@ +// RGB Core Library: consensus layer for RGB smart contracts. +// +// SPDX-License-Identifier: Apache-2.0 +// +// Written in 2019-2024 by +// Dr Maxim Orlovsky +// +// Copyright (C) 2019-2024 LNP/BP Standards Association. All rights reserved. +// Copyright (C) 2019-2024 Dr Maxim Orlovsky. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use strict_encoding::{StrictDecode, StrictEncode, StrictType}; + +use crate::LIB_NAME_RGB_COMMIT; + +#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Display)] +#[display(lowercase)] +#[derive(StrictType, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_COMMIT, tags = repr, into_u8, try_from_u8)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", rename_all = "camelCase") +)] +#[repr(u8)] +#[derive(Default)] +pub enum Layer1 { + #[default] + Bitcoin = 0, + Liquid = 1, +} diff --git a/src/operation/mod.rs b/src/operation/mod.rs index 6ab64acc..33919647 100644 --- a/src/operation/mod.rs +++ b/src/operation/mod.rs @@ -30,7 +30,7 @@ pub mod seal; pub mod assignments; mod operations; mod bundle; -mod xchain; +mod layer1; mod commit; pub use assignments::{ @@ -46,17 +46,11 @@ pub use commit::{ pub use data::{ConcealedData, DataState, RevealedData, VoidState}; pub use fungible::{ConcealedValue, FungibleState, RevealedValue}; pub use global::{GlobalState, GlobalValues}; +pub use layer1::Layer1; pub use meta::{MetaValue, Metadata, MetadataError}; pub use operations::{ Extension, Genesis, Identity, Input, Inputs, Operation, Opout, OpoutParseError, Redeemed, Transition, Valencies, }; -pub use seal::{ - ExposedSeal, GenesisSeal, GraphSeal, OutputSeal, SecretSeal, TxoSeal, XGenesisSeal, XGraphSeal, - XOutputSeal, -}; +pub use seal::{ExposedSeal, GenesisSeal, GraphSeal, OutputSeal, SecretSeal, TxoSeal}; pub use state::{ConcealedState, ConfidentialState, ExposedState, RevealedState, StateType}; -pub use xchain::{ - Impossible, Layer1, XChain, XChainParseError, XOutpoint, XCHAIN_BITCOIN_PREFIX, - XCHAIN_LIQUID_PREFIX, -}; diff --git a/src/operation/operations.rs b/src/operation/operations.rs index db0676d4..c4f48393 100644 --- a/src/operation/operations.rs +++ b/src/operation/operations.rs @@ -41,7 +41,7 @@ use crate::{ Assign, AssignmentIndex, AssignmentType, Assignments, AssignmentsRef, ConcealedAttach, ConcealedData, ConcealedValue, ContractId, DiscloseHash, ExposedState, Ffv, GenesisSeal, GlobalState, GraphSeal, Layer1, Metadata, OpDisclose, OpId, SecretSeal, TypedAssigns, - VoidState, XChain, LIB_NAME_RGB_COMMIT, + VoidState, LIB_NAME_RGB_COMMIT, }; #[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display)] @@ -248,7 +248,7 @@ pub trait Operation { fn proc_seals( ty: AssignmentType, a: &[Assign], - seals: &mut BTreeMap>, + seals: &mut BTreeMap, state: &mut BTreeMap, ) { for (index, assignment) in a.iter().enumerate() { @@ -261,7 +261,7 @@ pub trait Operation { } } - let mut seals: BTreeMap> = bmap!(); + let mut seals: BTreeMap = bmap!(); let mut void: BTreeMap = bmap!(); let mut fungible: BTreeMap = bmap!(); let mut data: BTreeMap = bmap!(); diff --git a/src/operation/seal.rs b/src/operation/seal.rs index ffa8564e..7b39baba 100644 --- a/src/operation/seal.rs +++ b/src/operation/seal.rs @@ -24,24 +24,18 @@ use core::fmt::Debug; use std::hash::Hash; pub use bp::seals::txout::blind::{ChainBlindSeal, ParseError, SingleBlindSeal}; +use bp::seals::txout::ExplicitSeal; pub use bp::seals::txout::TxoSeal; -use bp::seals::txout::{BlindSeal, ExplicitSeal, SealTxid}; pub use bp::seals::SecretSeal; -use bp::{Outpoint, Txid, Vout}; +use bp::Txid; use commit_verify::Conceal; use strict_encoding::{StrictDecode, StrictDumb, StrictEncode}; -use crate::{XChain, XOutpoint}; - pub type GenesisSeal = SingleBlindSeal; pub type GraphSeal = ChainBlindSeal; pub type OutputSeal = ExplicitSeal; -pub type XGenesisSeal = XChain; -pub type XGraphSeal = XChain; -pub type XOutputSeal = XChain; - pub trait ExposedSeal: Debug + StrictDumb @@ -54,48 +48,21 @@ pub trait ExposedSeal: + TxoSeal + Conceal { -} - -impl ExposedSeal for GraphSeal {} - -impl ExposedSeal for GenesisSeal {} - -impl TxoSeal for XChain { - fn txid(&self) -> Option { - match self { - XChain::Bitcoin(seal) | XChain::Liquid(seal) => seal.txid(), - XChain::Other(_) => unreachable!(), - } - } - - fn vout(&self) -> Vout { - match self { - XChain::Bitcoin(seal) | XChain::Liquid(seal) => seal.vout(), - XChain::Other(_) => unreachable!(), - } + #[inline] + fn to_output_seal(self) -> Option { + let outpoint = self.outpoint()?; + Some(ExplicitSeal::new(outpoint)) } - fn outpoint(&self) -> Option { - match self { - XChain::Bitcoin(seal) | XChain::Liquid(seal) => seal.outpoint(), - XChain::Other(_) => unreachable!(), - } + fn to_output_seal_or_default(self, witness_id: Txid) -> OutputSeal { + self.to_output_seal() + .unwrap_or(ExplicitSeal::new(self.outpoint_or(witness_id))) } +} - fn txid_or(&self, default_txid: Txid) -> Txid { - match self { - XChain::Bitcoin(seal) | XChain::Liquid(seal) => seal.txid_or(default_txid), - XChain::Other(_) => unreachable!(), - } - } +impl ExposedSeal for GraphSeal {} - fn outpoint_or(&self, default_txid: Txid) -> Outpoint { - match self { - XChain::Bitcoin(seal) | XChain::Liquid(seal) => seal.outpoint_or(default_txid), - XChain::Other(_) => unreachable!(), - } - } -} +impl ExposedSeal for GenesisSeal {} /* #[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug)] @@ -109,46 +76,28 @@ impl TxoSeal for XChain { pub struct SealPreimage(Bytes32); */ -impl From> for XOutpoint { - #[inline] - fn from(seal: XChain) -> Self { seal.to_outpoint() } -} - -impl XChain { - pub fn transmutate(self) -> XChain { self.map_ref(|seal| seal.transmutate()) } - - /// Converts seal into a transaction outpoint. - #[inline] - pub fn to_outpoint(&self) -> XOutpoint { self.map_ref(GenesisSeal::to_outpoint).into() } -} - -impl XChain> { - /// Converts revealed seal into concealed. - #[inline] - pub fn to_secret_seal(&self) -> XChain { self.conceal() } -} - #[cfg(test)] mod test { use amplify::hex::FromHex; - use bp::seals::txout::TxPtr; + use bp::seals::txout::{BlindSeal, TxPtr}; + use bp::Vout; use super::*; #[test] fn secret_seal_is_sha256d() { - let reveal = XChain::Bitcoin(BlindSeal { + let reveal = BlindSeal { blinding: 54683213134637, txid: TxPtr::Txid( Txid::from_hex("646ca5c1062619e2a2d60771c9dfd820551fb773e4dc8c4ed67965a8d1fae839") .unwrap(), ), vout: Vout::from(2), - }); + }; let secret = reveal.to_secret_seal(); assert_eq!( secret.to_string(), - "bc:utxob:nBRVm39A-ioJydHE-ug2d90m-aZyfPI0-MCc0ZNM-oMXMs2O-opKQ7" + "utxob:nBRVm39A-ioJydHE-ug2d90m-aZyfPI0-MCc0ZNM-oMXMs2O-opKQ7" ); assert_eq!(reveal.to_secret_seal(), reveal.conceal()) } diff --git a/src/operation/xchain.rs b/src/operation/xchain.rs deleted file mode 100644 index f4397aa7..00000000 --- a/src/operation/xchain.rs +++ /dev/null @@ -1,536 +0,0 @@ -// RGB Core Library: consensus layer for RGB smart contracts. -// -// SPDX-License-Identifier: Apache-2.0 -// -// Written in 2019-2024 by -// Dr Maxim Orlovsky -// -// Copyright (C) 2019-2024 LNP/BP Standards Association. All rights reserved. -// Copyright (C) 2019-2024 Dr Maxim Orlovsky. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use std::cmp::Ordering; -use std::convert::Infallible; -use std::fmt::{Debug, Display, Formatter}; -use std::str::FromStr; -use std::{fmt, io}; - -use bp::{Bp, Outpoint}; -use commit_verify::Conceal; -use strict_encoding::{ - DecodeError, DefineUnion, ReadTuple, ReadUnion, StrictDecode, StrictDumb, StrictEncode, - StrictEnum, StrictSum, StrictType, StrictUnion, TypedRead, TypedWrite, VariantError, - WriteUnion, -}; - -use crate::{OutputSeal, XOutputSeal, LIB_NAME_RGB_COMMIT}; - -pub const XCHAIN_BITCOIN_PREFIX: &str = "bc"; -pub const XCHAIN_LIQUID_PREFIX: &str = "lq"; - -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Display)] -#[display(lowercase)] -#[derive(StrictType, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT, tags = repr, into_u8, try_from_u8)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", rename_all = "camelCase") -)] -#[repr(u8)] -#[derive(Default)] -pub enum Layer1 { - #[default] - Bitcoin = 0, - Liquid = 1, -} - -#[derive(Wrapper, WrapperMut, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, From)] -#[wrapper(Deref, FromStr, Display)] -#[wrapper_mut(DerefMut)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT)] -pub struct XOutpoint(XChain); - -impl From for XOutpoint { - #[inline] - fn from(seal: XOutputSeal) -> Self { seal.to_outpoint() } -} - -impl XOutputSeal { - /// Converts seal into a transaction outpoint. - #[inline] - pub fn to_outpoint(&self) -> XOutpoint { self.map_ref(OutputSeal::to_outpoint).into() } -} - -#[cfg(feature = "serde")] -mod _serde { - use serde_crate::de::Error; - use serde_crate::{Deserialize, Deserializer, Serialize, Serializer}; - - use super::*; - - impl Serialize for XOutpoint { - fn serialize(&self, serializer: S) -> Result - where S: Serializer { - if serializer.is_human_readable() { - serializer.serialize_str(&self.to_string()) - } else { - self.0.serialize(serializer) - } - } - } - - impl<'de> Deserialize<'de> for XOutpoint { - fn deserialize(deserializer: D) -> Result - where D: Deserializer<'de> { - if deserializer.is_human_readable() { - let s = String::deserialize(deserializer)?; - Self::from_str(&s).map_err(D::Error::custom) - } else { - XChain::::deserialize(deserializer).map(Self) - } - } - } -} - -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", rename_all = "camelCase", tag = "chain", content = "data") -)] -pub enum Impossible {} - -impl TryFrom for Impossible { - type Error = VariantError; - - fn try_from(_: u8) -> Result { panic!("must not be instantiated") } -} -impl From for u8 { - fn from(_: Impossible) -> Self { unreachable!() } -} - -impl StrictDumb for Impossible { - fn strict_dumb() -> Self { panic!("must not be instantiated") } -} -impl StrictType for Impossible { - const STRICT_LIB_NAME: &'static str = LIB_NAME_RGB_COMMIT; -} -impl StrictSum for Impossible { - const ALL_VARIANTS: &'static [(u8, &'static str)] = &[]; - fn variant_name(&self) -> &'static str { unreachable!() } -} -impl StrictEnum for Impossible {} -impl StrictEncode for Impossible { - fn strict_encode(&self, _writer: W) -> io::Result { unreachable!() } -} -impl StrictDecode for Impossible { - fn strict_decode(_reader: &mut impl TypedRead) -> Result { - panic!("must not be deserialized") - } -} - -impl Conceal for Impossible { - type Concealed = Self; - fn conceal(&self) -> Self::Concealed { unreachable!() } -} - -impl Display for Impossible { - fn fmt(&self, _: &mut Formatter<'_>) -> fmt::Result { unreachable!() } -} -impl FromStr for Impossible { - type Err = Infallible; - fn from_str(_: &str) -> Result { panic!("must not be parsed") } -} - -#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", rename_all = "camelCase", tag = "chain", content = "data") -)] -pub enum XChain { - Bitcoin(T), - - Liquid(T), - - Other(X), -} - -impl PartialOrd for XChain { - fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } -} - -impl Ord for XChain { - fn cmp(&self, other: &Self) -> Ordering { - match (self, other) { - (Self::Bitcoin(t1), Self::Bitcoin(t2)) => t1.cmp(t2), - (Self::Liquid(t1), Self::Liquid(t2)) => t1.cmp(t2), - (Self::Bitcoin(_), _) => Ordering::Greater, - (_, Self::Bitcoin(_)) => Ordering::Less, - (Self::Liquid(_), _) => Ordering::Greater, - (_, Self::Liquid(_)) => Ordering::Less, - (Self::Other(x1), Self::Other(x2)) => x1.cmp(x2), - } - } -} - -impl Conceal for XChain { - type Concealed = XChain; - - #[inline] - fn conceal(&self) -> Self::Concealed { self.map2_ref(|t| t.conceal(), |x| x.conceal()) } -} - -impl StrictType for XChain -where T: StrictDumb + StrictType -{ - const STRICT_LIB_NAME: &'static str = LIB_NAME_RGB_COMMIT; -} -impl StrictSum for XChain -where T: StrictDumb + StrictType -{ - const ALL_VARIANTS: &'static [(u8, &'static str)] = &[(0x00, "bitcoin"), (0x01, "liquid")]; - - fn variant_name(&self) -> &'static str { - match self { - XChain::Bitcoin(_) => Self::ALL_VARIANTS[0].1, - XChain::Liquid(_) => Self::ALL_VARIANTS[1].1, - XChain::Other(_) => unreachable!(), - } - } -} -impl StrictUnion for XChain where T: StrictDumb + StrictType {} -impl StrictDumb for XChain -where T: StrictDumb -{ - fn strict_dumb() -> Self { XChain::Bitcoin(strict_dumb!()) } -} -impl StrictEncode for XChain -where T: StrictDumb + StrictEncode -{ - fn strict_encode(&self, writer: W) -> io::Result { - writer.write_union::(|w| { - let w = w - .define_newtype::(vname!(Self::ALL_VARIANTS[0].1)) - .define_newtype::(vname!(Self::ALL_VARIANTS[1].1)) - .complete(); - Ok(match self { - XChain::Bitcoin(t) => w.write_newtype(vname!(Self::ALL_VARIANTS[0].1), t)?, - XChain::Liquid(t) => w.write_newtype(vname!(Self::ALL_VARIANTS[1].1), t)?, - XChain::Other(_) => unreachable!(), - } - .complete()) - }) - } -} -impl StrictDecode for XChain -where T: StrictDumb + StrictDecode -{ - fn strict_decode(reader: &mut impl TypedRead) -> Result { - reader.read_union(|field, r| match field.as_str() { - x if x == Self::ALL_VARIANTS[0].1 => { - r.read_tuple(|r| r.read_field().map(Self::Bitcoin)) - } - x if x == Self::ALL_VARIANTS[1].1 => r.read_tuple(|r| r.read_field().map(Self::Liquid)), - _ => unreachable!(), - }) - } -} - -impl XChain { - pub fn layer1(&self) -> Layer1 { - match self { - XChain::Bitcoin(_) => Layer1::Bitcoin, - XChain::Liquid(_) => Layer1::Liquid, - XChain::Other(_) => unreachable!(), - } - } - - pub fn as_bp(&self) -> Bp<&T> - where for<'a> &'a T: StrictDumb + StrictEncode + StrictDecode { - match self { - XChain::Bitcoin(t) => Bp::Bitcoin(t), - XChain::Liquid(t) => Bp::Liquid(t), - XChain::Other(_) => unreachable!(), - } - } - - pub fn into_bp(self) -> Bp - where T: StrictDumb + StrictEncode + StrictDecode { - match self { - XChain::Bitcoin(t) => Bp::Bitcoin(t), - XChain::Liquid(t) => Bp::Liquid(t), - XChain::Other(_) => unreachable!(), - } - } - - pub fn as_reduced_unsafe(&self) -> &T { - match self { - XChain::Bitcoin(t) | XChain::Liquid(t) => t, - XChain::Other(_) => unreachable!(), - } - } - - /// Maps the value from one internal type into another. - pub fn map(self, f: impl FnOnce(T) -> U) -> XChain { - match self { - Self::Bitcoin(t) => XChain::Bitcoin(f(t)), - Self::Liquid(t) => XChain::Liquid(f(t)), - Self::Other(_) => unreachable!(), - } - } - - /// Maps the value from a reference on internal type into another. - pub fn map_ref(&self, f: impl FnOnce(&T) -> U) -> XChain { - match self { - Self::Bitcoin(t) => XChain::Bitcoin(f(t)), - Self::Liquid(t) => XChain::Liquid(f(t)), - Self::Other(_) => unreachable!(), - } - } - - /// Maps the value from one internal type into another, covering cases which - /// may error. - pub fn try_map(self, f: impl FnOnce(T) -> Result) -> Result, E> { - match self { - Self::Bitcoin(t) => f(t).map(XChain::Bitcoin), - Self::Liquid(t) => f(t).map(XChain::Liquid), - Self::Other(_) => unreachable!(), - } - } - - /// Maps the value from one internal type into another, covering cases which - /// may error. - pub fn try_map_ref(&self, f: impl FnOnce(&T) -> Result) -> Result, E> { - match self { - Self::Bitcoin(t) => f(t).map(XChain::Bitcoin), - Self::Liquid(t) => f(t).map(XChain::Liquid), - Self::Other(_) => unreachable!(), - } - } - - /// Maps the value from one internal type into another, covering cases which - /// may result in an optional value. - pub fn maybe_map(self, f: impl FnOnce(T) -> Option) -> Option> { - match self { - Self::Bitcoin(t) => f(t).map(XChain::Bitcoin), - Self::Liquid(t) => f(t).map(XChain::Liquid), - Self::Other(_) => unreachable!(), - } - } - - /// Maps the value from one internal type into another, covering cases which - /// may result in an optional value. - pub fn maybe_map_ref(&self, f: impl FnOnce(&T) -> Option) -> Option> { - match self { - Self::Bitcoin(t) => f(t).map(XChain::Bitcoin), - Self::Liquid(t) => f(t).map(XChain::Liquid), - Self::Other(_) => unreachable!(), - } - } - - /// Returns iterator over elements - pub fn iter<'i>( - &'i self, - ) -> Box::Item>> + 'i> - where &'i T: IntoIterator { - match self { - XChain::Bitcoin(t) => Box::new(t.into_iter().map(XChain::Bitcoin)), - XChain::Liquid(t) => Box::new(t.into_iter().map(XChain::Liquid)), - Self::Other(_) => unreachable!(), - } - } -} - -impl XChain { - pub fn with(layer1: Layer1, data: impl Into) -> Self { - match layer1 { - Layer1::Bitcoin => XChain::Bitcoin(data.into()), - Layer1::Liquid => XChain::Liquid(data.into()), - } - } - - pub fn is_bitcoin(&self) -> bool { matches!(self, XChain::Bitcoin(_)) } - pub fn is_liquid(&self) -> bool { matches!(self, XChain::Liquid(_)) } - pub fn is_bp(&self) -> bool { - match self { - XChain::Bitcoin(_) | XChain::Liquid(_) => true, - XChain::Other(_) => false, - } - } - - /// Maps the value from one internal type into another. - pub fn map2(self, f1: impl FnOnce(T) -> U, f2: impl FnOnce(X) -> Y) -> XChain { - match self { - Self::Bitcoin(t) => XChain::Bitcoin(f1(t)), - Self::Liquid(t) => XChain::Liquid(f1(t)), - Self::Other(x) => XChain::Other(f2(x)), - } - } - - /// Maps the value from a reference on internal type into another. - pub fn map2_ref( - &self, - f1: impl FnOnce(&T) -> U, - f2: impl FnOnce(&X) -> Y, - ) -> XChain { - match self { - Self::Bitcoin(t) => XChain::Bitcoin(f1(t)), - Self::Liquid(t) => XChain::Liquid(f1(t)), - Self::Other(x) => XChain::Other(f2(x)), - } - } - - /// Maps the value from one internal type into another, covering cases which - /// may error. - pub fn try_map2( - self, - f1: impl FnOnce(T) -> Result, - f2: impl FnOnce(X) -> Result, - ) -> Result, E> { - match self { - Self::Bitcoin(t) => f1(t).map(XChain::Bitcoin), - Self::Liquid(t) => f1(t).map(XChain::Liquid), - Self::Other(x) => f2(x).map(XChain::Other), - } - } - - /// Maps the value from one internal type into another, covering cases which - /// may error. - pub fn try_map2_ref( - &self, - f1: impl FnOnce(&T) -> Result, - f2: impl FnOnce(&X) -> Result, - ) -> Result, E> { - match self { - Self::Bitcoin(t) => f1(t).map(XChain::Bitcoin), - Self::Liquid(t) => f1(t).map(XChain::Liquid), - Self::Other(x) => f2(x).map(XChain::Other), - } - } - - /// Maps the value from one internal type into another, covering cases which - /// may result in an optional value. - pub fn maybe_map2( - self, - f1: impl FnOnce(T) -> Option, - f2: impl FnOnce(X) -> Option, - ) -> Option> { - match self { - Self::Bitcoin(t) => f1(t).map(XChain::Bitcoin), - Self::Liquid(t) => f1(t).map(XChain::Liquid), - Self::Other(x) => f2(x).map(XChain::Other), - } - } - - /// Maps the value from one internal type into another, covering cases which - /// may result in an optional value. - pub fn maybe_map2_ref( - &self, - f1: impl FnOnce(&T) -> Option, - f2: impl FnOnce(&X) -> Option, - ) -> Option> { - match self { - Self::Bitcoin(t) => f1(t).map(XChain::Bitcoin), - Self::Liquid(t) => f1(t).map(XChain::Liquid), - Self::Other(x) => f2(x).map(XChain::Other), - } - } -} - -impl<'a, T: Copy, X: Copy> XChain<&'a T, &'a X> { - pub fn copied(self) -> XChain { self.map2(|t| *t, |x| *x) } -} - -impl<'a, T: Clone, X: Clone> XChain<&'a T, &'a X> { - pub fn cloned(self) -> XChain { self.map2(T::clone, X::clone) } -} - -impl XChain, Impossible> { - pub fn transpose(self) -> Option> { - match self { - XChain::Bitcoin(inner) => inner.map(XChain::Bitcoin), - XChain::Liquid(inner) => inner.map(XChain::Liquid), - XChain::Other(_) => unreachable!(), - } - } -} - -impl Iterator for XChain { - type Item = XChain<::Item>; - - fn next(&mut self) -> Option { - match self { - XChain::Bitcoin(t) => t.next().map(XChain::Bitcoin), - XChain::Liquid(t) => t.next().map(XChain::Liquid), - XChain::Other(_) => unreachable!(), - } - } -} - -#[derive(Clone, Debug, Display, Error, From)] -pub enum XChainParseError { - #[display("unknown chain prefix '{0}'; only 'bc:' and 'lq:' are currently supported")] - UnknownPrefix(String), - - #[from] - #[display(inner)] - Inner(E), -} - -impl FromStr for XChain -where - T: StrictDumb + StrictEncode + StrictDecode, - T::Err: Debug + Display, - X: StrictDumb + StrictEncode + StrictDecode, - X::Err: Debug + Display, -{ - type Err = XChainParseError; - - fn from_str(s: &str) -> Result { - if let Some((prefix, s)) = s.split_once(':') { - match prefix { - XCHAIN_BITCOIN_PREFIX => s - .parse() - .map(XChain::Bitcoin) - .map_err(XChainParseError::from), - XCHAIN_LIQUID_PREFIX => s - .parse() - .map(XChain::Liquid) - .map_err(XChainParseError::from), - unknown => Err(XChainParseError::UnknownPrefix(unknown.to_owned())), - } - } else { - s.parse() - .map(XChain::Bitcoin) - .map_err(XChainParseError::from) - } - } -} - -impl Display for XChain -where - T: StrictDumb + StrictEncode + StrictDecode, - X: StrictDumb + StrictEncode + StrictDecode, -{ - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - match self { - XChain::Bitcoin(t) => write!(f, "{XCHAIN_BITCOIN_PREFIX}:{t}"), - XChain::Liquid(t) => write!(f, "{XCHAIN_LIQUID_PREFIX}:{t}"), - XChain::Other(x) => Display::fmt(x, f), - } - } -} diff --git a/src/stl.rs b/src/stl.rs index 8b2ae1d4..207234d4 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -23,13 +23,14 @@ pub use aluvm::stl::aluvm_stl; pub use bp::bc::stl::bp_tx_stl; pub use bp::stl::bp_core_stl; +use bp::Txid; use commit_verify::stl::commit_verify_stl; use strict_types::stl::{std_stl, strict_types_stl}; use strict_types::typelib::LibBuilder; use strict_types::{CompileError, TypeLib}; use crate::validation::DbcProof; -use crate::vm::{GlobalOrd, XWitnessId}; +use crate::vm::GlobalOrd; use crate::{ Extension, Genesis, OpCommitment, Schema, TransitionBundle, LIB_NAME_RGB_COMMIT, LIB_NAME_RGB_LOGIC, @@ -37,10 +38,10 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_COMMIT: &str = - "stl:mh8Ebzz!-9Trq2j8-Q2kUCyh-L4P1E80-HNp6Uct-LDLlJNo#victor-guru-philips"; + "stl:nX8j7yoL-WB1gVNN-JHgJDvZ-UL8177c-Hexose2-JYJs1Bs#level-exodus-final"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:ZVsDEEZJ-cDK203!-ys2wf2h-QMU18pN-fEl49v9-qOTytWA#armor-roman-zigzag"; + "stl:E2vH0scY-5u2NHhW-M5$ZWEP-33VJvaA-yeF1fVR-37IJ1ak#nitro-sandra-salami"; fn _rgb_commit_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_COMMIT), tiny_bset! { @@ -53,7 +54,7 @@ fn _rgb_commit_stl() -> Result { }) .transpile::() .transpile::() - .transpile::() + .transpile::() .transpile::() .transpile::() .transpile::() diff --git a/src/validation/consignment.rs b/src/validation/consignment.rs index 3db37d6e..e69fc29d 100644 --- a/src/validation/consignment.rs +++ b/src/validation/consignment.rs @@ -26,10 +26,10 @@ use aluvm::library::{Lib, LibId}; use amplify::confinement::ConfinedOrdMap; +use bp::Txid; use strict_types::TypeSystem; use super::EAnchor; -use crate::vm::XWitnessId; use crate::{ AssignmentType, AssignmentsRef, BundleId, ContractId, Extension, ExtensionType, Genesis, GlobalState, GraphSeal, Inputs, Metadata, OpFullType, OpId, OpType, Operation, Schema, @@ -183,11 +183,9 @@ impl ConsignmentApi for CheckedConsignment<'_, C> { .filter(|b| b.bundle_id() == bundle_id) } - fn anchor(&self, bundle_id: BundleId) -> Option<(XWitnessId, &EAnchor)> { - self.0.anchor(bundle_id) - } + fn anchor(&self, bundle_id: BundleId) -> Option<(Txid, &EAnchor)> { self.0.anchor(bundle_id) } - fn op_witness_id(&self, opid: OpId) -> Option { self.0.op_witness_id(opid) } + fn op_witness_id(&self, opid: OpId) -> Option { self.0.op_witness_id(opid) } } /// Trait defining common data access API for all storage-related RGB structures @@ -222,8 +220,8 @@ pub trait ConsignmentApi { fn bundle(&self, bundle_id: BundleId) -> Option<&TransitionBundle>; /// Returns a grip given a bundle id. - fn anchor(&self, bundle_id: BundleId) -> Option<(XWitnessId, &EAnchor)>; + fn anchor(&self, bundle_id: BundleId) -> Option<(Txid, &EAnchor)>; /// Returns witness id for a given operation. - fn op_witness_id(&self, opid: OpId) -> Option; + fn op_witness_id(&self, opid: OpId) -> Option; } diff --git a/src/validation/status.rs b/src/validation/status.rs index 02d44d02..e050dd4c 100644 --- a/src/validation/status.rs +++ b/src/validation/status.rs @@ -25,16 +25,13 @@ use std::fmt::{self, Display, Formatter}; use amplify::num::u24; use bp::seals::txout::CloseMethod; +use bp::Txid; use commit_verify::mpc::InvalidProof; use strict_types::SemId; use crate::schema::{self, SchemaId}; use crate::validation::WitnessResolverError; -use crate::vm::XWitnessId; -use crate::{ - BundleId, ContractId, Layer1, OccurrencesMismatch, OpFullType, OpId, Opout, StateType, Vin, - XGraphSeal, -}; +use crate::{BundleId, ContractId, OccurrencesMismatch, OpFullType, OpId, Opout, StateType, Vin}; #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Display)] #[repr(u8)] @@ -249,7 +246,7 @@ pub enum Failure { /// bundle {0} public witness {1} is not known to the resolver; validation /// stopped since operations can't be consensus-ordered. The resolver /// responded with error {2} - WitnessUnresolved(BundleId, XWitnessId, WitnessResolverError), + WitnessUnresolved(BundleId, Txid, WitnessResolverError), /// operation {0} is under a different contract {1}. ContractMismatch(OpId, ContractId), /// opout {0} appears more than once as input @@ -261,10 +258,10 @@ pub enum Failure { BundleExtraTransition(BundleId, OpId), /// transition bundle {0} references non-existing input in witness {2} for /// the state transition {1}. - BundleInvalidInput(BundleId, OpId, XWitnessId), + BundleInvalidInput(BundleId, OpId, Txid), /// transition bundle {0} doesn't commit to the input {1} in the witness {2} /// which is an input of the state transition {3}. - BundleInvalidCommitment(BundleId, Vin, XWitnessId, OpId), + BundleInvalidCommitment(BundleId, Vin, Txid, OpId), // Errors checking seal closing /// transition {opid} references state type {state_type} absent in the @@ -281,14 +278,10 @@ pub enum Failure { ConfidentialSeal(Opout), /// bundle {0} public witness {1} is not known to the resolver. Resolver /// reported error {2} - SealNoPubWitness(BundleId, XWitnessId, WitnessResolverError), - /// witness layer 1 {anchor} doesn't match seal definition {seal}. - SealWitnessLayer1Mismatch { seal: Layer1, anchor: Layer1 }, - /// seal {0} is defined on {1} which is not the layer 1 defined by the contract genesis ({2}). - SealLayerMismatch(XGraphSeal, Layer1, Layer1), + SealNoPubWitness(BundleId, Txid, WitnessResolverError), /// transition bundle {0} doesn't close seal with the witness {1}. Details: /// {2} - SealsInvalid(BundleId, XWitnessId, String), + SealsInvalid(BundleId, Txid, String), /// single-use seals for the operation {0} were not validated, which /// probably indicates unanchored state transition. SealsUnvalidated(OpId), @@ -297,7 +290,7 @@ pub enum Failure { AnchorMethodMismatch(BundleId), /// transition bundle {0} is not properly anchored to the witness {1}. /// Details: {2} - MpcInvalid(BundleId, XWitnessId, InvalidProof), + MpcInvalid(BundleId, Txid, InvalidProof), /// anchor close method {0} is different from the one of the contract {1} AnchorInvalidMethod(CloseMethod, CloseMethod), diff --git a/src/validation/validator.rs b/src/validation/validator.rs index fe6a4f8a..2b1d6eac 100644 --- a/src/validation/validator.rs +++ b/src/validation/validator.rs @@ -26,18 +26,17 @@ use std::rc::Rc; use bp::dbc::{Anchor, Proof}; use bp::seals::txout::{CloseMethod, Witness}; -use bp::{dbc, Outpoint}; +use bp::{dbc, Outpoint, Tx, Txid}; use commit_verify::mpc; use single_use_seals::SealWitness; use super::status::Failure; use super::{CheckedConsignment, ConsignmentApi, DbcProof, EAnchor, OpRef, Status, Validity}; -use crate::vm::{ - ContractStateAccess, ContractStateEvolve, OrdOpRef, WitnessOrd, XWitnessId, XWitnessTx, -}; +use crate::operation::seal::ExposedSeal; +use crate::vm::{ContractStateAccess, ContractStateEvolve, OrdOpRef, WitnessOrd}; use crate::{ - validation, BundleId, ContractId, Layer1, OpId, OpType, Operation, Opout, Schema, SchemaId, - TransitionBundle, XChain, XOutpoint, XOutputSeal, + validation, BundleId, ContractId, OpId, OpType, Operation, Opout, OutputSeal, Schema, SchemaId, + TransitionBundle, }; #[derive(Clone, PartialEq, Eq, Debug, Display, Error, From)] @@ -49,40 +48,29 @@ use crate::{ )] pub enum WitnessResolverError { /// actual witness id {actual} doesn't match expected id {expected}. - IdMismatch { - actual: XWitnessId, - expected: XWitnessId, - }, + IdMismatch { actual: Txid, expected: Txid }, /// witness {0} does not exist. - Unknown(XWitnessId), + Unknown(Txid), /// unable to retrieve witness {0}, {1} - Other(XWitnessId, String), + Other(Txid, String), } pub trait ResolveWitness { // TODO: Return with SPV proof data - fn resolve_pub_witness( - &self, - witness_id: XWitnessId, - ) -> Result; + fn resolve_pub_witness(&self, witness_id: Txid) -> Result; - fn resolve_pub_witness_ord( - &self, - witness_id: XWitnessId, - ) -> Result; + fn resolve_pub_witness_ord(&self, witness_id: Txid) + -> Result; } impl ResolveWitness for &T { - fn resolve_pub_witness( - &self, - witness_id: XWitnessId, - ) -> Result { + fn resolve_pub_witness(&self, witness_id: Txid) -> Result { ResolveWitness::resolve_pub_witness(*self, witness_id) } fn resolve_pub_witness_ord( &self, - witness_id: XWitnessId, + witness_id: Txid, ) -> Result { ResolveWitness::resolve_pub_witness_ord(*self, witness_id) } @@ -97,12 +85,9 @@ impl From for CheckedWitnessResolver { } impl ResolveWitness for CheckedWitnessResolver { - fn resolve_pub_witness( - &self, - witness_id: XWitnessId, - ) -> Result { + fn resolve_pub_witness(&self, witness_id: Txid) -> Result { let witness = self.inner.resolve_pub_witness(witness_id)?; - let actual_id = witness.witness_id(); + let actual_id = witness.txid(); if actual_id != witness_id { return Err(WitnessResolverError::IdMismatch { actual: actual_id, @@ -115,7 +100,7 @@ impl ResolveWitness for CheckedWitnessResolver { #[inline] fn resolve_pub_witness_ord( &self, - witness_id: XWitnessId, + witness_id: Txid, ) -> Result { self.inner.resolve_pub_witness_ord(witness_id) } @@ -134,7 +119,6 @@ pub struct Validator< schema_id: SchemaId, contract_id: ContractId, - layer1: Layer1, close_method: CloseMethod, contract_state: Rc>, @@ -162,7 +146,6 @@ impl< let genesis = consignment.genesis(); let contract_id = genesis.contract_id(); let schema_id = genesis.schema_id; - let layer1 = genesis.layer1; let close_method = genesis.close_method; // Prevent repeated validation of single-use seals @@ -174,7 +157,6 @@ impl< status: RefCell::new(status), schema_id, contract_id, - layer1, close_method, validated_op_seals, input_assignments: input_transitions, @@ -396,8 +378,8 @@ impl< continue; }; - // [VALIDATION]: We validate that the seals were properly defined on BP-type layers - let (seals, input_map) = self.validate_seal_definitions(witness_id.layer1(), bundle); + // [VALIDATION]: We validate that the seals were properly defined on BP-type layer + let (seals, input_map) = self.validate_seal_definitions(bundle); if self.close_method != anchor.dbc_proof.method() { self.status @@ -424,7 +406,7 @@ impl< continue; } - // [VALIDATION]: We validate that the seals were properly closed on BP-type layers + // [VALIDATION]: We validate that the seals were properly closed on BP-type layer let Some(witness_tx) = self.validate_seal_commitments(&seals, bundle_id, witness_id, anchor) else { @@ -444,10 +426,10 @@ impl< &self, bundle_id: BundleId, bundle: &TransitionBundle, - pub_witness: XWitnessTx, - input_map: BTreeMap>, + pub_witness: Tx, + input_map: BTreeMap>, ) { - let witness_id = pub_witness.witness_id(); + let witness_id = pub_witness.txid(); for (vin, opid) in &bundle.input_map { let Some(outpoints) = input_map.get(opid) else { self.status @@ -455,15 +437,13 @@ impl< .add_failure(Failure::BundleExtraTransition(bundle_id, *opid)); continue; }; - let layer1 = pub_witness.layer1(); - let pub_witness = pub_witness.as_reduced_unsafe(); let Some(input) = pub_witness.inputs.get(vin.to_usize()) else { self.status .borrow_mut() .add_failure(Failure::BundleInvalidInput(bundle_id, *opid, witness_id)); continue; }; - if !outpoints.contains(&XChain::with(layer1, input.prev_output)) { + if !outpoints.contains(&input.prev_output) { self.status .borrow_mut() .add_failure(Failure::BundleInvalidCommitment( @@ -477,11 +457,11 @@ impl< /// bitcoin commitments with opret and tapret schema. fn validate_seal_commitments( &self, - seals: impl AsRef<[XOutputSeal]>, + seals: impl AsRef<[OutputSeal]>, bundle_id: BundleId, - witness_id: XWitnessId, + witness_id: Txid, anchor: &EAnchor, - ) -> Option { + ) -> Option { // Check that the anchor is committed into a transaction spending all the // transition inputs. // Here the method can do SPV proof instead of querying the indexer. The SPV @@ -510,7 +490,7 @@ impl< dbc_proof: DbcProof::Tapret(tapret), .. } => { - let witness = pub_witness.clone().map(|tx| Witness::with(tx, tapret)); + let witness = Witness::with(pub_witness.clone(), tapret); self.validate_seal_closing(seals, bundle_id, witness, mpc_proof) } EAnchor { @@ -518,7 +498,7 @@ impl< dbc_proof: DbcProof::Opret(opret), .. } => { - let witness = pub_witness.clone().map(|tx| Witness::with(tx, opret)); + let witness = Witness::with(pub_witness.clone(), opret); self.validate_seal_closing(seals, bundle_id, witness, mpc_proof) } } @@ -530,14 +510,12 @@ impl< /// Single-use-seal definition validation. /// - /// Takes state transition, extracts all seals from its inputs and makes - /// sure they are defined or a correct layer1. + /// Takes state transition, extracts all seals from its inputs and validates them. fn validate_seal_definitions( &self, - layer1: Layer1, bundle: &TransitionBundle, - ) -> (Vec, BTreeMap>) { - let mut input_map: BTreeMap> = bmap!(); + ) -> (Vec, BTreeMap>) { + let mut input_map: BTreeMap> = bmap!(); let mut seals = vec![]; for (opid, transition) in &bundle.known_transitions { let opid = *opid; @@ -591,22 +569,6 @@ impl< continue; }; - if seal.layer1() != layer1 { - self.status - .borrow_mut() - .add_failure(Failure::SealWitnessLayer1Mismatch { - seal: seal.layer1(), - anchor: layer1, - }); - continue; - } - if self.layer1 != seal.layer1() { - self.status - .borrow_mut() - .add_failure(Failure::SealLayerMismatch(seal, seal.layer1(), self.layer1)); - continue; - } - let seal = if prev_op.op_type() == OpType::StateTransition { let Some(witness_id) = self.consignment.op_witness_id(op) else { self.status @@ -614,19 +576,7 @@ impl< .add_failure(Failure::OperationAbsent(op)); continue; }; - - match seal.try_to_output_seal(witness_id) { - Ok(seal) => seal, - Err(_) => { - self.status.borrow_mut().add_failure( - Failure::SealWitnessLayer1Mismatch { - seal: seal.layer1(), - anchor: witness_id.layer1(), - }, - ); - continue; - } - } + seal.to_output_seal_or_default(witness_id) } else { seal.to_output_seal() .expect("genesis and state extensions must have explicit seals") @@ -636,7 +586,7 @@ impl< input_map .entry(opid) .or_default() - .insert(seal.map(|seal| Outpoint::new(seal.txid, seal.vout)).into()); + .insert(Outpoint::new(seal.txid, seal.vout)); } } (seals, input_map) @@ -656,14 +606,14 @@ impl< &self, seals: impl IntoIterator, bundle_id: BundleId, - witness: XChain>, + witness: Witness, mpc_proof: mpc::MerkleProof, ) where - XChain>: SealWitness, + Witness: SealWitness, { let message = mpc::Message::from(bundle_id); - let witness_id = witness.witness_id(); - let anchor = Anchor::new(mpc_proof, witness.as_reduced_unsafe().proof.clone()); + let witness_id = witness.txid; + let anchor = Anchor::new(mpc_proof, witness.proof.clone()); // [VALIDATION]: Checking anchor MPC commitment match anchor.convolve(self.contract_id, message) { Err(err) => { diff --git a/src/vm/contract.rs b/src/vm/contract.rs index 165bf939..29ee66dd 100644 --- a/src/vm/contract.rs +++ b/src/vm/contract.rs @@ -29,104 +29,17 @@ use std::rc::Rc; use amplify::confinement; use amplify::num::u24; -use bp::seals::txout::{ExplicitSeal, VerifyError, Witness}; -use bp::{dbc, Tx, Txid}; +use bp::{Outpoint, Txid}; use chrono::{MappedLocalTime, TimeZone, Utc}; -use commit_verify::mpc; -use single_use_seals::SealWitness; use strict_encoding::{StrictDecode, StrictDumb, StrictEncode}; use crate::{ AssignmentType, Assignments, AssignmentsRef, AttachState, BundleId, ContractId, DataState, - ExposedSeal, Extension, ExtensionType, FungibleState, Genesis, GlobalState, GlobalStateType, - GraphSeal, Impossible, Inputs, Layer1, Metadata, OpFullType, OpId, OpType, Operation, - Transition, TransitionType, TxoSeal, TypedAssigns, Valencies, XChain, XOutpoint, XOutputSeal, - LIB_NAME_RGB_LOGIC, + Extension, ExtensionType, FungibleState, Genesis, GlobalState, GlobalStateType, GraphSeal, + Inputs, Layer1, Metadata, OpFullType, OpId, OpType, Operation, Transition, TransitionType, + TypedAssigns, Valencies, LIB_NAME_RGB_LOGIC, }; -pub type XWitnessId = XChain; - -pub type XWitnessTx = XChain; - -impl XWitnessTx { - pub fn witness_id(&self) -> XWitnessId { - match self { - Self::Bitcoin(tx) => XWitnessId::Bitcoin(tx.txid()), - Self::Liquid(tx) => XWitnessId::Liquid(tx.txid()), - Self::Other(_) => unreachable!(), - } - } -} - -impl XChain> { - pub fn witness_id(&self) -> XWitnessId { - match self { - Self::Bitcoin(w) => XWitnessId::Bitcoin(w.txid), - Self::Liquid(w) => XWitnessId::Liquid(w.txid), - Self::Other(_) => unreachable!(), - } - } -} - -impl SealWitness for XChain> { - type Message = mpc::Commitment; - type Error = VerifyError; - - fn verify_seal(&self, seal: &Seal, msg: &Self::Message) -> Result<(), Self::Error> { - match self { - Self::Bitcoin(witness) | Self::Liquid(witness) => witness.verify_seal(seal, msg), - Self::Other(_) => unreachable!(), - } - } - - fn verify_many_seals<'seal>( - &self, - seals: impl IntoIterator, - msg: &Self::Message, - ) -> Result<(), Self::Error> - where - Seal: 'seal, - { - match self { - Self::Bitcoin(witness) | Self::Liquid(witness) => witness.verify_many_seals(seals, msg), - Self::Other(_) => unreachable!(), - } - } -} - -impl XChain { - #[inline] - pub fn to_output_seal(self) -> Option - where U: TxoSeal { - Some(match self { - XChain::Bitcoin(seal) => { - let outpoint = seal.outpoint()?; - XChain::Bitcoin(ExplicitSeal::new(outpoint)) - } - XChain::Liquid(seal) => { - let outpoint = seal.outpoint()?; - XChain::Liquid(ExplicitSeal::new(outpoint)) - } - XChain::Other(_) => unreachable!(), - }) - } - - pub fn try_to_output_seal(self, witness_id: XWitnessId) -> Result - where U: TxoSeal { - self.to_output_seal() - .or(match (self, witness_id) { - (XChain::Bitcoin(seal), XWitnessId::Bitcoin(txid)) => { - Some(XChain::Bitcoin(ExplicitSeal::new(seal.outpoint_or(txid)))) - } - (XChain::Liquid(seal), XWitnessId::Liquid(txid)) => { - Some(XChain::Liquid(ExplicitSeal::new(seal.outpoint_or(txid)))) - } - _ => None, - }) - .ok_or(self) - } -} - /// The type is used during validation and computing a contract state. It /// combines both the operation with the information required for its ordering /// in the contract history (via construction of [`OpOrd`]) according to the @@ -135,8 +48,8 @@ impl XChain { pub enum OrdOpRef<'op> { #[from] Genesis(&'op Genesis), - Transition(&'op Transition, XWitnessId, WitnessOrd, BundleId), - Extension(&'op Extension, XWitnessId, WitnessOrd), + Transition(&'op Transition, Txid, WitnessOrd, BundleId), + Extension(&'op Extension, Txid, WitnessOrd), } impl PartialOrd for OrdOpRef<'_> { @@ -148,7 +61,7 @@ impl Ord for OrdOpRef<'_> { } impl OrdOpRef<'_> { - pub fn witness_id(&self) -> Option { + pub fn witness_id(&self) -> Option { match self { OrdOpRef::Genesis(_) => None, OrdOpRef::Transition(_, witness_id, ..) | OrdOpRef::Extension(_, witness_id, ..) => { @@ -674,23 +587,23 @@ pub trait ContractStateAccess: Debug { ty: GlobalStateType, ) -> Result, UnknownGlobalStateType>; - fn rights(&self, outpoint: XOutpoint, ty: AssignmentType) -> u32; + fn rights(&self, outpoint: Outpoint, ty: AssignmentType) -> u32; fn fungible( &self, - outpoint: XOutpoint, + outpoint: Outpoint, ty: AssignmentType, ) -> impl DoubleEndedIterator; fn data( &self, - outpoint: XOutpoint, + outpoint: Outpoint, ty: AssignmentType, ) -> impl DoubleEndedIterator>; fn attach( &self, - outpoint: XOutpoint, + outpoint: Outpoint, ty: AssignmentType, ) -> impl DoubleEndedIterator>; } diff --git a/src/vm/mod.rs b/src/vm/mod.rs index 89ccf6ad..5cda4e8d 100644 --- a/src/vm/mod.rs +++ b/src/vm/mod.rs @@ -35,7 +35,7 @@ mod contract; pub use aluvm::aluasm_isa; pub use contract::{ ContractStateAccess, ContractStateEvolve, GlobalContractState, GlobalOrd, GlobalStateIter, - OpOrd, OrdOpRef, UnknownGlobalStateType, WitnessOrd, WitnessPos, XWitnessId, XWitnessTx, + OpOrd, OrdOpRef, UnknownGlobalStateType, WitnessOrd, WitnessPos, }; pub(crate) use contract::{OpInfo, VmContext}; pub use isa::RgbIsa; diff --git a/stl/AnchoredBundle.vesper b/stl/AnchoredBundle.vesper index 1559f38c..cee409b5 100644 --- a/stl/AnchoredBundle.vesper +++ b/stl/AnchoredBundle.vesper @@ -50,101 +50,65 @@ TransitionBundle rec declarative list len=0..MAX16 wrapped tag=0 AssignVoidStateBlindSealTxPtr union confidential rec tag=0 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 + seal bytes len=32 aka=SecretSeal state is Unit aka=VoidState lock bytes len=2 aka=ReservedBytes2 confidentialState rec tag=1 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 + seal rec BlindSealTxPtr + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 state is Unit aka=VoidState lock bytes len=2 aka=ReservedBytes2 confidentialSeal rec tag=2 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 + seal bytes len=32 aka=SecretSeal state is Unit aka=VoidState lock bytes len=2 aka=ReservedBytes2 revealed rec tag=3 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 + seal rec BlindSealTxPtr + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 state is Unit aka=VoidState lock bytes len=2 aka=ReservedBytes2 fungible list len=0..MAX16 wrapped tag=1 AssignRevealedValueBlindSealTxPtr union confidential rec tag=0 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 + seal bytes len=32 aka=SecretSeal state rec ConcealedFungible value union FungibleState bits64 is U64 wrapped tag=0 concealedDummy is Unit lock bytes len=2 aka=ReservedBytes2 confidentialState rec tag=1 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 + seal rec BlindSealTxPtr + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 state rec ConcealedFungible value union FungibleState bits64 is U64 wrapped tag=0 concealedDummy is Unit lock bytes len=2 aka=ReservedBytes2 confidentialSeal rec tag=2 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 + seal bytes len=32 aka=SecretSeal state rec RevealedFungible value union FungibleState bits64 is U64 wrapped tag=0 lock bytes len=2 aka=ReservedBytes2 revealed rec tag=3 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 + seal rec BlindSealTxPtr + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 state rec RevealedFungible value union FungibleState bits64 is U64 wrapped tag=0 @@ -152,49 +116,31 @@ TransitionBundle rec structured list len=0..MAX16 wrapped tag=2 AssignRevealedDataBlindSealTxPtr union confidential rec tag=0 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 + seal bytes len=32 aka=SecretSeal state bytes len=32 aka=ConcealedData lock bytes len=2 aka=ReservedBytes2 confidentialState rec tag=1 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 + seal rec BlindSealTxPtr + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 state bytes len=32 aka=ConcealedData lock bytes len=2 aka=ReservedBytes2 confidentialSeal rec tag=2 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 + seal bytes len=32 aka=SecretSeal state rec RevealedData value bytes len=0..MAX16 aka=DataState salt is U128 lock bytes len=2 aka=ReservedBytes2 revealed rec tag=3 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 + seal rec BlindSealTxPtr + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 state rec RevealedData value bytes len=0..MAX16 aka=DataState salt is U128 @@ -202,31 +148,20 @@ TransitionBundle rec attachment list len=0..MAX16 wrapped tag=3 AssignRevealedAttachBlindSealTxPtr union confidential rec tag=0 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 + seal bytes len=32 aka=SecretSeal state bytes len=32 aka=ConcealedAttach lock bytes len=2 aka=ReservedBytes2 confidentialState rec tag=1 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 + seal rec BlindSealTxPtr + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 state bytes len=32 aka=ConcealedAttach lock bytes len=2 aka=ReservedBytes2 confidentialSeal rec tag=2 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 + seal bytes len=32 aka=SecretSeal state rec RevealedAttach file rec AttachState id bytes len=32 aka=AttachId @@ -234,19 +169,12 @@ TransitionBundle rec salt is U64 lock bytes len=2 aka=ReservedBytes2 revealed rec tag=3 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 + seal rec BlindSealTxPtr + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 state rec RevealedAttach file rec AttachState id bytes len=32 aka=AttachId diff --git a/stl/RGBCommit@0.1.0.sta b/stl/RGBCommit@0.1.0.sta index 58cf44fd..87fa1674 100644 --- a/stl/RGBCommit@0.1.0.sta +++ b/stl/RGBCommit@0.1.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:mh8Ebzz!-9Trq2j8-Q2kUCyh-L4P1E80-HNp6Uct-LDLlJNo#victor-guru-philips +Id: stl:nX8j7yoL-WB1gVNN-JHgJDvZ-UL8177c-Hexose2-JYJs1Bs#level-exodus-final Name: RGBCommit Dependencies: BPCore#symbol-tropic-grand, @@ -8,7 +8,7 @@ Dependencies: CommitVerify#miller-pancake-elastic, Std#ralph-blue-lucky, Bitcoin#signal-color-cipher -Check-SHA256: ff8e7d8563394d581dba462eb3ccbac6c5cc1338cf3c04a9d7b97f562197189d +Check-SHA256: ad6ac8582ba234345b04eb22746b2d2fe75a729e78ad75b4482570178efe665f 2~tNwLvL+uX>mb;*F>vukd; =m`ygb@x#_>`RmOO$0)3Z)}yry~#}iVEJ)s5j^%uEnQ9{n2s|9Fa^ps+HG#`XS5DMY;b5{PIYZeZ)9O} Xt{%a=RmHK6WZ%EWRm@*ULd%lgGoFTxUTU 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 +25;!;B10COK +earHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%B2y$h1 +WnpY(WB>*O1aoC!Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEU;2^0@;NPlb{-n1xko1uZcK +L=FhMw)iW@^B~GyS4IVMbYXO50sm-Yz<5%CY59k^g5#W{6D&GDo53%OaP0&iRq10COK earHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%dL349y -XKqquc4c8~Wn@HQbYVhlX>MdwWnpYocxhw=1ON -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 -VQc}buAyhdo%dUA4%7&o +7^|1Fn59cLW!>7R25;!;BwOY}Ov_b`4?P%YY`+Wb+o` +y98`+V`~C>10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-F +Xm+)yumJ%95o2#|W@%()Zggp3Y*Tb$bY%br0|awrVQc~+aI2y9pehZ%M2QE^S2-B&?H_1O1&4u6*^T^m +bhP}ZsPef35>JJaHJF7}X$37Y21E`BySDf%$MYb{T~|g0b97;JWdSa-rT!PdFhnqz;9Q#JJaHJF7}X$37Y21E`BySDf%$MYb{T~|g0b97;JWdSa-rT!PdFhnqz;9Q#< T5Q%H?RE`e-pha{(`54&;kyKEZ)0l$dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0Th_>4e9YQ#rfba;u!+d5tm#=h2RwFCuobYXO50WPwo{ujV7L@=1( -T$>wOY}Ov_b`4?P%YY`+Wb+o`y98`+V`~C>10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8 -X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%95o2#|W@%()Zggp3Y*Tb$bY%br0|awrVQc|zz!8ZmxG0SM -PZTc4w%!w3d}4CRtg5Jm=n8Q-roiL{b97;JWdSa-rT!PdFhnqz;9Q#%7&o7^|1Fn59cLW!>7R +25;!;BwOY}Ov_b`4?P%YY`+Wb+o`y98`+V`~C>10COK +earHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%95o2#| +W@%()Zggp3Y*Tb$bY%br0|awrVQc~+aI2y9pehZ%M2QE^S2-B&?H_1O1&4u6*^T^mbhP{|1C2;aNA(0e +XS#L;%_oib8;tKCLQ=nuAv#{`SnN;*b97;JWdSa-rT!PdFhnqz;9Q#9j!E%yECE_aqvb +{^Dg=h-~N_zJ`Red1EINWrM}GXaQb}6c#qIM2EQn4AaeCy`?KfZ0H=mhJ>?uVso3EIu+3*)t78850@mnbX00000000300000000008 L3DIsV`xca1pxpD002NB01H8MbYWv?Q*>c;Wd;HQX=DL}aSf9!PV~dK2uo>;u!nFdemP_$e?^hl+JkM; eY!XaZDnL>VN`i=WdTAkVTFju)Tn+a 3j=0mb^+R(Q4?4eR(6nw`S$_F2)vN@Mb6UJ-F(lri_dqerx4lR4>iBsz2WM<=Vqt7^0p25# -Yo@G%*b#-tU^&3KX?w7l?~*Sh8@1jRRblZzybED-b7^O8ZDnqBa{+B8dRRT6v^+Utq2R*LPciBoh`YBV -A5APO#~wOBdpZbmWn^V#ZDnKu-_NO$^@rt6M7IGITmUKjm1~>v&8b0-V>p(oz$%0233g#@Wo~0>Wpe@D +Yo@G%*b#-tU^&3KX?w7l?~*Sh8@1jRRblZzybED-b7^O8ZDnqBa{*as?yI5TY8=l|S=)-UH4bo3Ym}-0 +prjaef_E>x{+|ePWn^V#ZDnKu-_NO$^@rt6M7IGITmUKjm1~>v&8b0-V>p(oz$%0233g#@Wo~0>Wpe@D g=PS6VPp{$?vC--s`v@B8YHl)C#jpVFzBk!DMw8Sc42I3WMOn~asqk-9p7nv%krpqN@L7b8`ZE10COKearHwcS=7M 7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%NMR;^&ZgXjGZc}4u @@ -154,7 +170,7 @@ C7cFqVR>b8F#&nR*hvU%Hiwm>NkB*5l*n^F-s9AWUWw-#$_-O$8W0C`Wpi|HWpo0{EFN!zncXl9K5w2; FV{y1jDTJCC^p$-mHEbO0#qkqh9c2>uJC38-{*D7fZ(%hZo23R4S;p`Q9JBQllDyuV{C78Wld#tXm4Z! A#kgq^`I&ZzC?)!&R01Y?(H9FO$CR6P1%k7c67A-F1HXRxo%|^+Itiop&gxXSvq){{YhrGf57_P)SQy* 2yJC_VPs)+VFC4eO*mP8`7qV21dnrCyk{{a-lF$FG0V5TNAc?Tc{K-TY;R&=Y;ytLBav&Stb*7Pg~wny -z`1FAu$k|YFC-ha-WFA1@jtu^VRLh7XKrm}Zgg`2Z6Kur>w<8}-EGowyIzW3m +z`1FAu$k|YFC-ha-WFA1@jtu^VRLh7XKrm}Zgg`2S!nL7q2Ov9&rw<1inBEia8GNLssNy*7Wpe@Dg=PS6VPp{$?vC--s`v@B8YHl)C#jpVFzBk!DMw8Sc42I3WMOn~asqk-9p7nv%krpq N(I! Xk~3-1_cOhWprU=VRT^t2?2HFP59r=ivk@6CZd7@2WdSr&53UoI8eY9A{1GERg--GiI0S#x1is&)M%fmnGH3{G WprU=VRT^u^?FS>S$_F2)vN@Mb6UJ-F(lri_dqerx4lR4>iBsz2WM<=Vqt7^0p25#Yo@G%*b#-tU^&3K X?w7l?~*Sh8@1jRRblZzyas7*aCLNZ0jZ*TSChz_$|Xx}eRkFNAr%^eLl(1e@}~9=0-ijXfD2)Bb7^O8 -ZDnqBa{=IV(}D8jCsklS@{1v@LD1w=H!oG#YQ3ehhDVCN^+gGGVQgh?V`*h`0o{dW0B>Pr5ftu@@z<*O +ZDnqBa{(ht>-pde{GkuQzBXTAin>IdF&9PAZ4eqJ|JRcX$HfVDVQgh?V`*h`0o{dW0B>Pr5ftu@@z<*O 39}j`u&O7io3b$Is?RA$O$l~kY-wa+bZ>G3dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0Thj-IXaCLM|VQ>KznP+6nwW~k}RP!NmuV?G -015$>$mV(;bz)!CmQ_M(k?Vd!kfCo{nDM?)_qK{868FUcgVc)RC_n4!M)-m~r-&+&DY>#4Q@X=A-BxC6 -tm0Sz0RR9100000|Nj60000005L9wuZgXjLX>V>*V`yb$mV(;bz)!CmQ_M(k?Vd!kfCo{nDM?)_qK{868FUcDMVYyR82_wM5*Z}2x&2iAAvl{68TB;){@BD +#37|g0RR9100000|Nj60000005L9wuZgXjLX>V>*V`ybM?JbaMa-0f+wLWmt%8=p4R=gtK{LClh6Z#kObxUW*hKHnBv9xdAr8G@<&SffJ|QFn~N>u=2wF+7z(W @@ -238,28 +254,17 @@ NK5;L!8FkfGTe+FK;UUh9M-4n+}vRfRB~Z%b7^#GZ*Ek1aAgGn0006GRC#b^LvL+uX>@I6Zgd0#00(Df Ze??6a{vVa0eWpZ9+jxjF?kjkjKm%VAEccnz281lN_aBj?kEuWU;zqra$#@6CZU6-W0iOsgNjk^^ qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G66JF53UoI8eY9A{1GERg--GiI0S#x1is&)M%fmnGH3z`Wq5RD ZgXjGZU6-W0iOsgNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G67_D9zv-Vp*%wog4O?q)g04AaHEjn -O6;Ie%sNwVNZuM$d2nT9L349yXKr&sY-w&}Q)OXnRCrKyas&hb3uI+uY+-U?bZK^F00jX62mw{x*tXpD -o;l5DLes-C{(xD7d6!~!$BzIRP#fdy`l0{;00000009600000000039W_507X<}?;00jX62mu3Yb-?Q~ -J*#k!Q3P`O)#UiJ7o@ZBBWe_c6EU>QFz)~W0000000960000000006Cb98cbV{~?nZ&L00;r&RmTdUadnMQziE5xZZH-mc~-fzS41y+p{^_ku%R9R -0000000030{{R30000303So3~VPj}*Wo~o;1pxpE0XeIl<1VPcybH9KM*xoq&Zg2Gr#Z;y7!6fzc?JkK -3;+NC000000RR600000000~xMY-Mg^X=QT-0RRaBM(yUq2ps*m=2xUDT;RqCgn#@WzFu~@adfH5^@&-| -0000000000{{R30000003szxlWo~16RC#b^1pxp60tr@cX=GD$VRU5$0RR916j(!OVQFqcY-w&}Q)OXn -RCrKyas&bZ2V!Y-V{d7000jX8A#kgq^`I&ZzC?)!&R01Y?(H9FO$CR6P1%k7c67A-r>OF|0}@Y#k~Nrx -RcQq+F$P2q2)nlUE64L7%3W7R0S0Voadl~A00jX8A#kgq^`I&ZzC?)!&R01Y?(H9FO$CR6P1%k7c67A- -r>OF|0}@Y#k~NrxRcQq+F$P2q2)nlUE64L7%3W7R6IerNVQFqcY-w&}Q)OXnRCsA*1OfmDVrg_^Z)t7- -1pxvfaI2y9pehZ%M2QE^S2-B&?H_1O1&4u6*^T^mbhP{|1C2;aNA(0eXS#L;%_oib8;tKCLQ=nuAv#{` -SnN;%25f0@b!lV(1pxvfaI2y9pehZ%M2QE^S2-B&?H_1O1&4u6*^T^mbhP{|1C2;aNA(0eXS#L;%_oib -8;tKCLQ=nuAv#{`SnN;`SVL%GX>LL?_X=DTf00&}ebYpL6ZU6-V0`+VYVk7oBr%DNv+($;q`HHK!gIHa)*%m(-e#9sm3ZsHT^UK%K(4i9A -jp1M~R@C@!4#dQE#lUD;OiKi1RsjZVX>oOFWB>&L0`+VYVk7oBr%DNv+($;q`HHK!gIHa)*%m(-e#9sm -3ZsHT^UK%K(4i9Ajp1M~R@C@!4#dQE#lUD;OiKi1Rs +O6;Ie%sNwVNZuM$d2nT9L349yXKr&sY-w&}Q)OXnRCrKyas&hb3uI+uY+-U?bZK^F00jX62mvIbO})vu +wNYes?|slVUJVKS +dpWWUDN*iLy7r@_$;(@v`JFEl;-`;0GZFv*0000000960000000006Cb98cbV{~R)def|Q10000000000|Nj6000000{|aGrbYWv?ZDnqB00jX62m#Gh +r9yo^9b7e4zX000000096000000000?Od2nT9L349yXKr&sY-w&} +Q)OXnRCsA*1OxyJWMyM)VRB(~X?A4*1pxpE0n!+g^zB)9g7@9zEeXi$)a}`73$!@VJ}Ihs;PdOHtN;K2 +000000RR6000000009VQb#7;AVr*pq1pxpE0WH#fNvB~JuvPjRzgRGz_prqexC}!&-1hZ8sf8UjcK`qY +000000RR600000000IhgbaHiLbairNWB>&L00;q}`(lVb{F+?>1tC589WlkJ4(T@u?8)d_7GlQG%sFlV +0000000030{{R30000303So3~VPj}*Wo~o;1pxpE0dCCHhI~QV&X+ep#A6w*Y?6dZtMP`1@htLD*t(0E +sQ>@~000000RR600000000~xMY-Mg^X=QT-0RRaBM(yUq2ps*m=2xUDT;RqCgn#@WzFu~@adfH5^@&-| +0000000000{{R30000003szxlWo~16RC#b^1pxp60tr@cX=GD$VRU5$0RR91 -----END STRICT TYPE LIB----- diff --git a/stl/RGBCommit@0.1.0.stl b/stl/RGBCommit@0.1.0.stl index 2e711c76c058df64a49a215cebf3118ca9932295..393e937599b68f0aefe071c18506d2991506d750 100644 GIT binary patch delta 956 zcmaD@v!Q-N9}A=HL$@R*Lll^TKCi`*ZPL7t4o-A+U2xPaz#ckQ@!D4sWmczwh zYC(G6+ko_fHC0w{Lq2_yWYCycO1P7q?xKEY*hdtho|W}>TyiOUJ*PJS$62G?gV ziLe924iJ+f{9=Zj6|=g@bRKK>e;4HI+BXRn{J^5zHeP%+`^4IiU5 zH|tC9W>$#Ic(;1tgDjczfswbnHkvj~|`vpi;K^jtK{&f~HIKi4b3p zUoI&UCLYbecVWA}Enaf+boAVxbM=KEE$_EB z7Mi@*N=c#qYzOZ)!`pji-Slz4`S07C-FfXd?Ebvkt05s#S^JNvY4U%dqO&1Oooel5 zV@yMzEdT2FUf|kA>&u>JHXI0?-tP7Fcl^Q0a#r>Vmn0^Cc^g^Y^!@G=UCtA)ue`mP z#l6MiqMhcd$_JlcFI@w6lkTNj&*h0?8$y3c?T;{+|9!(z{vABdR(HOAwOiRLYgP_+ z)BN8_9d>_a#WJ!g+WwR^Ji3zar8(!DlP{vgl8#+CW0?nbQ{I^?Z8eU!&P_LWIFc;6 bE@x7U*XoaL?H_eM1>V@zJ#*z`N9%k5K&X_z delta 2061 zcmdl`|FC959}A=7-W zJ9)JT|70&d{>h5mz>pyrhPB)sMEJRupP2CD<0U5i&haiK)?EbsOM<%yn#ISPJNXnl z|KwdF0z`)0J5gfO-#bxa!mm!4nDDa`Sw=+o!QDpC-z2z=pjmaoxsxA@n-SqYd0Aq^ z4y1B|q!dwR5)*zP^CYBAi82rBMuPq((TxPnyDxiCVZt8nzaM_EZhdC^XMZ)fRMuaQ z+3hd4INUr_SikhUiqy=>2ju(}y4`*FTy`jLb~+zfe{!qK>cf$lbzSe5U;C|7CLiJ{ zX}VcoemAp1u3A-u?Sd^fmPrdA96IlB_)4Z@_jYA@UmdOEa#jx2R-3t$#aIcea?oHC zPyd{2 z>sM|+nrxSMXid`Gxk)m3*I|phVQJZG9z`&0X0bA3RtUXwW80mt^DNJ%J6%3(^sgbZ zxpI0^>G6IB$pGocZ+Vp12mZD!*pZwS&zGU+UEQpFj1NnsM$ zO^-v5b1f_^?G4zUS^YZCKuoPNZ0F{17yasm>vY&RER+Mg$#V6)$9gLc?BU)r-JPMI zoYShVk##ncWIlNW$!4^B-kN-Y7| gk45i)8BD!EF-b0n-jE6m8{g|FPEKS()ddv;0NYN2egFUf diff --git a/stl/RGBCommit@0.1.0.sty b/stl/RGBCommit@0.1.0.sty index d22019a1..6ee7a5d1 100644 --- a/stl/RGBCommit@0.1.0.sty +++ b/stl/RGBCommit@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:mh8Ebzz!-9Trq2j8-Q2kUCyh-L4P1E80-HNp6Uct-LDLlJNo#victor-guru-philips + Id: stl:nX8j7yoL-WB1gVNN-JHgJDvZ-UL8177c-Hexose2-JYJs1Bs#level-exodus-final Name: RGBCommit Version: 0.1.0 Description: Consensus commitment layer for RGB smart contracts @@ -44,115 +44,115 @@ import Bitcoin#signal-color-cipher use Txid#shallow-light-reverse -@mnemonic(airport-ladder-joseph) -data AssignRevealedAttachBlindSealTxPtr : confidential (seal XChainSecretSeal +@mnemonic(credit-cycle-panama) +data AssignRevealedAttachBlindSealTxPtr : confidential (seal BPCore.SecretSeal , state ConcealedAttach , lock CommitVerify.ReservedBytes2) - | confidentialState (seal XChainBlindSealTxPtr + | confidentialState (seal BPCore.BlindSealTxPtr , state ConcealedAttach , lock CommitVerify.ReservedBytes2) - | confidentialSeal (seal XChainSecretSeal + | confidentialSeal (seal BPCore.SecretSeal , state RevealedAttach , lock CommitVerify.ReservedBytes2) - | revealed (seal XChainBlindSealTxPtr + | revealed (seal BPCore.BlindSealTxPtr , state RevealedAttach , lock CommitVerify.ReservedBytes2) -@mnemonic(member-camera-parking) -data AssignRevealedAttachBlindSealTxid : confidential (seal XChainSecretSeal +@mnemonic(volcano-chariot-plastic) +data AssignRevealedAttachBlindSealTxid : confidential (seal BPCore.SecretSeal , state ConcealedAttach , lock CommitVerify.ReservedBytes2) - | confidentialState (seal XChainBlindSealTxid + | confidentialState (seal BPCore.BlindSealTxid , state ConcealedAttach , lock CommitVerify.ReservedBytes2) - | confidentialSeal (seal XChainSecretSeal + | confidentialSeal (seal BPCore.SecretSeal , state RevealedAttach , lock CommitVerify.ReservedBytes2) - | revealed (seal XChainBlindSealTxid + | revealed (seal BPCore.BlindSealTxid , state RevealedAttach , lock CommitVerify.ReservedBytes2) -@mnemonic(genius-editor-formula) -data AssignRevealedDataBlindSealTxPtr : confidential (seal XChainSecretSeal +@mnemonic(sweden-alpine-quality) +data AssignRevealedDataBlindSealTxPtr : confidential (seal BPCore.SecretSeal , state ConcealedData , lock CommitVerify.ReservedBytes2) - | confidentialState (seal XChainBlindSealTxPtr + | confidentialState (seal BPCore.BlindSealTxPtr , state ConcealedData , lock CommitVerify.ReservedBytes2) - | confidentialSeal (seal XChainSecretSeal + | confidentialSeal (seal BPCore.SecretSeal , state RevealedData , lock CommitVerify.ReservedBytes2) - | revealed (seal XChainBlindSealTxPtr + | revealed (seal BPCore.BlindSealTxPtr , state RevealedData , lock CommitVerify.ReservedBytes2) -@mnemonic(soda-edison-music) -data AssignRevealedDataBlindSealTxid : confidential (seal XChainSecretSeal +@mnemonic(break-python-verona) +data AssignRevealedDataBlindSealTxid : confidential (seal BPCore.SecretSeal , state ConcealedData , lock CommitVerify.ReservedBytes2) - | confidentialState (seal XChainBlindSealTxid + | confidentialState (seal BPCore.BlindSealTxid , state ConcealedData , lock CommitVerify.ReservedBytes2) - | confidentialSeal (seal XChainSecretSeal + | confidentialSeal (seal BPCore.SecretSeal , state RevealedData , lock CommitVerify.ReservedBytes2) - | revealed (seal XChainBlindSealTxid + | revealed (seal BPCore.BlindSealTxid , state RevealedData , lock CommitVerify.ReservedBytes2) -@mnemonic(rachel-unique-logic) -data AssignRevealedValueBlindSealTxPtr : confidential (seal XChainSecretSeal +@mnemonic(basic-elastic-digital) +data AssignRevealedValueBlindSealTxPtr : confidential (seal BPCore.SecretSeal , state ConcealedFungible , lock CommitVerify.ReservedBytes2) - | confidentialState (seal XChainBlindSealTxPtr + | confidentialState (seal BPCore.BlindSealTxPtr , state ConcealedFungible , lock CommitVerify.ReservedBytes2) - | confidentialSeal (seal XChainSecretSeal + | confidentialSeal (seal BPCore.SecretSeal , state RevealedFungible , lock CommitVerify.ReservedBytes2) - | revealed (seal XChainBlindSealTxPtr + | revealed (seal BPCore.BlindSealTxPtr , state RevealedFungible , lock CommitVerify.ReservedBytes2) -@mnemonic(cadet-book-pablo) -data AssignRevealedValueBlindSealTxid : confidential (seal XChainSecretSeal +@mnemonic(example-reply-lorenzo) +data AssignRevealedValueBlindSealTxid : confidential (seal BPCore.SecretSeal , state ConcealedFungible , lock CommitVerify.ReservedBytes2) - | confidentialState (seal XChainBlindSealTxid + | confidentialState (seal BPCore.BlindSealTxid , state ConcealedFungible , lock CommitVerify.ReservedBytes2) - | confidentialSeal (seal XChainSecretSeal + | confidentialSeal (seal BPCore.SecretSeal , state RevealedFungible , lock CommitVerify.ReservedBytes2) - | revealed (seal XChainBlindSealTxid + | revealed (seal BPCore.BlindSealTxid , state RevealedFungible , lock CommitVerify.ReservedBytes2) -@mnemonic(cycle-panther-cave) -data AssignVoidStateBlindSealTxPtr : confidential (seal XChainSecretSeal +@mnemonic(snow-adrian-cadet) +data AssignVoidStateBlindSealTxPtr : confidential (seal BPCore.SecretSeal , state VoidState , lock CommitVerify.ReservedBytes2) - | confidentialState (seal XChainBlindSealTxPtr + | confidentialState (seal BPCore.BlindSealTxPtr , state VoidState , lock CommitVerify.ReservedBytes2) - | confidentialSeal (seal XChainSecretSeal + | confidentialSeal (seal BPCore.SecretSeal , state VoidState , lock CommitVerify.ReservedBytes2) - | revealed (seal XChainBlindSealTxPtr + | revealed (seal BPCore.BlindSealTxPtr , state VoidState , lock CommitVerify.ReservedBytes2) -@mnemonic(dynasty-iron-athena) -data AssignVoidStateBlindSealTxid : confidential (seal XChainSecretSeal +@mnemonic(drum-cover-between) +data AssignVoidStateBlindSealTxid : confidential (seal BPCore.SecretSeal , state VoidState , lock CommitVerify.ReservedBytes2) - | confidentialState (seal XChainBlindSealTxid + | confidentialState (seal BPCore.BlindSealTxid , state VoidState , lock CommitVerify.ReservedBytes2) - | confidentialSeal (seal XChainSecretSeal + | confidentialSeal (seal BPCore.SecretSeal , state VoidState , lock CommitVerify.ReservedBytes2) - | revealed (seal XChainBlindSealTxid + | revealed (seal BPCore.BlindSealTxid , state VoidState , lock CommitVerify.ReservedBytes2) @@ -409,20 +409,4 @@ data ValencyType : U16 @mnemonic(email-snow-safari) data VoidState : () -@mnemonic(poem-heaven-chicken) -data XChainBlindSealTxPtr : bitcoin BPCore.BlindSealTxPtr - | liquid BPCore.BlindSealTxPtr - -@mnemonic(vision-promise-user) -data XChainBlindSealTxid : bitcoin BPCore.BlindSealTxid - | liquid BPCore.BlindSealTxid - -@mnemonic(alex-griffin-left) -data XChainSecretSeal : bitcoin BPCore.SecretSeal - | liquid BPCore.SecretSeal - -@mnemonic(liquid-river-absorb) -data XChainTxid : bitcoin Bitcoin.Txid - | liquid Bitcoin.Txid - diff --git a/stl/RGBLogic@0.1.0.sta b/stl/RGBLogic@0.1.0.sta index 93631e40..52fcdf53 100644 --- a/stl/RGBLogic@0.1.0.sta +++ b/stl/RGBLogic@0.1.0.sta @@ -1,14 +1,14 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:ZVsDEEZJ-cDK203!-ys2wf2h-QMU18pN-fEl49v9-qOTytWA#armor-roman-zigzag +Id: stl:E2vH0scY-5u2NHhW-M5$ZWEP-33VJvaA-yeF1fVR-37IJ1ak#nitro-sandra-salami Name: RGBLogic Dependencies: BPCore#symbol-tropic-grand, - RGBCommit#victor-guru-philips, + RGBCommit#level-exodus-final, Bitcoin#signal-color-cipher -Check-SHA256: b4085e8f4b916ed0130fb3120d191196edab4fe2df707cddc8d35f5b8f582c31 +Check-SHA256: 623219184b8b0df1ad047920ca4e596ff8865c5bc4d2b602028c9763cdbef182 -2vSEvOmAmtV*?>@tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPA_P(yEWWttxZZ#@3>I_la#5ZXlo -$`bfLQ9RIdY3WBTEHdRJ+6hueLPKwDZE1A%Y!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkk +2vSEvOmAmtV*?>@tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPA_P(yEWWu1Q`?ja}LTPkk Z)t7=20~CnZ*pY?00DdlT>wB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 wjY>38tto&d&=eG4cRAF#( @@ -24,15 +24,15 @@ iRT*14O40w5C%+Pd1Z1jmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<1W#~DWCZ{SL}Fu5a&K>D n*!v8^Ea7rh?dzC2n+%RZ*X#DbN~eb0wHj#q4l6D4ZcK)2hLYH81C&KXiWu&flb+s{C0G-{6|jDT+rxD K6vW;JU&?LxLM72H?wDC1Zo}=N}D)4mkCE~Z(?C=PjX}i0tIhyPjX}dBrRR>2@LcryZYc>KM>kQ0?HEjKT$l;b7|>EEi5wS -B-&(k9zv-Vp*%wog4O?q)g04AaHEjnO6;Ie%sNwVNZti*Z*F5{000OCZ*Xa30-7HLZ#@3>I_la#5ZXlo -$`bfLQ9RIdY3WBTEHdRJ+Lg%WdLDIRU(}XWLTZugenOC;Z(5k~zEJnJiX;;E#s3O)a$#@6CZU6=Z -2X|?7Ze??G0gF(#a06?0nLd|SC|>c2?4}E((!U1rl;i3pNx$ZJGXivZ0-7HLZ#@3>I_la#5ZXlo$`bfL -Q9RIdY3WBTEHdRJ+B8xRt`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zcaA{-$njZvj -JpT1M>e@dL+C>7&68Jw+JkWD#=|?RrGUX)NmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<3Rh`# +w{Qb%c9}kxS14ZbiR`8eq|(0z@s#80B}u>LcryZYc>@6CZU6=Z +2X|?7Ze??G0gF(#a06?0nLd|SC|>c2?4}E((!U1rl;i3pNx$ZJGXivZ0-b*&?ZewKt00;zcaA{-$oqr?m +DhpU0U{upd9s)zXl?(G;`*3%$qQ|x+f^5_qmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<3Rh`# Ze??GPjX}g1ONwVXKrtDWn=&V009VLa${&|c4cG$00067ZE0?0WB>&L0bJY;BNZ=sBHM?<`J6+Fr=Ae@dL+C>7& -68Jw+JkWD#=|?RrGUX)NdBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W)00aqiX>Db5 +EJ!(G_IUTS%E$nK5(5czWo~p~bZK^F0000AS7~%^Wpi^-Z*v9%25ez@WpXhBoqr?mDhpU0U{upd9s)zX +l?(G;`*3%$qQ|x+f^5_qdBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W)00aqiX>Db5 bYX39002k -----END STRICT TYPE LIB----- diff --git a/stl/RGBLogic@0.1.0.stl b/stl/RGBLogic@0.1.0.stl index 5466d7bda8ac8c4821cc85d87904f687645d21d1..327cbe7bbc9c0feeb4214898a62972355a218a92 100644 GIT binary patch delta 247 zcmZqYZRed}s4%x)`Mnl*gls~{WluRK=e<+8KgazpDBrl~_%_w1oGa2B0|i+KDw@2T xNkN}AFF!9im4ShSCBGmug^7^ClP|Kw5H{GCRiCh;i!2J0_pp`_Rv5r$4gk^XX6OI_ delta 247 zcmZqYZRed}s4z>OCEw=XSF2aI>;-PQGMy6oVIOF7p*ZuUyRMGWQ Date: Fri, 24 Jan 2025 17:34:14 +0100 Subject: [PATCH 22/70] validation: unified seals --- src/operation/bundle.rs | 8 +- src/operation/commit.rs | 3 - src/operation/operations.rs | 2 - src/stl.rs | 4 +- src/validation/status.rs | 13 +- src/validation/validator.rs | 52 ++-- stl/AnchoredBundle.vesper | 1 - stl/RGBCommit@0.1.0.sta | 490 ++++++++++++++++++------------------ stl/RGBCommit@0.1.0.stl | Bin 16304 -> 16034 bytes stl/RGBCommit@0.1.0.sty | 15 +- stl/RGBLogic@0.1.0.sta | 26 +- stl/RGBLogic@0.1.0.stl | Bin 1671 -> 1671 bytes stl/RGBLogic@0.1.0.sty | 14 +- 13 files changed, 299 insertions(+), 329 deletions(-) diff --git a/src/operation/bundle.rs b/src/operation/bundle.rs index 6a69d4f1..46b25fc3 100644 --- a/src/operation/bundle.rs +++ b/src/operation/bundle.rs @@ -24,7 +24,6 @@ use std::collections::{btree_map, BTreeMap}; use amplify::confinement::{Confined, U16 as U16MAX}; use amplify::{Bytes32, Wrapper}; -use bp::seals::txout::CloseMethod; use bp::Vout; use commit_verify::{mpc, CommitEncode, CommitEngine, CommitId, CommitmentId, DigestExt, Sha256}; use strict_encoding::{StrictDumb, StrictEncode}; @@ -109,7 +108,6 @@ impl<'a> IntoIterator for &'a InputMap { serde(crate = "serde_crate", rename_all = "camelCase") )] pub struct TransitionBundle { - pub close_method: CloseMethod, pub input_map: InputMap, pub known_transitions: Confined, 1, U16MAX>, } @@ -117,16 +115,12 @@ pub struct TransitionBundle { impl CommitEncode for TransitionBundle { type CommitmentId = BundleId; - fn commit_encode(&self, e: &mut CommitEngine) { - e.commit_to_serialized(&self.close_method); - e.commit_to_serialized(&self.input_map); - } + fn commit_encode(&self, e: &mut CommitEngine) { e.commit_to_serialized(&self.input_map); } } impl StrictDumb for TransitionBundle { fn strict_dumb() -> Self { Self { - close_method: strict_dumb!(), input_map: strict_dumb!(), known_transitions: Confined::with_key_value(strict_dumb!(), strict_dumb!()), } diff --git a/src/operation/commit.rs b/src/operation/commit.rs index f476cca6..5326913a 100644 --- a/src/operation/commit.rs +++ b/src/operation/commit.rs @@ -30,7 +30,6 @@ use amplify::hex::{FromHex, ToHex}; use amplify::num::u256; use amplify::{hex, ByteArray, Bytes32, FromSliceError, Wrapper}; use baid64::{Baid64ParseError, DisplayBaid64, FromBaid64Str}; -use bp::seals::txout::CloseMethod; use commit_verify::{ mpc, CommitEncode, CommitEngine, CommitId, CommitmentId, Conceal, DigestExt, MerkleHash, MerkleLeaves, ReservedBytes, Sha256, StrictHash, @@ -239,7 +238,6 @@ pub struct BaseCommitment { pub issuer: StrictHash, pub layer1: Layer1, pub testnet: bool, - pub close_method: CloseMethod, } #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] @@ -283,7 +281,6 @@ impl Genesis { timestamp: self.timestamp, layer1: self.layer1, testnet: self.testnet, - close_method: self.close_method, issuer: self.issuer.commit_id(), }; OpCommitment { diff --git a/src/operation/operations.rs b/src/operation/operations.rs index c4f48393..3a59b174 100644 --- a/src/operation/operations.rs +++ b/src/operation/operations.rs @@ -28,7 +28,6 @@ use std::str::FromStr; use amplify::confinement::{Confined, SmallOrdSet, TinyOrdMap, TinyOrdSet}; use amplify::{hex, Wrapper}; -use bp::seals::txout::CloseMethod; use commit_verify::{ CommitEncode, CommitEngine, CommitId, Conceal, MerkleHash, MerkleLeaves, ReservedBytes, StrictHash, @@ -346,7 +345,6 @@ pub struct Genesis { pub issuer: Identity, pub layer1: Layer1, pub testnet: bool, - pub close_method: CloseMethod, pub metadata: Metadata, pub globals: GlobalState, pub assignments: Assignments, diff --git a/src/stl.rs b/src/stl.rs index 207234d4..d3d7ec67 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -38,10 +38,10 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_COMMIT: &str = - "stl:nX8j7yoL-WB1gVNN-JHgJDvZ-UL8177c-Hexose2-JYJs1Bs#level-exodus-final"; + "stl:FjjU0$$o-dgf5dmK-ohaEobc-Y6Vz3rp-TqLj3kS-8F7NMQQ#capsule-arthur-quest"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:E2vH0scY-5u2NHhW-M5$ZWEP-33VJvaA-yeF1fVR-37IJ1ak#nitro-sandra-salami"; + "stl:iLZ2rLhr-oAp7rHh-cX2LO3T-7evttnL-KT6MX!V-m64WEyQ#janet-mineral-phone"; fn _rgb_commit_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_COMMIT), tiny_bset! { diff --git a/src/validation/status.rs b/src/validation/status.rs index e050dd4c..49da5206 100644 --- a/src/validation/status.rs +++ b/src/validation/status.rs @@ -285,17 +285,14 @@ pub enum Failure { /// single-use seals for the operation {0} were not validated, which /// probably indicates unanchored state transition. SealsUnvalidated(OpId), - /// anchor provides different type of DBC proof than required by the bundle - /// {0}. - AnchorMethodMismatch(BundleId), /// transition bundle {0} is not properly anchored to the witness {1}. /// Details: {2} MpcInvalid(BundleId, Txid, InvalidProof), - - /// anchor close method {0} is different from the one of the contract {1} - AnchorInvalidMethod(CloseMethod, CloseMethod), - /// bundle close method {0} is different from the one of the contract {1} - BundleInvalidMethod(CloseMethod, CloseMethod), + /// witness transaction {0} has no taproot or OP_RETURN output. + NoDbcOutput(Txid), + /// first DBC-compatible output of witness transaction {0} doesn't match the provided proof + /// type ({1}) + InvalidProofType(Txid, CloseMethod), // State extensions errors /// valency {valency} redeemed by state extension {opid} references diff --git a/src/validation/validator.rs b/src/validation/validator.rs index 2b1d6eac..aa800029 100644 --- a/src/validation/validator.rs +++ b/src/validation/validator.rs @@ -24,7 +24,7 @@ use std::cell::RefCell; use std::collections::{BTreeMap, BTreeSet}; use std::rc::Rc; -use bp::dbc::{Anchor, Proof}; +use bp::dbc::Anchor; use bp::seals::txout::{CloseMethod, Witness}; use bp::{dbc, Outpoint, Tx, Txid}; use commit_verify::mpc; @@ -119,7 +119,6 @@ pub struct Validator< schema_id: SchemaId, contract_id: ContractId, - close_method: CloseMethod, contract_state: Rc>, validated_op_seals: RefCell>, @@ -146,7 +145,6 @@ impl< let genesis = consignment.genesis(); let contract_id = genesis.contract_id(); let schema_id = genesis.schema_id; - let close_method = genesis.close_method; // Prevent repeated validation of single-use seals let validated_op_seals = RefCell::new(BTreeSet::::new()); @@ -157,7 +155,6 @@ impl< status: RefCell::new(status), schema_id, contract_id, - close_method, validated_op_seals, input_assignments: input_transitions, resolver: CheckedWitnessResolver::from(resolver), @@ -381,31 +378,6 @@ impl< // [VALIDATION]: We validate that the seals were properly defined on BP-type layer let (seals, input_map) = self.validate_seal_definitions(bundle); - if self.close_method != anchor.dbc_proof.method() { - self.status - .borrow_mut() - .add_failure(Failure::AnchorInvalidMethod( - anchor.dbc_proof.method(), - self.close_method, - )); - continue; - } - if self.close_method != bundle.close_method { - self.status - .borrow_mut() - .add_failure(Failure::BundleInvalidMethod( - bundle.close_method, - self.close_method, - )); - continue; - } - if anchor.dbc_proof.method() != bundle.close_method { - self.status - .borrow_mut() - .add_failure(Failure::AnchorMethodMismatch(bundle_id)); - continue; - } - // [VALIDATION]: We validate that the seals were properly closed on BP-type layer let Some(witness_tx) = self.validate_seal_commitments(&seals, bundle_id, witness_id, anchor) @@ -624,6 +596,28 @@ impl< .add_failure(Failure::MpcInvalid(bundle_id, witness_id, err)); } Ok(commitment) => { + // [VALIDATION]: Verify commitment + let Some(output) = witness + .tx + .outputs() + .find(|out| out.script_pubkey.is_op_return() || out.script_pubkey.is_p2tr()) + else { + self.status + .borrow_mut() + .add_failure(Failure::NoDbcOutput(witness_id)); + return; + }; + let output_method = if output.script_pubkey.is_op_return() { + CloseMethod::OpretFirst + } else { + CloseMethod::TapretFirst + }; + let proof_method = witness.proof.method(); + if proof_method != output_method { + self.status + .borrow_mut() + .add_failure(Failure::InvalidProofType(witness_id, proof_method)); + } // [VALIDATION]: CHECKING SINGLE-USE-SEALS witness .verify_many_seals(seals, &commitment) diff --git a/stl/AnchoredBundle.vesper b/stl/AnchoredBundle.vesper index cee409b5..6f3ea5a3 100644 --- a/stl/AnchoredBundle.vesper +++ b/stl/AnchoredBundle.vesper @@ -8,7 +8,6 @@ Bundles vesper lexicon=types+commitments BundleId commitment hasher=SHA256 tagged=urn:lnp-bp:rgb:bundle#2024-02-03 - Method serialized InputMap serialized DbcProof union diff --git a/stl/RGBCommit@0.1.0.sta b/stl/RGBCommit@0.1.0.sta index 87fa1674..4dccc426 100644 --- a/stl/RGBCommit@0.1.0.sta +++ b/stl/RGBCommit@0.1.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:nX8j7yoL-WB1gVNN-JHgJDvZ-UL8177c-Hexose2-JYJs1Bs#level-exodus-final +Id: stl:FjjU0$$o-dgf5dmK-ohaEobc-Y6Vz3rp-TqLj3kS-8F7NMQQ#capsule-arthur-quest Name: RGBCommit Dependencies: BPCore#symbol-tropic-grand, @@ -8,263 +8,259 @@ Dependencies: CommitVerify#miller-pancake-elastic, Std#ralph-blue-lucky, Bitcoin#signal-color-cipher -Check-SHA256: ad6ac8582ba234345b04eb22746b2d2fe75a729e78ad75b4482570178efe665f +Check-SHA256: d962ea87194c00a283f546c2787a30e2a16c396deabb107af66218664d63e270 2~tNwLvL+uX>4E? M+l67UG^w8*<_XZ#%uyqCj(P-Wc6$lVk7oBr%DNv+($;q`HHK!gIHa)*%m(-e#9sm3I{@IbYpL6ZUzNG Y;{&m0sw9Ap(f$Hb>aU=OZ$bvG|>z)+>9PT;Au-7)~D;-++hbyX<}1pbY-V7RRS&fT*&Z=qeY@Wmfle* -z!SF)@h8|JkU^FEQwjx4X<|ua20~CnZ*pY?04xKINJ~fc1UzTDb_LBRjrSXj?;k=^zm6d~Uh7!wPz^$C -X>MdwWnpYocxhxVw-6<{ZeNoKcy!1~?PoRaGXO=WawZ)9j0>%7&o7^|1Fn59cL -W!>7R25;!;BbW>$vY^SL5xdReUg_1Rxg;i+MdwWnpYocu;h5vE?{96bd-L@NXK=z8qksZ{gweeRv2cdB4&6(-0xu1yp!YbaDqmX>?<6X>I}lA>%$n -#j0HLDJN5-IKgM_J7b(p+0MPGk2Gl)y2(Rz1Xgc#bfbbo^UK%K(4i9Ajp1M~R@C@!4#dQE#lUD;OiKi1 -Rs>XdX=DsTZ*6U9bXH|@X=Zr^063mQh9?yTI7S;;e;>sZfv!yd427@;7veO2zMB=|GYU;*a%*g5NMUnm -ZLh7x^`{^P$fKg#%8c8X#<$(NgM!uni2C|Kr}onZ3R84)X=8LqVRLAc_h5K%L=laq&yA1JoJ^{7>oKLk -F4~iax8KK|47hp@Qe|^xa&~28LV0v$b1}=fEj#9D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RawDWpib6 -c4cHjd30rSGX8=VN#A(BKKz&v`r;e6DUv<<*U}cmb;*F>vukd; -=m`ygb@x#_>`RmOO$0)3Z)}yry~#}iVEJ)s5j^%uEnQ9{n2s|9Fa^ps+HG#`XS5DMY;b5{PIYZeZ)9O} -Xt{%a=RmHK6WZ%EWRm@*ULd%lgGoFTxUTU -76^nC$%1sKzB<;EQA|)S-x88IWKN#S$#@T&w`gPtRC#b^PGN0jYXqYdo~D%m7H6OD0<^0n_2##VWXRdj -y=DB@qgYOj1yf~hNn||$B0+O=X=iRyWp-s@Y-MCYbaY{3XhLjhZe&wsVQf@*P;_zx1ONyAAHY;R+00(t`--)Viz -@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCd;@jJLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF0Ra(XZ*FF3 -WMyu2X<=+rbYXO500sjDb7f&{0wHj#q4l6D4ZcK)2hLYH81C&KXiWu&flb+s{C0G-{HLh$xdReUg_1Rx -g;i+JW4?*h+3X!X@fjr@d0Ii -mUQ-Q1Z;0(YXW)$9p7nv%krpqNJW4?*h+3X!X@fjr@d0Ii -mUQ-Q1Z;0(YXW)$9p7nv%krpqNc;WdH^P1aoC!Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEQdsjYvyJ^#nX;x^@N4Cyn`(=BbYXO50sJ&Y-CxfQ3;(PYq10COK -earHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%A5Mys{ -W@%()Zggp3Y*S@nYybuW1aoC!Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwESop>%7&o7^|1F -n59cLW!>7R25;!;B10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)y -umJ%B2y$h1WnpY(WB>*O1aoC!Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEQdsjYvyJ^#nX; -x^@N4Cyn`(=BbYXO50p}%){+CCYqok=CI6O*0D2Q5~XK8~xVetWFewK9hZ3Jv@ -V`~C>10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)y -umJ%eL349yXKqquc4c8~Wn@HQbYVhlX>MdwWnpYocu;h51OxyKV{dL|X=G(?bZKF100sjDb7f&{0wHj# -q4l6D4ZcK)2hLYH81C&KXiWu&flb+s{C0G-{Ad~Lyw$T9tCzEwrAszt-P)%HZ|LbH=L2A=l(W4CP6cyx -VRU5ya1CV;vVwtcAGbZ_5@VACR|ut2VXXq-)V^B9&!_4M1Z;0(YXW)$9p7nv%krpqNc;WdH^P -1aoC!Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEU;2^0@;NPlb{-n1xko1uZcKL=FhMw)iW@ -^B~GyS4IVMbYXO50dNgv5VC@SZy&ck10COKearHwcS=7M -7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%A5Mys{W@%()Zggp3 -Y*S@nYybuW1aoC!Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwESop>%7&o7^|1Fn59cLW!>7R -25;!;B10COK -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 -oRaGgLvLn+a -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 -N(I! -Xk~3-1_cOhWprU=VRT^t2?2HFP59r=ivkxis%Ku=2wF -+7z(Wqt=tdZk`V^s(Ana000000093000000000YNb8~5DZf#|5baMa-0f+wLWmt%8=p4R=gtK{LClh6Z -#kObxUW*hKHnBv9xdAr8G@<&SffJ|QFn~N>u=2wF+7z(Wqt=tdZk`V^s(Ana000000093000000000Sg -VQgh?V`*h`00{v`?dHP>9R0ZFSEMRj;Km4qfBYZ5UUs>0bg9bqiCNA700000000300000000009c42I3 -WMOn~asUJZ00eGtZe;)f009JZZ*64&1pxwLa5aA+<>R2XhQO_4{AcS-HH^7AVzASV8M4NYxyCka@1Z8) -ymjIKNK5;L!8FkfGTe+FK;UUh9M-4n+}vRcM{I9mVQf=$VRU5$0RRdC)$WoGNrWQHGZU6uP000000RI300000001-!Q -Z(?C=Q*>c;Wm98lWo=;w0|;_ub7gXNWn=<+10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUE}_h5K% -L=laq&yA1JoJ^{7>oKLkF4~iax8KK|47hp)b7gHwWCBI%qhH(hioJpYH;+t0eX2w~A!Q+0eaZ{MVycPK^j{VR%V&Wo>f+00R$4Y;R&=Y*Tb$bY)a|aAgGn -0006EM{I9mVQf}mY;|RG1pxpE0WzLeQ3m-<6)UHjqig^*m4co5us7ukl*0UQzs7w8g#iEn000000RR60 -0000000>EBWo~q7ba@2<00ja9$}AplgPGkh3_fq3Q7_j=2#kPT_9!;lWR>~GYywm#NWLQ%D(Hkon&*Qw -pawq)`VKLB>Wd>h=Ype%b?27200;ugEFN!zncXl9K5w2;FV{y1jDTJCC^p$-mHEbO0#qkRz9SbZ=!8X@ -=Yuq$20sb<4l#S`iz7Vef}@Ca=a#qt00000000304*&oF00005Np5g;bOr(kaB^jKPjz$wlMuXsu{2tX -FT+?;?hj39&>gq>HOrf1lB-q;n)I5N2y$g}WpZ|9WCD5v9p7nv%krpqN%$n#j0HLDJN5-IKgM_J7b(p+0MPGk2Gl)y2(Rz0hP$+dLDIRU(}XWLTZug -enOC;Z(5k~zEJnJiX;;E#Q^{S000000RR600000000v2JaCLNZ1pxpF0o9FP2n?Horiuqf0^m>2O`jNR -ziT$b7#=ya6uYYC;s5{u000000RR600000000vB9d1Z1j0|EzPX>?<6X>I@pY-w?IX=DKjO=VlVN`i=Wd#8M00Ie3WprUyVQh6}1pxpE002M$0000000030{{R3000008O=WapWMOn+ -1pxpG0d?d}_}|Wp0vpvv$c&#PW69R$ltr%da5t5w^x+8!q5%{oJdRMsrjHBJ^EIe4enz&iEACnc`NWk% ->en!wdoTb1000000093000000000Y5V`Fu4a%FB~Wpf4s18r$;00065ZDDu-00In8a6@lxZE19EWo~o^ -3j=0mb^+R(Q4?4eR(6nw`MZ*F5{000OEZ*Ww3aAg5e7%8g>mNAq~ -6HF>1W#;Gy1&akla$y^tAD1n$toKU@ZDn*}WMOn+0(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@O -CT*{+#r3Bk2FRnL+RBXEn8vr=x`Tq%|A_kfK&ST81_x(sZ(?C=a{_t;9p7nv%krpqN0-0(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCT*{+#r3Bk2FRnL+RBXEn8vr=x`Tq% -|A_kfK&ST81_^dyY-Mg^X=QT)dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThsZfv!yd427@;7veO2zMB=|GYNKKY-wa+bZ>G3dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0 -ThV1_J_b -Z~>Lb=6W7=VqesjRYGc!>wZFzp>JB4@xD;^wu&SY_r(Hqc>#z1;$>KfZ0H=mhJ>?uVM0r~W- -2xhK9cV^W63=w?&L0!8YhU)%QMkO4aJ;_ZeCe;xE! -X<$x_Fs4If6Z`oP*=q!&6rQG)02XJT?*g=|B=zREie$*y(7k2+*P~cYjROi{baY{3Xl-R~bN~eb0YWfg -g^0-1s}v?c$Nk9{EX~mW5dRI6fB-~%h??EZc?eQvWMyS-Wn={b015#{?dHP>9R0ZFSEMRj;Km4qfBYZ5 -UUs>0bg9bqiCNA8mB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<0000000000{{R30000004pL=y -WnpY(WI=RvVPj|p0t9AhY-Irnwto`e>uZ$?1z+)WysMU3t2e*Ffe9Y;*ts5D-#jc4c8~ -Wn@NmZf9v?Y-I)k1$JRKwa1v8ba_B>T#2Nxy=Q)6glZD9rt17>D+ -0ot2U6Id2jc94hrndMfLayEe1ISdA&%p{mB1!VWk)dgm3VP|s!dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0 -ThOi(W05|TJ%PM*ricn_PmXk-a=X>Db5bYX39002k{WMy_` -Y;SO7asjsJfQB3>bs~EXcCXx(drQcb3B`Fx$)^%va$Ar)C7cOuWprUwd2nTO015$hC`}q*rYXqYdo~D%m7H6OD -0<^0n_2##VWXRdjy=DB@qgYOj0000000000{{R30000003ukO^Vqt7ld2nTO015%s?vf5kh_h+&YE#h% -O8d1V_{UOl9{V;uR#^q%KfZ0H=mhJ>?uV9R0ZFSEMRj -;Km4qfBYZ5UUs>0bg9bqiCNA700000000300000000007XJu|>b7^w{7)aIA#9XnshcC})U)TI#r3b0k -yqD7}ejM+$yUGm(3T1e7Wo~n6Z*Fq{3ISww9zv-Vp*%wog4O?q)g04AaHEjnO6;Ie%sNwVNZtVhXadZr --SPY!h`6Z9%SYt5l1;p3@00000 -000300000000008a%FR6a&~280(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCjNpJN#A(BKKz&v -`r;e6DUv<<*U}cD+0ot2U6Id2j -c94hrndMfLayEe1ISdA&%p{mB1!VWk)e2*8Zgg^CV{}Pm0iOsgNjk^^qPoT1+zTRnAg`3vXv9d*8d@RX -y~6c6G6imLZewKt00<6ra$#@6CZd7@2WdSr&53UoI8eY9A{1GERg--GiI0S#x1is&)M%fmnGH3{G -WprU=VRT^u^?FS>S$_F2)vN@Mb6UJ-F(lri_dqerx4lR4>iBsz2WM<=Vqt7^0p25#Yo@G%*b#-tU^&3K -X?w7l?~*Sh8@1jRRblZzyas7*aCLNZ0jZ*TSChz_$|Xx}eRkFNAr%^eLl(1e@}~9=0-ijXfD2)Bb7^O8 -ZDnqBa{(ht>-pde{GkuQzBXTAin>IdF&9PAZ4eqJ|JRcX$HfVDVQgh?V`*h`0o{dW0B>Pr5ftu@@z<*O -39}j`u&O7io3b$Is?RA$O$l~kY-wa+bZ>G3dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0Thj-IXaCLM|VQ>KznP+6nwW~k}RP!NmuV?G -015$>$mV(;bz)!CmQ_M(k?Vd!kfCo{nDM?)_qK{868FUcDMVYyR82_wM5*Z}2x&2iAAvl{68TB;){@BD -#37|g0RR9100000|Nj60000005L9wuZgXjLX>V>*V`ybM?JbaMa-0f+wLWmt%8=p4R=gtK{LClh6Z#kObxUW*hKHnBv9xdAr8G@<&SffJ|QFn~N>u=2wF+7z(W -qt=tdZk`V^s(Ana000000093000000000YNb8~5DZf#|5baMa-0f+wLWmt%8=p4R=gtK{LClh6Z#kObx -UW*hKHnBv9xdAr8G@<&SffJ|QFn~N>u=2wF+7z(Wqt=tdZk`V^s(Ana000000093000000000SgVQgh? -V`*h`00{v`?dHP>9R0ZFSEMRj;Km4qfBYZ5UUs>0bg9bqiCNA700000000300000000009c42I3WMOn~ -asUJZ00eGtZe;)f009JZZ*64&1pxwLa5aA+<>R2XhQO_4{AcS-HH^7AVzASV8M4NYxyCka@1Z8)ymjIK -NK5;L!8FkfGTe+FK;UUh9M-4n+}vRfRB~Z%b7^#GZ*Ek1aAgGn0006GRC#b^LvL+uX>@I6Zgd0#00(Df -Ze??6a{vVa0eWpZ9+jxjF?kjkjKm%VAEccnz281lN_aBj?kEuWU;zqra$#@6CZU6-W0iOsgNjk^^ -qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G66JF53UoI8eY9A{1GERg--GiI0S#x1is&)M%fmnGH3z`Wq5RD -ZgXjGZU6-W0iOsgNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G67_D9zv-Vp*%wog4O?q)g04AaHEjn -O6;Ie%sNwVNZuM$d2nT9L349yXKr&sY-w&}Q)OXnRCrKyas&hb3uI+uY+-U?bZK^F00jX62mvIbO})vu -wNYes?|slVUJVKS -dpWWUDN*iLy7r@_$;(@v`JFEl;-`;0GZFv*0000000960000000006Cb98cbV{~R)def|Q10000000000|Nj6000000{|aGrbYWv?ZDnqB00jX62m#Gh -r9yo^9b7e4zX000000096000000000?Od2nT9L349yXKr&sY-w&} -Q)OXnRCsA*1OxyJWMyM)VRB(~X?A4*1pxpE0n!+g^zB)9g7@9zEeXi$)a}`73$!@VJ}Ihs;PdOHtN;K2 -000000RR6000000009VQb#7;AVr*pq1pxpE0WH#fNvB~JuvPjRzgRGz_prqexC}!&-1hZ8sf8UjcK`qY -000000RR600000000IhgbaHiLbairNWB>&L00;q}`(lVb{F+?>1tC589WlkJ4(T@u?8)d_7GlQG%sFlV -0000000030{{R30000303So3~VPj}*Wo~o;1pxpE0dCCHhI~QV&X+ep#A6w*Y?6dZtMP`1@htLD*t(0E -sQ>@~000000RR600000000~xMY-Mg^X=QT-0RRaBM(yUq2ps*m=2xUDT;RqCgn#@WzFu~@adfH5^@&-| -0000000000{{R30000003szxlWo~16RC#b^1pxp60tr@cX=GD$VRU5$0RR91 +N@L7b8`ZE +10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%N +MR;^&ZgXjGZc}4uWo=;w1_*6sbYWy+bYTDq0d?d}_}|Wp0vpvv$c&#PW69R$ltr%da5t5w^x+8!q5uE@ +000000RI300000000(DmZ(?C=a{vkf)$WoGNrn+a000000RI300000000(kqWMyS-a{vheM(yUq2ps*m=2xUD +T;RqCgn#@WzFu~@adfH5^@&-|0000000000{{R30000003t@9}X=iS2Wo~qH015$z{^Dg=h-~N_zJ`Re +d1EINWrM}GXaQb}6c#qIM2EQnHo-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4>GEG0000000000{{R30 +0000033g#@Wo~0>Wpe-t0Y>fS!w4MxxaL=+DqP^k2!wz9AHH68xp8!<%Jqp^&Hw-a000000RI3000000 +010+sY-wa+bZ>G11OfmAZf|a7000011aog~WdH>M0%CAAe<9`Lptgpr6F_xjAC6(~TLj#*ewi +Hf`^rCgHqw;r~cW`-QV>+d2nR~0RR9314d?c1pxp60u4rW +Zf9v?Y-Lk)VRU5#0SE?SX>@ZoGynww000OKMs;pyX<}?;RC#b^0|5bs~EXcCXx(drQcb +3B`Fx$)^%va$Ar)C7cFqVR>b8F#&nR*hvU%Hiwm>NkB*5l*n^F-s9AWUWw-#$_-O$8W0C`Wpi|HWpo0{ +EFN!zncXl9K5w2;FV{y1jDTJCC^p$-mHEbO0#qkqh9c2>uJC38-{*D7fZ(%hZo23R4S;p`Q9JBQllDyr +ZDn*}WMOn+0rh%KI9Y!AFx9LCk8@hQXE7w+qW3^C%eTEp@#^?_H3w&GZ(?C=a{=BXk!z-`g4hv-$6z_Y +xoLZ_neUP>BpbEf7FA*KKfDWJb8~5DZf#|5baMe&Xzr__;A$MtQCZuHvo#KIPivH_0HCB8b%J*a{=9jW&m$tWDykZj`7#3_zANbB(SO{shhGe=&H{tM@n+a000000RI300000001IJrb7^O8ZDnqBa{vkfhyLPaScq)s9KMExvw34D6J>+N +wrBxfixd_%u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a000000RI3000000010+s +Y-Mg^X=QT&2?0j!=EDda{kY~=q$*tC#t4Le{2#tvcDZqMsmk?aU=OZ$bvG|>z)+>9PT;Au-7)~D;-++hnxY;R&=Y*Tb$bY%qr015%s?vf5kh_h+&YE#h%O8d1V_{UOl +9{V;uR#^q%$8ES^HwOl>wiJc;WmI`^Wd#8M +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 -----END STRICT TYPE LIB----- diff --git a/stl/RGBCommit@0.1.0.stl b/stl/RGBCommit@0.1.0.stl index 393e937599b68f0aefe071c18506d2991506d750..f69722de1d4e1b140a1c1dd3856ca183408c0f2c 100644 GIT binary patch delta 154 zcmV;L0A>HMf1-V`TLA(D0F%ERAd`Io4zscW3?2anlc6(5lLjF0vqK^C1OW__0U{-{ zTqYL*v%n|!1}V!yJd-&DojN<3_MFxkGDSwL&NBN&quehMB5_>HrR)f8WprU=VRT`W z0R|zHDKH?jAukpR0RppyIm7}W2EXNPr!AXjMvk8@(slJDP*(&ecK1ktUo|B@bd?D~ IvuQj>1JNTmW&i*H delta 343 zcmZ2fyPjJ2yYls$$k(&$R9J2Y%hX zGH23jHs92ejQo_z{hSJ$S2MnmWn`cHz{q{_efbYO+{rol#i>yF_tJ_Agv{D}Ug0wf zBk$w`x~iLBsERX^VZwj4?`)cZ5}K ^ 1.. Transition} +@mnemonic(rider-serpent-algebra) +data TransitionBundle : inputMap InputMap, knownTransitions {OpId -> ^ 1.. Transition} @mnemonic(pirate-lithium-side) data TransitionSchema : metadata {MetaType ^ ..0xff} diff --git a/stl/RGBLogic@0.1.0.sta b/stl/RGBLogic@0.1.0.sta index 52fcdf53..c3f6662b 100644 --- a/stl/RGBLogic@0.1.0.sta +++ b/stl/RGBLogic@0.1.0.sta @@ -1,14 +1,14 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:E2vH0scY-5u2NHhW-M5$ZWEP-33VJvaA-yeF1fVR-37IJ1ak#nitro-sandra-salami +Id: stl:iLZ2rLhr-oAp7rHh-cX2LO3T-7evttnL-KT6MX!V-m64WEyQ#janet-mineral-phone Name: RGBLogic Dependencies: + RGBCommit#capsule-arthur-quest, BPCore#symbol-tropic-grand, - RGBCommit#level-exodus-final, Bitcoin#signal-color-cipher -Check-SHA256: 623219184b8b0df1ad047920ca4e596ff8865c5bc4d2b602028c9763cdbef182 +Check-SHA256: 3d7cbf9634aff9423e3c6eb8faf367617888cd6e7a7387d53f82a282dd881436 -2vSEvOmAmtV*?>@tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPA_P(yEWWu1Q`?ja}LTPkk +2vSEvOmAmtV*?gA)YJdyb_e-(VyK0oC~d|%S3T>cI*X5a67XKlF$4)xM?ynyZEb0EA#kgq^`I&ZzC?)! +&R01Y?(H9FO$CR6P1%k7c67A-20~CnZ*pbzY!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkk Z)t7=20~CnZ*pY?00DdlT>wB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 wjY>38tto&d&=eG4cRAF#( @@ -24,15 +24,15 @@ iRT*14O40w5C%+Pd1Z1jmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<1W#~DWCZ{SL}Fu5a&K>D n*!v8^Ea7rh?dzC2n+%RZ*X#DbN~eb0wHj#q4l6D4ZcK)2hLYH81C&KXiWu&flb+s{C0G-{6|jDT+rxD K6vW;JU&?LxLM72H?wDC1Zo}=N}D)4mkCE~Z(?C=PjX}i0tIhyPjX}dBrRR>2@LcryZYc>@6CZU6=Z -2X|?7Ze??G0gF(#a06?0nLd|SC|>c2?4}E((!U1rl;i3pNx$ZJGXivZ0-b*&?ZewKt00;zcaA{-$oqr?m -DhpU0U{upd9s)zXl?(G;`*3%$qQ|x+f^5_qmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<3Rh`# +w{Qb%c9}kxS14ZbiR`8eq|(0z@s#80B}u>LcryZYc>)$V)YJdyb_e-(VyK0oC~d|%S3T>cI*X5a67XKl +F$83F9zv-Vp*%wog4O?q)g04AaHEjnO6;Ie%sNwVNZti*Z*F5{000OCZ*Xa30v0&b)Bosp2l;klsD+^@ +ZN@rRJ?o`9i;sB{@LtU^1eM6@6CZU6=Z +2X|?7Ze??G0gF(#a06?0nLd|SC|>c2?4}E((!U1rl;i3pNx$ZJGXivZ0v0&b)Bosp2l;klsD+^@ZN@rR +J?o`9i;sB{@LtU^1T<0)t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zcaA{-$7C6+? +|LArH`F3Kcg`p^I#yVF$>!mu2k9iXCUd=HCmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<3Rh`# Ze??GPjX}g1ONwVXKrtDWn=&V009VLa${&|c4cG$00067ZE0?0WB>&L0bJY;BNZ=sBHM?<`J6+Fr=ADb5 +EJ!(G_IUTS%E$nK5(5czWo~p~bZK^F0000AS7~%^Wpi^-Z*v9%25ez@WpXhB7C6+?|LArH`F3Kcg`p^I +#yVF$>!mu2k9iXCUd=HCdBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W)00aqiX>Db5 bYX39002k -----END STRICT TYPE LIB----- diff --git a/stl/RGBLogic@0.1.0.stl b/stl/RGBLogic@0.1.0.stl index 327cbe7bbc9c0feeb4214898a62972355a218a92..7312516ad2152ac427a527f5b3a05b84983c6214 100644 GIT binary patch delta 277 zcmZqYZRa)N2y%Dw$xqKrW)`!!a{2#@GWMTkNh?|xYUCcX3b%c|)T+C`Qs_h6Swj|1 zpi1Zb+}zBP$$rcV>}*Z}&iO^D8>87-6bNaZyqifupEWN(FFBQgfrBN#ATx!Dpq`5? aF@z2FWz{FF=pu{487-6bLDwyqifupEWN(FFBQgfrBN#ATx!Dpq`5? aF@z2FWz{FF=pu{4 Date: Thu, 30 Jan 2025 12:12:59 +0100 Subject: [PATCH 23/70] operation: chain net in genesis + resolver check --- Cargo.lock | 92 +++++++ Cargo.toml | 1 + src/operation/commit.rs | 14 +- src/operation/layer1.rs | 126 ++++++++++ src/operation/mod.rs | 2 +- src/operation/operations.rs | 9 +- src/stl.rs | 4 +- src/validation/status.rs | 12 +- src/validation/validator.rs | 36 ++- stl/RGBCommit@0.1.0.sta | 471 ++++++++++++++++++------------------ stl/RGBCommit@0.1.0.stl | Bin 16034 -> 15951 bytes stl/RGBCommit@0.1.0.sty | 22 +- stl/RGBLogic@0.1.0.sta | 26 +- stl/RGBLogic@0.1.0.stl | Bin 1671 -> 1671 bytes stl/RGBLogic@0.1.0.sty | 14 +- stl/Transition.vesper | 3 +- 16 files changed, 536 insertions(+), 296 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cff088e1..4cecfc4f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -166,6 +166,12 @@ dependencies = [ "thiserror", ] +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + [[package]] name = "bitcoin-io" version = "0.1.2" @@ -259,6 +265,33 @@ dependencies = [ "strict_encoding", ] +[[package]] +name = "bp-derive" +version = "0.11.0-beta.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65e52af1dc2c8c8efd82ae24e48a556cae7f35de9cb42745aae3a79b8fd8cd3d" +dependencies = [ + "amplify", + "bp-consensus", + "bp-invoice", + "commit_verify", + "hmac", + "indexmap", + "sha2", +] + +[[package]] +name = "bp-invoice" +version = "0.11.0-beta.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "929663905dd8447a01a14fe35b31e62a4763c77f0757899cb9442b6d906fe701" +dependencies = [ + "amplify", + "bech32", + "bp-consensus", + "commit_verify", +] + [[package]] name = "bp-seals" version = "0.11.0-beta.9" @@ -276,6 +309,23 @@ dependencies = [ "strict_encoding", ] +[[package]] +name = "bp-std" +version = "0.11.0-beta.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe06ed7abc1faf9b8dd7d2e6b08ca0b8dbaff0b0f487926b8e1724938628f31c" +dependencies = [ + "amplify", + "bp-consensus", + "bp-derive", + "bp-invoice", + "descriptors", + "getrandom", + "psbt", + "secp256k1", + "wasm-bindgen", +] + [[package]] name = "bumpalo" version = "3.16.0" @@ -394,6 +444,17 @@ dependencies = [ "typenum", ] +[[package]] +name = "descriptors" +version = "0.11.0-beta.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "644bbfd06245939d6d61f937362c1870ef9e5af169aa85920452d70dd75b5993" +dependencies = [ + "amplify", + "bp-derive", + "indexmap", +] + [[package]] name = "digest" version = "0.10.7" @@ -402,6 +463,7 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", + "subtle", ] [[package]] @@ -464,6 +526,15 @@ dependencies = [ "arrayvec", ] +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + [[package]] name = "iana-time-zone" version = "0.1.61" @@ -592,6 +663,20 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "psbt" +version = "0.11.0-beta.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc697c385d5829ae4d92ea388ebb6f5fa657f1e328a6a3320e06d75dac8a437" +dependencies = [ + "amplify", + "base64", + "bp-derive", + "chrono", + "descriptors", + "indexmap", +] + [[package]] name = "quote" version = "1.0.37" @@ -639,6 +724,7 @@ dependencies = [ "amplify", "baid64", "bp-core", + "bp-std", "chrono", "commit_verify", "getrandom", @@ -851,6 +937,12 @@ dependencies = [ "serde_str_helpers", ] +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "syn" version = "1.0.109" diff --git a/Cargo.toml b/Cargo.toml index 2a9f5ea6..2fa53eec 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,6 +30,7 @@ aluvm = { version = "~0.11.0-beta.9", features = ["std", "ascii-armor"] } commit_verify = { version = "~0.11.0-beta.9", features = ["rand", "derive"] } single_use_seals = "~0.11.0-beta.9" bp-core = { version = "~0.11.0-beta.9" } +bp-std = { version = "~0.11.0-beta.9.1" } secp256k1 = { version = "0.30.0", features = ["global-context"] } mime = "~0.3.17" serde_crate = { package = "serde", version = "1", features = ["derive"], optional = true } diff --git a/src/operation/commit.rs b/src/operation/commit.rs index 5326913a..ee993511 100644 --- a/src/operation/commit.rs +++ b/src/operation/commit.rs @@ -37,11 +37,11 @@ use commit_verify::{ use strict_encoding::StrictDumb; use crate::{ - impl_serde_baid64, Assign, AssignmentType, Assignments, BundleId, ConcealedAttach, + impl_serde_baid64, Assign, AssignmentType, Assignments, BundleId, ChainNet, ConcealedAttach, ConcealedData, ConcealedState, ConcealedValue, ConfidentialState, DataState, ExposedSeal, - ExposedState, Extension, ExtensionType, Ffv, Genesis, GlobalState, GlobalStateType, Layer1, - Operation, Redeemed, SchemaId, SecretSeal, Transition, TransitionBundle, TransitionType, - TypedAssigns, LIB_NAME_RGB_COMMIT, + ExposedState, Extension, ExtensionType, Ffv, Genesis, GlobalState, GlobalStateType, Operation, + Redeemed, SchemaId, SecretSeal, Transition, TransitionBundle, TransitionType, TypedAssigns, + LIB_NAME_RGB_COMMIT, }; /// Unique contract identifier equivalent to the contract genesis commitment @@ -236,8 +236,7 @@ pub struct BaseCommitment { pub schema_id: SchemaId, pub timestamp: i64, pub issuer: StrictHash, - pub layer1: Layer1, - pub testnet: bool, + pub chain_net: ChainNet, } #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] @@ -279,8 +278,7 @@ impl Genesis { flags: self.flags, schema_id: self.schema_id, timestamp: self.timestamp, - layer1: self.layer1, - testnet: self.testnet, + chain_net: self.chain_net, issuer: self.issuer.commit_id(), }; OpCommitment { diff --git a/src/operation/layer1.rs b/src/operation/layer1.rs index 051c6a4c..9cc3e93a 100644 --- a/src/operation/layer1.rs +++ b/src/operation/layer1.rs @@ -20,6 +20,10 @@ // See the License for the specific language governing permissions and // limitations under the License. +use std::str::FromStr; + +use bp::BlockHash; +use bpstd::{AddressNetwork, Network}; use strict_encoding::{StrictDecode, StrictEncode, StrictType}; use crate::LIB_NAME_RGB_COMMIT; @@ -40,3 +44,125 @@ pub enum Layer1 { Bitcoin = 0, Liquid = 1, } + +#[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display)] +#[display(inner)] +#[derive(StrictType, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_COMMIT, tags = repr, into_u8, try_from_u8)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", rename_all = "camelCase") +)] +#[repr(u8)] +#[derive(Default)] +pub enum ChainNet { + BitcoinMainnet = 0, + BitcoinTestnet3 = 1, + #[default] + BitcoinTestnet4 = 2, + BitcoinSignet = 3, + BitcoinRegtest = 4, + LiquidMainnet = 5, + LiquidTestnet = 6, +} + +impl ChainNet { + pub fn prefix(&self) -> &str { + match self { + ChainNet::BitcoinMainnet => "bc", + ChainNet::BitcoinTestnet3 => "tb3", + ChainNet::BitcoinTestnet4 => "tb4", + ChainNet::BitcoinRegtest => "bcrt", + ChainNet::BitcoinSignet => "sb", + ChainNet::LiquidMainnet => "lq", + ChainNet::LiquidTestnet => "tl", + } + } + + pub fn layer1(&self) -> Layer1 { + match self { + ChainNet::BitcoinMainnet + | ChainNet::BitcoinTestnet3 + | ChainNet::BitcoinTestnet4 + | ChainNet::BitcoinSignet + | ChainNet::BitcoinRegtest => Layer1::Bitcoin, + ChainNet::LiquidMainnet | ChainNet::LiquidTestnet => Layer1::Liquid, + } + } + + pub fn address_network(&self) -> AddressNetwork { + match self { + ChainNet::BitcoinMainnet => AddressNetwork::Mainnet, + ChainNet::BitcoinTestnet3 | ChainNet::BitcoinTestnet4 | ChainNet::BitcoinSignet => { + AddressNetwork::Testnet + } + ChainNet::BitcoinRegtest => AddressNetwork::Regtest, + ChainNet::LiquidMainnet => AddressNetwork::Mainnet, + ChainNet::LiquidTestnet => AddressNetwork::Testnet, + } + } + + pub fn genesis_block_hash(&self) -> BlockHash { + BlockHash::from_str(match self { + ChainNet::BitcoinMainnet => { + "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f" + } + ChainNet::BitcoinTestnet3 => { + "000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943" + } + ChainNet::BitcoinTestnet4 => { + "00000000da84f2bafbbc53dee25a72ae507ff4914b867c565be350b0da8bf043" + } + ChainNet::BitcoinSignet => { + "00000008819873e925422c1ff0f99f7cc9bbb232af63a077a480a3633bee1ef6" + } + ChainNet::BitcoinRegtest => { + "0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206" + } + ChainNet::LiquidMainnet => { + "4f4eac81e5f9f04f5d2a17b03e6726e6a1af69d9c3f00d820f1c82fcb6000000" + } + ChainNet::LiquidTestnet => { + "f9f21a7636b35c12f080ff73fc8bb16bb7c3ceafdc2eb1b673f0ea7a40c00000" + } + }) + .unwrap() + } +} + +impl From for ChainNet { + fn from(value: Network) -> Self { + match value { + Network::Mainnet => ChainNet::BitcoinMainnet, + Network::Regtest => ChainNet::BitcoinRegtest, + Network::Signet => ChainNet::BitcoinSignet, + Network::Testnet3 => ChainNet::BitcoinTestnet3, + Network::Testnet4 => ChainNet::BitcoinTestnet4, + } + } +} + +#[derive(Debug, Display, Error, From)] +#[display(doc_comments)] +pub enum ChainNetParseError { + /// invalid chain-network pair {0}. + Invalid(String), +} + +impl FromStr for ChainNet { + type Err = ChainNetParseError; + + fn from_str(s: &str) -> Result { + match s.to_lowercase() { + x if ChainNet::BitcoinMainnet.prefix() == x => Ok(ChainNet::BitcoinMainnet), + x if ChainNet::BitcoinRegtest.prefix() == x => Ok(ChainNet::BitcoinRegtest), + x if ChainNet::BitcoinSignet.prefix() == x => Ok(ChainNet::BitcoinSignet), + x if ChainNet::BitcoinTestnet3.prefix() == x => Ok(ChainNet::BitcoinTestnet3), + x if ChainNet::BitcoinTestnet4.prefix() == x => Ok(ChainNet::BitcoinTestnet4), + x if ChainNet::LiquidMainnet.prefix() == x => Ok(ChainNet::LiquidMainnet), + x if ChainNet::LiquidTestnet.prefix() == x => Ok(ChainNet::LiquidTestnet), + _ => Err(ChainNetParseError::Invalid(s.to_owned())), + } + } +} diff --git a/src/operation/mod.rs b/src/operation/mod.rs index 33919647..c56d0d9a 100644 --- a/src/operation/mod.rs +++ b/src/operation/mod.rs @@ -46,7 +46,7 @@ pub use commit::{ pub use data::{ConcealedData, DataState, RevealedData, VoidState}; pub use fungible::{ConcealedValue, FungibleState, RevealedValue}; pub use global::{GlobalState, GlobalValues}; -pub use layer1::Layer1; +pub use layer1::{ChainNet, Layer1}; pub use meta::{MetaValue, Metadata, MetadataError}; pub use operations::{ Extension, Genesis, Identity, Input, Inputs, Operation, Opout, OpoutParseError, Redeemed, diff --git a/src/operation/operations.rs b/src/operation/operations.rs index 3a59b174..a4498816 100644 --- a/src/operation/operations.rs +++ b/src/operation/operations.rs @@ -37,9 +37,9 @@ use strict_encoding::{RString, StrictDeserialize, StrictEncode, StrictSerialize} use crate::schema::{self, ExtensionType, OpFullType, OpType, SchemaId, TransitionType}; use crate::{ - Assign, AssignmentIndex, AssignmentType, Assignments, AssignmentsRef, ConcealedAttach, - ConcealedData, ConcealedValue, ContractId, DiscloseHash, ExposedState, Ffv, GenesisSeal, - GlobalState, GraphSeal, Layer1, Metadata, OpDisclose, OpId, SecretSeal, TypedAssigns, + Assign, AssignmentIndex, AssignmentType, Assignments, AssignmentsRef, ChainNet, + ConcealedAttach, ConcealedData, ConcealedValue, ContractId, DiscloseHash, ExposedState, Ffv, + GenesisSeal, GlobalState, GraphSeal, Metadata, OpDisclose, OpId, SecretSeal, TypedAssigns, VoidState, LIB_NAME_RGB_COMMIT, }; @@ -343,8 +343,7 @@ pub struct Genesis { pub flags: ReservedBytes<1, 0>, pub timestamp: i64, pub issuer: Identity, - pub layer1: Layer1, - pub testnet: bool, + pub chain_net: ChainNet, pub metadata: Metadata, pub globals: GlobalState, pub assignments: Assignments, diff --git a/src/stl.rs b/src/stl.rs index d3d7ec67..7f158ed7 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -38,10 +38,10 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_COMMIT: &str = - "stl:FjjU0$$o-dgf5dmK-ohaEobc-Y6Vz3rp-TqLj3kS-8F7NMQQ#capsule-arthur-quest"; + "stl:n4BoS9Kd-oZ1mUgb-6Hqg9hY-q$JXa84-YoWed1a-!6AZCTM#raymond-open-organic"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:iLZ2rLhr-oAp7rHh-cX2LO3T-7evttnL-KT6MX!V-m64WEyQ#janet-mineral-phone"; + "stl:HffUFU0Z-oNyZXNs-O8u1dRc-Q4Z5mOo-3bqPppu-A0f5iTo#permit-helena-lorenzo"; fn _rgb_commit_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_COMMIT), tiny_bset! { diff --git a/src/validation/status.rs b/src/validation/status.rs index 49da5206..ba3402ec 100644 --- a/src/validation/status.rs +++ b/src/validation/status.rs @@ -31,7 +31,9 @@ use strict_types::SemId; use crate::schema::{self, SchemaId}; use crate::validation::WitnessResolverError; -use crate::{BundleId, ContractId, OccurrencesMismatch, OpFullType, OpId, Opout, StateType, Vin}; +use crate::{ + BundleId, ChainNet, ContractId, OccurrencesMismatch, OpFullType, OpId, Opout, StateType, Vin, +}; #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Display)] #[repr(u8)] @@ -160,9 +162,13 @@ impl Status { )] #[display(doc_comments)] pub enum Failure { - /// the contract network doesn't match (validator runs in testnet={0} + /// the contract chain-network pair doesn't match (validator runs in chain_net={0} /// configuration). - NetworkMismatch(bool), + ContractChainNetMismatch(ChainNet), + + /// the resolver chain-network pair doesn't match (validator runs in chain_net={0} + /// configuration). + ResolverChainNetMismatch(ChainNet), /// schema {actual} provided for the consignment validation doesn't match /// schema {expected} used by the contract. This means that the consignment diff --git a/src/validation/validator.rs b/src/validation/validator.rs index aa800029..20dba826 100644 --- a/src/validation/validator.rs +++ b/src/validation/validator.rs @@ -35,8 +35,8 @@ use super::{CheckedConsignment, ConsignmentApi, DbcProof, EAnchor, OpRef, Status use crate::operation::seal::ExposedSeal; use crate::vm::{ContractStateAccess, ContractStateEvolve, OrdOpRef, WitnessOrd}; use crate::{ - validation, BundleId, ContractId, OpId, OpType, Operation, Opout, OutputSeal, Schema, SchemaId, - TransitionBundle, + validation, BundleId, ChainNet, ContractId, OpId, OpType, Operation, Opout, OutputSeal, Schema, + SchemaId, TransitionBundle, }; #[derive(Clone, PartialEq, Eq, Debug, Display, Error, From)] @@ -53,6 +53,8 @@ pub enum WitnessResolverError { Unknown(Txid), /// unable to retrieve witness {0}, {1} Other(Txid, String), + /// resolver is for another chain-network pair + WrongChainNet, } pub trait ResolveWitness { @@ -61,6 +63,8 @@ pub trait ResolveWitness { fn resolve_pub_witness_ord(&self, witness_id: Txid) -> Result; + + fn check_chain_net(&self, chain_net: ChainNet) -> Result<(), WitnessResolverError>; } impl ResolveWitness for &T { @@ -74,6 +78,10 @@ impl ResolveWitness for &T { ) -> Result { ResolveWitness::resolve_pub_witness_ord(*self, witness_id) } + + fn check_chain_net(&self, chain_net: ChainNet) -> Result<(), WitnessResolverError> { + ResolveWitness::check_chain_net(*self, chain_net) + } } struct CheckedWitnessResolver { @@ -104,6 +112,10 @@ impl ResolveWitness for CheckedWitnessResolver { ) -> Result { self.inner.resolve_pub_witness_ord(witness_id) } + + fn check_chain_net(&self, chain_net: ChainNet) -> Result<(), WitnessResolverError> { + self.inner.check_chain_net(chain_net) + } } pub struct Validator< @@ -119,6 +131,7 @@ pub struct Validator< schema_id: SchemaId, contract_id: ContractId, + chain_net: ChainNet, contract_state: Rc>, validated_op_seals: RefCell>, @@ -145,6 +158,7 @@ impl< let genesis = consignment.genesis(); let contract_id = genesis.contract_id(); let schema_id = genesis.schema_id; + let chain_net = genesis.chain_net; // Prevent repeated validation of single-use seals let validated_op_seals = RefCell::new(BTreeSet::::new()); @@ -155,6 +169,7 @@ impl< status: RefCell::new(status), schema_id, contract_id, + chain_net, validated_op_seals, input_assignments: input_transitions, resolver: CheckedWitnessResolver::from(resolver), @@ -174,17 +189,24 @@ impl< pub fn validate( consignment: &'consignment C, resolver: &'resolver R, - testnet: bool, + chain_net: ChainNet, context: S::Context<'_>, ) -> Status { let mut validator = Self::init(consignment, resolver, context); - // If the network mismatches there is no point in validating the contract since - // all witness transactions will be missed. - if testnet != validator.consignment.genesis().testnet { + // If the chain-network pair doesn't match there is no point in validating the contract + // since all witness transactions will be missed. + if validator.chain_net != chain_net { + validator + .status + .borrow_mut() + .add_failure(Failure::ContractChainNetMismatch(chain_net)); + return validator.status.into_inner(); + } + if resolver.check_chain_net(chain_net).is_err() { validator .status .borrow_mut() - .add_failure(Failure::NetworkMismatch(testnet)); + .add_failure(Failure::ResolverChainNetMismatch(chain_net)); return validator.status.into_inner(); } diff --git a/stl/RGBCommit@0.1.0.sta b/stl/RGBCommit@0.1.0.sta index 4dccc426..ced2066b 100644 --- a/stl/RGBCommit@0.1.0.sta +++ b/stl/RGBCommit@0.1.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:FjjU0$$o-dgf5dmK-ohaEobc-Y6Vz3rp-TqLj3kS-8F7NMQQ#capsule-arthur-quest +Id: stl:n4BoS9Kd-oZ1mUgb-6Hqg9hY-q$JXa84-YoWed1a-!6AZCTM#raymond-open-organic Name: RGBCommit Dependencies: BPCore#symbol-tropic-grand, @@ -8,7 +8,7 @@ Dependencies: CommitVerify#miller-pancake-elastic, Std#ralph-blue-lucky, Bitcoin#signal-color-cipher -Check-SHA256: d962ea87194c00a283f546c2787a30e2a16c396deabb107af66218664d63e270 +Check-SHA256: 88954d8b1822bdd4fb13a2f1eb7fc7eec49e010e69dcbd009e07aff60255070a 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 +9p7nv%krpqNc;WdH^P1aoC! +Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEQdsjYvyJ^#nX;x^@N4Cyn`(=BbYXO50sJ&Y-CxfQ3;(PYq10COKearHwcS=7M7YzYa +I8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%A5Mys{W@%()Zggp3Y*S@n +YybuW1aoC!Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwESop>%7&o7^|1Fn59cLW!>7R25;!; +B10COKearHw +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 -N@L7b8`ZE -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 -9{V;uR#^q%$8ES^HwOl>wiJc;WmI`^Wd#8M -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 +307}uWK(oubY%qr0000 -----END STRICT TYPE LIB----- diff --git a/stl/RGBCommit@0.1.0.stl b/stl/RGBCommit@0.1.0.stl index f69722de1d4e1b140a1c1dd3856ca183408c0f2c..760cfd78b699c8dcb0da29a840c2c0f1e3167c34 100644 GIT binary patch delta 348 zcmZ2fd%k8vC^IAT0e%X-MKK+)x@ItziVA%`>$miG(Kxz<8X$mWM=0}$}CCF&&=}$YRyY6Vc>`ILsE-N zfP7;{GyxMPUZ{%T%yggvW|#p%s;TKEKus*XIhlo}nJG{MS)p90d2E}{D|}{|Tx6y; z`Gx8-E#jTL`M=s-*2Uj+7&Upfen}6j*eP4IH-xjytuIvQZNBCiM@!8EoED;=&X;F! zgIKdmNZu6L?i(!4UoY=< K-yCi2&I|zbI*#f9 delta 387 zcmX?Kv#54MC^Hia!(>}+g~{d2{HlpS&tbOVtPY3sVQ%)4y z-FtkcBd+tg)G6NJEGYr@lGNgoywnn=i5nFZ2-&pxuEJ*)MxMzRRZr8#g2}7Qf;UU5 zcd<&b`GDQe%*39QS(2Qena9AElUZ1rnZmeuu@0l=X-AvMmMn9vtY>|jb4}97)osl= zqu;KJ@8}CE6~>%i`i3JnwInemu_STw15L%r3Hpkg`Sfn_D6s8+n!8+gcDh^Ne7#Gh cUsVFaS=7tEdo;wGs@j!I<#gQ4VeQTg059#Od;kCd diff --git a/stl/RGBCommit@0.1.0.sty b/stl/RGBCommit@0.1.0.sty index 3fe7bab5..338d7f9f 100644 --- a/stl/RGBCommit@0.1.0.sty +++ b/stl/RGBCommit@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:FjjU0$$o-dgf5dmK-ohaEobc-Y6Vz3rp-TqLj3kS-8F7NMQQ#capsule-arthur-quest + Id: stl:n4BoS9Kd-oZ1mUgb-6Hqg9hY-q$JXa84-YoWed1a-!6AZCTM#raymond-open-organic Name: RGBCommit Version: 0.1.0 Description: Consensus commitment layer for RGB smart contracts @@ -34,7 +34,6 @@ import CommitVerify#miller-pancake-elastic import Std#ralph-blue-lucky use AsciiPrintable#ultra-sunset-format - use Bool#oxygen-complex-duet use AlphaNumLodash#percent-bingo-caesar use AlphaCapsLodash#duet-hammer-labor @@ -170,13 +169,17 @@ data AttachId : [Byte ^ 32] @mnemonic(harvard-burma-bicycle) data AttachState : id AttachId, mediaType MediaType -@mnemonic(bagel-ground-provide) +@mnemonic(stadium-stadium-vacuum) data BaseCommitment : flags CommitVerify.ReservedBytes1 , schemaId SchemaId , timestamp I64 , issuer CommitVerify.StrictHash - , layer1 Layer1 - , testnet Std.Bool + , chainNet ChainNet + +@mnemonic(ringo-fashion-enrico) +data ChainNet : bitcoinMainnet | bitcoinTestnet3 | bitcoinTestnet4 | bitcoinSignet + | bitcoinRegtest | liquidMainnet | liquidTestnet + @mnemonic(meter-arizona-albino) data ConcealedAttach : [Byte ^ 32] @@ -227,14 +230,13 @@ data FungibleState : bits64#8 U64 | (|) data FungibleType : unsigned64Bit#8 | (|) -@mnemonic(friday-cliff-ticket) +@mnemonic(bazooka-couple-summer) data Genesis : ffv Ffv , schemaId SchemaId , flags CommitVerify.ReservedBytes1 , timestamp I64 , issuer Identity - , layer1 Layer1 - , testnet Std.Bool + , chainNet ChainNet , metadata Metadata , globals GlobalState , assignments AssignmentsBlindSealTxid @@ -274,10 +276,6 @@ data InputMap : {Bitcoin.Vout -> ^ 1.. OpId} @mnemonic(sector-charlie-diagram) data Inputs : {Input} -@mnemonic(camilla-basket-justin) -data Layer1 : bitcoin | liquid - - @mnemonic(isabel-heaven-north) data MediaType : any#255 | (|) diff --git a/stl/RGBLogic@0.1.0.sta b/stl/RGBLogic@0.1.0.sta index c3f6662b..1ad80616 100644 --- a/stl/RGBLogic@0.1.0.sta +++ b/stl/RGBLogic@0.1.0.sta @@ -1,14 +1,14 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:iLZ2rLhr-oAp7rHh-cX2LO3T-7evttnL-KT6MX!V-m64WEyQ#janet-mineral-phone +Id: stl:HffUFU0Z-oNyZXNs-O8u1dRc-Q4Z5mOo-3bqPppu-A0f5iTo#permit-helena-lorenzo Name: RGBLogic Dependencies: - RGBCommit#capsule-arthur-quest, BPCore#symbol-tropic-grand, + RGBCommit#raymond-open-organic, Bitcoin#signal-color-cipher -Check-SHA256: 3d7cbf9634aff9423e3c6eb8faf367617888cd6e7a7387d53f82a282dd881436 +Check-SHA256: 8d34caed4e853c7151edddfda253ec77aa3b73ceda15091820cb27240a0f5a81 -2vSEvOmAmtV*?gA)YJdyb_e-(VyK0oC~d|%S3T>cI*X5a67XKlF$4)xM?ynyZEb0EA#kgq^`I&ZzC?)! -&R01Y?(H9FO$CR6P1%k7c67A-20~CnZ*pbzY!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkk +2vSEvOmAmtV*?>@tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPA_P(yEWWuJg(OVXX8on}%7`W~n~ +g^Ir=cD&(=7J1!T`=A*KGYL{hLPKwDZE1A%Y!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkk Z)t7=20~CnZ*pY?00DdlT>wB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 wjY>38tto&d&=eG4cRAF#( @@ -24,15 +24,15 @@ iRT*14O40w5C%+Pd1Z1jmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<1W#~DWCZ{SL}Fu5a&K>D n*!v8^Ea7rh?dzC2n+%RZ*X#DbN~eb0wHj#q4l6D4ZcK)2hLYH81C&KXiWu&flb+s{C0G-{6|jDT+rxD K6vW;JU&?LxLM72H?wDC1Zo}=N}D)4mkCE~Z(?C=PjX}i0tIhyPjX}dBrRR>2@LcryZYc>)$V)YJdyb_e-(VyK0oC~d|%S3T>cI*X5a67XKl -F$83F9zv-Vp*%wog4O?q)g04AaHEjnO6;Ie%sNwVNZti*Z*F5{000OCZ*Xa30v0&b)Bosp2l;klsD+^@ -ZN@rRJ?o`9i;sB{@LtU^1eM6@6CZU6=Z -2X|?7Ze??G0gF(#a06?0nLd|SC|>c2?4}E((!U1rl;i3pNx$ZJGXivZ0v0&b)Bosp2l;klsD+^@ZN@rR -J?o`9i;sB{@LtU^1T<0)t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zcaA{-$7C6+? -|LArH`F3Kcg`p^I#yVF$>!mu2k9iXCUd=HCmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<3Rh`# +w{Qb%c9}kxS14ZbiR`8eq|(0z@s#80B}u>LcryZYc>@6CZU6=Z +2X|?7Ze??G0gF(#a06?0nLd|SC|>c2?4}E((!U1rl;i3pNx$ZJGXivZ0-u0rOVXX8on}%7`W~n~g^Ir= +cD&(=7J1!T`=A*KGc-~Ut`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zcaA{-$pMYpf +(w(85W>NmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<3Rh`# Ze??GPjX}g1ONwVXKrtDWn=&V009VLa${&|c4cG$00067ZE0?0WB>&L0bJY;BNZ=sBHM?<`J6+Fr=A!mu2k9iXCUd=HCdBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W)00aqiX>Db5 +EJ!(G_IUTS%E$nK5(5czWo~p~bZK^F0000AS7~%^Wpi^-Z*v9%25ez@WpXhBpMYpf(w(85W>NdBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W)00aqiX>Db5 bYX39002k -----END STRICT TYPE LIB----- diff --git a/stl/RGBLogic@0.1.0.stl b/stl/RGBLogic@0.1.0.stl index 7312516ad2152ac427a527f5b3a05b84983c6214..2fdb92b3ec204c7c7c26d4fb0efb40fb5922c71d 100644 GIT binary patch delta 277 zcmZqYZRh3U2y%Dw$xqKrW}fWFtYFCI6yTg+lsdm5!~4?Qg>%z_*nY{aux;(yuUfX} zVV79t-KgISBsq;afx4XYb8|CGHb%3vC=gOUc{h`SK5JfnUUDh}0|!ffL1qdQK|L2) aVh9`T%c@UU(M1-8$$MB!2rCR=GY0^Higo$` delta 277 zcmZqYZRa)N2y%Dw$xqKrW)`!!a{2#@GWMTkNh?|xYUCcX3b%c|)T+C`Qs_h6Swj|1 zpi1Zb+}zBP$$rcV>}*Z}&iO^D8>87-6bNaZyqifupEWN(FFBQgfrBN#ATx!Dpq`5? aF@z2FWz{FF=pu{4 Date: Wed, 12 Feb 2025 11:38:10 +0100 Subject: [PATCH 24/70] chore: remove bp-std --- Cargo.toml | 1 - src/operation/layer1.rs | 25 ------------------------- 2 files changed, 26 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 2fa53eec..2a9f5ea6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,7 +30,6 @@ aluvm = { version = "~0.11.0-beta.9", features = ["std", "ascii-armor"] } commit_verify = { version = "~0.11.0-beta.9", features = ["rand", "derive"] } single_use_seals = "~0.11.0-beta.9" bp-core = { version = "~0.11.0-beta.9" } -bp-std = { version = "~0.11.0-beta.9.1" } secp256k1 = { version = "0.30.0", features = ["global-context"] } mime = "~0.3.17" serde_crate = { package = "serde", version = "1", features = ["derive"], optional = true } diff --git a/src/operation/layer1.rs b/src/operation/layer1.rs index 9cc3e93a..574ff1da 100644 --- a/src/operation/layer1.rs +++ b/src/operation/layer1.rs @@ -23,7 +23,6 @@ use std::str::FromStr; use bp::BlockHash; -use bpstd::{AddressNetwork, Network}; use strict_encoding::{StrictDecode, StrictEncode, StrictType}; use crate::LIB_NAME_RGB_COMMIT; @@ -91,18 +90,6 @@ impl ChainNet { } } - pub fn address_network(&self) -> AddressNetwork { - match self { - ChainNet::BitcoinMainnet => AddressNetwork::Mainnet, - ChainNet::BitcoinTestnet3 | ChainNet::BitcoinTestnet4 | ChainNet::BitcoinSignet => { - AddressNetwork::Testnet - } - ChainNet::BitcoinRegtest => AddressNetwork::Regtest, - ChainNet::LiquidMainnet => AddressNetwork::Mainnet, - ChainNet::LiquidTestnet => AddressNetwork::Testnet, - } - } - pub fn genesis_block_hash(&self) -> BlockHash { BlockHash::from_str(match self { ChainNet::BitcoinMainnet => { @@ -131,18 +118,6 @@ impl ChainNet { } } -impl From for ChainNet { - fn from(value: Network) -> Self { - match value { - Network::Mainnet => ChainNet::BitcoinMainnet, - Network::Regtest => ChainNet::BitcoinRegtest, - Network::Signet => ChainNet::BitcoinSignet, - Network::Testnet3 => ChainNet::BitcoinTestnet3, - Network::Testnet4 => ChainNet::BitcoinTestnet4, - } - } -} - #[derive(Debug, Display, Error, From)] #[display(doc_comments)] pub enum ChainNetParseError { From a2013df7d9222dd3f4926435c7d04fde342c2217 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Wed, 12 Feb 2025 14:26:03 +0100 Subject: [PATCH 25/70] doc: fix Genesis fields --- doc/Commitments.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/Commitments.md b/doc/Commitments.md index df0eac2e..f4cc84cf 100644 --- a/doc/Commitments.md +++ b/doc/Commitments.md @@ -220,8 +220,7 @@ flowchart LR subgraph "Genesis" schemaId --> BaseCommitment - testnet --> BaseCommitment - closeMethod --> BaseCommitment + chainNet --> BaseCommitment end subgraph "Transition" From 5883d22bd3d0cd24ae411e0c3c98b06db6466f38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Wed, 12 Feb 2025 15:03:51 +0100 Subject: [PATCH 26/70] chore: update bp-core to 0.11.1-alpha.1 --- Cargo.lock | 124 +++++++---------------------------------------------- Cargo.toml | 2 +- 2 files changed, 17 insertions(+), 109 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4cecfc4f..fbb9e438 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -25,9 +25,9 @@ dependencies = [ [[package]] name = "amplify" -version = "4.7.0" +version = "4.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7147b742325842988dd6c793d55f58df3ae36bccf7d9b6e07db10ab035be343d" +checksum = "b2090b9b79b61d4047a307a46de043d0ee5ec406d99a7d652341b96d48ed5567" dependencies = [ "amplify_apfloat", "amplify_derive", @@ -166,12 +166,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "bech32" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" - [[package]] name = "bitcoin-io" version = "0.1.2" @@ -218,9 +212,9 @@ dependencies = [ [[package]] name = "bp-consensus" -version = "0.11.0-beta.9" +version = "0.11.1-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54db63118d55e32ea78f8775e98871d442a33e3bdef6419c7964d71b308316c0" +checksum = "40f227ce25d185bc5fc9109ca83dfa8bd0e745f219e320f3da658aaf4fd7e0c5" dependencies = [ "amplify", "chrono", @@ -233,9 +227,9 @@ dependencies = [ [[package]] name = "bp-core" -version = "0.11.0-beta.9" +version = "0.11.1-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e51a329150531b12243adf51d978490c796a6a20ec76c506b41c8e1226022bc" +checksum = "40c6b213ada98fe5e78a978e67a7044d16d2571edb3f85fcdb4246324ec9514a" dependencies = [ "amplify", "bp-consensus", @@ -252,9 +246,9 @@ dependencies = [ [[package]] name = "bp-dbc" -version = "0.11.0-beta.9" +version = "0.11.1-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9286fb448160672148262317f4647ebdcdd4699ed2bd34401f9799d0920cc376" +checksum = "d33d4cc345a595236441fc2b8726ca7eb693947914b278849d1e2c1923dcb314" dependencies = [ "amplify", "base85", @@ -265,38 +259,11 @@ dependencies = [ "strict_encoding", ] -[[package]] -name = "bp-derive" -version = "0.11.0-beta.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e52af1dc2c8c8efd82ae24e48a556cae7f35de9cb42745aae3a79b8fd8cd3d" -dependencies = [ - "amplify", - "bp-consensus", - "bp-invoice", - "commit_verify", - "hmac", - "indexmap", - "sha2", -] - -[[package]] -name = "bp-invoice" -version = "0.11.0-beta.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "929663905dd8447a01a14fe35b31e62a4763c77f0757899cb9442b6d906fe701" -dependencies = [ - "amplify", - "bech32", - "bp-consensus", - "commit_verify", -] - [[package]] name = "bp-seals" -version = "0.11.0-beta.9" +version = "0.11.1-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9873cfe420f4ce5cc539c394c75df0669cdbe2c23eed1930dffe024cb0f13a57" +checksum = "6a7a009fbf7e71be7ab5f43e032c69927f58cd7f59a6a822af64f84d3e8d41c5" dependencies = [ "amplify", "baid64", @@ -309,23 +276,6 @@ dependencies = [ "strict_encoding", ] -[[package]] -name = "bp-std" -version = "0.11.0-beta.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe06ed7abc1faf9b8dd7d2e6b08ca0b8dbaff0b0f487926b8e1724938628f31c" -dependencies = [ - "amplify", - "bp-consensus", - "bp-derive", - "bp-invoice", - "descriptors", - "getrandom", - "psbt", - "secp256k1", - "wasm-bindgen", -] - [[package]] name = "bumpalo" version = "3.16.0" @@ -369,9 +319,9 @@ dependencies = [ [[package]] name = "commit_encoding_derive" -version = "0.11.0-beta.8" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea07c5ad73a637276dc4f8a957f8285764018d45bdefef35eb9137f32d0e3c81" +checksum = "dc09678c15e9280cc6eaf29bf437a2cf18fadedd8bf78c369b8ac15fa217dbe5" dependencies = [ "amplify", "amplify_syn", @@ -382,9 +332,9 @@ dependencies = [ [[package]] name = "commit_verify" -version = "0.11.0-beta.9" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bf08c4941e147937551f6a3d370552d67f98cf72c9eb18948142596beadd31e" +checksum = "0fcf5f557e112c684f2458f20c66bab865c01cab56d6a318f64243cba9b163a7" dependencies = [ "amplify", "commit_encoding_derive", @@ -444,17 +394,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "descriptors" -version = "0.11.0-beta.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644bbfd06245939d6d61f937362c1870ef9e5af169aa85920452d70dd75b5993" -dependencies = [ - "amplify", - "bp-derive", - "indexmap", -] - [[package]] name = "digest" version = "0.10.7" @@ -463,7 +402,6 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", - "subtle", ] [[package]] @@ -526,15 +464,6 @@ dependencies = [ "arrayvec", ] -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - [[package]] name = "iana-time-zone" version = "0.1.61" @@ -663,20 +592,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "psbt" -version = "0.11.0-beta.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc697c385d5829ae4d92ea388ebb6f5fa657f1e328a6a3320e06d75dac8a437" -dependencies = [ - "amplify", - "base64", - "bp-derive", - "chrono", - "descriptors", - "indexmap", -] - [[package]] name = "quote" version = "1.0.37" @@ -724,7 +639,6 @@ dependencies = [ "amplify", "baid64", "bp-core", - "bp-std", "chrono", "commit_verify", "getrandom", @@ -873,9 +787,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "single_use_seals" -version = "0.11.0-beta.9" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec071f3b3153217f1cb2bca5ba7ac87eeafc446cb35a5c0643dec33495a37244" +checksum = "b01aad2d785dc858c4f652d1e18d0c815cd10aa8f15ac7accd2b12b894d7c367" dependencies = [ "amplify_derive", ] @@ -937,12 +851,6 @@ dependencies = [ "serde_str_helpers", ] -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - [[package]] name = "syn" version = "1.0.109" diff --git a/Cargo.toml b/Cargo.toml index 2a9f5ea6..c4a4608e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,7 +29,7 @@ strict_types = { version = "~2.7.2", features = ["armor"] } aluvm = { version = "~0.11.0-beta.9", features = ["std", "ascii-armor"] } commit_verify = { version = "~0.11.0-beta.9", features = ["rand", "derive"] } single_use_seals = "~0.11.0-beta.9" -bp-core = { version = "~0.11.0-beta.9" } +bp-core = { version = "~0.11.1-alpha.1" } secp256k1 = { version = "0.30.0", features = ["global-context"] } mime = "~0.3.17" serde_crate = { package = "serde", version = "1", features = ["derive"], optional = true } From af35bcd76e2912fd4ea6b799a60b76aec8318d8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Fri, 14 Feb 2025 18:08:37 +0100 Subject: [PATCH 27/70] operation: remove concealed states --- src/operation/assignments.rs | 121 ++++++----------------------------- src/operation/attachment.rs | 47 +------------- src/operation/commit.rs | 34 +++++----- src/operation/data.rs | 58 +---------------- src/operation/fungible.rs | 37 +---------- src/operation/mod.rs | 8 +-- src/operation/operations.rs | 23 +++---- src/operation/state.rs | 48 +------------- src/validation/logic.rs | 33 ++-------- src/validation/status.rs | 4 -- src/vm/op_contract.rs | 28 ++------ 11 files changed, 74 insertions(+), 367 deletions(-) diff --git a/src/operation/assignments.rs b/src/operation/assignments.rs index a47019cb..65459a67 100644 --- a/src/operation/assignments.rs +++ b/src/operation/assignments.rs @@ -54,45 +54,26 @@ pub type AssignAttach = Assign; #[strict_type( lib = LIB_NAME_RGB_COMMIT, tags = custom, - dumb = { Self::Confidential { seal: strict_dumb!(), state: strict_dumb!(), lock: default!() } } + dumb = { Self::Revealed { seal: strict_dumb!(), state: strict_dumb!(), lock: default!() } } )] #[cfg_attr( feature = "serde", derive(Serialize, Deserialize), - serde( - crate = "serde_crate", - rename_all = "camelCase", - untagged, - bound = "State::Confidential: serde::Serialize + serde::de::DeserializeOwned, State: \ - serde::Serialize + serde::de::DeserializeOwned, Seal: serde::Serialize + \ - serde::de::DeserializeOwned" - ) + serde(crate = "serde_crate", rename_all = "camelCase", untagged) )] pub enum Assign { #[strict_type(tag = 0x00)] - Confidential { - seal: SecretSeal, - state: State::Confidential, - lock: ReservedBytes<2, 0>, - }, - #[strict_type(tag = 0x03)] Revealed { seal: Seal, state: State, lock: ReservedBytes<2, 0>, }, - #[strict_type(tag = 0x02)] + #[strict_type(tag = 0x01)] ConfidentialSeal { seal: SecretSeal, state: State, lock: ReservedBytes<2, 0>, }, - #[strict_type(tag = 0x01)] - ConfidentialState { - seal: Seal, - state: State::Confidential, - lock: ReservedBytes<2, 0>, - }, } // Consensus-critical! @@ -113,7 +94,7 @@ impl Ord for Assign { impl PartialEq for Assign { fn eq(&self, other: &Self) -> bool { self.to_confidential_seal() == other.to_confidential_seal() - && self.to_confidential_state() == other.to_confidential_state() + && self.as_revealed_state() == other.as_revealed_state() } } @@ -130,20 +111,6 @@ impl Assign { pub fn with_seal_replaced(assignment: &Self, seal: Seal) -> Self { match assignment { - Assign::Confidential { - seal: _, - state, - lock, - } - | Assign::ConfidentialState { - seal: _, - state, - lock, - } => Assign::ConfidentialState { - seal, - state: *state, - lock: *lock, - }, Assign::ConfidentialSeal { seal: _, state, @@ -163,47 +130,33 @@ impl Assign { pub fn to_confidential_seal(&self) -> SecretSeal { match self { - Assign::Revealed { seal, .. } | Assign::ConfidentialState { seal, .. } => { - seal.conceal() - } - Assign::Confidential { seal, .. } | Assign::ConfidentialSeal { seal, .. } => *seal, + Assign::Revealed { seal, .. } => seal.conceal(), + Assign::ConfidentialSeal { seal, .. } => *seal, } } pub fn revealed_seal(&self) -> Option { match self { - Assign::Revealed { seal, .. } | Assign::ConfidentialState { seal, .. } => Some(*seal), - Assign::Confidential { .. } | Assign::ConfidentialSeal { .. } => None, + Assign::Revealed { seal, .. } => Some(*seal), + Assign::ConfidentialSeal { .. } => None, } } - pub fn to_confidential_state(&self) -> State::Confidential { + pub fn as_revealed_state(&self) -> &State { match self { - Assign::Revealed { state, .. } | Assign::ConfidentialSeal { state, .. } => { - state.conceal() - } - Assign::Confidential { state, .. } | Assign::ConfidentialState { state, .. } => *state, + Assign::Revealed { state, .. } | Assign::ConfidentialSeal { state, .. } => state, } } - pub fn as_revealed_state(&self) -> Option<&State> { + pub fn as_revealed_state_mut(&mut self) -> &mut State { match self { - Assign::Revealed { state, .. } | Assign::ConfidentialSeal { state, .. } => Some(state), - Assign::Confidential { .. } | Assign::ConfidentialState { .. } => None, + Assign::Revealed { state, .. } | Assign::ConfidentialSeal { state, .. } => state, } } - pub fn as_revealed_state_mut(&mut self) -> Option<&mut State> { + pub fn into_revealed_state(self) -> State { match self { - Assign::Revealed { state, .. } | Assign::ConfidentialSeal { state, .. } => Some(state), - Assign::Confidential { .. } | Assign::ConfidentialState { .. } => None, - } - } - - pub fn into_revealed_state(self) -> Option { - match self { - Assign::Revealed { state, .. } | Assign::ConfidentialSeal { state, .. } => Some(state), - Assign::Confidential { .. } | Assign::ConfidentialState { .. } => None, + Assign::Revealed { state, .. } | Assign::ConfidentialSeal { state, .. } => state, } } @@ -236,22 +189,12 @@ where Self: Clone fn conceal(&self) -> Self::Concealed { match self { - Assign::Confidential { .. } => self.clone(), - Assign::ConfidentialState { seal, state, lock } => Self::Confidential { - seal: seal.conceal(), - state: *state, - lock: *lock, - }, - Assign::Revealed { seal, state, lock } => Self::Confidential { + Assign::Revealed { seal, state, lock } => Self::ConfidentialSeal { seal: seal.conceal(), - state: state.conceal(), - lock: *lock, - }, - Assign::ConfidentialSeal { seal, state, lock } => Self::Confidential { - seal: *seal, - state: state.conceal(), + state: state.clone(), lock: *lock, }, + Assign::ConfidentialSeal { .. } => self.clone(), } } } @@ -259,11 +202,6 @@ where Self: Clone impl Assign { pub fn transmutate_seals(&self) -> Assign { match self { - Assign::Confidential { seal, state, lock } => Assign::Confidential { - seal: *seal, - state: *state, - lock: *lock, - }, Assign::ConfidentialSeal { seal, state, lock } => Assign::ConfidentialSeal { seal: *seal, state: state.clone(), @@ -274,11 +212,6 @@ impl Assign { state: state.clone(), lock: *lock, }, - Assign::ConfidentialState { seal, state, lock } => Assign::ConfidentialState { - seal: seal.transmutate(), - state: *state, - lock: *lock, - }, } } } @@ -487,10 +420,7 @@ impl TypedAssigns { } } - pub fn as_structured_state_at( - &self, - index: u16, - ) -> Result, UnknownDataError> { + pub fn as_structured_state_at(&self, index: u16) -> Result<&RevealedData, UnknownDataError> { match self { TypedAssigns::Structured(vec) => Ok(vec .get(index as usize) @@ -500,10 +430,7 @@ impl TypedAssigns { } } - pub fn as_fungible_state_at( - &self, - index: u16, - ) -> Result, UnknownDataError> { + pub fn as_fungible_state_at(&self, index: u16) -> Result<&RevealedValue, UnknownDataError> { match self { TypedAssigns::Fungible(vec) => Ok(vec .get(index as usize) @@ -513,10 +440,7 @@ impl TypedAssigns { } } - pub fn into_structured_state_at( - self, - index: u16, - ) -> Result, UnknownDataError> { + pub fn into_structured_state_at(self, index: u16) -> Result { match self { TypedAssigns::Structured(vec) => { if index as usize >= vec.len() { @@ -528,10 +452,7 @@ impl TypedAssigns { } } - pub fn into_fungible_state_at( - self, - index: u16, - ) -> Result, UnknownDataError> { + pub fn into_fungible_state_at(self, index: u16) -> Result { match self { TypedAssigns::Fungible(vec) => { if index as usize >= vec.len() { diff --git a/src/operation/attachment.rs b/src/operation/attachment.rs index 43084a06..2d53e1b7 100644 --- a/src/operation/attachment.rs +++ b/src/operation/attachment.rs @@ -27,13 +27,10 @@ use std::str::FromStr; use amplify::{ByteArray, Bytes32}; use baid64::{Baid64ParseError, DisplayBaid64, FromBaid64Str}; use bp::secp256k1::rand::{random, Rng, RngCore}; -use commit_verify::{CommitId, CommitmentId, Conceal, DigestExt, Sha256}; use strict_encoding::{StrictEncode, StrictSerialize}; -use super::{ConfidentialState, ExposedState}; -use crate::{ - impl_serde_baid64, ConcealedState, MediaType, RevealedState, StateType, LIB_NAME_RGB_COMMIT, -}; +use super::ExposedState; +use crate::{impl_serde_baid64, MediaType, RevealedState, StateType, LIB_NAME_RGB_COMMIT}; /// Unique data attachment identifier #[derive(Wrapper, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From)] @@ -94,8 +91,6 @@ impl From for AttachState { #[derive(Clone, PartialOrd, Ord, PartialEq, Eq, Hash, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB_COMMIT)] -#[derive(CommitEncode)] -#[commit_encode(strategy = strict, id = ConcealedAttach)] #[cfg_attr( feature = "serde", derive(Serialize, Deserialize), @@ -136,48 +131,10 @@ impl RevealedAttach { } impl ExposedState for RevealedAttach { - type Confidential = ConcealedAttach; fn state_type(&self) -> StateType { StateType::Attachment } fn state_data(&self) -> RevealedState { RevealedState::Attachment(self.clone()) } } -impl Conceal for RevealedAttach { - type Concealed = ConcealedAttach; - - fn conceal(&self) -> Self::Concealed { self.commit_id() } -} - -/// Confidential version of an attachment information. -/// -/// See also revealed version [`RevealedAttach`]. -#[derive(Wrapper, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From)] -#[wrapper(Deref, BorrowSlice, Hex, Index, RangeOps)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", transparent) -)] -pub struct ConcealedAttach( - #[from] - #[from([u8; 32])] - Bytes32, -); - -impl ConfidentialState for ConcealedAttach { - fn state_type(&self) -> StateType { StateType::Attachment } - fn state_commitment(&self) -> ConcealedState { ConcealedState::Attachment(*self) } -} - -impl From for ConcealedAttach { - fn from(hasher: Sha256) -> Self { hasher.finish().into() } -} - -impl CommitmentId for ConcealedAttach { - const TAG: &'static str = "urn:lnp-bp:rgb:state-attach#2024-02-12"; -} - #[cfg(test)] mod test { use super::*; diff --git a/src/operation/commit.rs b/src/operation/commit.rs index ee993511..437ab744 100644 --- a/src/operation/commit.rs +++ b/src/operation/commit.rs @@ -37,11 +37,11 @@ use commit_verify::{ use strict_encoding::StrictDumb; use crate::{ - impl_serde_baid64, Assign, AssignmentType, Assignments, BundleId, ChainNet, ConcealedAttach, - ConcealedData, ConcealedState, ConcealedValue, ConfidentialState, DataState, ExposedSeal, - ExposedState, Extension, ExtensionType, Ffv, Genesis, GlobalState, GlobalStateType, Operation, - Redeemed, SchemaId, SecretSeal, Transition, TransitionBundle, TransitionType, TypedAssigns, - LIB_NAME_RGB_COMMIT, + impl_serde_baid64, Assign, AssignmentType, Assignments, BundleId, ChainNet, DataState, + ExposedSeal, ExposedState, Extension, ExtensionType, Ffv, Genesis, GlobalState, + GlobalStateType, Operation, Redeemed, RevealedAttach, RevealedData, RevealedState, + RevealedValue, SchemaId, SecretSeal, Transition, TransitionBundle, TransitionType, + TypedAssigns, LIB_NAME_RGB_COMMIT, }; /// Unique contract identifier equivalent to the contract genesis commitment @@ -189,9 +189,9 @@ impl AssignmentIndex { pub struct OpDisclose { pub id: OpId, pub seals: MediumOrdMap, - pub fungible: MediumOrdMap, - pub data: MediumOrdMap, - pub attach: MediumOrdMap, + pub fungible: MediumOrdMap, + pub data: MediumOrdMap, + pub attach: MediumOrdMap, } #[derive(Clone, Eq, PartialEq, Hash, Debug)] @@ -335,21 +335,21 @@ impl Extension { } } -impl ConcealedState { +impl RevealedState { fn commit_encode(&self, e: &mut CommitEngine) { match self { - ConcealedState::Void => {} - ConcealedState::Fungible(val) => e.commit_to_serialized(&val), - ConcealedState::Structured(dat) => e.commit_to_serialized(dat), - ConcealedState::Attachment(att) => e.commit_to_serialized(att), + Self::Void => {} + Self::Fungible(val) => e.commit_to_serialized(&val), + Self::Structured(dat) => e.commit_to_serialized(dat), + Self::Attachment(att) => e.commit_to_serialized(att), } } } -#[derive(Copy, Clone, Eq, PartialEq, Debug)] +#[derive(Clone, Eq, PartialEq, Debug)] pub struct AssignmentCommitment { pub ty: AssignmentType, - pub state: ConcealedState, + pub state: RevealedState, pub seal: SecretSeal, pub lock: ReservedBytes<2, 0>, } @@ -368,12 +368,12 @@ impl CommitEncode for AssignmentCommitment { impl Assign { pub fn commitment(&self, ty: AssignmentType) -> AssignmentCommitment { - let Self::Confidential { seal, state, lock } = self.conceal() else { + let Self::ConfidentialSeal { seal, state, lock } = self.conceal() else { unreachable!(); }; AssignmentCommitment { ty, - state: state.state_commitment(), + state: state.state_data(), seal, lock, } diff --git a/src/operation/data.rs b/src/operation/data.rs index 1ad420b0..b841da22 100644 --- a/src/operation/data.rs +++ b/src/operation/data.rs @@ -25,13 +25,12 @@ use std::cmp::Ordering; use amplify::confinement::SmallBlob; use amplify::hex::ToHex; -use amplify::{Bytes32, Wrapper}; +use amplify::Wrapper; use bp::secp256k1::rand::{random, Rng, RngCore}; -use commit_verify::{CommitId, CommitmentId, Conceal, DigestExt, Sha256}; use strict_encoding::{StrictSerialize, StrictType}; -use super::{ConfidentialState, ExposedState}; -use crate::{ConcealedState, RevealedState, StateType, LIB_NAME_RGB_COMMIT}; +use super::ExposedState; +use crate::{RevealedState, StateType, LIB_NAME_RGB_COMMIT}; /// Struct using for storing Void (i.e. absent) state #[derive(Copy, Clone, Debug, PartialOrd, Ord, PartialEq, Eq, Hash, Display, Default)] @@ -41,22 +40,11 @@ use crate::{ConcealedState, RevealedState, StateType, LIB_NAME_RGB_COMMIT}; #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(crate = "serde_crate"))] pub struct VoidState(()); -impl ConfidentialState for VoidState { - fn state_type(&self) -> StateType { StateType::Void } - fn state_commitment(&self) -> ConcealedState { ConcealedState::Void } -} - impl ExposedState for VoidState { - type Confidential = VoidState; fn state_type(&self) -> StateType { StateType::Void } fn state_data(&self) -> RevealedState { RevealedState::Void } } -impl Conceal for VoidState { - type Concealed = VoidState; - fn conceal(&self) -> Self::Concealed { *self } -} - #[derive(Wrapper, Clone, Debug, PartialOrd, Ord, PartialEq, Eq, Hash, From, Display, Default)] #[display(LowerHex)] #[wrapper(Deref, AsSlice, BorrowSlice, Hex)] @@ -96,8 +84,6 @@ mod _serde { #[derive(Clone, Eq, PartialEq, Hash)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB_COMMIT)] -#[derive(CommitEncode)] -#[commit_encode(strategy = strict, id = ConcealedData)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(crate = "serde_crate"))] pub struct RevealedData { pub value: DataState, @@ -125,17 +111,10 @@ impl RevealedData { } impl ExposedState for RevealedData { - type Confidential = ConcealedData; fn state_type(&self) -> StateType { StateType::Structured } fn state_data(&self) -> RevealedState { RevealedState::Structured(self.clone()) } } -impl Conceal for RevealedData { - type Concealed = ConcealedData; - - fn conceal(&self) -> Self::Concealed { self.commit_id() } -} - impl PartialOrd for RevealedData { fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } } @@ -159,34 +138,3 @@ impl Debug for RevealedData { .finish() } } - -/// Confidential version of an structured state data. -/// -/// See also revealed version [`RevealedData`]. -#[derive(Wrapper, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From)] -#[wrapper(Deref, BorrowSlice, Hex, Index, RangeOps)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT, rename = "ConcealedData")] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", transparent) -)] -pub struct ConcealedData( - #[from] - #[from([u8; 32])] - Bytes32, -); - -impl ConfidentialState for ConcealedData { - fn state_type(&self) -> StateType { StateType::Structured } - fn state_commitment(&self) -> ConcealedState { ConcealedState::Structured(*self) } -} - -impl From for ConcealedData { - fn from(hasher: Sha256) -> Self { hasher.finish().into() } -} - -impl CommitmentId for ConcealedData { - const TAG: &'static str = "urn:lnp-bp:rgb:state-data#2024-02-12"; -} diff --git a/src/operation/fungible.rs b/src/operation/fungible.rs index 182dc12a..9e82758c 100644 --- a/src/operation/fungible.rs +++ b/src/operation/fungible.rs @@ -35,11 +35,10 @@ use core::num::ParseIntError; use core::str::FromStr; use std::hash::Hash; -use commit_verify::Conceal; use strict_encoding::{StrictDecode, StrictDumb, StrictEncode}; -use super::{ConfidentialState, ExposedState}; -use crate::{schema, ConcealedState, RevealedState, StateType, LIB_NAME_RGB_COMMIT}; +use super::ExposedState; +use crate::{schema, RevealedState, StateType, LIB_NAME_RGB_COMMIT}; /// An atom of an additive state, which thus can be monomorphically encrypted. #[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display, From)] @@ -112,38 +111,6 @@ impl RevealedValue { } impl ExposedState for RevealedValue { - type Confidential = ConcealedValue; fn state_type(&self) -> StateType { StateType::Fungible } fn state_data(&self) -> RevealedState { RevealedState::Fungible(*self) } } - -impl Conceal for RevealedValue { - type Concealed = ConcealedValue; - - fn conceal(&self) -> Self::Concealed { - ConcealedValue { - value: self.value, - concealed_dummy: (), - } - } -} - -#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT, rename = "ConcealedFungible")] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", rename_all = "camelCase") -)] -pub struct ConcealedValue { - /// Original value in smallest indivisible units - pub value: FungibleState, - /// Field necessary only to avoid clash with RevealedValue during yaml deserialization - pub concealed_dummy: (), -} - -impl ConfidentialState for ConcealedValue { - fn state_type(&self) -> StateType { StateType::Fungible } - fn state_commitment(&self) -> ConcealedState { ConcealedState::Fungible(*self) } -} diff --git a/src/operation/mod.rs b/src/operation/mod.rs index c56d0d9a..6db1613c 100644 --- a/src/operation/mod.rs +++ b/src/operation/mod.rs @@ -37,14 +37,14 @@ pub use assignments::{ Assign, AssignAttach, AssignData, AssignFungible, AssignRights, Assignments, AssignmentsRef, TypedAssigns, }; -pub use attachment::{AttachId, AttachState, ConcealedAttach, RevealedAttach}; +pub use attachment::{AttachId, AttachState, RevealedAttach}; pub use bundle::{BundleId, InputMap, TransitionBundle, Vin}; pub use commit::{ AssignmentCommitment, AssignmentIndex, BaseCommitment, BundleDisclosure, ContractId, DiscloseHash, GlobalCommitment, OpCommitment, OpDisclose, OpId, TypeCommitment, }; -pub use data::{ConcealedData, DataState, RevealedData, VoidState}; -pub use fungible::{ConcealedValue, FungibleState, RevealedValue}; +pub use data::{DataState, RevealedData, VoidState}; +pub use fungible::{FungibleState, RevealedValue}; pub use global::{GlobalState, GlobalValues}; pub use layer1::{ChainNet, Layer1}; pub use meta::{MetaValue, Metadata, MetadataError}; @@ -53,4 +53,4 @@ pub use operations::{ Transition, Valencies, }; pub use seal::{ExposedSeal, GenesisSeal, GraphSeal, OutputSeal, SecretSeal, TxoSeal}; -pub use state::{ConcealedState, ConfidentialState, ExposedState, RevealedState, StateType}; +pub use state::{ExposedState, RevealedState, StateType}; diff --git a/src/operation/operations.rs b/src/operation/operations.rs index a4498816..74c9174b 100644 --- a/src/operation/operations.rs +++ b/src/operation/operations.rs @@ -37,10 +37,10 @@ use strict_encoding::{RString, StrictDeserialize, StrictEncode, StrictSerialize} use crate::schema::{self, ExtensionType, OpFullType, OpType, SchemaId, TransitionType}; use crate::{ - Assign, AssignmentIndex, AssignmentType, Assignments, AssignmentsRef, ChainNet, - ConcealedAttach, ConcealedData, ConcealedValue, ContractId, DiscloseHash, ExposedState, Ffv, - GenesisSeal, GlobalState, GraphSeal, Metadata, OpDisclose, OpId, SecretSeal, TypedAssigns, - VoidState, LIB_NAME_RGB_COMMIT, + Assign, AssignmentIndex, AssignmentType, Assignments, AssignmentsRef, ChainNet, ContractId, + DiscloseHash, ExposedState, Ffv, GenesisSeal, GlobalState, GraphSeal, Metadata, OpDisclose, + OpId, RevealedAttach, RevealedData, RevealedValue, SecretSeal, TypedAssigns, VoidState, + LIB_NAME_RGB_COMMIT, }; #[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display)] @@ -248,23 +248,24 @@ pub trait Operation { ty: AssignmentType, a: &[Assign], seals: &mut BTreeMap, - state: &mut BTreeMap, + state: &mut BTreeMap, ) { for (index, assignment) in a.iter().enumerate() { if let Some(seal) = assignment.revealed_seal() { seals.insert(AssignmentIndex::new(ty, index as u16), seal.to_secret_seal()); } - if let Some(revealed) = assignment.as_revealed_state() { - state.insert(AssignmentIndex::new(ty, index as u16), revealed.conceal()); - } + state.insert( + AssignmentIndex::new(ty, index as u16), + assignment.as_revealed_state().clone(), + ); } } let mut seals: BTreeMap = bmap!(); let mut void: BTreeMap = bmap!(); - let mut fungible: BTreeMap = bmap!(); - let mut data: BTreeMap = bmap!(); - let mut attach: BTreeMap = bmap!(); + let mut fungible: BTreeMap = bmap!(); + let mut data: BTreeMap = bmap!(); + let mut attach: BTreeMap = bmap!(); for (ty, assigns) in self.assignments().flat() { match assigns { TypedAssigns::Declarative(a) => { diff --git a/src/operation/state.rs b/src/operation/state.rs index 294c9ffb..5edb64e6 100644 --- a/src/operation/state.rs +++ b/src/operation/state.rs @@ -23,32 +23,14 @@ use core::fmt::Debug; use core::hash::Hash; -use commit_verify::Conceal; use strict_encoding::{StrictDecode, StrictDumb, StrictEncode}; -use crate::{ - ConcealedAttach, ConcealedData, ConcealedValue, RevealedAttach, RevealedData, RevealedValue, -}; - -/// Marker trait for types of state which are just a commitment to the actual -/// state data. -pub trait ConfidentialState: Debug + Eq + Copy { - fn state_type(&self) -> StateType; - fn state_commitment(&self) -> ConcealedState; -} +use crate::{RevealedAttach, RevealedData, RevealedValue}; /// Marker trait for types of state holding explicit state data. pub trait ExposedState: - Debug - + StrictDumb - + StrictEncode - + StrictDecode - + Conceal - + Eq - + Ord - + Clone + Debug + StrictDumb + StrictEncode + StrictDecode + Eq + Ord + Clone { - type Confidential: ConfidentialState + StrictEncode + StrictDecode + StrictDumb; fn state_type(&self) -> StateType; fn state_data(&self) -> RevealedState; } @@ -99,29 +81,3 @@ impl RevealedState { } } } - -#[derive(Copy, Clone, Eq, PartialEq, Debug)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", rename_all = "camelCase", tag = "type") -)] -#[allow(clippy::large_enum_variant)] -pub enum ConcealedState { - Void, - Fungible(ConcealedValue), - Structured(ConcealedData), - Attachment(ConcealedAttach), -} - -impl ConfidentialState for ConcealedState { - fn state_type(&self) -> StateType { - match self { - ConcealedState::Void => StateType::Void, - ConcealedState::Fungible(_) => StateType::Fungible, - ConcealedState::Structured(_) => StateType::Structured, - ConcealedState::Attachment(_) => StateType::Attachment, - } - } - fn state_commitment(&self) -> ConcealedState { *self } -} diff --git a/src/validation/logic.rs b/src/validation/logic.rs index 00f2befa..d2dbddcf 100644 --- a/src/validation/logic.rs +++ b/src/validation/logic.rs @@ -36,10 +36,10 @@ use crate::schema::{AssignmentsSchema, GlobalSchema, ValencySchema}; use crate::validation::{CheckedConsignment, ConsignmentApi}; use crate::vm::{ContractStateAccess, ContractStateEvolve, OpInfo, OrdOpRef, RgbIsa, VmContext}; use crate::{ - validation, Assign, AssignmentType, Assignments, AssignmentsRef, ConcealedState, - ConfidentialState, ExposedSeal, ExposedState, Extension, GlobalState, GlobalStateSchema, - GlobalValues, GraphSeal, Inputs, MetaSchema, Metadata, OpId, Operation, Opout, - OwnedStateSchema, RevealedState, Schema, Transition, TypedAssigns, Valencies, + validation, Assign, AssignmentType, Assignments, AssignmentsRef, ExposedSeal, ExposedState, + Extension, GlobalState, GlobalStateSchema, GlobalValues, GraphSeal, Inputs, MetaSchema, + Metadata, OpId, Operation, Opout, OwnedStateSchema, RevealedState, Schema, Transition, + TypedAssigns, Valencies, }; impl Schema { @@ -565,31 +565,6 @@ impl OwnedStateSchema { ) -> validation::Status { let mut status = validation::Status::new(); match data { - Assign::Confidential { state, .. } | Assign::ConfidentialState { state, .. } => { - match (self, state.state_commitment()) { - (OwnedStateSchema::Declarative, ConcealedState::Void) => {} - (OwnedStateSchema::Fungible(_), ConcealedState::Fungible(_)) => {} - (OwnedStateSchema::Structured(_), ConcealedState::Structured(_)) => { - status.add_warning(validation::Warning::UncheckableConfidentialState( - opid, state_type, - )); - } - (OwnedStateSchema::Attachment(_), ConcealedState::Attachment(_)) => { - status.add_warning(validation::Warning::UncheckableConfidentialState( - opid, state_type, - )); - } - // all other options are mismatches - (state_schema, found) => { - status.add_failure(validation::Failure::StateTypeMismatch { - opid, - state_type, - expected: state_schema.state_type(), - found: found.state_type(), - }); - } - } - } Assign::Revealed { state, .. } | Assign::ConfidentialSeal { state, .. } => { match (self, state.state_data()) { (OwnedStateSchema::Declarative, RevealedState::Void) => {} diff --git a/src/validation/status.rs b/src/validation/status.rs index ba3402ec..ef074c43 100644 --- a/src/validation/status.rs +++ b/src/validation/status.rs @@ -360,10 +360,6 @@ pub enum Failure { )] #[display(doc_comments)] pub enum Warning { - /// operation {0} contains state in assignment {1} which is confidential and - /// thus was not validated. - UncheckableConfidentialState(OpId, schema::AssignmentType), - /// Custom warning by external services on top of RGB Core. #[display(inner)] Custom(String), diff --git a/src/vm/op_contract.rs b/src/vm/op_contract.rs index ce9af66a..930a312d 100644 --- a/src/vm/op_contract.rs +++ b/src/vm/op_contract.rs @@ -258,10 +258,7 @@ impl InstructionSet for ContractOp { TypedAssigns::Fungible(state) => { let mut values = vec![]; for assign in state.iter().map(Assign::as_revealed_state) { - match assign { - Some(rev) => values.push(rev.value.as_u64()), - None => fail!(), - } + values.push(assign.value.as_u64()) } values } @@ -278,10 +275,7 @@ impl InstructionSet for ContractOp { TypedAssigns::Fungible(state) => { let mut values = vec![]; for assign in state.iter().map(Assign::as_revealed_state) { - match assign { - Some(rev) => values.push(rev.value.as_u64()), - None => fail!(), - } + values.push(assign.value.as_u64()) } values } @@ -342,12 +336,8 @@ impl InstructionSet for ContractOp { else { fail!() }; - let state = state.map(|s| s.value.as_inner()); - if let Some(state) = state { - regs.set_s16(*reg, state); - } else { - regs.clr_s16(*reg); - } + let state = state.value.as_inner(); + regs.set_s16(*reg, state); } ContractOp::LdS(state_type, reg_32, reg) => { let Some(reg_32) = *regs.get_n(RegA::A16, *reg_32) else { @@ -363,12 +353,8 @@ impl InstructionSet for ContractOp { else { fail!() }; - let state = state.map(|s| s.value.into_inner()); - if let Some(state) = state { - regs.set_s16(*reg, state); - } else { - regs.clr_s16(*reg); - } + let state = state.value.into_inner(); + regs.set_s16(*reg, state); } ContractOp::LdF(state_type, reg_32, reg) => { let Some(reg_32) = *regs.get_n(RegA::A16, *reg_32) else { @@ -384,7 +370,7 @@ impl InstructionSet for ContractOp { else { fail!() }; - regs.set_n(RegA::A64, *reg, state.map(|s| s.value.as_u64())); + regs.set_n(RegA::A64, *reg, state.value.as_u64()); } ContractOp::LdG(state_type, reg_8, reg_s) => { let Some(reg_32) = *regs.get_n(RegA::A8, *reg_8) else { From 8dabd3658196513e7d94d590a066565a4e2c4687 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Wed, 19 Feb 2025 11:16:41 +0100 Subject: [PATCH 28/70] chore: experimental release v0.11.1-alpha.1. Do not use! --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fbb9e438..2ca8a564 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -633,7 +633,7 @@ dependencies = [ [[package]] name = "rgb-core" -version = "0.11.0-beta.9" +version = "0.11.1-alpha.1" dependencies = [ "aluvm", "amplify", diff --git a/Cargo.toml b/Cargo.toml index c4a4608e..7c602de6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rgb-core" -version = "0.11.0-beta.9" +version = "0.11.1-alpha.1" authors = ["Dr Maxim Orlovsky "] description = "RGB Core Library: confidential & scalable smart contracts on Bitcoin & Lightning (consensus layer)" repository = "https://github.com/RGB-WG/rgb-core" From 7bcb7c842c4a4b3aeae3eedee133a8be4d5fda5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Fri, 28 Feb 2025 17:58:05 +0100 Subject: [PATCH 29/70] chore: fix stl and tests --- src/stl.rs | 4 +- stl/AnchoredBundle.vesper | 80 +------- stl/RGBCommit@0.1.0.sta | 416 +++++++++++++++++--------------------- stl/RGBCommit@0.1.0.stl | Bin 15951 -> 12650 bytes stl/RGBCommit@0.1.0.sty | 103 +++------- stl/RGBLogic@0.1.0.sta | 26 +-- stl/RGBLogic@0.1.0.stl | Bin 1671 -> 1671 bytes stl/RGBLogic@0.1.0.sty | 4 +- stl/Transition.vesper | 80 +------- 9 files changed, 244 insertions(+), 469 deletions(-) diff --git a/src/stl.rs b/src/stl.rs index 7f158ed7..f5a2e81c 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -38,10 +38,10 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_COMMIT: &str = - "stl:n4BoS9Kd-oZ1mUgb-6Hqg9hY-q$JXa84-YoWed1a-!6AZCTM#raymond-open-organic"; + "stl:lhPZzkmM-XPl6NIu-rvxD3r3-h2L6yaq-rydEDe5-H4bi8w4#outside-pelican-reflex"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:HffUFU0Z-oNyZXNs-O8u1dRc-Q4Z5mOo-3bqPppu-A0f5iTo#permit-helena-lorenzo"; + "stl:5LehOU0m-g6h$ore-sH2a10I-bE8Z$5l-MMssex2-x$$9lF4#icon-think-learn"; fn _rgb_commit_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_COMMIT), tiny_bset! { diff --git a/stl/AnchoredBundle.vesper b/stl/AnchoredBundle.vesper index 6f3ea5a3..35236321 100644 --- a/stl/AnchoredBundle.vesper +++ b/stl/AnchoredBundle.vesper @@ -48,11 +48,7 @@ TransitionBundle rec value union TypedAssignsBlindSealTxPtr declarative list len=0..MAX16 wrapped tag=0 AssignVoidStateBlindSealTxPtr union - confidential rec tag=0 - seal bytes len=32 aka=SecretSeal - state is Unit aka=VoidState - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 + revealed rec tag=0 seal rec BlindSealTxPtr txid union TxPtr witnessTx is Unit tag=0 @@ -61,119 +57,65 @@ TransitionBundle rec blinding is U64 state is Unit aka=VoidState lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 + confidentialSeal rec tag=1 seal bytes len=32 aka=SecretSeal state is Unit aka=VoidState lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal rec BlindSealTxPtr - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state is Unit aka=VoidState - lock bytes len=2 aka=ReservedBytes2 fungible list len=0..MAX16 wrapped tag=1 AssignRevealedValueBlindSealTxPtr union - confidential rec tag=0 - seal bytes len=32 aka=SecretSeal - state rec ConcealedFungible - value union FungibleState - bits64 is U64 wrapped tag=0 - concealedDummy is Unit - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 + revealed rec tag=0 seal rec BlindSealTxPtr txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - state rec ConcealedFungible - value union FungibleState - bits64 is U64 wrapped tag=0 - concealedDummy is Unit - lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 - seal bytes len=32 aka=SecretSeal state rec RevealedFungible value union FungibleState bits64 is U64 wrapped tag=0 lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal rec BlindSealTxPtr - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 + confidentialSeal rec tag=1 + seal bytes len=32 aka=SecretSeal state rec RevealedFungible value union FungibleState bits64 is U64 wrapped tag=0 lock bytes len=2 aka=ReservedBytes2 structured list len=0..MAX16 wrapped tag=2 AssignRevealedDataBlindSealTxPtr union - confidential rec tag=0 - seal bytes len=32 aka=SecretSeal - state bytes len=32 aka=ConcealedData - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 + revealed rec tag=0 seal rec BlindSealTxPtr txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - state bytes len=32 aka=ConcealedData - lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 - seal bytes len=32 aka=SecretSeal state rec RevealedData value bytes len=0..MAX16 aka=DataState salt is U128 lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal rec BlindSealTxPtr - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 + confidentialSeal rec tag=1 + seal bytes len=32 aka=SecretSeal state rec RevealedData value bytes len=0..MAX16 aka=DataState salt is U128 lock bytes len=2 aka=ReservedBytes2 attachment list len=0..MAX16 wrapped tag=3 AssignRevealedAttachBlindSealTxPtr union - confidential rec tag=0 - seal bytes len=32 aka=SecretSeal - state bytes len=32 aka=ConcealedAttach - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 + revealed rec tag=0 seal rec BlindSealTxPtr txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - state bytes len=32 aka=ConcealedAttach - lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 - seal bytes len=32 aka=SecretSeal state rec RevealedAttach file rec AttachState id bytes len=32 aka=AttachId mediaType enum MediaType any=255 salt is U64 lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal rec BlindSealTxPtr - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 + confidentialSeal rec tag=1 + seal bytes len=32 aka=SecretSeal state rec RevealedAttach file rec AttachState id bytes len=32 aka=AttachId diff --git a/stl/RGBCommit@0.1.0.sta b/stl/RGBCommit@0.1.0.sta index ced2066b..e3b4237e 100644 --- a/stl/RGBCommit@0.1.0.sta +++ b/stl/RGBCommit@0.1.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:n4BoS9Kd-oZ1mUgb-6Hqg9hY-q$JXa84-YoWed1a-!6AZCTM#raymond-open-organic +Id: stl:lhPZzkmM-XPl6NIu-rvxD3r3-h2L6yaq-rydEDe5-H4bi8w4#outside-pelican-reflex Name: RGBCommit Dependencies: BPCore#symbol-tropic-grand, @@ -8,7 +8,7 @@ Dependencies: CommitVerify#miller-pancake-elastic, Std#ralph-blue-lucky, Bitcoin#signal-color-cipher -Check-SHA256: 88954d8b1822bdd4fb13a2f1eb7fc7eec49e010e69dcbd009e07aff60255070a +Check-SHA256: dcefdbcbb496afc0035f0e1c1e41689342b3e915f1f17831eeb954ed3d4cfec7 2~tNwLvL+uX>TU76^nC$%1sKzB<;E QA|)S-x88IWKN#S$#@T&w`gPtRC#b^PGN0jYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj1yf~h -Nn||$B0+O=X=iRyWp-s@Y-MCYbaY{3XhLjhZe&wsVQf@*P;_zx1ONyAAHY;R+00(t`--)Viz@~C%8KNS}Z0aQ3s -^SOqbBwN-D{wl@OCd;@jJLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF0Ra(XZ*FF3WMyu2X<=+rbYXO5 -00sjDb7f&{0wHj#q4l6D4ZcK)2hLYH81C&KXiWu&flb+s{C0G-{HLh$xdReUg_1Rxg;i+JW4?*h+3X!X@fjr@d0IimUQ-Q1Z;0(YXW)$ -9p7nv%krpqNJW4?*h+3X!X@fjr@d0IimUQ-Q1Z;0(YXW)$ -9p7nv%krpqNc;WdH^P1aoC! -Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEQdsjYvyJ^#nX;x^@N4Cyn`(=BbYXO50sJ&Y-CxfQ3;(PYq10COKearHwcS=7M7YzYa -I8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%A5Mys{W@%()Zggp3Y*S@n -YybuW1aoC!Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwESop>%7&o7^|1Fn59cLW!>7R25;!; -B10COKearHw -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 -307}uWK(oubY%qr0000 +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 +Thxis%Ku=2wF+7z(Wqt=tdZk`V^ +s(Ana000000093000000000MaWn^V#ZF2w#0Y>fS!w4MxxaL=+DqP^k2!wz9AHH68xp8!<%Jqp^&Hw-a +000000RI300000001IJrb7^O8ZDnqBa{vkfhyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0XD%j +q57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a000000RI3000000010+sY-Mg^X=QT&2?0j!=EDda +{kY~=q$*tC#t4Le{2#tvcDZqMsmk?aU=OZ$bvG|>z)+>9PT +;Au-7)~D;-++htxcywiMb7^mGRC#b^1pxp60s}^7b_D?d00Iq0b#7;AVr*qobYXO51OW&JVrg`9HZ%YQ +0RR993`TWsXK7+=WmI`^Wdi{Xb#8NMXKrO=HZ($MbO;AWWo~72X>$e(17>D+0ot2U6Id2jc94hrndMfL +ayEe1ISdA&%p{mB1!VWk)d+KAXk~3-Nn`<(Qq$W5tE;F{pQrXd&=l*`O?@#x{Qdy?T_k!`1dtE~W^7?+ +a{_t;9p7nv%krpqNDb5bYX39002k^X>)URWpV+w=zxYCD0L!x4tB5Hm3vFbl?lapNXe%XU~*fKJ0+Y5V`yP%Zcb%% +0j(ZClptSlj45aI>Ppga1W-frt90uqg8@)(CB7bYWy+bYTJYdQCW4e)%xftOSp9TD)g5B;KO; +Krzd=y+`rt_<1!4XKZg`VQg~&-XoD~rmTY45rxNKIl#GTd$5`Bk}o71wcZw0Vevn_3t@9}X=iS2Wo~qH +0YV$Z3Is=p4*x5!OXF$5bo;GIanRKCb)RX@dYz-TUkP?$Y-Mg^X=QT(-GycVZ((E+6z-1k*Q)plvl=9@ +swb(NvM}hX&nZVu33g#@X=Gt^Z*l^910COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUE}_h5K%L=laq +&yA1JoJ^{7>oKLkF4~iax8KK|47hp?M`dnhb7^x^V`ybVZDn*}WMOn+00{wgKfZ0H=mhJ>?uVa{vheM(yUq2ps*m=2xUDT;RqCgn#@W +zFu~@adfH5^@&-|0000000000{{R300000033g#@X=Gt^Z*l+x0ssVVZ*FA(00035b8l^B00jX8VsJHo +A?4$swuZp1Wc+9AOf`(TIbyKWjTy4WkGaM+ZSSEb;k|42*wg~2q@3^Lq|9zft}OB~jx>)hO73rB2k +Vqt7kbYXO51pxpG0oCr34oQf!Y4K`P(FaQVwIle)QgI&pHa%8Z1>xis%K-|*_9BKowP1qopf1fvG|`fdOK000000093000000000q3Y;R&=Y*Tb$bY)XxXk~3-1_KCkWpib6c4cG&dIKHb +X?@G`sCP;~6&DQwR5(-fxrUo0Th +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 +xrUo0ThV>qb#7#AWd;HW +X>M?JbWLG!0Tr2NWXrXyKnGOwA#t$mH2bG7pQ)aE=^FQF!@KkQh!AUTZ+C7~a$#@6CZgT(%0hP$+ +dLDIRU(}XWLTZugenOC;Z(5k~zEJnJiX;;E#R08YhjcV>N4>6_6SyX&ptxo1igHsc2cdhP$e%d~?$!YS +000000096000000000nFa$#@6CZc}4uWo=;w1_*6sbYWy+bYTDq0d?d}_}|Wp0vpvv$c&#PW69R$ +ltr%da5t5w^x+8!q5uE@000000RI300000000(DmZ(?C=a{vkf)$WoGNrn+a000000RI300000000wDpaCLNZ +015$z{^Dg=h-~N_zJ`Red1EINWrM}GXaQb}6c#qIM2EQnHo-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF +4>GEG0000000000{{R30000003t@9}X=iS2Wo~qH015$z{^Dg=h-~N_zJ`Red1EINWrM}GXaQb}6c#qI +M2EQnHo-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4>GEG0000000000{{R300000033g#@Wo~0>Wpe-t +0Y>fS!w4MxxaL=+DqP^k2!wz9AHH68xp8!<%Jqp^&Hw-a000000RI3000000010+sY-wa+bZ>G11OfmA +Zf|a7000011aog~WdH>M0%CAAe<9`Lptgpr6F_xjAC6(~TLj#*ewiHf`^rCgHqw;r~cW`-Qb7^w` +1pxuF6jyr<)WbQ@(CZ(W=ig937K21oZj>F1*aU<1)4fLl3UqQ|ZgXjLX>V=-1p)z|2rNlD$O59e#ogQs +B77jPl+h5j^*S;EG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(10tsb!bY*UHX>V=- +1p)z|2rNlD$O59e#ogQsB77jPl+h5j^*S;EWOW`wsTH9-LlJ`2|Ay5Z(?oEikl{+~pis;@ +Q*TJ#8dQ03Wn@8fb7^O8b3$xsZe&wsVQf@*P;_zx1ON+UWn*k%a$$67c4Yts0RRXAZxMm`#T#PnhgWq` +eMS>|xBI2`eUgpkI4MC;V)xV20000000000|Nj60000000SIPwZf9v?Y-Ioi0RRXA$tKg)lZIpnJ?s52 +Lb#i5700jX62mwiP2M#dZN%AXT +A9%-&dal959qWIGOJWz(UDXek?U(=n0000000960000000093AVRUq1V`yzM00;rIPS18A9{>CZ0|Ju;9Pya4*S_o#KSQ#S^GM00;qJNbG0cIzBFIR(d`#um0T+f+Ht6TBtC0P;Q%&@2p?|0000000030 +{{R30000023UhRFbz^jOa%E%y1pxpE0c!PSwI(YdXDh`S;c-XJf-JhsCbw@%Wz)m1PMN&5x&QzG00000 +0RR60000000RIYMbaY{3Xl-R~bN~eb00;qFo~-2t-FBm?{;M?9h#oN_CYm?uXkfmH1{@T?ji$~300000 +00030{{R3000009R$**qZewX>a|Hna2?0j!=EDda{kY~=q$*tC#t4Le{2#tvcDZqMsmk?c;Wd#8M000 -----END STRICT TYPE LIB----- diff --git a/stl/RGBCommit@0.1.0.stl b/stl/RGBCommit@0.1.0.stl index 760cfd78b699c8dcb0da29a840c2c0f1e3167c34..646b5a171f142fe422aeb7914b2bcfb8f1bd8daa 100644 GIT binary patch delta 759 zcmX?K^D1eB6AQBygVN-Bc6qjdk|Gu+hRKeyMw9KO)F(%$l>EiMbL6G};!EQ^Od`l*6@);>Ph{S$`;3T;ag-z_Czic0HE1nYAJ+FJ0d8=KK z%B;O-Di;Z^@xIbHXYT3AC35}>H~1t~)AC;5Skhd7C{(}DTj1B`&l82(XDi)ZdZ&b` z=kDgma=#ciM=5GCDmY0W;bL*`;QOz=-urRp!IIx=Jqs^f`BFMR^IX;3#oOXHFHve@ zA*gEdIi<4Ad(_ML6>=uTKK?T&Z$a4B6gB2=>7{)VlCuunG>KUjU8Kc&uw z9$p$)>n2>i{rA#uwUc_ET4*{3Bz?bpd9sYHg2G9)%U372rEu83{%i0w?@WfplV7L4 zaO&%4>=HfpUiiYq$uYJ{3Z8}Rd?Cbh=?d*N}d`^?1)d?w$YIrqryn|Z;W5|j7Z*eh)IJ71NnU6CzUElXc(B65|#Ls@Y-%IX$f!!4E@h1JAm7QL8Se2c@`hR!%o0QcpqgEJ{ z2jtD3^nOhO*iBhqQ@5&VE2L{5m3&y}ezr+x*BQ0#`JSnl53lo^xo7Jxu$!Xit$E6J lw`}psf2&QdbjTShsm(Hfm65QolTAkCK<~11lONdT0|4fBKVbj> delta 1618 zcmaErbiQVT6APp5WM>vtUKR$PDS%Eu%7`<+cOp_Zq5+`@FrZF;4 zKFA(9*_=IX@<&!>syan;@?1`J(w!qH5IH%YEp75V9{$N|*oCn;sem_CU{h0LzWjFE zr$Wh-nZr4j1|_a#dT?c5)Y0?HUvc6K9U}BXLgzR*WcE+?;8dil6Cj~Nk~2Uda)dK& z@+U5A5j20<9#~o_ z;08sG5|&UQ!Z;ks77{8%=tp%9C}gC0(tAq+Zuf<`ME&Si9$oP3Gs&ca=W=8k-FhbIfP2pRw}h2k}rb;pz<^qct~I3;kkr z;djo@OHNJ9NlkGqDM?JuU}a=rXJBwpVBm#IxFnV&!i5Fl!fvH`>6uA6sccM>gH_dq z_<+R)#2}Z_+}uhA28PY0B3g_Jks0q+FMNRV7Nj;a5=hdj0bO&!2_-2ltu9Cv@#{nQJKSdNEf(O6~vk$=t_}PEM36 zn;b9ZIax=$NI}yj`b3DY$1j(aFV#3Q4LjuU zckjs^TLV){-`8F+i{q7U*|mXdj^B!|udlqlnZ>=u;-a1As>%nSUoTw)c9ZUQ)VjDt#N$rm?nE!pl zQT`n~&Q^E6eYIQJDr;5_cGLXdNgZ~7X2mkHD%$>(H9WeK@1;5Co0Bi1#FCC(IAfUy sc2nM&D{VE7x6VyBcQ}$Pxh`i?i`VLpZS5a*J_X*`)jf0N@tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPA_P(yEWWuJg(OVXX8on}%7`W~n~ -g^Ir=cD&(=7J1!T`=A*KGYL{hLPKwDZE1A%Y!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkk +2vSEvOmAmtV*?>@tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPA_P(yEWWtJ1!&Pj}1`Fb>qtG^KU +uXuJZteUF4oe(#ja}LTPkk Z)t7=20~CnZ*pY?00DdlT>wB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 wjY>38tto&d&=eG4cRAF#( @@ -24,15 +24,15 @@ iRT*14O40w5C%+Pd1Z1jmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<1W#~DWCZ{SL}Fu5a&K>D n*!v8^Ea7rh?dzC2n+%RZ*X#DbN~eb0wHj#q4l6D4ZcK)2hLYH81C&KXiWu&flb+s{C0G-{6|jDT+rxD K6vW;JU&?LxLM72H?wDC1Zo}=N}D)4mkCE~Z(?C=PjX}i0tIhyPjX}dBrRR>2@LcryZYc>@6CZU6=Z -2X|?7Ze??G0gF(#a06?0nLd|SC|>c2?4}E((!U1rl;i3pNx$ZJGXivZ0-u0rOVXX8on}%7`W~n~g^Ir= -cD&(=7J1!T`=A*KGc-~Ut`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zcaA{-$pMYpf -(w(85W>NmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<3Rh`# +w{Qb%c9}kxS14ZbiR`8eq|(0z@s#80B}u>LcryZYc>tp7_pf+%FRYrXyqyp?xgUn& +^A2Qn9zv-Vp*%wog4O?q)g04AaHEjnO6;Ie%sNwVNZti*Z*F5{000OCZ*Xa30+tim&Pj}1`Fb>qtG^KU +uXuJZteUF4oe(#@6CZU6=Z +2X|?7Ze??G0gF(#a06?0nLd|SC|>c2?4}E((!U1rl;i3pNx$ZJGXivZ0+tim&Pj}1`Fb>qtG^KUuXuJZ +teUF4oe(#ZewKt00;zcaA{-$mJ`{| +NsL_idNhlxzYzDYcy=$WnyS2=5I4CWhT`)MmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<3Rh`# Ze??GPjX}g1ONwVXKrtDWn=&V009VLa${&|c4cG$00067ZE0?0WB>&L0bJY;BNZ=sBHM?<`J6+Fr=ANdBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W)00aqiX>Db5 +EJ!(G_IUTS%E$nK5(5czWo~p~bZK^F0000AS7~%^Wpi^-Z*v9%25ez@WpXhBmJ`{|NsL_idNhlxzYzDY +cy=$WnyS2=5I4CWhT`)MdBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W)00aqiX>Db5 bYX39002k -----END STRICT TYPE LIB----- diff --git a/stl/RGBLogic@0.1.0.stl b/stl/RGBLogic@0.1.0.stl index 2fdb92b3ec204c7c7c26d4fb0efb40fb5922c71d..f73be194263f7e9b27df1fce0af82135f234a342 100644 GIT binary patch delta 247 zcmZqYZRed}s4z|V<~h%vn4eW9-K+Ntd|zKtroU#^sy%ZB%y-JSJ^IYIF;I|&prXmU xnH2O{^YZhOQyCaISn>-pQ%z_*nY{aux;(yuUfX}VV79t-KgISBsq;Y1`4teR5W=v xlY%~LUVdJ3Dgy%tOMXFS3KJoNCtqZVA#AWOt3F{x7g-c0?_n(=tT2Gh8~}zWZCU^T diff --git a/stl/RGBLogic@0.1.0.sty b/stl/RGBLogic@0.1.0.sty index 89df3e38..414f49cb 100644 --- a/stl/RGBLogic@0.1.0.sty +++ b/stl/RGBLogic@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:HffUFU0Z-oNyZXNs-O8u1dRc-Q4Z5mOo-3bqPppu-A0f5iTo#permit-helena-lorenzo + Id: stl:5LehOU0m-g6h$ore-sH2a10I-bE8Z$5l-MMssex2-x$$9lF4#icon-think-learn Name: RGBLogic Version: 0.1.0 Description: Consensus logic layer for RGB smart contracts @@ -18,7 +18,7 @@ import BPCore#symbol-tropic-grand use TapretRightBranch#miracle-patriot-touch use OpretProof#good-village-flex -import RGBCommit#raymond-open-organic +import RGBCommit#outside-pelican-reflex use TransitionType#picture-reflex-brigade use ExtensionType#apropos-scoop-viva use Layer1#camilla-basket-justin diff --git a/stl/Transition.vesper b/stl/Transition.vesper index 80a7fa49..0d71ae9b 100644 --- a/stl/Transition.vesper +++ b/stl/Transition.vesper @@ -59,11 +59,7 @@ Transition rec value union TypedAssignsBlindSealTxPtr declarative list len=0..MAX16 wrapped tag=0 AssignVoidStateBlindSealTxPtr union - confidential rec tag=0 - seal bytes len=32 aka=SecretSeal - state is Unit aka=VoidState - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 + revealed rec tag=0 seal rec BlindSealTxPtr txid union TxPtr witnessTx is Unit tag=0 @@ -72,119 +68,65 @@ Transition rec blinding is U64 state is Unit aka=VoidState lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 + confidentialSeal rec tag=1 seal bytes len=32 aka=SecretSeal state is Unit aka=VoidState lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal rec BlindSealTxPtr - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state is Unit aka=VoidState - lock bytes len=2 aka=ReservedBytes2 fungible list len=0..MAX16 wrapped tag=1 AssignRevealedValueBlindSealTxPtr union - confidential rec tag=0 - seal bytes len=32 aka=SecretSeal - state rec ConcealedFungible - value union FungibleState - bits64 is U64 wrapped tag=0 - concealedDummy is Unit - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 + revealed rec tag=0 seal rec BlindSealTxPtr txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - state rec ConcealedFungible - value union FungibleState - bits64 is U64 wrapped tag=0 - concealedDummy is Unit - lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 - seal bytes len=32 aka=SecretSeal state rec RevealedFungible value union FungibleState bits64 is U64 wrapped tag=0 lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal rec BlindSealTxPtr - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 + confidentialSeal rec tag=1 + seal bytes len=32 aka=SecretSeal state rec RevealedFungible value union FungibleState bits64 is U64 wrapped tag=0 lock bytes len=2 aka=ReservedBytes2 structured list len=0..MAX16 wrapped tag=2 AssignRevealedDataBlindSealTxPtr union - confidential rec tag=0 - seal bytes len=32 aka=SecretSeal - state bytes len=32 aka=ConcealedData - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 + revealed rec tag=0 seal rec BlindSealTxPtr txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - state bytes len=32 aka=ConcealedData - lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 - seal bytes len=32 aka=SecretSeal state rec RevealedData value bytes len=0..MAX16 aka=DataState salt is U128 lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal rec BlindSealTxPtr - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 + confidentialSeal rec tag=1 + seal bytes len=32 aka=SecretSeal state rec RevealedData value bytes len=0..MAX16 aka=DataState salt is U128 lock bytes len=2 aka=ReservedBytes2 attachment list len=0..MAX16 wrapped tag=3 AssignRevealedAttachBlindSealTxPtr union - confidential rec tag=0 - seal bytes len=32 aka=SecretSeal - state bytes len=32 aka=ConcealedAttach - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 + revealed rec tag=0 seal rec BlindSealTxPtr txid union TxPtr witnessTx is Unit tag=0 txid bytes len=32 wrapped aka=Txid tag=1 vout is U32 aka=Vout blinding is U64 - state bytes len=32 aka=ConcealedAttach - lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 - seal bytes len=32 aka=SecretSeal state rec RevealedAttach file rec AttachState id bytes len=32 aka=AttachId mediaType enum MediaType any=255 salt is U64 lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal rec BlindSealTxPtr - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 + confidentialSeal rec tag=1 + seal bytes len=32 aka=SecretSeal state rec RevealedAttach file rec AttachState id bytes len=32 aka=AttachId From 90d24d810f5f2435f938f78ee5af2f4f882663dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Mon, 24 Feb 2025 10:20:59 +0100 Subject: [PATCH 30/70] vm: change WitnessOrd variants order --- src/stl.rs | 2 +- src/vm/contract.rs | 29 +++++++++++++++-------------- stl/RGBLogic@0.1.0.sta | 16 ++++++++-------- stl/RGBLogic@0.1.0.stl | Bin 1671 -> 1671 bytes stl/RGBLogic@0.1.0.sty | 10 +++++----- 5 files changed, 29 insertions(+), 28 deletions(-) diff --git a/src/stl.rs b/src/stl.rs index f5a2e81c..bca9a591 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -41,7 +41,7 @@ pub const LIB_ID_RGB_COMMIT: &str = "stl:lhPZzkmM-XPl6NIu-rvxD3r3-h2L6yaq-rydEDe5-H4bi8w4#outside-pelican-reflex"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:5LehOU0m-g6h$ore-sH2a10I-bE8Z$5l-MMssex2-x$$9lF4#icon-think-learn"; + "stl:G2guZb4U-8s8wONt-zJNUyTV-vDZPiKq-r42C1In-s2jmYL8#marvin-lobby-sandra"; fn _rgb_commit_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_COMMIT), tiny_bset! { diff --git a/src/vm/contract.rs b/src/vm/contract.rs index 29ee66dd..f07fed20 100644 --- a/src/vm/contract.rs +++ b/src/vm/contract.rs @@ -325,20 +325,6 @@ impl Display for WitnessPos { serde(crate = "serde_crate", rename_all = "camelCase") )] pub enum WitnessOrd { - /// Witness transaction must be ignored by the update witnesses process. - Ignored, - /// Witness transaction must be excluded from the state processing. - /// - /// Cases for the exclusion: - /// - transaction was removed from blockchain after a re-org and its inputs were spent by other - /// transaction; - /// - previous transaction(s) after RBF replacement, once it is excluded from the mempool and - /// replaced by RBFed successors; - /// - past state channel transactions once a new channel state is signed (and until they may - /// become valid once again due to an uncooperative channel closing). - #[strict_type(dumb)] - Archived, - /// Transaction is included into layer 1 blockchain at a specific height and /// timestamp. /// @@ -364,6 +350,21 @@ pub enum WitnessOrd { /// - transaction is an RBF replacement prepared to be broadcast (with the previous transaction /// set to [`Self::Archived`] at the same moment). Tentative, + + /// Witness transaction must be ignored by the update witnesses process. + Ignored, + + /// Witness transaction must be excluded from the state processing. + /// + /// Cases for the exclusion: + /// - transaction was removed from blockchain after a re-org and its inputs were spent by other + /// transaction; + /// - previous transaction(s) after RBF replacement, once it is excluded from the mempool and + /// replaced by RBFed successors; + /// - past state channel transactions once a new channel state is signed (and until they may + /// become valid once again due to an uncooperative channel closing). + #[strict_type(dumb)] + Archived, } impl WitnessOrd { diff --git a/stl/RGBLogic@0.1.0.sta b/stl/RGBLogic@0.1.0.sta index 7de98d2a..b1abbef8 100644 --- a/stl/RGBLogic@0.1.0.sta +++ b/stl/RGBLogic@0.1.0.sta @@ -1,11 +1,11 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:5LehOU0m-g6h$ore-sH2a10I-bE8Z$5l-MMssex2-x$$9lF4#icon-think-learn +Id: stl:G2guZb4U-8s8wONt-zJNUyTV-vDZPiKq-r42C1In-s2jmYL8#marvin-lobby-sandra Name: RGBLogic Dependencies: BPCore#symbol-tropic-grand, RGBCommit#outside-pelican-reflex, Bitcoin#signal-color-cipher -Check-SHA256: 0703535c21173c78703e05251f5f70a6f88a65a1cb824a474838e5c81a4d44c9 +Check-SHA256: 88487bd038f96921ad1338b05ab1916cf3c87e5d2b9945253ef5b9c1d0bce11c 2vSEvOmAmtV*?>@tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPA_P(yEWWtJ1!&Pj}1`Fb>qtG^KU uXuJZteUF4oe(#ja}LTPkk @@ -22,16 +22,16 @@ Mp|h#f#{Gz8SzLEaTf~c{WkYggkPIjuQHS#3Ua|L6d7%qre2Ut&TYD 1OfpDbYXCEWpn@q0Rka#tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPdYADBNH?W>M^%H|xc>sh|D n*!v8^Ea7rh?dzC2n+%RZ*X#DbN~eb0wHj#q4l6D4ZcK)2hLYH81C&KXiWu&flb+s{C0G-{6|jDT+rxD -K6vW;JU&?LxLM72H?wDC1Zo}=N}D)4mkCE~Z(?C=PjX}i0tIhyPjX}dBrRR>2@LcryZYc>tp7_pf+%FRYrXyqyp?xgUn& +K6vW;JU&?LxLM72H?wDC1Zo}=N}D)4mkCE~Z(?C=PjX}i0tIhyPjX}dtp7_pf+%FRYrXyqyp?xgUn& ^A2Qn9zv-Vp*%wog4O?q)g04AaHEjnO6;Ie%sNwVNZti*Z*F5{000OCZ*Xa30+tim&Pj}1`Fb>qtG^KU uXuJZteUF4oe(#@6CZU6=Z -2X|?7Ze??G0gF(#a06?0nLd|SC|>c2?4}E((!U1rl;i3pNx$ZJGXivZ0+tim&Pj}1`Fb>qtG^KUuXuJZ +2X|?7Ze??G0gvlp0sK<6W+n*cBpJ9-*worFk3Ek7Mz>CQ0ZEXBf&z4T0+tim&Pj}1`Fb>qtG^KUuXuJZ teUF4oe(#ZewKt00;zcaA{-$mJ`{| NsL_idNhlxzYzDYcy=$WnyS2=5I4CWhT`)MmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<3Rh`# -Ze??GPjX}g1ONwVXKrtDWn=&V009VLa${&|c4cG$00067ZE0?0WB>&L0bJY;BNZ=sBHM?<`J6+Fr=AMg?00jX7T-**L6)$-r+lRyXoI{GIo*U3CNI7Emc=xo*$N+#60SRDb5 bYX39002k diff --git a/stl/RGBLogic@0.1.0.stl b/stl/RGBLogic@0.1.0.stl index f73be194263f7e9b27df1fce0af82135f234a342..c43c773c9baca45985d33c411c95473810eced4e 100644 GIT binary patch delta 167 zcmZqYZRg$ahFRh1t4aR0^3opHISntxFAb7a;EgM{4Et^S8Qiw}RWN!^XlnK=@Rk~4tfDU&7G@&N>WKNtW2 delta 168 zcmZqYZRg$ahFL*HH})f^(3bnZIgW4tFy-dU4O)vYYb0?lwB2F6_+$6ZIg@!X{$~}&ljB%c6Qf9FvM+0`BztChUVc$( m3IhWJBS&IUaz Date: Thu, 13 Feb 2025 17:52:39 +0100 Subject: [PATCH 31/70] validation: add unsafe history check --- src/validation/mod.rs | 2 +- src/validation/status.rs | 6 ++++++ src/validation/validator.rs | 39 +++++++++++++++++++++++++++++++++---- 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/validation/mod.rs b/src/validation/mod.rs index c7c3eb09..18d96cd8 100644 --- a/src/validation/mod.rs +++ b/src/validation/mod.rs @@ -29,5 +29,5 @@ mod commitments; pub use commitments::{DbcError, DbcProof, EAnchor}; pub use consignment::{CheckedConsignment, ConsignmentApi, OpRef, Scripts, CONSIGNMENT_MAX_LIBS}; -pub use status::{Failure, Info, Status, Validity, Warning}; +pub use status::{Failure, Info, Status, UnsafeHistoryMap, Validity, Warning}; pub use validator::{ResolveWitness, Validator, WitnessResolverError}; diff --git a/src/validation/status.rs b/src/validation/status.rs index ef074c43..445963f2 100644 --- a/src/validation/status.rs +++ b/src/validation/status.rs @@ -21,6 +21,7 @@ // limitations under the License. use core::ops::AddAssign; +use std::collections::{HashMap, HashSet}; use std::fmt::{self, Display, Formatter}; use amplify::num::u24; @@ -35,6 +36,8 @@ use crate::{ BundleId, ChainNet, ContractId, OccurrencesMismatch, OpFullType, OpId, Opout, StateType, Vin, }; +pub type UnsafeHistoryMap = HashMap>; + #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Display)] #[repr(u8)] pub enum Validity { @@ -373,6 +376,9 @@ pub enum Warning { )] #[display(doc_comments)] pub enum Info { + /// Map of transfer history TXs with potentially unsafe height. + UnsafeHistory(UnsafeHistoryMap), + /// Custom info by external services on top of RGB Core. #[display(inner)] Custom(String), diff --git a/src/validation/validator.rs b/src/validation/validator.rs index 20dba826..6c366b64 100644 --- a/src/validation/validator.rs +++ b/src/validation/validator.rs @@ -21,7 +21,8 @@ // limitations under the License. use std::cell::RefCell; -use std::collections::{BTreeMap, BTreeSet}; +use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; +use std::num::NonZeroU32; use std::rc::Rc; use bp::dbc::Anchor; @@ -30,7 +31,7 @@ use bp::{dbc, Outpoint, Tx, Txid}; use commit_verify::mpc; use single_use_seals::SealWitness; -use super::status::Failure; +use super::status::{Failure, Info}; use super::{CheckedConsignment, ConsignmentApi, DbcProof, EAnchor, OpRef, Status, Validity}; use crate::operation::seal::ExposedSeal; use crate::vm::{ContractStateAccess, ContractStateEvolve, OrdOpRef, WitnessOrd}; @@ -138,6 +139,7 @@ pub struct Validator< input_assignments: RefCell>, resolver: CheckedWitnessResolver<&'resolver R>, + safe_height: Option, } impl< @@ -148,7 +150,12 @@ impl< R: ResolveWitness, > Validator<'consignment, 'resolver, S, C, R> { - fn init(consignment: &'consignment C, resolver: &'resolver R, context: S::Context<'_>) -> Self { + fn init( + consignment: &'consignment C, + resolver: &'resolver R, + context: S::Context<'_>, + safe_height: Option, + ) -> Self { // We use validation status object to store all detected failures and // warnings let status = Status::default(); @@ -174,6 +181,7 @@ impl< input_assignments: input_transitions, resolver: CheckedWitnessResolver::from(resolver), contract_state: Rc::new(RefCell::new(S::init(context))), + safe_height, } } @@ -191,8 +199,9 @@ impl< resolver: &'resolver R, chain_net: ChainNet, context: S::Context<'_>, + safe_height: Option, ) -> Status { - let mut validator = Self::init(consignment, resolver, context); + let mut validator = Self::init(consignment, resolver, context, safe_height); // If the chain-network pair doesn't match there is no point in validating the contract // since all witness transactions will be missed. if validator.chain_net != chain_net { @@ -264,6 +273,7 @@ impl< // [VALIDATION]: Iterating over all consignment operations, ordering them according to the // consensus ordering rules. let mut ops = BTreeSet::::new(); + let mut unsafe_history_map: HashMap> = HashMap::new(); for bundle_id in self.consignment.bundle_ids() { let bundle = self .consignment @@ -284,6 +294,22 @@ impl< return; } }; + if let Some(safe_height) = self.safe_height { + match witness_ord { + WitnessOrd::Mined(witness_pos) => { + let witness_height = witness_pos.height(); + if witness_height > safe_height { + unsafe_history_map + .entry(witness_height.into()) + .or_default() + .insert(witness_id); + } + } + WitnessOrd::Tentative | WitnessOrd::Ignored | WitnessOrd::Archived => { + unsafe_history_map.entry(0).or_default().insert(witness_id); + } + } + } for op in bundle.known_transitions.values() { ops.insert(OrdOpRef::Transition(op, witness_id, witness_ord, bundle_id)); for input in &op.inputs { @@ -311,6 +337,11 @@ impl< } } } + if self.safe_height.is_some() { + self.status + .borrow_mut() + .add_info(Info::UnsafeHistory(unsafe_history_map)); + } for op in ops { // We do not skip validating archive operations since after a re-org they may // become valid and thus must be added to the contract state and validated From 5c54fc1afb7466b9bf99d309289d60437af486c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Thu, 27 Feb 2025 12:27:57 +0100 Subject: [PATCH 32/70] validation: move UnsafeHistory from Info to Warning --- src/validation/status.rs | 6 +++--- src/validation/validator.rs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/validation/status.rs b/src/validation/status.rs index 445963f2..dd8263a7 100644 --- a/src/validation/status.rs +++ b/src/validation/status.rs @@ -363,6 +363,9 @@ pub enum Failure { )] #[display(doc_comments)] pub enum Warning { + /// Map of transfer history TXs with potentially unsafe height. + UnsafeHistory(UnsafeHistoryMap), + /// Custom warning by external services on top of RGB Core. #[display(inner)] Custom(String), @@ -376,9 +379,6 @@ pub enum Warning { )] #[display(doc_comments)] pub enum Info { - /// Map of transfer history TXs with potentially unsafe height. - UnsafeHistory(UnsafeHistoryMap), - /// Custom info by external services on top of RGB Core. #[display(inner)] Custom(String), diff --git a/src/validation/validator.rs b/src/validation/validator.rs index 6c366b64..ff5cca6f 100644 --- a/src/validation/validator.rs +++ b/src/validation/validator.rs @@ -31,7 +31,7 @@ use bp::{dbc, Outpoint, Tx, Txid}; use commit_verify::mpc; use single_use_seals::SealWitness; -use super::status::{Failure, Info}; +use super::status::{Failure, Warning}; use super::{CheckedConsignment, ConsignmentApi, DbcProof, EAnchor, OpRef, Status, Validity}; use crate::operation::seal::ExposedSeal; use crate::vm::{ContractStateAccess, ContractStateEvolve, OrdOpRef, WitnessOrd}; @@ -340,7 +340,7 @@ impl< if self.safe_height.is_some() { self.status .borrow_mut() - .add_info(Info::UnsafeHistory(unsafe_history_map)); + .add_warning(Warning::UnsafeHistory(unsafe_history_map)); } for op in ops { // We do not skip validating archive operations since after a re-org they may From 814ecaa142f5f071be0b1b4a455a313c9290ccbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Wed, 19 Feb 2025 18:40:46 +0100 Subject: [PATCH 33/70] validation: remove blank transitions --- src/operation/bundle.rs | 16 ++-- src/schema/schema.rs | 45 ++++++----- src/stl.rs | 4 +- src/validation/logic.rs | 2 - src/validation/schema.rs | 6 +- src/validation/status.rs | 2 - src/validation/validator.rs | 40 +++++----- stl/AnchoredBundle.vesper | 3 +- stl/RGBCommit@0.1.0.sta | 150 ++++++++++++++++++------------------ stl/RGBCommit@0.1.0.stl | Bin 12650 -> 12668 bytes stl/RGBCommit@0.1.0.sty | 6 +- stl/RGBLogic@0.1.0.sta | 26 +++---- stl/RGBLogic@0.1.0.stl | Bin 1671 -> 1671 bytes stl/RGBLogic@0.1.0.sty | 4 +- 14 files changed, 155 insertions(+), 149 deletions(-) diff --git a/src/operation/bundle.rs b/src/operation/bundle.rs index 46b25fc3..9e586450 100644 --- a/src/operation/bundle.rs +++ b/src/operation/bundle.rs @@ -22,7 +22,7 @@ use std::collections::{btree_map, BTreeMap}; -use amplify::confinement::{Confined, U16 as U16MAX}; +use amplify::confinement::{Confined, SmallOrdSet, U16 as U16MAX}; use amplify::{Bytes32, Wrapper}; use bp::Vout; use commit_verify::{mpc, CommitEncode, CommitEngine, CommitId, CommitmentId, DigestExt, Sha256}; @@ -75,26 +75,28 @@ impl From for BundleId { derive(Serialize, Deserialize), serde(crate = "serde_crate", transparent) )] -pub struct InputMap(Confined, 1, U16MAX>); +pub struct InputMap(Confined>, 1, U16MAX>); impl StrictDumb for InputMap { fn strict_dumb() -> Self { Self(Confined::with_key_value(strict_dumb!(), strict_dumb!())) } } impl InputMap { - pub fn with(input: Vin, id: OpId) -> Self { InputMap(Confined::with((input, id))) } + pub fn with(input: Vin, ids: SmallOrdSet) -> Self { + InputMap(Confined::with((input, ids))) + } } impl IntoIterator for InputMap { - type Item = (Vin, OpId); - type IntoIter = btree_map::IntoIter; + type Item = (Vin, SmallOrdSet); + type IntoIter = btree_map::IntoIter>; fn into_iter(self) -> Self::IntoIter { self.0.into_iter() } } impl<'a> IntoIterator for &'a InputMap { - type Item = (&'a Vin, &'a OpId); - type IntoIter = btree_map::Iter<'a, Vin, OpId>; + type Item = (&'a Vin, &'a SmallOrdSet); + type IntoIter = btree_map::Iter<'a, Vin, SmallOrdSet>; fn into_iter(self) -> Self::IntoIter { self.0.iter() } } diff --git a/src/schema/schema.rs b/src/schema/schema.rs index 5f70800f..a0d06f36 100644 --- a/src/schema/schema.rs +++ b/src/schema/schema.rs @@ -39,9 +39,7 @@ use strict_types::SemId; use super::{ AssignmentType, ExtensionSchema, GenesisSchema, OwnedStateSchema, TransitionSchema, ValencyType, }; -use crate::{ - impl_serde_baid64, Ffv, GlobalStateSchema, Identity, Occurrences, LIB_NAME_RGB_COMMIT, -}; +use crate::{impl_serde_baid64, Ffv, GlobalStateSchema, Identity, LIB_NAME_RGB_COMMIT}; #[derive(Wrapper, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From, Display)] #[wrapper(FromStr, LowerHex, UpperHex)] @@ -103,12 +101,6 @@ impl TransitionType { pub const fn with(ty: u16) -> Self { Self(ty) } } -impl TransitionType { - pub const BLANK: Self = TransitionType(u16::MAX); - /// Easily check if the TransitionType is blank with convention method - pub fn is_blank(self) -> bool { self == Self::BLANK } -} - /// Schema identifier. /// /// Schema identifier commits to all the schema data. @@ -218,15 +210,6 @@ impl Schema { #[inline] pub fn schema_id(&self) -> SchemaId { self.commit_id() } - pub fn blank_transition(&self) -> TransitionSchema { - let mut schema = TransitionSchema::default(); - for id in self.owned_types.keys() { - schema.inputs.insert(*id, Occurrences::NoneOrMore).ok(); - schema.assignments.insert(*id, Occurrences::NoneOrMore).ok(); - } - schema - } - pub fn types(&self) -> impl Iterator + '_ { self.meta_types .values() @@ -248,6 +231,32 @@ impl Schema { .chain(self.extensions.values().filter_map(|i| i.validator)) .map(|site| site.lib) } + + pub fn transition_for_assignment_type( + &self, + assignment_type: &AssignmentType, + ) -> Option { + for (transition_type, transition_schema) in &self.transitions { + // for now we support only schemas defining transitions to move single assignments + if transition_schema.inputs.as_unconfined().len() == 1 + && transition_schema.assignments.as_unconfined().len() == 1 + { + let (input_ass_type, input_occurrences) = + transition_schema.inputs.iter().next().unwrap(); + let (out_ass_type, out_occurrences) = + transition_schema.assignments.iter().next().unwrap(); + + if input_occurrences.check(1).is_ok() + && out_occurrences.check(1).is_ok() + && input_ass_type == assignment_type + && out_ass_type == assignment_type + { + return Some(*transition_type); + } + } + } + None + } } #[cfg(test)] diff --git a/src/stl.rs b/src/stl.rs index bca9a591..57e7b051 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -38,10 +38,10 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_COMMIT: &str = - "stl:lhPZzkmM-XPl6NIu-rvxD3r3-h2L6yaq-rydEDe5-H4bi8w4#outside-pelican-reflex"; + "stl:N6SXCpvQ-tPzjGVN-pRMk9CN-qE0thG!-2mpTOLT-fOL4sRA#sunset-cherry-melody"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:G2guZb4U-8s8wONt-zJNUyTV-vDZPiKq-r42C1In-s2jmYL8#marvin-lobby-sandra"; + "stl:0wsJV4GJ-U$BRIX2-Mvvm2Db-aTx6jqR-CWzNyC9-S8TnMPE#program-june-motel"; fn _rgb_commit_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_COMMIT), tiny_bset! { diff --git a/src/validation/logic.rs b/src/validation/logic.rs index d2dbddcf..901d4124 100644 --- a/src/validation/logic.rs +++ b/src/validation/logic.rs @@ -58,7 +58,6 @@ impl Schema { let empty_assign_schema = AssignmentsSchema::default(); let empty_valency_schema = ValencySchema::default(); - let blank_transition = self.blank_transition(); let ( metadata_schema, global_schema, @@ -95,7 +94,6 @@ impl Schema { */ let transition_schema = match self.transitions.get(transition_type) { - None if transition_type.is_blank() => &blank_transition, None => { return validation::Status::with_failure( validation::Failure::SchemaUnknownTransitionType( diff --git a/src/validation/schema.rs b/src/validation/schema.rs index 4e8dafc2..08be0f8b 100644 --- a/src/validation/schema.rs +++ b/src/validation/schema.rs @@ -22,7 +22,7 @@ use strict_types::TypeSystem; -use crate::{validation, OpFullType, OpSchema, OwnedStateSchema, Schema, TransitionType}; +use crate::{validation, OpFullType, OpSchema, OwnedStateSchema, Schema}; impl Schema { pub fn verify(&self, types: &TypeSystem) -> validation::Status { @@ -35,10 +35,6 @@ impl Schema { for (type_id, schema) in &self.extensions { status += self.verify_operation(OpFullType::StateExtension(*type_id), schema); } - // Check that the schema doesn't contain reserved type ids - if self.transitions.contains_key(&TransitionType::BLANK) { - status.add_failure(validation::Failure::SchemaBlankTransitionRedefined); - } for (type_id, sem_id) in &self.meta_types { if !types.contains_key(sem_id) { diff --git a/src/validation/status.rs b/src/validation/status.rs index dd8263a7..908e5f88 100644 --- a/src/validation/status.rs +++ b/src/validation/status.rs @@ -182,8 +182,6 @@ pub enum Failure { /// Actual schema id provided by the consignment. actual: SchemaId, }, - /// schema uses reserved type for the blank state transition. - SchemaBlankTransitionRedefined, /// schema global state #{0} uses semantic data type absent in type library /// ({1}). diff --git a/src/validation/validator.rs b/src/validation/validator.rs index ff5cca6f..07a1e9f1 100644 --- a/src/validation/validator.rs +++ b/src/validation/validator.rs @@ -455,25 +455,27 @@ impl< input_map: BTreeMap>, ) { let witness_id = pub_witness.txid(); - for (vin, opid) in &bundle.input_map { - let Some(outpoints) = input_map.get(opid) else { - self.status - .borrow_mut() - .add_failure(Failure::BundleExtraTransition(bundle_id, *opid)); - continue; - }; - let Some(input) = pub_witness.inputs.get(vin.to_usize()) else { - self.status - .borrow_mut() - .add_failure(Failure::BundleInvalidInput(bundle_id, *opid, witness_id)); - continue; - }; - if !outpoints.contains(&input.prev_output) { - self.status - .borrow_mut() - .add_failure(Failure::BundleInvalidCommitment( - bundle_id, *vin, witness_id, *opid, - )); + for (vin, opids) in &bundle.input_map { + for opid in opids { + let Some(outpoints) = input_map.get(opid) else { + self.status + .borrow_mut() + .add_failure(Failure::BundleExtraTransition(bundle_id, *opid)); + continue; + }; + let Some(input) = pub_witness.inputs.get(vin.to_usize()) else { + self.status + .borrow_mut() + .add_failure(Failure::BundleInvalidInput(bundle_id, *opid, witness_id)); + continue; + }; + if !outpoints.contains(&input.prev_output) { + self.status + .borrow_mut() + .add_failure(Failure::BundleInvalidCommitment( + bundle_id, *vin, witness_id, *opid, + )); + } } } } diff --git a/stl/AnchoredBundle.vesper b/stl/AnchoredBundle.vesper index 35236321..0e389391 100644 --- a/stl/AnchoredBundle.vesper +++ b/stl/AnchoredBundle.vesper @@ -21,7 +21,8 @@ DbcProof union TransitionBundle rec inputMap map len=1..MAX16 aka=InputMap key is U32 aka=Vout - value bytes len=32 aka=OpId + value set len=0..MAX16 + element bytes len=32 aka=OpId knownTransitions map len=1..MAX16 key bytes len=32 aka=OpId value rec Transition diff --git a/stl/RGBCommit@0.1.0.sta b/stl/RGBCommit@0.1.0.sta index e3b4237e..df540c32 100644 --- a/stl/RGBCommit@0.1.0.sta +++ b/stl/RGBCommit@0.1.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:lhPZzkmM-XPl6NIu-rvxD3r3-h2L6yaq-rydEDe5-H4bi8w4#outside-pelican-reflex +Id: stl:N6SXCpvQ-tPzjGVN-pRMk9CN-qE0thG!-2mpTOLT-fOL4sRA#sunset-cherry-melody Name: RGBCommit Dependencies: BPCore#symbol-tropic-grand, @@ -8,7 +8,7 @@ Dependencies: CommitVerify#miller-pancake-elastic, Std#ralph-blue-lucky, Bitcoin#signal-color-cipher -Check-SHA256: dcefdbcbb496afc0035f0e1c1e41689342b3e915f1f17831eeb954ed3d4cfec7 +Check-SHA256: e15dc82e58623fe67040e8084fa209e92e921b53d78154905d97ba115000f7fd 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 -xrUo0ThV>qb#7#AWd;HW -X>M?JbWLG!0Tr2NWXrXyKnGOwA#t$mH2bG7pQ)aE=^FQF!@KkQh!AUTZ+C7~a$#@6CZgT(%0hP$+ -dLDIRU(}XWLTZugenOC;Z(5k~zEJnJiX;;E#R08YhjcV>N4>6_6SyX&ptxo1igHsc2cdhP$e%d~?$!YS -000000096000000000nFa$#@6CZc}4uWo=;w1_*6sbYWy+bYTDq0d?d}_}|Wp0vpvv$c&#PW69R$ -ltr%da5t5w^x+8!q5uE@000000RI300000000(DmZ(?C=a{vkf)$WoGNrn+a000000RI300000000wDpaCLNZ -015$z{^Dg=h-~N_zJ`Red1EINWrM}GXaQb}6c#qIM2EQnHo-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF -4>GEG0000000000{{R30000003t@9}X=iS2Wo~qH015$z{^Dg=h-~N_zJ`Red1EINWrM}GXaQb}6c#qI -M2EQnHo-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4>GEG0000000000{{R300000033g#@Wo~0>Wpe-t -0Y>fS!w4MxxaL=+DqP^k2!wz9AHH68xp8!<%Jqp^&Hw-a000000RI3000000010+sY-wa+bZ>G11OfmA -Zf|a7000011aog~WdH>M0%CAAe<9`Lptgpr6F_xjAC6(~TLj#*ewiHf`^rCgHqw;r~cW`-Qb7^w` -1pxuF6jyr<)WbQ@(CZ(W=ig937K21oZj>F1*aU<1)4fLl3UqQ|ZgXjLX>V=-1p)z|2rNlD$O59e#ogQs -B77jPl+h5j^*S;EG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(10tsb!bY*UHX>V=- -1p)z|2rNlD$O59e#ogQsB77jPl+h5j^*S;EWOW`wsTH9-LlJ`2|Ay5Z(?oEikl{+~pis;@ -Q*TJ#8dQ03Wn@8fb7^O8b3$xsZe&wsVQf@*P;_zx1ON+UWn*k%a$$67c4Yts0RRXAZxMm`#T#PnhgWq` -eMS>|xBI2`eUgpkI4MC;V)xV20000000000|Nj60000000SIPwZf9v?Y-Ioi0RRXA$tKg)lZIpnJ?s52 -Lb#i5700jX62mwiP2M#dZN%AXT -A9%-&dal959qWIGOJWz(UDXek?U(=n0000000960000000093AVRUq1V`yzM00;rIPS18A9{>CZ0|Ju;9Pya4*S_o#KSQ#S^GM00;qJNbG0cIzBFIR(d`#um0T+f+Ht6TBtC0P;Q%&@2p?|0000000030 -{{R30000023UhRFbz^jOa%E%y1pxpE0c!PSwI(YdXDh`S;c-XJf-JhsCbw@%Wz)m1PMN&5x&QzG00000 -0RR60000000RIYMbaY{3Xl-R~bN~eb00;qFo~-2t-FBm?{;M?9h#oN_CYm?uXkfmH1{@T?ji$~300000 -00030{{R3000009R$**qZewX>a|Hna2?0j!=EDda{kY~=q$*tC#t4Le{2#tvcDZqMsmk?c;Wd#8M000 +?K@+fP1(-9sgE>i7rMzqbpQzgmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<0000000000|Nj60 +000000RR9100000|Nj600000021#ykb#!wD0RRaB)s0^W44ZlVPs)+VFdvI3ITQGP59r=ivkR6Lh9EroO>_;0000000030000000000BPh(?sa&l#EV`Xy&0t0Pn +ZU6uR18re=0006EPjEwTZEb0EZDnqB1`7jbW_AJEn^6;37FKqUhx?i3R+Mr!fY&(;2BFL(m@EZk_srD= +Zf|a5WdHyO25)dwd2nR`4Yl-VR(QD`a=lauc1Dg>676p(%t1LRzzH}N^3Qi@2yJC_VPs)+VFG#s9p7nv +%krpqNM?JbaMiF10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUD@oClv)a +MjKgwAH@`bu1x<7g|G$};xvA~n-$_S2y$g)Wo2z;WCD5v9p7nv%krpqNv2!%ioJpYH;+t0eX2w~A!Q+0eaZ +{MVycPK^T!VRUq1V`yzWn^V#ZDnKy +0RRdCM(yUq2ps*m=2xUDT;RqCgn#@WzFu~@adfH5^@&-|0hP$+dLDIRU(}XWLTZugenOC;Z(5k~zEJnJ +iX;;E#Q*>R000000RI300000001i@Rc4c8~Wn@8gbYWv?1_A_TX>4Ty3ATR{-|K6Y3I$*BbiAvUS*tg{ +!Gb}P!O*^_P#qhP1ao0*bN~Pd3{quwWnpY(WJFEY++|} +0(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCX@GIcyL4!ji%3ykIZ4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HJt76^nC$%1sKzB<;EQA|)S-x88IWKN#S +$#@T&w`gPubZKp6b97;CZ~y>E31nqvO>-_DBy8`Vb0jGrW9$=2qSMXvL3HV?G015$Qbsj>g6`?#s5rWnK +hSeO?L~x^!;Y#eFP|P}0Z%Ez&184%wsNMHUptBVZ#B!U%rHo-i1kG~VoNp!e_~i}U0000000000{{R30 +000003v_Z}ZgXjLX>V?G015##QV*^ZmKt8YDf|&5KZQ>65I6*X)C9iYp+?yjr7~y%cC{O5i=z9Tbk4I8 +B8ok+RO(3iQ~4#2=U8Jf?FGcx0000000000{{R30000002y$g}WpZ|9WCD5v9p7nv%krpqNV`ybV=@3j=0mb^+R(Q4?4eR(6nw`65I6*X)C9iYp+?yjr7~y;ZDn*}WMOn+0rh%KI9Y!AFx9LCk8@hQXE7w+qW3^C%eTEp@#^?_ +H3w&GZ(?C=a{=BXk!z-`g4hv-$6z_YxoLZ_neUP>BpbEf7FA*KKfDHMZg6#Ua{;NMdRLRko603iZGCpt +_aPM;fa{=9jW&m$tWDykZj`7#3_zANbB(SO{shhGe=&H{tM@@6CZbEf#WNc*y0tjhtaCLM|VQ>L#V|}CmMi`h#IzV?G015$>$mV(;bz)!CmQ_M(k?Vd!kfCo{nDM?)_qK{868FUctyqV2G;l|~uA39MCZ(Xb +W$cP_Q!59dd!NXkISB670RR9100000|Nj60000005L9wuZgXjLX>V>*V`ybM?JbaMa-0f+wLWmt%8=p4R=gtK{LClh6Z#kObxUW*hKHnBv9xdAr8G@<&SffJ|Q +Fn~N>u=2wF+7z(Wqt=tdZk`V^s(Ana000000093000000000YNb8~5DZf#|5baMa-0f+wLWmt%8=p4R= +gtK{LClh6Z#kObxUW*hKHnBv9xdAr8G@<&SffJ|QFn~N>u=2wF+7z(Wqt=tdZk`V^s(Ana0000000930 +00000000SgVQgh?V`*h`00{v`?dHP>9R0ZFSEMRj;Km4qfBYZ5UUs>0bg9bqiCNA7000000003000000 +00009c42I3WMOn~asUJZ00eGtZe;)f009JZZ*64&1pxwLa5aA+<>R2XhQO_4{AcS-HH^7AVzASV8M4NY +xyCka@1Z8)ymjIKNK5;L!8FkfGTe+FK;UUh9M-4n+}vRfRB~Z%b7^#GZ*Ek1aAgGn0006GRC#b^LvL+u +X>@I6Zgd0#00(DfZe??6a{vVa0kRZVdkxgXIndDSADQRhP(T)gL{x5+9gElmgZ0zBM*#|Sa$#@6C +ZU6-W0iOsgNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G66JF53UoI8eY9A{1GERg--GiI0S#x1is&) +M%fmnGH3z`Wq5RDZgXjGZU6-W0iOsgNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G67_D9zv-Vp*%wo +g4O?q)g04AaHEjnO6;Ie%sNwVNZuM$d2nT9L349yXKr&sY-w&}Q)OXnRCrKyas&hb3uI+uY+-U?bZK^F +00jX62mx;qf%wH6V(o`lby0mr6MMJ&rS^T2jpaBgK~Q4%)6)O|00000009600000000039W_507X<}?; +00jX62m#3^)76uPWC%U${V?Tj%xE~|`pWbPFE41i6~^xq(2)QD0000000960000000006Cb98cbV{~wU50>qi0000000000|Nj6000000{|aGrbYWv? +ZDnqB00jX62mwKgD3w^Bk@ys(*bFVu<9$b&qo7Qa-=8dh +vXS#nZTEEFN&o-=000000RR6000000009VQb#7;AVr*pq1pxpE0bfY$XWlwKE^AhLJ}|HT-4B8zCplWE +Fn3UHo09LWU;qFB000000RR600000000IhgbaHiLbairNWB>&L00;qU^<}jtD&%5ytTRj0000000030{{R30000303So3~VPj}*Wo~o;1pxpE0b8D|9Tsh)f38uw_! MyYu^qvwJH62GqM74FCWD diff --git a/stl/RGBCommit@0.1.0.sty b/stl/RGBCommit@0.1.0.sty index 4e249183..e530ea30 100644 --- a/stl/RGBCommit@0.1.0.sty +++ b/stl/RGBCommit@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:lhPZzkmM-XPl6NIu-rvxD3r3-h2L6yaq-rydEDe5-H4bi8w4#outside-pelican-reflex + Id: stl:N6SXCpvQ-tPzjGVN-pRMk9CN-qE0thG!-2mpTOLT-fOL4sRA#sunset-cherry-melody Name: RGBCommit Version: 0.1.0 Description: Consensus commitment layer for RGB smart contracts @@ -213,8 +213,8 @@ data Identity : Std.AsciiPrintable, [Std.AsciiPrintable ^ ..0xfff] @mnemonic(kevin-morgan-shrink) data Input : prevOut Opout, reserved CommitVerify.ReservedBytes2 -@mnemonic(tobacco-open-join) -data InputMap : {Bitcoin.Vout -> ^ 1.. OpId} +@mnemonic(tourist-deal-mask) +data InputMap : {Bitcoin.Vout -> ^ 1.. {OpId}} @mnemonic(sector-charlie-diagram) data Inputs : {Input} diff --git a/stl/RGBLogic@0.1.0.sta b/stl/RGBLogic@0.1.0.sta index b1abbef8..c54cdfd9 100644 --- a/stl/RGBLogic@0.1.0.sta +++ b/stl/RGBLogic@0.1.0.sta @@ -1,14 +1,14 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:G2guZb4U-8s8wONt-zJNUyTV-vDZPiKq-r42C1In-s2jmYL8#marvin-lobby-sandra +Id: stl:0wsJV4GJ-U$BRIX2-Mvvm2Db-aTx6jqR-CWzNyC9-S8TnMPE#program-june-motel Name: RGBLogic Dependencies: BPCore#symbol-tropic-grand, - RGBCommit#outside-pelican-reflex, + RGBCommit#sunset-cherry-melody, Bitcoin#signal-color-cipher -Check-SHA256: 88487bd038f96921ad1338b05ab1916cf3c87e5d2b9945253ef5b9c1d0bce11c +Check-SHA256: c8aae1c5bf383176222ca44a70a51ac050c67e21967e10c5d5216d7b523bf62a -2vSEvOmAmtV*?>@tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPA_P(yEWWtJ1!&Pj}1`Fb>qtG^KU -uXuJZteUF4oe(#ja}LTPkk +2vSEvOmAmtV*?>@tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPA_P(yEWWjCak3Y*Zh{Nou@X++6A +2-<|w*hc$lsZ8S2eB$`A5D8L8LPKwDZE1A%Y!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkk Z)t7=20~CnZ*pY?00DdlT>wB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 wjY>38tto&d&=eG4cRAF#( @@ -24,15 +24,15 @@ iRT*14O40w5C%+Pd1Z1jmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<1W#~DWCZ{SL}Fu5a&K>D n*!v8^Ea7rh?dzC2n+%RZ*X#DbN~eb0wHj#q4l6D4ZcK)2hLYH81C&KXiWu&flb+s{C0G-{6|jDT+rxD K6vW;JU&?LxLM72H?wDC1Zo}=N}D)4mkCE~Z(?C=PjX}i0tIhyPjX}dtp7_pf+%FRYrXyqyp?xgUn& -^A2Qn9zv-Vp*%wog4O?q)g04AaHEjnO6;Ie%sNwVNZti*Z*F5{000OCZ*Xa30+tim&Pj}1`Fb>qtG^KU -uXuJZteUF4oe(#@6CZU6=Z -2X|?7Ze??G0gvlp0sK<6W+n*cBpJ9-*worFk3Ek7Mz>CQ0ZEXBf&z4T0+tim&Pj}1`Fb>qtG^KUuXuJZ -teUF4oe(#ZewKt00;zcaA{-$mJ`{| -NsL_idNhlxzYzDYcy=$WnyS2=5I4CWhT`)MmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<3Rh`# +VFCP7wPq#=<|G-oQP|YlF^@fu07kb?cmYX}g@OWfc>*`2mkOKEwEW{4Q)xuWJqX%_(%44(X{k)&(|qFi +u@Gc+9zv-Vp*%wog4O?q)g04AaHEjnO6;Ie%sNwVNZti*Z*F5{000OCZ*Xa30ym_W3Y*Zh{Nou@X++6A +2-<|w*hc$lsZ8S2eB$`A5S7U0dLDIRU(}XWLTZugenOC;Z(5k~zEJnJiX;;E#s3O)a$#@6CZU6=Z +2X|?7Ze??G0gvlp0sK<6W+n*cBpJ9-*worFk3Ek7Mz>CQ0ZEXBf&z4T0ym_W3Y*Zh{Nou@X++6A2-<|w +*hc$lsZ8S2eB$`A5HwN`t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zcaA{-$H>8&e +o6xlU;~7(FM9Dn}+Jw^BM*C^0Oybjg;`p%;mB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<3Rh`# Ze??GPjX}g1ONqXX>Mg?00jX7T-**L6)$-r+lRyXoI{GIo*U3CNI7Emc=xo*$N+#60SRDb5 +00069X=iS4a%E%y0009BVRB<=X?A5~0000AS7~%^Wpi^-Z*v9%25ez@WpXhBH>8&eo6xlU;~7(FM9Dn} ++Jw^BM*C^0Oybjg;`p%;dBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W)00aqiX>Db5 bYX39002k -----END STRICT TYPE LIB----- diff --git a/stl/RGBLogic@0.1.0.stl b/stl/RGBLogic@0.1.0.stl index c43c773c9baca45985d33c411c95473810eced4e..29408854858344d3feb160ff9eb0838e19c36e39 100644 GIT binary patch delta 247 zcmZqYZRed}s9?TiI@jzATmC$j49;{pY0Gh|<U~+&CAbAPGw-=V977YOkpBq@Z^guF@z2FWz{FF=pu{4y8 delta 247 zcmZqYZRed}s4z|V<~h%vn4eW9-K+Ntd|zKtroU#^sy%ZB%y-JSJ^IYIF;I|&prXmU xnH2O{^YZhOQyCaISn>-pQ Date: Tue, 4 Mar 2025 11:23:05 +0100 Subject: [PATCH 34/70] operation: remove extensions and valencies --- doc/Commitments.md | 19 +--- src/operation/commit.rs | 36 +----- src/operation/mod.rs | 3 +- src/operation/operations.rs | 181 +---------------------------- src/schema/mod.rs | 6 +- src/schema/operations.rs | 89 +-------------- src/schema/schema.rs | 26 +---- src/stl.rs | 8 +- src/validation/consignment.rs | 42 +------ src/validation/logic.rs | 105 +---------------- src/validation/schema.rs | 13 --- src/validation/status.rs | 22 ---- src/validation/validator.rs | 52 +-------- src/vm/contract.rs | 105 +++-------------- stl/AnchoredBundle.vesper | 2 - stl/RGBCommit@0.1.0.sta | 209 +++++++++++++++------------------- stl/RGBCommit@0.1.0.stl | Bin 12668 -> 10886 bytes stl/RGBCommit@0.1.0.sty | 58 ++-------- stl/RGBLogic@0.1.0.sta | 40 +++---- stl/RGBLogic@0.1.0.stl | Bin 1671 -> 1423 bytes stl/RGBLogic@0.1.0.sty | 11 +- stl/Schema.vesper | 33 ------ stl/Transition.vesper | 7 -- 23 files changed, 178 insertions(+), 889 deletions(-) diff --git a/doc/Commitments.md b/doc/Commitments.md index f4cc84cf..69baa643 100644 --- a/doc/Commitments.md +++ b/doc/Commitments.md @@ -141,7 +141,7 @@ Here are more details on each type of the commitments: | Commitment ID | Produced by | Procedure | Tag URN suffix(1) | |----------------------|--------------------------------------|------------------------------------------------------------------------------------------------|-------------------------------| | `SchemaID` | `RootSchema`, `SubSchema` | strict serialization | `rgb:schema#2024-02-03` | -| `OpId`, `ContractId` | `Genesis`, `Transition`, `Extension` | nested commitments with concealing, merklization etc via intermediate `OpCommitment` structure | `rgb:operation#2024-02-03` | +| `OpId`, `ContractId` | `Genesis`, `Transition` | nested commitments with concealing, merklization etc via intermediate `OpCommitment` structure | `rgb:operation#2024-02-03` | | `BundleId` | `TransitionBundle` | conceal and partial strict serialization | `rgb:bundle#2024-02-03` | | `SecretSeal` | `BlindSeal` | strict serialization | `seals:secret#2024-02-03` | | `ConcealedData` | `RevealedData` | strict serialization | `rgb:state-data#2024-02-12` | @@ -187,8 +187,8 @@ code. ### Operation ID and Contract ID -Operation id is represented by a `OpId` type and produced for `Genesis`, -`Transition` and `Extension` types via custom algorithm, which first creates a +Operation id is represented by a `OpId` type and produced for `Genesis` and +`Transition` types via custom algorithm, which first creates a dedicated `OpCommitment` structure, and strict-serializes it to hasher, initialized with `urn:lnp-bp:rgb:operation#2024-02-03` hash tag. @@ -201,9 +201,9 @@ assignments are concealed before the merklization, and range proofs are removed from the commitment, such that an aggregation of the historical proofs can be applied without changing the operation ids. -To ensure succinctness, other types of collections, such as redeemed and -defined valencies in genesis are not merklized and strict-serialized producing -`StrictHash`, which participates in the final `OpCommitment` structure. +To ensure succinctness, other types of collections, such as metadata, are not +merklized and strict-serialized producing `StrictHash`, which participates in +the final `OpCommitment` structure. ```mermaid flowchart LR @@ -214,8 +214,6 @@ flowchart LR Globals -- Merklize --> OpCommitment Inputs -- Merklize --> OpCommitment Assignments -- "Conceal\n + Merklize" --> OpCommitment - Redeemed -- StrictHash --> OpCommitment - Valencies -- StrictHash --> OpCommitment end subgraph "Genesis" @@ -228,11 +226,6 @@ flowchart LR transitionType --> TypeCommitment end - subgraph "Extension" - ecid[contractId] --> TypeCommitment - extensionType --> TypeCommitment - end - BaseCommitment --> TypeCommitment OpCommitment -- hash --> OpId diff --git a/src/operation/commit.rs b/src/operation/commit.rs index 437ab744..a869a0e1 100644 --- a/src/operation/commit.rs +++ b/src/operation/commit.rs @@ -38,10 +38,9 @@ use strict_encoding::StrictDumb; use crate::{ impl_serde_baid64, Assign, AssignmentType, Assignments, BundleId, ChainNet, DataState, - ExposedSeal, ExposedState, Extension, ExtensionType, Ffv, Genesis, GlobalState, - GlobalStateType, Operation, Redeemed, RevealedAttach, RevealedData, RevealedState, - RevealedValue, SchemaId, SecretSeal, Transition, TransitionBundle, TransitionType, - TypedAssigns, LIB_NAME_RGB_COMMIT, + ExposedSeal, ExposedState, Ffv, Genesis, GlobalState, GlobalStateType, Operation, + RevealedAttach, RevealedData, RevealedState, RevealedValue, SchemaId, SecretSeal, Transition, + TransitionBundle, TransitionType, TypedAssigns, LIB_NAME_RGB_COMMIT, }; /// Unique contract identifier equivalent to the contract genesis commitment @@ -95,7 +94,7 @@ impl From for mpc::ProtocolId { impl_serde_baid64!(ContractId); -/// Unique operation (genesis, extensions & state transition) identifier +/// Unique operation (genesis & state transition) identifier /// equivalent to the commitment hash #[derive(Wrapper, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display, From)] #[wrapper(Deref, BorrowSlice, Hex, Index, RangeOps)] @@ -248,9 +247,6 @@ pub enum TypeCommitment { #[strict_type(tag = 1)] Transition(ContractId, TransitionType), - - #[strict_type(tag = 2)] - Extension(ContractId, ExtensionType), } #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] @@ -266,8 +262,6 @@ pub struct OpCommitment { pub globals: MerkleHash, pub inputs: MerkleHash, pub assignments: MerkleHash, - pub redeemed: StrictHash, - pub valencies: StrictHash, pub witness: MerkleHash, pub validator: StrictHash, } @@ -289,8 +283,6 @@ impl Genesis { globals: MerkleHash::merklize(&self.globals), inputs: MerkleHash::void(0, u256::ZERO), assignments: MerkleHash::merklize(&self.assignments), - redeemed: Redeemed::default().commit_id(), - valencies: self.valencies.commit_id(), witness: MerkleHash::void(0, u256::ZERO), validator: self.validator.commit_id(), } @@ -309,26 +301,6 @@ impl Transition { globals: MerkleHash::merklize(&self.globals), inputs: MerkleHash::merklize(&self.inputs), assignments: MerkleHash::merklize(&self.assignments), - redeemed: Redeemed::default().commit_id(), - valencies: self.valencies.commit_id(), - witness: MerkleHash::void(0, u256::ZERO), - validator: self.validator.commit_id(), - } - } -} - -impl Extension { - pub fn commit(&self) -> OpCommitment { - OpCommitment { - ffv: self.ffv, - nonce: self.nonce, - op_type: TypeCommitment::Extension(self.contract_id, self.extension_type), - metadata: self.metadata.commit_id(), - globals: MerkleHash::merklize(&self.globals), - inputs: MerkleHash::void(0, u256::ZERO), - assignments: MerkleHash::merklize(&self.assignments), - redeemed: self.redeemed.commit_id(), - valencies: self.valencies.commit_id(), witness: MerkleHash::void(0, u256::ZERO), validator: self.validator.commit_id(), } diff --git a/src/operation/mod.rs b/src/operation/mod.rs index 6db1613c..7d479a7d 100644 --- a/src/operation/mod.rs +++ b/src/operation/mod.rs @@ -49,8 +49,7 @@ pub use global::{GlobalState, GlobalValues}; pub use layer1::{ChainNet, Layer1}; pub use meta::{MetaValue, Metadata, MetadataError}; pub use operations::{ - Extension, Genesis, Identity, Input, Inputs, Operation, Opout, OpoutParseError, Redeemed, - Transition, Valencies, + Genesis, Identity, Input, Inputs, Operation, Opout, OpoutParseError, Transition, }; pub use seal::{ExposedSeal, GenesisSeal, GraphSeal, OutputSeal, SecretSeal, TxoSeal}; pub use state::{ExposedState, RevealedState, StateType}; diff --git a/src/operation/operations.rs b/src/operation/operations.rs index 74c9174b..29101d1a 100644 --- a/src/operation/operations.rs +++ b/src/operation/operations.rs @@ -21,12 +21,12 @@ // limitations under the License. use std::cmp::Ordering; -use std::collections::{btree_map, btree_set, BTreeMap}; +use std::collections::{btree_set, BTreeMap}; use std::iter; use std::num::ParseIntError; use std::str::FromStr; -use amplify::confinement::{Confined, SmallOrdSet, TinyOrdMap, TinyOrdSet}; +use amplify::confinement::{Confined, SmallOrdSet, TinyOrdSet}; use amplify::{hex, Wrapper}; use commit_verify::{ CommitEncode, CommitEngine, CommitId, Conceal, MerkleHash, MerkleLeaves, ReservedBytes, @@ -35,7 +35,7 @@ use commit_verify::{ use strict_encoding::stl::AsciiPrintable; use strict_encoding::{RString, StrictDeserialize, StrictEncode, StrictSerialize}; -use crate::schema::{self, ExtensionType, OpFullType, OpType, SchemaId, TransitionType}; +use crate::schema::{OpFullType, OpType, SchemaId, TransitionType}; use crate::{ Assign, AssignmentIndex, AssignmentType, Assignments, AssignmentsRef, ChainNet, ContractId, DiscloseHash, ExposedState, Ffv, GenesisSeal, GlobalState, GraphSeal, Metadata, OpDisclose, @@ -95,48 +95,6 @@ impl FromStr for Opout { } } -#[derive(Wrapper, WrapperMut, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Default, From)] -#[wrapper(Deref)] -#[wrapper_mut(DerefMut)] -#[derive(StrictType, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT)] -#[derive(CommitEncode)] -#[commit_encode(strategy = strict, id = StrictHash)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", transparent) -)] -pub struct Valencies(TinyOrdSet); - -impl<'a> IntoIterator for &'a Valencies { - type Item = schema::ValencyType; - type IntoIter = iter::Copied>; - - fn into_iter(self) -> Self::IntoIter { self.0.iter().copied() } -} - -#[derive(Wrapper, WrapperMut, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Default, From)] -#[wrapper(Deref)] -#[wrapper_mut(DerefMut)] -#[derive(StrictType, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT)] -#[derive(CommitEncode)] -#[commit_encode(strategy = strict, id = StrictHash)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", transparent) -)] -pub struct Redeemed(TinyOrdMap); - -impl<'a> IntoIterator for &'a Redeemed { - type Item = (&'a schema::ValencyType, &'a OpId); - type IntoIter = btree_map::Iter<'a, schema::ValencyType, OpId>; - - fn into_iter(self) -> Self::IntoIter { self.0.iter() } -} - #[derive(Wrapper, WrapperMut, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Default, From)] #[wrapper(Deref)] #[wrapper_mut(DerefMut)] @@ -195,7 +153,6 @@ impl Input { /// Implemented by all contract operation types (see [`OpType`]): /// - Genesis ([`Genesis`]) /// - State transitions ([`Transitions`]) -/// - Public state extensions ([`Extensions`]) pub trait Operation { /// Returns type of the operation (see [`OpType`]). Unfortunately, this /// can't be just a const, since it will break our ability to convert @@ -213,33 +170,25 @@ pub trait Operation { /// Returns [`ContractId`] this operation belongs to. fn contract_id(&self) -> ContractId; - /// Returns nonce used in consensus ordering of state transitions and - /// extensions. + /// Returns nonce used in consensus ordering of state transitions fn nonce(&self) -> u64; /// Returns [`Option::Some`]`(`[`TransitionType`]`)` for transitions or - /// [`Option::None`] for genesis and extension operation types + /// [`Option::None`] for genesis operation type fn transition_type(&self) -> Option; - /// Returns [`Option::Some`]`(`[`ExtensionType`]`)` for extension nodes or - /// [`Option::None`] for genesis and state transitions - fn extension_type(&self) -> Option; - /// Returns metadata associated with the operation, if any. fn metadata(&self) -> &Metadata; /// Returns reference to a full set of metadata (in form of [`GlobalState`] /// wrapper structure) for the contract operation. fn globals(&self) -> &GlobalState; - fn valencies(&self) -> &Valencies; fn assignments(&self) -> AssignmentsRef; fn assignments_by_type(&self, t: AssignmentType) -> Option>; - /// For genesis and public state extensions always returns an empty list. - /// While public state extension do have parent nodes, they do not contain - /// indexed rights. + /// For genesis always returns an empty list. fn inputs(&self) -> Inputs; /// Provides summary about parts of the operation which are revealed. @@ -348,46 +297,12 @@ pub struct Genesis { pub metadata: Metadata, pub globals: GlobalState, pub assignments: Assignments, - pub valencies: Valencies, pub validator: ReservedBytes<1, 0>, } impl StrictSerialize for Genesis {} impl StrictDeserialize for Genesis {} -#[derive(Clone, PartialEq, Eq, Debug)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", rename_all = "camelCase") -)] -pub struct Extension { - pub ffv: Ffv, - pub contract_id: ContractId, - pub nonce: u64, - pub extension_type: ExtensionType, - pub metadata: Metadata, - pub globals: GlobalState, - pub assignments: Assignments, - pub redeemed: Redeemed, - pub valencies: Valencies, - pub validator: ReservedBytes<1, 0>, - pub witness: ReservedBytes<2, 0>, -} - -impl StrictSerialize for Extension {} -impl StrictDeserialize for Extension {} - -impl Ord for Extension { - fn cmp(&self, other: &Self) -> Ordering { self.id().cmp(&other.id()) } -} - -impl PartialOrd for Extension { - fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } -} - #[derive(Clone, PartialEq, Eq, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB_COMMIT)] @@ -405,7 +320,6 @@ pub struct Transition { pub globals: GlobalState, pub inputs: Inputs, pub assignments: Assignments, - pub valencies: Valencies, pub validator: ReservedBytes<1, 0>, pub witness: ReservedBytes<2, 0>, } @@ -445,18 +359,6 @@ impl Conceal for Transition { } } -impl Conceal for Extension { - type Concealed = Self; - fn conceal(&self) -> Self::Concealed { - let mut concealed = self.clone(); - concealed - .assignments - .keyed_values_mut() - .for_each(|(_, a)| *a = a.conceal()); - concealed - } -} - impl CommitEncode for Genesis { type CommitmentId = OpId; fn commit_encode(&self, e: &mut CommitEngine) { e.commit_to_serialized(&self.commit()) } @@ -467,11 +369,6 @@ impl CommitEncode for Transition { fn commit_encode(&self, e: &mut CommitEngine) { e.commit_to_serialized(&self.commit()) } } -impl CommitEncode for Extension { - type CommitmentId = OpId; - fn commit_encode(&self, e: &mut CommitEngine) { e.commit_to_serialized(&self.commit()) } -} - impl Transition { /// Returns reference to information about the owned rights in form of /// [`Inputs`] wrapper structure which this operation updates with @@ -479,15 +376,6 @@ impl Transition { pub fn prev_state(&self) -> &Inputs { &self.inputs } } -impl Extension { - /// Returns reference to information about the public rights (in form of - /// [`Redeemed`] wrapper structure), defined with "parent" state - /// extensions (i.e. those finalized with the current state transition) or - /// referenced by another state extension, which this operation updates - /// ("parent public rights"). - pub fn redeemed(&self) -> &Redeemed { &self.redeemed } -} - impl Operation for Genesis { #[inline] fn op_type(&self) -> OpType { OpType::Genesis } @@ -507,63 +395,12 @@ impl Operation for Genesis { #[inline] fn transition_type(&self) -> Option { None } - #[inline] - fn extension_type(&self) -> Option { None } - - #[inline] - fn metadata(&self) -> &Metadata { &self.metadata } - - #[inline] - fn globals(&self) -> &GlobalState { &self.globals } - - #[inline] - fn valencies(&self) -> &Valencies { &self.valencies } - - #[inline] - fn assignments(&self) -> AssignmentsRef { (&self.assignments).into() } - - #[inline] - fn assignments_by_type(&self, t: AssignmentType) -> Option> { - self.assignments - .get(&t) - .map(TypedAssigns::transmutate_seals) - } - - #[inline] - fn inputs(&self) -> Inputs { empty!() } -} - -impl Operation for Extension { - #[inline] - fn op_type(&self) -> OpType { OpType::StateExtension } - - #[inline] - fn full_type(&self) -> OpFullType { OpFullType::StateExtension(self.extension_type) } - - #[inline] - fn id(&self) -> OpId { self.commit_id() } - - #[inline] - fn contract_id(&self) -> ContractId { self.contract_id } - - #[inline] - fn nonce(&self) -> u64 { self.nonce } - - #[inline] - fn transition_type(&self) -> Option { None } - - #[inline] - fn extension_type(&self) -> Option { Some(self.extension_type) } - #[inline] fn metadata(&self) -> &Metadata { &self.metadata } #[inline] fn globals(&self) -> &GlobalState { &self.globals } - #[inline] - fn valencies(&self) -> &Valencies { &self.valencies } - #[inline] fn assignments(&self) -> AssignmentsRef { (&self.assignments).into() } @@ -597,18 +434,12 @@ impl Operation for Transition { #[inline] fn transition_type(&self) -> Option { Some(self.transition_type) } - #[inline] - fn extension_type(&self) -> Option { None } - #[inline] fn metadata(&self) -> &Metadata { &self.metadata } #[inline] fn globals(&self) -> &GlobalState { &self.globals } - #[inline] - fn valencies(&self) -> &Valencies { &self.valencies } - #[inline] fn assignments(&self) -> AssignmentsRef { (&self.assignments).into() } diff --git a/src/schema/mod.rs b/src/schema/mod.rs index 54073447..08297c2f 100644 --- a/src/schema/mod.rs +++ b/src/schema/mod.rs @@ -28,8 +28,8 @@ mod occurrences; pub use occurrences::{Occurrences, OccurrencesMismatch}; pub use operations::{ - AssignmentType, AssignmentsSchema, ExtensionSchema, GenesisSchema, GlobalSchema, MetaSchema, - OpFullType, OpSchema, OpType, TransitionSchema, ValencySchema, ValencyType, + AssignmentType, AssignmentsSchema, GenesisSchema, GlobalSchema, MetaSchema, OpFullType, + OpSchema, OpType, TransitionSchema, }; -pub use schema::{ExtensionType, GlobalStateType, MetaType, Schema, SchemaId, TransitionType}; +pub use schema::{GlobalStateType, MetaType, Schema, SchemaId, TransitionType}; pub use state::{FungibleType, GlobalStateSchema, MediaType, OwnedStateSchema}; diff --git a/src/schema/operations.rs b/src/schema/operations.rs index fa1dc820..343b350d 100644 --- a/src/schema/operations.rs +++ b/src/schema/operations.rs @@ -24,7 +24,7 @@ use aluvm::library::LibSite; use amplify::confinement::{TinyOrdMap, TinyOrdSet}; use amplify::Wrapper; -use super::{ExtensionType, GlobalStateType, Occurrences, TransitionType}; +use super::{GlobalStateType, Occurrences, TransitionType}; use crate::schema::schema::MetaType; use crate::LIB_NAME_RGB_COMMIT; @@ -45,24 +45,8 @@ impl AssignmentType { pub fn to_le_bytes(&self) -> [u8; 2] { self.0.to_le_bytes() } } -#[derive(Wrapper, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From, Display)] -#[wrapper(FromStr, LowerHex, UpperHex)] -#[display("0x{0:04X}")] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", rename_all = "camelCase") -)] -pub struct ValencyType(u16); -impl ValencyType { - pub const fn with(ty: u16) -> Self { Self(ty) } -} - pub type MetaSchema = TinyOrdSet; pub type GlobalSchema = TinyOrdMap; -pub type ValencySchema = TinyOrdSet; pub type InputsSchema = TinyOrdMap; pub type AssignmentsSchema = TinyOrdMap; @@ -73,29 +57,21 @@ pub type AssignmentsSchema = TinyOrdMap; serde(crate = "serde_crate", rename_all = "camelCase") )] #[repr(u8)] -/// Node type: genesis, extensions and state transitions +/// Node type: genesis and state transitions pub enum OpType { /// Genesis: single operation per contract, defining contract and /// committing to a specific schema and underlying chain hash #[display("genesis")] Genesis = 0, - /// Multiple points for decentralized & unowned contract extension, - /// committing either to a genesis or some state transition via their - /// valencies - #[display("extension")] - StateExtension = 1, - - /// State transition performing owned change to the state data and - /// committing to (potentially multiple) ancestors (i.e. genesis, - /// extensions and/or other state transitions) via spending + /// State transition performing owned change to the state data and committing to (potentially + /// multiple) ancestors (i.e. genesis and/or other state transitions) via spending /// corresponding transaction outputs assigned some state by ancestors #[display("transition")] - StateTransition = 2, + StateTransition = 1, } -/// Aggregated type used to supply full contract operation type and -/// transition/state extension type information +/// Aggregated type used to supply full contract operation type and transition type information #[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display)] #[cfg_attr( feature = "serde", @@ -110,10 +86,6 @@ pub enum OpFullType { /// State transition contract operation, subtyped by transition type #[display("state transition #{0}")] StateTransition(TransitionType), - - /// State extension contract operation, subtyped by extension type - #[display("state extension #{0}")] - StateExtension(ExtensionType), } impl OpFullType { @@ -121,13 +93,10 @@ impl OpFullType { match self { OpFullType::Genesis => 0, OpFullType::StateTransition(ty) => ty.to_inner(), - OpFullType::StateExtension(ty) => ty.to_inner(), } } pub fn is_transition(self) -> bool { matches!(self, Self::StateTransition(_)) } - - pub fn is_extension(self) -> bool { matches!(self, Self::StateExtension(_)) } } /// Trait defining common API for all operation type schemata @@ -136,9 +105,7 @@ pub trait OpSchema { fn metadata(&self) -> &MetaSchema; fn globals(&self) -> &GlobalSchema; fn inputs(&self) -> Option<&InputsSchema>; - fn redeems(&self) -> Option<&ValencySchema>; fn assignments(&self) -> &AssignmentsSchema; - fn valencies(&self) -> &ValencySchema; } #[derive(Clone, PartialEq, Eq, Debug, Default)] @@ -153,28 +120,10 @@ pub struct GenesisSchema { pub metadata: MetaSchema, pub globals: GlobalSchema, pub assignments: AssignmentsSchema, - pub valencies: ValencySchema, // NB: it is possible to transform option into enum covering other virtual machines pub validator: Option, } -#[derive(Clone, PartialEq, Eq, Debug, Default)] -#[derive(StrictType, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", rename_all = "camelCase") -)] -pub struct ExtensionSchema { - pub metadata: MetaSchema, - pub globals: GlobalSchema, - pub redeems: ValencySchema, - pub assignments: AssignmentsSchema, - pub valencies: ValencySchema, - pub validator: Option, -} - #[derive(Clone, PartialEq, Eq, Debug, Default)] #[derive(StrictType, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB_COMMIT)] @@ -188,7 +137,6 @@ pub struct TransitionSchema { pub globals: GlobalSchema, pub inputs: InputsSchema, pub assignments: AssignmentsSchema, - pub valencies: ValencySchema, pub validator: Option, } @@ -202,28 +150,7 @@ impl OpSchema for GenesisSchema { #[inline] fn inputs(&self) -> Option<&InputsSchema> { None } #[inline] - fn redeems(&self) -> Option<&ValencySchema> { None } - #[inline] fn assignments(&self) -> &AssignmentsSchema { &self.assignments } - #[inline] - fn valencies(&self) -> &ValencySchema { &self.valencies } -} - -impl OpSchema for ExtensionSchema { - #[inline] - fn op_type(&self) -> OpType { OpType::StateExtension } - #[inline] - fn metadata(&self) -> &MetaSchema { &self.metadata } - #[inline] - fn globals(&self) -> &GlobalSchema { &self.globals } - #[inline] - fn inputs(&self) -> Option<&InputsSchema> { None } - #[inline] - fn redeems(&self) -> Option<&ValencySchema> { Some(&self.redeems) } - #[inline] - fn assignments(&self) -> &AssignmentsSchema { &self.assignments } - #[inline] - fn valencies(&self) -> &ValencySchema { &self.valencies } } impl OpSchema for TransitionSchema { @@ -236,9 +163,5 @@ impl OpSchema for TransitionSchema { #[inline] fn inputs(&self) -> Option<&AssignmentsSchema> { Some(&self.inputs) } #[inline] - fn redeems(&self) -> Option<&ValencySchema> { None } - #[inline] fn assignments(&self) -> &AssignmentsSchema { &self.assignments } - #[inline] - fn valencies(&self) -> &ValencySchema { &self.valencies } } diff --git a/src/schema/schema.rs b/src/schema/schema.rs index a0d06f36..1204c09e 100644 --- a/src/schema/schema.rs +++ b/src/schema/schema.rs @@ -25,7 +25,7 @@ use std::fmt::{self, Display, Formatter}; use std::str::FromStr; use aluvm::library::LibId; -use amplify::confinement::{TinyOrdMap, TinyOrdSet}; +use amplify::confinement::TinyOrdMap; use amplify::{ByteArray, Bytes32}; use baid64::{Baid64ParseError, DisplayBaid64, FromBaid64Str}; use commit_verify::{ @@ -36,9 +36,7 @@ use strict_encoding::{ }; use strict_types::SemId; -use super::{ - AssignmentType, ExtensionSchema, GenesisSchema, OwnedStateSchema, TransitionSchema, ValencyType, -}; +use super::{AssignmentType, GenesisSchema, OwnedStateSchema, TransitionSchema}; use crate::{impl_serde_baid64, Ffv, GlobalStateSchema, Identity, LIB_NAME_RGB_COMMIT}; #[derive(Wrapper, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From, Display)] @@ -71,21 +69,6 @@ impl GlobalStateType { pub const fn with(ty: u16) -> Self { Self(ty) } } -#[derive(Wrapper, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From, Display)] -#[wrapper(FromStr, LowerHex, UpperHex)] -#[display("0x{0:04X}")] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", rename_all = "camelCase") -)] -pub struct ExtensionType(u16); -impl ExtensionType { - pub const fn with(ty: u16) -> Self { Self(ty) } -} - #[derive(Wrapper, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From, Display)] #[wrapper(FromStr, LowerHex, UpperHex)] #[display("0x{0:04X}")] @@ -160,9 +143,7 @@ pub struct Schema { pub meta_types: TinyOrdMap, pub global_types: TinyOrdMap, pub owned_types: TinyOrdMap, - pub valency_types: TinyOrdSet, pub genesis: GenesisSchema, - pub extensions: TinyOrdMap, pub transitions: TinyOrdMap, pub reserved: ReservedBytes<8, 0>, @@ -182,9 +163,7 @@ impl CommitEncode for Schema { e.commit_to_map(&self.meta_types); e.commit_to_map(&self.global_types); e.commit_to_map(&self.owned_types); - e.commit_to_set(&self.valency_types); e.commit_to_serialized(&self.genesis); - e.commit_to_map(&self.extensions); e.commit_to_map(&self.transitions); e.commit_to_serialized(&self.reserved); @@ -228,7 +207,6 @@ impl Schema { .iter() .copied() .chain(self.transitions.values().filter_map(|i| i.validator)) - .chain(self.extensions.values().filter_map(|i| i.validator)) .map(|site| site.lib) } diff --git a/src/stl.rs b/src/stl.rs index 57e7b051..a0a9d9cd 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -32,16 +32,15 @@ use strict_types::{CompileError, TypeLib}; use crate::validation::DbcProof; use crate::vm::GlobalOrd; use crate::{ - Extension, Genesis, OpCommitment, Schema, TransitionBundle, LIB_NAME_RGB_COMMIT, - LIB_NAME_RGB_LOGIC, + Genesis, OpCommitment, Schema, TransitionBundle, LIB_NAME_RGB_COMMIT, LIB_NAME_RGB_LOGIC, }; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_COMMIT: &str = - "stl:N6SXCpvQ-tPzjGVN-pRMk9CN-qE0thG!-2mpTOLT-fOL4sRA#sunset-cherry-melody"; + "stl:O97qYf!c-DQ5qDGf-DLQPobD-6u5bUjG-J8!Svk7-OIVz4fk#fossil-latin-random"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:0wsJV4GJ-U$BRIX2-Mvvm2Db-aTx6jqR-CWzNyC9-S8TnMPE#program-june-motel"; + "stl:cpfuZutw-7s$hkuI-Q8vaRf4-XCUiAKC-glMJM!0-8hV0Gvg#monarch-detect-paradox"; fn _rgb_commit_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_COMMIT), tiny_bset! { @@ -56,7 +55,6 @@ fn _rgb_commit_stl() -> Result { .transpile::() .transpile::() .transpile::() - .transpile::() .transpile::() .compile() } diff --git a/src/validation/consignment.rs b/src/validation/consignment.rs index e69fc29d..07e817cc 100644 --- a/src/validation/consignment.rs +++ b/src/validation/consignment.rs @@ -21,8 +21,7 @@ // limitations under the License. //! Common API for accessing RGB contract operation graph, including individual -//! state transitions, extensions, genesis, outputs, assignments & -//! single-use-seal data. +//! state transitions, genesis, outputs, assignments & single-use-seal data. use aluvm::library::{Lib, LibId}; use amplify::confinement::ConfinedOrdMap; @@ -31,9 +30,9 @@ use strict_types::TypeSystem; use super::EAnchor; use crate::{ - AssignmentType, AssignmentsRef, BundleId, ContractId, Extension, ExtensionType, Genesis, - GlobalState, GraphSeal, Inputs, Metadata, OpFullType, OpId, OpType, Operation, Schema, - Transition, TransitionBundle, TransitionType, TypedAssigns, Valencies, + AssignmentType, AssignmentsRef, BundleId, ContractId, Genesis, GlobalState, GraphSeal, Inputs, + Metadata, OpFullType, OpId, OpType, Operation, Schema, Transition, TransitionBundle, + TransitionType, TypedAssigns, }; pub const CONSIGNMENT_MAX_LIBS: usize = 1024; @@ -46,8 +45,6 @@ pub enum OpRef<'op> { Genesis(&'op Genesis), #[from] Transition(&'op Transition), - #[from] - Extension(&'op Extension), } impl<'op> Operation for OpRef<'op> { @@ -55,7 +52,6 @@ impl<'op> Operation for OpRef<'op> { match self { Self::Genesis(op) => op.op_type(), Self::Transition(op) => op.op_type(), - Self::Extension(op) => op.op_type(), } } @@ -63,7 +59,6 @@ impl<'op> Operation for OpRef<'op> { match self { Self::Genesis(op) => op.full_type(), Self::Transition(op) => op.full_type(), - Self::Extension(op) => op.full_type(), } } @@ -71,7 +66,6 @@ impl<'op> Operation for OpRef<'op> { match self { Self::Genesis(op) => op.id(), Self::Transition(op) => op.id(), - Self::Extension(op) => op.id(), } } @@ -79,7 +73,6 @@ impl<'op> Operation for OpRef<'op> { match self { Self::Genesis(op) => op.contract_id(), Self::Transition(op) => op.contract_id(), - Self::Extension(op) => op.contract_id(), } } @@ -87,7 +80,6 @@ impl<'op> Operation for OpRef<'op> { match self { Self::Genesis(op) => op.nonce(), Self::Transition(op) => op.nonce(), - Self::Extension(op) => op.nonce(), } } @@ -95,15 +87,6 @@ impl<'op> Operation for OpRef<'op> { match self { Self::Genesis(op) => op.transition_type(), Self::Transition(op) => op.transition_type(), - Self::Extension(op) => op.transition_type(), - } - } - - fn extension_type(&self) -> Option { - match self { - Self::Genesis(op) => op.extension_type(), - Self::Transition(op) => op.extension_type(), - Self::Extension(op) => op.extension_type(), } } @@ -111,7 +94,6 @@ impl<'op> Operation for OpRef<'op> { match self { Self::Genesis(op) => op.metadata(), Self::Transition(op) => op.metadata(), - Self::Extension(op) => op.metadata(), } } @@ -119,15 +101,6 @@ impl<'op> Operation for OpRef<'op> { match self { Self::Genesis(op) => op.globals(), Self::Transition(op) => op.globals(), - Self::Extension(op) => op.globals(), - } - } - - fn valencies(&self) -> &Valencies { - match self { - Self::Genesis(op) => op.valencies(), - Self::Transition(op) => op.valencies(), - Self::Extension(op) => op.valencies(), } } @@ -135,7 +108,6 @@ impl<'op> Operation for OpRef<'op> { match self { Self::Genesis(op) => (&op.assignments).into(), Self::Transition(op) => (&op.assignments).into(), - Self::Extension(op) => (&op.assignments).into(), } } @@ -143,7 +115,6 @@ impl<'op> Operation for OpRef<'op> { match self { Self::Genesis(op) => op.assignments_by_type(t), Self::Transition(op) => op.assignments_by_type(t), - Self::Extension(op) => op.assignments_by_type(t), } } @@ -151,7 +122,6 @@ impl<'op> Operation for OpRef<'op> { match self { Self::Genesis(op) => op.inputs(), Self::Transition(op) => op.inputs(), - Self::Extension(op) => op.inputs(), } } } @@ -206,8 +176,8 @@ pub trait ConsignmentApi { /// validation. fn scripts(&self) -> &Scripts; - /// Retrieves reference to an operation (genesis, state transition or state - /// extension) matching the provided id, or `None` otherwise + /// Retrieves reference to an operation (genesis or state transition) matching the provided id, + /// or `None` otherwise fn operation(&self, opid: OpId) -> Option; /// Contract genesis. diff --git a/src/validation/logic.rs b/src/validation/logic.rs index 901d4124..1b1f8b16 100644 --- a/src/validation/logic.rs +++ b/src/validation/logic.rs @@ -32,14 +32,13 @@ use amplify::confinement::Confined; use amplify::Wrapper; use strict_types::TypeSystem; -use crate::schema::{AssignmentsSchema, GlobalSchema, ValencySchema}; +use crate::schema::{AssignmentsSchema, GlobalSchema}; use crate::validation::{CheckedConsignment, ConsignmentApi}; use crate::vm::{ContractStateAccess, ContractStateEvolve, OpInfo, OrdOpRef, RgbIsa, VmContext}; use crate::{ validation, Assign, AssignmentType, Assignments, AssignmentsRef, ExposedSeal, ExposedState, - Extension, GlobalState, GlobalStateSchema, GlobalValues, GraphSeal, Inputs, MetaSchema, - Metadata, OpId, Operation, Opout, OwnedStateSchema, RevealedState, Schema, Transition, - TypedAssigns, Valencies, + GlobalState, GlobalStateSchema, GlobalValues, GraphSeal, Inputs, MetaSchema, Metadata, OpId, + Operation, Opout, OwnedStateSchema, RevealedState, Schema, Transition, TypedAssigns, }; impl Schema { @@ -57,24 +56,13 @@ impl Schema { let mut status = validation::Status::new(); let empty_assign_schema = AssignmentsSchema::default(); - let empty_valency_schema = ValencySchema::default(); - let ( - metadata_schema, - global_schema, - owned_schema, - redeem_schema, - assign_schema, - valency_schema, - validator, - ty, - ) = match op { + let (metadata_schema, global_schema, owned_schema, assign_schema, validator, ty) = match op + { OrdOpRef::Genesis(_) => ( &self.genesis.metadata, &self.genesis.globals, &empty_assign_schema, - &empty_valency_schema, &self.genesis.assignments, - &self.genesis.valencies, self.genesis.validator, None::, ), @@ -109,43 +97,11 @@ impl Schema { &transition_schema.metadata, &transition_schema.globals, &transition_schema.inputs, - &empty_valency_schema, &transition_schema.assignments, - &transition_schema.valencies, transition_schema.validator, Some(transition_type.into_inner()), ) } - OrdOpRef::Extension(Extension { extension_type, .. }, ..) => { - // Right now we do not have actions to implement; but later - // we may have embedded procedures which must be verified - // here - /* - if let Some(procedure) = extension_type.abi.get(&ExtensionAction::NoOp) { - - } - */ - - let extension_schema = match self.extensions.get(extension_type) { - None => { - return validation::Status::with_failure( - validation::Failure::SchemaUnknownExtensionType(opid, *extension_type), - ); - } - Some(extension_schema) => extension_schema, - }; - - ( - &extension_schema.metadata, - &extension_schema.globals, - &empty_assign_schema, - &extension_schema.redeems, - &extension_schema.assignments, - &extension_schema.redeems, - extension_schema.validator, - Some(extension_type.into_inner()), - ) - } }; // Validate type system @@ -160,13 +116,6 @@ impl Schema { } else { Assignments::default() }; - let mut redeemed = Valencies::default(); - if let OrdOpRef::Extension(extension, ..) = op { - for valency in extension.redeemed.keys() { - redeemed.push(*valency).expect("same size"); - } - status += self.validate_redeemed(opid, &redeemed, redeem_schema); - } status += match op.assignments() { AssignmentsRef::Genesis(assignments) => { self.validate_owned_state(opid, assignments, assign_schema, consignment.types()) @@ -176,10 +125,8 @@ impl Schema { } }; - status += self.validate_valencies(opid, op.valencies(), valency_schema); - let genesis = consignment.genesis(); - let op_info = OpInfo::with(opid, &op, &prev_state, &redeemed); + let op_info = OpInfo::with(opid, &op, &prev_state); let context = VmContext { contract_id: genesis.contract_id(), op_info, @@ -370,26 +317,6 @@ impl Schema { status } - fn validate_redeemed( - &self, - id: OpId, - valencies: &Valencies, - valency_schema: &ValencySchema, - ) -> validation::Status { - let mut status = validation::Status::new(); - - valencies - .difference(valency_schema) - .for_each(|public_type_id| { - status.add_failure(validation::Failure::SchemaUnknownValencyType( - id, - *public_type_id, - )); - }); - - status - } - fn validate_owned_state( &self, id: OpId, @@ -447,26 +374,6 @@ impl Schema { status } - - fn validate_valencies( - &self, - id: OpId, - valencies: &Valencies, - valency_schema: &ValencySchema, - ) -> validation::Status { - let mut status = validation::Status::new(); - - valencies - .difference(valency_schema) - .for_each(|public_type_id| { - status.add_failure(validation::Failure::SchemaUnknownValencyType( - id, - *public_type_id, - )); - }); - - status - } } fn extract_prev_state( diff --git a/src/validation/schema.rs b/src/validation/schema.rs index 08be0f8b..e87b6c85 100644 --- a/src/validation/schema.rs +++ b/src/validation/schema.rs @@ -32,9 +32,6 @@ impl Schema { for (type_id, schema) in &self.transitions { status += self.verify_operation(OpFullType::StateTransition(*type_id), schema); } - for (type_id, schema) in &self.extensions { - status += self.verify_operation(OpFullType::StateExtension(*type_id), schema); - } for (type_id, sem_id) in &self.meta_types { if !types.contains_key(sem_id) { @@ -75,9 +72,6 @@ impl Schema { if matches!(schema.inputs(), Some(inputs) if inputs.is_empty()) { status.add_failure(validation::Failure::SchemaOpEmptyInputs(op_type)); } - if matches!(schema.redeems(), Some(inputs) if inputs.is_empty()) { - status.add_failure(validation::Failure::SchemaOpEmptyInputs(op_type)); - } for type_id in schema.globals().keys() { if !self.global_types.contains_key(type_id) { status @@ -91,13 +85,6 @@ impl Schema { )); } } - for type_id in schema.valencies() { - if !self.valency_types.contains(type_id) { - status.add_failure(validation::Failure::SchemaOpValencyTypeUnknown( - op_type, *type_id, - )); - } - } status } diff --git a/src/validation/status.rs b/src/validation/status.rs index 908e5f88..d03035e0 100644 --- a/src/validation/status.rs +++ b/src/validation/status.rs @@ -201,11 +201,7 @@ pub enum Failure { SchemaOpGlobalTypeUnknown(OpFullType, schema::GlobalStateType), /// schema for {0} references undeclared owned state type {1}. SchemaOpAssignmentTypeUnknown(OpFullType, schema::AssignmentType), - /// schema for {0} references undeclared valency type {1}. - SchemaOpValencyTypeUnknown(OpFullType, schema::ValencyType), - /// operation {0} uses invalid state extension type {1}. - SchemaUnknownExtensionType(OpId, schema::ExtensionType), /// operation {0} uses invalid state transition type {1}. SchemaUnknownTransitionType(OpId, schema::TransitionType), /// operation {0} uses invalid metadata type {1}. @@ -214,8 +210,6 @@ pub enum Failure { SchemaUnknownGlobalStateType(OpId, schema::GlobalStateType), /// operation {0} uses invalid assignment type {1}. SchemaUnknownAssignmentType(OpId, schema::AssignmentType), - /// operation {0} uses invalid valency type {1}. - SchemaUnknownValencyType(OpId, schema::ValencyType), /// invalid number of global state entries of type {1} in operation {0} - /// {2} @@ -301,22 +295,6 @@ pub enum Failure { /// type ({1}) InvalidProofType(Txid, CloseMethod), - // State extensions errors - /// valency {valency} redeemed by state extension {opid} references - /// non-existing operation {prev_id} - ValencyNoParent { - opid: OpId, - prev_id: OpId, - valency: schema::ValencyType, - }, - /// state extension {opid} references valency {valency} absent in the parent - /// {prev_id}. - NoPrevValency { - opid: OpId, - prev_id: OpId, - valency: schema::ValencyType, - }, - // State check errors /// state in {opid}/{state_type} is of {found} type, while schema requires /// it to be {expected}. diff --git a/src/validation/validator.rs b/src/validation/validator.rs index 07a1e9f1..82a3e204 100644 --- a/src/validation/validator.rs +++ b/src/validation/validator.rs @@ -32,7 +32,7 @@ use commit_verify::mpc; use single_use_seals::SealWitness; use super::status::{Failure, Warning}; -use super::{CheckedConsignment, ConsignmentApi, DbcProof, EAnchor, OpRef, Status, Validity}; +use super::{CheckedConsignment, ConsignmentApi, DbcProof, EAnchor, Status, Validity}; use crate::operation::seal::ExposedSeal; use crate::vm::{ContractStateAccess, ContractStateEvolve, OrdOpRef, WitnessOrd}; use crate::{ @@ -312,29 +312,6 @@ impl< } for op in bundle.known_transitions.values() { ops.insert(OrdOpRef::Transition(op, witness_id, witness_ord, bundle_id)); - for input in &op.inputs { - // We will error in `validate_operations` below on the absent extension from the - // consignment. - if let Some(OpRef::Extension(extension)) = - self.consignment.operation(input.prev_out.op) - { - let ext = OrdOpRef::Extension(extension, witness_id, witness_ord); - // Account only for the first time when extension seal was closed - let prev = ops.iter().find(|r| matches!(r, OrdOpRef::Extension(ext, ..) if ext.id() == extension.id())).copied(); - match prev { - Some(old) if old > ext => { - ops.remove(&old); - ops.insert(ext) - } - None => ops.insert(ext), - _ => { - /* the extension is already present in the queue and properly - * ordered, so we have nothing to add or change */ - true - } - }; - } - } } } if self.safe_height.is_some() { @@ -384,31 +361,6 @@ impl< } } } - OrdOpRef::Extension(extension, ..) => { - for (valency, prev_id) in &extension.redeemed { - let Some(prev_op) = self.consignment.operation(*prev_id) else { - self.status - .borrow_mut() - .add_failure(Failure::ValencyNoParent { - opid, - prev_id: *prev_id, - valency: *valency, - }); - continue; - }; - - if !prev_op.valencies().contains(valency) { - self.status - .borrow_mut() - .add_failure(Failure::NoPrevValency { - opid, - prev_id: *prev_id, - valency: *valency, - }); - continue; - } - } - } } } @@ -606,7 +558,7 @@ impl< seal.to_output_seal_or_default(witness_id) } else { seal.to_output_seal() - .expect("genesis and state extensions must have explicit seals") + .expect("genesis must have explicit seals") }; seals.push(seal); diff --git a/src/vm/contract.rs b/src/vm/contract.rs index f07fed20..48defcd6 100644 --- a/src/vm/contract.rs +++ b/src/vm/contract.rs @@ -35,9 +35,9 @@ use strict_encoding::{StrictDecode, StrictDumb, StrictEncode}; use crate::{ AssignmentType, Assignments, AssignmentsRef, AttachState, BundleId, ContractId, DataState, - Extension, ExtensionType, FungibleState, Genesis, GlobalState, GlobalStateType, GraphSeal, - Inputs, Layer1, Metadata, OpFullType, OpId, OpType, Operation, Transition, TransitionType, - TypedAssigns, Valencies, LIB_NAME_RGB_LOGIC, + FungibleState, Genesis, GlobalState, GlobalStateType, GraphSeal, Inputs, Layer1, Metadata, + OpFullType, OpId, OpType, Operation, Transition, TransitionType, TypedAssigns, + LIB_NAME_RGB_LOGIC, }; /// The type is used during validation and computing a contract state. It @@ -49,7 +49,6 @@ pub enum OrdOpRef<'op> { #[from] Genesis(&'op Genesis), Transition(&'op Transition, Txid, WitnessOrd, BundleId), - Extension(&'op Extension, Txid, WitnessOrd), } impl PartialOrd for OrdOpRef<'_> { @@ -64,15 +63,13 @@ impl OrdOpRef<'_> { pub fn witness_id(&self) -> Option { match self { OrdOpRef::Genesis(_) => None, - OrdOpRef::Transition(_, witness_id, ..) | OrdOpRef::Extension(_, witness_id, ..) => { - Some(*witness_id) - } + OrdOpRef::Transition(_, witness_id, ..) => Some(*witness_id), } } pub fn bundle_id(&self) -> Option { match self { - OrdOpRef::Genesis(_) | OrdOpRef::Extension(..) => None, + OrdOpRef::Genesis(_) => None, OrdOpRef::Transition(_, _, _, bundle_id) => Some(*bundle_id), } } @@ -86,12 +83,6 @@ impl OrdOpRef<'_> { nonce: op.nonce, opid: op.id(), }, - OrdOpRef::Extension(op, _, witness_ord) => OpOrd::Extension { - witness: *witness_ord, - ty: op.extension_type, - nonce: op.nonce, - opid: op.id(), - }, } } } @@ -101,7 +92,6 @@ impl<'op> Operation for OrdOpRef<'op> { match self { OrdOpRef::Genesis(op) => op.op_type(), OrdOpRef::Transition(op, ..) => op.op_type(), - OrdOpRef::Extension(op, ..) => op.op_type(), } } @@ -109,7 +99,6 @@ impl<'op> Operation for OrdOpRef<'op> { match self { OrdOpRef::Genesis(op) => op.full_type(), OrdOpRef::Transition(op, ..) => op.full_type(), - OrdOpRef::Extension(op, ..) => op.full_type(), } } @@ -117,7 +106,6 @@ impl<'op> Operation for OrdOpRef<'op> { match self { OrdOpRef::Genesis(op) => op.id(), OrdOpRef::Transition(op, ..) => op.id(), - OrdOpRef::Extension(op, ..) => op.id(), } } @@ -125,7 +113,6 @@ impl<'op> Operation for OrdOpRef<'op> { match self { OrdOpRef::Genesis(op) => op.contract_id(), OrdOpRef::Transition(op, ..) => op.contract_id(), - OrdOpRef::Extension(op, ..) => op.contract_id(), } } @@ -133,7 +120,6 @@ impl<'op> Operation for OrdOpRef<'op> { match self { OrdOpRef::Genesis(op) => op.nonce(), OrdOpRef::Transition(op, ..) => op.nonce(), - OrdOpRef::Extension(op, ..) => op.nonce(), } } @@ -141,15 +127,6 @@ impl<'op> Operation for OrdOpRef<'op> { match self { OrdOpRef::Genesis(op) => op.transition_type(), OrdOpRef::Transition(op, ..) => op.transition_type(), - OrdOpRef::Extension(op, ..) => op.transition_type(), - } - } - - fn extension_type(&self) -> Option { - match self { - OrdOpRef::Genesis(op) => op.extension_type(), - OrdOpRef::Transition(op, ..) => op.extension_type(), - OrdOpRef::Extension(op, ..) => op.extension_type(), } } @@ -157,7 +134,6 @@ impl<'op> Operation for OrdOpRef<'op> { match self { OrdOpRef::Genesis(op) => op.metadata(), OrdOpRef::Transition(op, ..) => op.metadata(), - OrdOpRef::Extension(op, ..) => op.metadata(), } } @@ -165,15 +141,6 @@ impl<'op> Operation for OrdOpRef<'op> { match self { OrdOpRef::Genesis(op) => op.globals(), OrdOpRef::Transition(op, ..) => op.globals(), - OrdOpRef::Extension(op, ..) => op.globals(), - } - } - - fn valencies(&self) -> &Valencies { - match self { - OrdOpRef::Genesis(op) => op.valencies(), - OrdOpRef::Transition(op, ..) => op.valencies(), - OrdOpRef::Extension(op, ..) => op.valencies(), } } @@ -181,7 +148,6 @@ impl<'op> Operation for OrdOpRef<'op> { match self { OrdOpRef::Genesis(op) => (&op.assignments).into(), OrdOpRef::Transition(op, ..) => (&op.assignments).into(), - OrdOpRef::Extension(op, ..) => (&op.assignments).into(), } } @@ -189,7 +155,6 @@ impl<'op> Operation for OrdOpRef<'op> { match self { OrdOpRef::Genesis(op) => op.assignments_by_type(t), OrdOpRef::Transition(op, ..) => op.assignments_by_type(t), - OrdOpRef::Extension(op, ..) => op.assignments_by_type(t), } } @@ -197,7 +162,6 @@ impl<'op> Operation for OrdOpRef<'op> { match self { OrdOpRef::Genesis(op) => op.inputs(), OrdOpRef::Transition(op, ..) => op.inputs(), - OrdOpRef::Extension(op, ..) => op.inputs(), } } } @@ -310,11 +274,9 @@ impl Display for WitnessPos { } } -/// RGB consensus information about the status of a witness transaction. This -/// information is used in ordering state transition and state extension -/// processing in the AluVM during the validation, as well as consensus ordering -/// of the contract global state data, as they are presented to all contract -/// users. +/// RGB consensus information about the status of a witness transaction. This information is used +/// in ordering state transitions during the validation, as well as consensus ordering of the +/// contract global state data, as they are presented to all contract users. #[derive(Copy, Clone, PartialOrd, Ord, PartialEq, Eq, Hash, Debug, Display, From)] #[display(lowercase)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] @@ -379,8 +341,6 @@ impl WitnessOrd { /// - Genesis is processed first. /// - Other operations are ordered according to their witness transactions (see [`WitnessOrd`] for /// the details). -/// - Extensions share witness transaction with the state transition which first to close one of the -/// seals defined in the extension, but are processed before that state transition. /// - If two or more operations share the same witness transaction ordering, they are first ordered /// basing on their `nonce` value, and if it is also the same, basing on their operation id value. /// @@ -396,13 +356,6 @@ impl WitnessOrd { pub enum OpOrd { #[strict_type(tag = 0x00, dumb)] Genesis, - #[strict_type(tag = 0x01)] - Extension { - witness: WitnessOrd, - ty: ExtensionType, - nonce: u64, - opid: OpId, - }, #[strict_type(tag = 0xFF)] Transition { witness: WitnessOrd, @@ -415,16 +368,10 @@ pub enum OpOrd { impl OpOrd { #[inline] pub fn is_archived(&self) -> bool { - matches!( - self, - Self::Extension { - witness: WitnessOrd::Archived, - .. - } | Self::Transition { - witness: WitnessOrd::Archived, - .. - } - ) + matches!(self, Self::Transition { + witness: WitnessOrd::Archived, + .. + }) } } @@ -466,23 +413,6 @@ impl GlobalOrd { idx, } } - pub fn extension( - opid: OpId, - idx: u16, - ty: ExtensionType, - nonce: u64, - witness: WitnessOrd, - ) -> Self { - Self { - op_ord: OpOrd::Extension { - witness, - ty, - nonce, - opid, - }, - idx, - } - } } pub trait GlobalStateIter { @@ -629,26 +559,17 @@ pub struct OpInfo<'op> { pub metadata: &'op Metadata, pub prev_state: &'op Assignments, pub owned_state: AssignmentsRef<'op>, - pub redeemed: &'op Valencies, - pub valencies: &'op Valencies, pub global: &'op GlobalState, } impl<'op> OpInfo<'op> { - pub fn with( - id: OpId, - op: &'op OrdOpRef<'op>, - prev_state: &'op Assignments, - redeemed: &'op Valencies, - ) -> Self { + pub fn with(id: OpId, op: &'op OrdOpRef<'op>, prev_state: &'op Assignments) -> Self { OpInfo { id, ty: op.full_type(), metadata: op.metadata(), prev_state, owned_state: op.assignments(), - redeemed, - valencies: op.valencies(), global: op.globals(), } } diff --git a/stl/AnchoredBundle.vesper b/stl/AnchoredBundle.vesper index 0e389391..cf414146 100644 --- a/stl/AnchoredBundle.vesper +++ b/stl/AnchoredBundle.vesper @@ -123,8 +123,6 @@ TransitionBundle rec mediaType enum MediaType any=255 salt is U64 lock bytes len=2 aka=ReservedBytes2 - valencies set len=0..MAX8 aka=Valencies - element is U16 aka=ValencyType validator bytes len=1 aka=ReservedBytes1 witness bytes len=2 aka=ReservedBytes2 diff --git a/stl/RGBCommit@0.1.0.sta b/stl/RGBCommit@0.1.0.sta index df540c32..d1448e35 100644 --- a/stl/RGBCommit@0.1.0.sta +++ b/stl/RGBCommit@0.1.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:N6SXCpvQ-tPzjGVN-pRMk9CN-qE0thG!-2mpTOLT-fOL4sRA#sunset-cherry-melody +Id: stl:O97qYf!c-DQ5qDGf-DLQPobD-6u5bUjG-J8!Svk7-OIVz4fk#fossil-latin-random Name: RGBCommit Dependencies: BPCore#symbol-tropic-grand, @@ -8,7 +8,7 @@ Dependencies: CommitVerify#miller-pancake-elastic, Std#ralph-blue-lucky, Bitcoin#signal-color-cipher -Check-SHA256: e15dc82e58623fe67040e8084fa209e92e921b53d78154905d97ba115000f7fd +Check-SHA256: 61e41a5be1879cdc6a8740346884fb660413f1fee2d57c6fb218613c0559dfd5 2~tNwLvL+uX>TU76^nC$%1sKzB<;E QA|)S-x88IWKN#S$#@T&w`gPtRC#b^PGN0jYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj1yf~h -Nn|OF|0}@Y#k~NrxRcQq+F$P2q2)nlUE64L7%3W7R1#@&^ bY%hOC5!%-N13CfsTw#uNIUvP{mXY}ey+|ZdtG&qC*MSg*Y`lhfb^DEW}Lug@X Zcb%%0|yRbX>?<6X>LtnX>M+1bN~-xX>?<6X>L?yb98QHbTa`DVrg_^Z)t8+Wpi|HWpp$G4Pt3@V{d70 Q)y>zWpo1$Vrg_^Z)t8)WoL9{b94j^Y-w?IX=F`dX>M+1bOjA;X>oOFWK?BybZ%vI1`0!OZgg^CV{}Pm -1pxpD002NB00~54bYW9;VRU5$0RRX906+i$000000096000000000R^cywiMb7^mG1`7jbW_AJEn^6;3 -7FKqUhx?i3R+Mr!fY&(;2BFL(m@EZk_srD_V{dMBa$#e1Nn`<^2rNlD$O59e#ogQsB77jPl+h5j^*S;IZf|a5WdHyO4P|(AWo~n6Z*Ek1aAg5xbsj>g6`?#s5rWnKhSeO?L~x^!;Y#eFP|P}0Z%Ez< -ZDn*}WMOn+0rh%KI9Y!AFx9LCk8@hQXE7w+qW3^C%eTEp@#^?_H3w&GZ(?C=a{=BXk!z-`g4hv-$6z_Y -xoLZ_neUP>BpbEf7FA*KKfDWJb8~5DZf#|5baMeh8^j6(M~DvpE3ZrAX~A^+tx0jv)bw?qY0i3`qqbiN -a%E&?Wo>0-0pHK5k@bh=O+>c=6oKLkF4~iax8KK|47hp+cWHEPWpi@^dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0 -Thxis%Ku=2wF+7z(Wqt=tdZk`V^ -s(Ana000000093000000000MaWn^V#ZF2w#0Y>fS!w4MxxaL=+DqP^k2!wz9AHH68xp8!<%Jqp^&Hw-a +1pxpD002NB00~54bYW9;VRU5$0RRX906+i$0000000960000000009c; +Wds2T24ZP+b2c;p1pxp62noKLkF4~iax8KK|47hp;bZKp6b97;CZ~y>E25ED1b!Bn^w&;L{94K`ndk%K5+?9Jv$dw7jc}U5p5@2#$ +kUJ%u2xDkrX>LwsbOEg%Ka?O}aEvKu^y*67(3wRvID`L1eu0Pjrm!gUE7k~YWprU=VRT^u^?FS>S$_F2 +)vN@Mb6UJ-F(lri_dqerx4lR4>iBsz2WM<=Vqt7^0p25#Yo@G%*b#-tU^&3KX?w7l?~*Sh8@1jRRblZz +ybED-b7^O8ZDnqBa{)pd#0msQhz|cNuS?@;!F2nrNpaBB^mU(U&U&4rwqFT$VQgt+VRUbD0(t`--)Viz +@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCX@GIcyL4!ji%3ykIn+a000000RI300000001IJrb7^O8ZDnqBa{vkfhyLPaScq)s9KMExvw34D +6J>+NwrBxfixd_%u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a000000RI3000000 +010+sY-wa+bZ>G11OfmAZf|a7000011aog~WdH>M0%CAAe<9`Lptgpr6F_xjAC6(~TLj#*ewi +Hf`^rCgHqw;r~cW`-Qc;Wd#8M3IWybk`76TvuW{aQ_%-X +`?VwZ$5L?~`!+pRSq0(b70Uq%!}cPEJ+)wh?w~HsM>Kh32^DD>YKF13Ts`WEp!#kA000000003000000 +0000HM{I9mVQf=$VRU6vV`ybC`}q*rYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj2yJ0_Npxjxa{vGX4@YcoVqt7kbYXO5 +RC#b^1pxp60t`oNZ(?C=R$**)Wpf1q00;pxo>ox?`Aroor<$W|05z3@o%ygg4E?M+l67UG^w8*<_XZ#%uyqCrG{{ +7b@t4MVjY>G@u4Q3HlB(d+LiLJm-R=h;`?dxBvhE000000RImF0000000l{IaCLMB0taw%Wp+<>bODnP +ynwMZT8l5kSW@l}O=!>^xB4~9n`Dx!RtcK)nwJQ2Wpib6c4cG&dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0 +ThRw7=FYk8VVufK10Q-T=FR=Q=>S+XYD&R000000RR600000000961000000RR600000000v2JaCLNZ +1pxpF0o9FP2n?Horiuqf0^m>2O`jNRziT$b7#=ya6uYYC;s5{u000000RR600000000~WHWNBekd2nR| +0Rv%fdH)DaWprUwd2nR~0RR932~A~mVOC*mb!7zs00;m8KmY&$000000RR600000000>QGbYWy+bYTSn +015$h4P{pQ?3(@m6s4{*=wy-PiS_k>Wl|t&* +Fr0fZ0000000000{{R30000003r}NXb#iiLZewM01_A?ZX>I@j0t0PfcmMzb3{P-FZ*6U9bZupBbOs3n +W@dH)+M7`mSQb`xkca!3Clv)aMjKgwAH@`bu1x<7g|G$};xvA~n-$_S25D|^b#!wAdIKHbX?@G`sCP;~6&DQw +R5(-fxrUo0ThClv)aMjKgwAH@`bu1x<7g|G$};xvA~n-$_S3t@9}X=iS2Wo~qH0(t`- +-)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCODo$h9?yTI7S;;e;>sZfv!yd427@;7veO2zMB=|GY5BR +bZ%vHa{_t;9p7nv%krpqNv2!%ioJ +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 -X?@G`sCP;~6&DQwR5(-fxrUo0Th -Nn`>=>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HJ_1fvw5rj-B|XP@r^w5ufb=C_Ju$l1`nW&GEp -SWb-yZDDvxbY*RG0009IM{I9mVQf=$VRU6wd2nR~0RR933`cBlVqt7nVQh6}a|Hna2mvylR#67|O%*Gr -nxkw0HI;&$`LH+T3zWkAaKFZV1cd@r70RRO80?I5NZ-bfLFbqC# -o>4E?M+l67UG^w8*<_XZ#%uyqCrG{{7b@t4MVjY>G@u4Q3HlB(d+LiLJm-R=h;`?dxBv(O$}AplgPGkh -3_fq3Q7_j=2#kPT_9!;lWR>~GYywm#NWLQ%D(Hkon&*Qwpawq)`VKLB>Wd>h=Ype%b?2720000000000 -{|^8F000001xapjb#w*-2XJy_c29M50h18CfUz`Mi!Z}iQtl5;XwV(E`Zdd&WRj~^37Yhpmk4rYb7gXN -Wn=<+10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)y -umJ%GNp5g;bWLG!1pxpG0`+VYVk7oBr%DNv+($;q`HHK!gIHa)*%m(-e#9sm3L)b@L&d6G@+l`%qd385 -?K@+fP1(-9sgE>i7rMzqbpQzgmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<0000000000|Nj60 -000000RR9100000|Nj600000021#ykb#!wD0RRaB)s0^W44ZlVPs)+VFdvI3ITQGP59r=ivkR6Lh9EroO>_;0000000030000000000BPh(?sa&l#EV`Xy&0t0Pn -ZU6uR18re=0006EPjEwTZEb0EZDnqB1`7jbW_AJEn^6;37FKqUhx?i3R+Mr!fY&(;2BFL(m@EZk_srD= -Zf|a5WdHyO25)dwd2nR`4Yl-VR(QD`a=lauc1Dg>676p(%t1LRzzH}N^3Qi@2yJC_VPs)+VFG#s9p7nv -%krpqNM?JbaMiF10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUD@oClv)a -MjKgwAH@`bu1x<7g|G$};xvA~n-$_S2y$g)Wo2z;WCD5v9p7nv%krpqNv2!%ioJpYH;+t0eX2w~A!Q+0eaZ -{MVycPK^T!VRUq1V`yzWn^V#ZDnKy -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 +?U(=n0000000960000000093AVRUq1V`yzM +00;rIPS18A9{>CZ0|Ju;9Pya4*S_o#KSQ#S^GM +00;qJNbG0cIzBFIR(d`#um0T+f+Ht6TBtC0P;Q%&@2p?|0000000030{{R30000023UhRFbz^jOa%E%y +1pxpE0c!PSwI(YdXDh`S;c-XJf-JhsCbw@%Wz)m1PMN&5x&QzG000000RR60000000RIYMbaY{3Xl-R~ +bN~eb00;qFo~-2t-FBm?{;M?9h#oN_CYm?uXkfmH1{@T?ji$~30000000030{{R3000009R&Qx!Q*>c; +Wd#8M000 -----END STRICT TYPE LIB----- diff --git a/stl/RGBCommit@0.1.0.stl b/stl/RGBCommit@0.1.0.stl index fe7a27f2e5a02411f1515a08cdbb1e9c25a70142..9b7d22597a74ed4f10f5b2b17cecfd12e3400141 100644 GIT binary patch delta 297 zcmV+^0oMNfVun?)LIeRcvqJ=D5R;u4P5}y&O(`X_5gAkglaLx#0R)q}7MPQN8)UN} z9C-u*36o7JC6m7(5g_nzx#_tshuWu;$-~QwElJ^S44fUnd!6eASeNo zUlu8ot05q>_9B1*lhq`@lT0Zlv$`b$0+akF2_Q~v%9@}OZ_-bc51ndy0w1NGl_wIg zUQD>ylx`L>RgRN{C@>(bf2kfhA@=uGO=Jtx#~n~$5JW2|a}~7vfDWQsGAeSD)F^lX z3bRcqHUX268b^~~7D&YYMM1volM&01u~YMM-L2ab|uV8~5aR|F>P0x$IJ~c)~-kHwyyJSOw>M+?)JPv>}wEC^aQDH8(Yd@&5Uh6Th}U^>x|K zC>q0{`DbeO?2l(xI`$=7Oj~t8tN8_ISz=CVUUFt?G2`9VG=}`d6hV=9eIKu{`oXzb zN@c?;^_8Li}*&1t({u<|eYSO}?c%Lz^99VKD^6a=h{3=B+@ zSBdyBa!lB}2TxO(|W%*Gw<`sXv^um4F{%D(dYp6Qph>tx<<-F=Fel?$FMi-GPWlqwmS zGnme-xcl8}!DdnZBSo_hFYQTmW;t7QYfirEw;xY=?_l_0nv#J+*;eU{?nS@nmYmxx zsMKYub0 zF>%5}h=G-9a=)^oBEewVY@p%E6bs9dz!X3@JD~?0cNkbZII_Vxg)=NaGbOkru>_oP F7yzI(+SUL7 diff --git a/stl/RGBCommit@0.1.0.sty b/stl/RGBCommit@0.1.0.sty index e530ea30..7ca365b8 100644 --- a/stl/RGBCommit@0.1.0.sty +++ b/stl/RGBCommit@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:N6SXCpvQ-tPzjGVN-pRMk9CN-qE0thG!-2mpTOLT-fOL4sRA#sunset-cherry-melody + Id: stl:O97qYf!c-DQ5qDGf-DLQPobD-6u5bUjG-J8!Svk7-OIVz4fk#fossil-latin-random Name: RGBCommit Version: 0.1.0 Description: Consensus commitment layer for RGB smart contracts @@ -139,30 +139,6 @@ data ContractId : [Byte ^ 32] @mnemonic(short-noise-postal) data DataState : [Byte] -@mnemonic(reform-garden-ballet) -data Extension : ffv Ffv - , contractId ContractId - , nonce U64 - , extensionType ExtensionType - , metadata Metadata - , globals GlobalState - , assignments AssignmentsBlindSealTxid - , redeemed Redeemed - , valencies Valencies - , validator CommitVerify.ReservedBytes1 - , witness CommitVerify.ReservedBytes2 - -@mnemonic(delta-elastic-germany) -data ExtensionSchema : metadata {MetaType ^ ..0xff} - , globals {GlobalStateType -> ^ ..0xff Occurrences} - , redeems {ValencyType ^ ..0xff} - , assignments {AssignmentType -> ^ ..0xff Occurrences} - , valencies {ValencyType ^ ..0xff} - , validator AluVM.LibSite? - -@mnemonic(apropos-scoop-viva) -data ExtensionType : U16 - @mnemonic(pigment-career-hippie) data Ffv : U16 @@ -173,7 +149,7 @@ data FungibleState : bits64#8 U64 | (|) data FungibleType : unsigned64Bit#8 | (|) -@mnemonic(bazooka-couple-summer) +@mnemonic(melody-granite-cave) data Genesis : ffv Ffv , schemaId SchemaId , flags CommitVerify.ReservedBytes1 @@ -183,14 +159,12 @@ data Genesis : ffv Ffv , metadata Metadata , globals GlobalState , assignments AssignmentsBlindSealTxid - , valencies Valencies , validator CommitVerify.ReservedBytes1 -@mnemonic(concept-gloria-shock) +@mnemonic(strong-mister-version) data GenesisSchema : metadata {MetaType ^ ..0xff} , globals {GlobalStateType -> ^ ..0xff Occurrences} , assignments {AssignmentType -> ^ ..0xff Occurrences} - , valencies {ValencyType ^ ..0xff} , validator AluVM.LibSite? @mnemonic(initial-malta-sierra) @@ -235,7 +209,7 @@ data Metadata : {MetaType -> ^ ..0xff MetaValue} @mnemonic(source-olga-mirage) data Occurrences : min U16, max U16 -@mnemonic(survive-citizen-harris) +@mnemonic(tactic-china-order) data OpCommitment : ffv Ffv , nonce U64 , opType TypeCommitment @@ -243,8 +217,6 @@ data OpCommitment : ffv Ffv , globals CommitVerify.MerkleHash , inputs CommitVerify.MerkleHash , assignments CommitVerify.MerkleHash - , redeemed CommitVerify.StrictHash - , valencies CommitVerify.StrictHash , witness CommitVerify.MerkleHash , validator CommitVerify.StrictHash @@ -262,9 +234,6 @@ data OwnedStateSchema : declarative () | structured StrictTypes.SemId | attachment MediaType -@mnemonic(anita-vega-pirate) -data Redeemed : {ValencyType -> ^ ..0xff OpId} - @mnemonic(simple-bombay-salute) data RevealedAttach : file AttachState, salt U64 @@ -274,7 +243,7 @@ data RevealedData : value DataState, salt U128 @mnemonic(escape-nylon-client) data RevealedFungible : value FungibleState -@mnemonic(corona-igloo-sierra) +@mnemonic(ohio-carrot-grand) data Schema : ffv Ffv , flags CommitVerify.ReservedBytes1 , name StrictTypes.TypeName @@ -283,16 +252,14 @@ data Schema : ffv Ffv , metaTypes {MetaType -> ^ ..0xff StrictTypes.SemId} , globalTypes {GlobalStateType -> ^ ..0xff GlobalStateSchema} , ownedTypes {AssignmentType -> ^ ..0xff OwnedStateSchema} - , valencyTypes {ValencyType ^ ..0xff} , genesis GenesisSchema - , extensions {ExtensionType -> ^ ..0xff ExtensionSchema} , transitions {TransitionType -> ^ ..0xff TransitionSchema} , reserved CommitVerify.ReservedBytes8 @mnemonic(ramirez-patron-simon) data SchemaId : [Byte ^ 32] -@mnemonic(michael-exact-eric) +@mnemonic(gizmo-plastic-hazard) data Transition : ffv Ffv , contractId ContractId , nonce U64 @@ -301,28 +268,25 @@ data Transition : ffv Ffv , globals GlobalState , inputs Inputs , assignments AssignmentsBlindSealTxPtr - , valencies Valencies , validator CommitVerify.ReservedBytes1 , witness CommitVerify.ReservedBytes2 @mnemonic(rider-serpent-algebra) data TransitionBundle : inputMap InputMap, knownTransitions {OpId -> ^ 1.. Transition} -@mnemonic(pirate-lithium-side) +@mnemonic(scratch-magnum-polaris) data TransitionSchema : metadata {MetaType ^ ..0xff} , globals {GlobalStateType -> ^ ..0xff Occurrences} , inputs {AssignmentType -> ^ ..0xff Occurrences} , assignments {AssignmentType -> ^ ..0xff Occurrences} - , valencies {ValencyType ^ ..0xff} , validator AluVM.LibSite? @mnemonic(picture-reflex-brigade) data TransitionType : U16 -@mnemonic(biscuit-pandora-bagel) +@mnemonic(yellow-young-stone) data TypeCommitment : genesis BaseCommitment | transition (ContractId, TransitionType) - | extension (ContractId, ExtensionType) @mnemonic(giant-trinity-lagoon) data TypedAssignsBlindSealTxPtr : declarative [AssignVoidStateBlindSealTxPtr] @@ -336,12 +300,6 @@ data TypedAssignsBlindSealTxid : declarative [AssignVoidStateBlindSealTxid] | structured [AssignRevealedDataBlindSealTxid] | attachment#255 [AssignRevealedAttachBlindSealTxid] -@mnemonic(shock-jester-orion) -data Valencies : {ValencyType ^ ..0xff} - -@mnemonic(aloha-dublin-brush) -data ValencyType : U16 - @mnemonic(email-snow-safari) data VoidState : () diff --git a/stl/RGBLogic@0.1.0.sta b/stl/RGBLogic@0.1.0.sta index c54cdfd9..5110f078 100644 --- a/stl/RGBLogic@0.1.0.sta +++ b/stl/RGBLogic@0.1.0.sta @@ -1,14 +1,14 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:0wsJV4GJ-U$BRIX2-Mvvm2Db-aTx6jqR-CWzNyC9-S8TnMPE#program-june-motel +Id: stl:cpfuZutw-7s$hkuI-Q8vaRf4-XCUiAKC-glMJM!0-8hV0Gvg#monarch-detect-paradox Name: RGBLogic Dependencies: BPCore#symbol-tropic-grand, - RGBCommit#sunset-cherry-melody, + RGBCommit#fossil-latin-random, Bitcoin#signal-color-cipher -Check-SHA256: c8aae1c5bf383176222ca44a70a51ac050c67e21967e10c5d5216d7b523bf62a +Check-SHA256: a12adf0516cbe1705cbf8d3968030c53d401ed53cad734e0b658d6a2113d7387 -2vSEvOmAmtV*?>@tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPA_P(yEWWjCak3Y*Zh{Nou@X++6A -2-<|w*hc$lsZ8S2eB$`A5D8L8LPKwDZE1A%Y!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkk +2vSEvOmAmtV*?>@tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPA_P(yEWWjo&LVgH;B4r&Z%!z}~o +Y(B2#wIdjxK1%sJIE8cJ`3X`-LPKwDZE1A%Y!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkk Z)t7=20~CnZ*pY?00DdlT>wB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 wjY>38tto&d&=eG4cRAF#( @@ -17,23 +17,19 @@ Wpq+$XJ~Xna$#;`Xh%-ZT+rxDK6vW;JU&?LxLM72H?wDC1Zo}=N}D)4mkLjCa%FT-a&K>D2SRCdV{d70 DJ{*3f84s>#k$1lf7uIEVQ@}wWMxQUb7)_z*=^-NPQ?`2v5jYd+6t@dEhY>7H!Y*UdZb-BpG^u(WnpGh V{&P5bg6}ecT=8d`>?<6$C@F;S3|*6`1-v+nBdcqJ?FPKcnV2wbY*gGVQf%qwlfK-7{9iX4Q|L-q$GzU Mp|h#f#{Gz8SzLEaTf~c{WkYggkPIjuQHS#3Ua|L6d7%qre2Ut&TYs@(?%#f7ArN-=Rj?7Ns(14peesZgXjLX>V>+d2nT9bsj>g -6`?#s5rWnKhSeO?L~x^!;Y#eFP|P}0Z%Ez^MR;^&ZgXjGZd7@2WqHKdNeFB= -iRT*14O40w5C%+Pd1Z1jmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<1W#~DWCZ{SL}Fu5a&K>D -1OfpDbYXCEWpn@q0Rka#tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPdYADBNH?W>M^%H|xc>sh|D -n*!v8^Ea7rh?dzC2n+%RZ*X#DbN~eb0wHj#q4l6D4ZcK)2hLYH81C&KXiWu&flb+s{C0G-{6|jDT+rxD -K6vW;JU&?LxLM72H?wDC1Zo}=N}D)4mkCE~Z(?C=PjX}i0tIhyPjX}d*`2mkOKEwEW{4Q)xuWJqX%_(%44(X{k)&(|qFi -u@Gc+9zv-Vp*%wog4O?q)g04AaHEjnO6;Ie%sNwVNZti*Z*F5{000OCZ*Xa30ym_W3Y*Zh{Nou@X++6A -2-<|w*hc$lsZ8S2eB$`A5S7U0dLDIRU(}XWLTZugenOC;Z(5k~zEJnJiX;;E#s3O)a$#@6CZU6=Z -2X|?7Ze??G0gvlp0sK<6W+n*cBpJ9-*worFk3Ek7Mz>CQ0ZEXBf&z4T0ym_W3Y*Zh{Nou@X++6A2-<|w -*hc$lsZ8S2eB$`A5HwN`t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zcaA{-$H>8&e -o6xlU;~7(FM9Dn}+Jw^BM*C^0Oybjg;`p%;mB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<3Rh`# -Ze??GPjX}g1ONqXX>Mg?00jX7T-**L6)$-r+lRyXoI{GIo*U3CNI7Emc=xo*$N+#60SR8&eo6xlU;~7(FM9Dn} -+Jw^BM*C^0Oybjg;`p%;dBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W)00aqiX>Db5 -bYX39002k +2~tNwLvL+uX>s@(?%#f7ArN-=Rj?7Ns(14peesZgXjLX>V>+d2nTU#Mns) +Y&M6LqDeqU-jv95KHlThh+c{38p;h*Y8ns*OksItaxs<2=6W7=VqesjRYGc!>wZFzp>JB4@xD;^wu&SY +_r(NHa7knZ00=~4V^DH$Z)OAn0S0toaB^jI00jX8A#kgq^`I&ZzC?)!&R01Y?(H9FO$CR6P1%k7c67A- +54IneKN{_;j(f`H9IfkFzO$PG=uAF%>iaxCSnRl2&38AmXJiCw9urENI6IdKM{I9mVQf!wWCj8SZ*Wg?WC5$Mo0RIYfa$#@6CZU6=Z2X|?7Ze??G0gvlp0sK<6W+n*cBpJ9-*worFk3Ek7Mz>CQ0ZEXBf&z4T0z2O7VgH;B4r&Z% +!z}~oY(B2#wIdjxK1%sJIE8cJ`7}}wt`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zc +aA{-$JKpMH|C|jDY7A$?Ed%ImKCb1pBN(4PO8GlDg>&KgmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`Zq +Bog<<3Rh`#Ze??GPjX}g1ONqXX>Mg?00jX7T-**L6)$-r+lRyXoI{GIo*U3CNI7Emc=xo*$N+#60SR&KgdBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W) +00aqiX>Db5bYX39002k -----END STRICT TYPE LIB----- diff --git a/stl/RGBLogic@0.1.0.stl b/stl/RGBLogic@0.1.0.stl index 29408854858344d3feb160ff9eb0838e19c36e39..1b6f7648790ecd7db09dbe15be262beb9caf879c 100644 GIT binary patch delta 241 zcmZqY?dP6gs9=5XRpS3SynI4$ZhU*y=Wd%9IwV!oZ%Piu?T;)g#s23j&PF*8i| zWmTBGhKYZ20Gr}uF6Kwp>lV&DSyB1k;KBjcMmgSyZJZ$`GYpH>`*pWO6m5KvQo@{> zQo+E$#Ohz*UzEba#K4}OnwMIfS{k4MBT>7U~mLbdg12@*dU_!U_Y}%mETi BV!HqU delta 421 zcmeC@Zs(m~s9?TiI@jzATmC$j49;{pY0Gh|<Qr>Ewn z7H1YSFfcH3rh*Nc%*0|`Psn|Q9L1WKpO>7 Date: Thu, 6 Mar 2025 18:40:23 +0100 Subject: [PATCH 35/70] schema: remove interfaces --- src/schema/mod.rs | 5 +- src/schema/schema.rs | 191 +++++++++++++++++++---- src/stl.rs | 4 +- src/validation/logic.rs | 48 +++--- src/validation/schema.rs | 26 ++-- stl/RGBCommit@0.1.0.sta | 328 ++++++++++++++++++++------------------- stl/RGBCommit@0.1.0.stl | Bin 10886 -> 11568 bytes stl/RGBCommit@0.1.0.sty | 28 +++- stl/RGBLogic@0.1.0.sta | 20 +-- stl/RGBLogic@0.1.0.stl | Bin 1423 -> 1423 bytes stl/RGBLogic@0.1.0.sty | 12 +- stl/Schema.vesper | 87 ++++++----- 12 files changed, 467 insertions(+), 282 deletions(-) diff --git a/src/schema/mod.rs b/src/schema/mod.rs index 08297c2f..34f6fa63 100644 --- a/src/schema/mod.rs +++ b/src/schema/mod.rs @@ -31,5 +31,8 @@ pub use operations::{ AssignmentType, AssignmentsSchema, GenesisSchema, GlobalSchema, MetaSchema, OpFullType, OpSchema, OpType, TransitionSchema, }; -pub use schema::{GlobalStateType, MetaType, Schema, SchemaId, TransitionType}; +pub use schema::{ + AssignmentDetails, GlobalDetails, GlobalStateType, MetaDetails, MetaType, Schema, SchemaId, + TransitionDetails, TransitionType, +}; pub use state::{FungibleType, GlobalStateSchema, MediaType, OwnedStateSchema}; diff --git a/src/schema/schema.rs b/src/schema/schema.rs index 1204c09e..fe5479d6 100644 --- a/src/schema/schema.rs +++ b/src/schema/schema.rs @@ -34,10 +34,10 @@ use commit_verify::{ use strict_encoding::{ StrictDecode, StrictDeserialize, StrictEncode, StrictSerialize, StrictType, TypeName, }; -use strict_types::SemId; +use strict_types::{FieldName, SemId}; use super::{AssignmentType, GenesisSchema, OwnedStateSchema, TransitionSchema}; -use crate::{impl_serde_baid64, Ffv, GlobalStateSchema, Identity, LIB_NAME_RGB_COMMIT}; +use crate::{impl_serde_baid64, Ffv, GlobalStateSchema, Identity, StateType, LIB_NAME_RGB_COMMIT}; #[derive(Wrapper, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From, Display)] #[wrapper(FromStr, LowerHex, UpperHex)] @@ -84,6 +84,59 @@ impl TransitionType { pub const fn with(ty: u16) -> Self { Self(ty) } } +#[derive(Clone, PartialEq, Eq, Debug)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_COMMIT, tags = order)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", rename_all = "camelCase") +)] +pub struct AssignmentDetails { + pub owned_state_schema: OwnedStateSchema, + pub name: FieldName, + pub default_transition: TransitionType, +} + +#[derive(Clone, PartialEq, Eq, Debug)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_COMMIT, tags = order)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", rename_all = "camelCase") +)] +pub struct GlobalDetails { + pub global_state_schema: GlobalStateSchema, + pub name: FieldName, +} + +#[derive(Clone, PartialEq, Eq, Debug)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_COMMIT, tags = order)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", rename_all = "camelCase") +)] +pub struct MetaDetails { + pub sem_id: SemId, + pub name: FieldName, +} + +#[derive(Clone, PartialEq, Eq, Debug)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_COMMIT, tags = order)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", rename_all = "camelCase") +)] +pub struct TransitionDetails { + pub transition_schema: TransitionSchema, + pub name: FieldName, +} + /// Schema identifier. /// /// Schema identifier commits to all the schema data. @@ -97,6 +150,10 @@ pub struct SchemaId( Bytes32, ); +impl SchemaId { + pub const fn from_array(id: [u8; 32]) -> Self { SchemaId(Bytes32::from_array(id)) } +} + impl From for SchemaId { fn from(hasher: Sha256) -> Self { hasher.finish().into() } } @@ -140,11 +197,11 @@ pub struct Schema { pub timestamp: i64, pub developer: Identity, - pub meta_types: TinyOrdMap, - pub global_types: TinyOrdMap, - pub owned_types: TinyOrdMap, + pub meta_types: TinyOrdMap, + pub global_types: TinyOrdMap, + pub owned_types: TinyOrdMap, pub genesis: GenesisSchema, - pub transitions: TinyOrdMap, + pub transitions: TinyOrdMap, pub reserved: ReservedBytes<8, 0>, } @@ -192,12 +249,17 @@ impl Schema { pub fn types(&self) -> impl Iterator + '_ { self.meta_types .values() - .copied() - .chain(self.global_types.values().map(|i| i.sem_id)) + .map(|i| &i.sem_id) + .cloned() + .chain( + self.global_types + .values() + .map(|i| i.global_state_schema.sem_id), + ) .chain( self.owned_types .values() - .filter_map(OwnedStateSchema::sem_id), + .filter_map(|ai| OwnedStateSchema::sem_id(&ai.owned_state_schema)), ) } @@ -206,34 +268,101 @@ impl Schema { .validator .iter() .copied() - .chain(self.transitions.values().filter_map(|i| i.validator)) + .chain( + self.transitions + .values() + .filter_map(|i| i.transition_schema.validator), + ) .map(|site| site.lib) } - pub fn transition_for_assignment_type( + pub fn default_transition_for_assignment( &self, assignment_type: &AssignmentType, - ) -> Option { - for (transition_type, transition_schema) in &self.transitions { - // for now we support only schemas defining transitions to move single assignments - if transition_schema.inputs.as_unconfined().len() == 1 - && transition_schema.assignments.as_unconfined().len() == 1 - { - let (input_ass_type, input_occurrences) = - transition_schema.inputs.iter().next().unwrap(); - let (out_ass_type, out_occurrences) = - transition_schema.assignments.iter().next().unwrap(); - - if input_occurrences.check(1).is_ok() - && out_occurrences.check(1).is_ok() - && input_ass_type == assignment_type - && out_ass_type == assignment_type - { - return Some(*transition_type); + ) -> TransitionType { + self.owned_types + .get(assignment_type) + .expect("invalid schema") + .default_transition + } + + pub fn assignment(&self, name: impl Into) -> (&AssignmentType, &AssignmentDetails) { + let name = name.into(); + self.owned_types + .iter() + .find(|(_, i)| i.name == name) + .expect("cannot find assignment with the given name") + } + + pub fn assignment_type(&self, name: impl Into) -> AssignmentType { + *self.assignment(name).0 + } + + pub fn assignment_name(&self, type_id: AssignmentType) -> &FieldName { + &self + .owned_types + .iter() + .find(|(id, _)| *id == &type_id) + .expect("cannot find assignment with the given type ID") + .1 + .name + } + + pub fn assignment_types_for_state(&self, state_type: StateType) -> Vec<&AssignmentType> { + self.owned_types + .iter() + .filter_map(|(at, ai)| { + if ai.owned_state_schema.state_type() == state_type { + Some(at) + } else { + None } - } - } - None + }) + .collect() + } + + pub fn global(&self, name: impl Into) -> (&GlobalStateType, &GlobalDetails) { + let name = name.into(); + self.global_types + .iter() + .find(|(_, i)| i.name == name) + .expect("cannot find global with the given name") + } + + pub fn global_type(&self, name: impl Into) -> GlobalStateType { + *self.global(name).0 + } + + pub fn meta(&self, name: impl Into) -> (&MetaType, &MetaDetails) { + let name = name.into(); + self.meta_types + .iter() + .find(|(_, i)| i.name == name) + .expect("cannot find meta with the given name") + } + + pub fn meta_type(&self, name: impl Into) -> MetaType { *self.meta(name).0 } + + pub fn meta_name(&self, type_id: MetaType) -> &FieldName { + &self + .meta_types + .iter() + .find(|(id, _)| *id == &type_id) + .expect("cannot find meta with the given type ID") + .1 + .name + } + + pub fn transition(&self, name: impl Into) -> (&TransitionType, &TransitionDetails) { + let name = name.into(); + self.transitions + .iter() + .find(|(_, i)| i.name == name) + .expect("cannot find transition with the given name") + } + + pub fn transition_type(&self, name: impl Into) -> TransitionType { + *self.transition(name).0 } } diff --git a/src/stl.rs b/src/stl.rs index a0a9d9cd..5a706a49 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -37,10 +37,10 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_COMMIT: &str = - "stl:O97qYf!c-DQ5qDGf-DLQPobD-6u5bUjG-J8!Svk7-OIVz4fk#fossil-latin-random"; + "stl:BCPURiOu-GomuDWh-zQP$5BK-TMvP32R-WWBapOQ-r4CQwSI#cake-bingo-shadow"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:cpfuZutw-7s$hkuI-Q8vaRf4-XCUiAKC-glMJM!0-8hV0Gvg#monarch-detect-paradox"; + "stl:RvzTp24G-g$eJHWw-LqT0lhQ-IQuCWAD-VeQWSfN-gXQc0sQ#japan-dublin-annual"; fn _rgb_commit_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_COMMIT), tiny_bset! { diff --git a/src/validation/logic.rs b/src/validation/logic.rs index 1b1f8b16..9b424e9f 100644 --- a/src/validation/logic.rs +++ b/src/validation/logic.rs @@ -90,7 +90,7 @@ impl Schema { ), ); } - Some(transition_schema) => transition_schema, + Some(transition_details) => &transition_details.transition_schema, }; ( @@ -198,16 +198,20 @@ impl Schema { continue; }; - let sem_id = self.meta_types.get(type_id).expect( - "if this metadata type were absent, the schema would not be able to pass the \ - internal validation and we would not reach this point", - ); + let sem_id = self + .meta_types + .get(type_id) + .expect( + "if this metadata type were absent, the schema would not be able to pass the \ + internal validation and we would not reach this point", + ) + .sem_id; if types - .strict_deserialize_type(*sem_id, value.as_ref()) + .strict_deserialize_type(sem_id, value.as_ref()) .is_err() { - status.add_failure(validation::Failure::SchemaInvalidMetadata(opid, *sem_id)); + status.add_failure(validation::Failure::SchemaInvalidMetadata(opid, sem_id)); }; } @@ -245,10 +249,14 @@ impl Schema { sem_id, max_items, reserved: _, - } = self.global_types.get(type_id).expect( - "if the field were absent, the schema would not be able to pass the internal \ - validation and we would not reach this point", - ); + } = self + .global_types + .get(type_id) + .expect( + "if the field were absent, the schema would not be able to pass the internal \ + validation and we would not reach this point", + ) + .global_state_schema; // Checking number of field occurrences let count = set.len() as u16; @@ -259,18 +267,18 @@ impl Schema { } if count as u32 > max_items.to_u32() { status.add_failure(validation::Failure::SchemaGlobalStateLimit( - opid, *type_id, count, *max_items, + opid, *type_id, count, max_items, )); } // Validating data types for data in set { if types - .strict_deserialize_type(*sem_id, data.as_ref()) + .strict_deserialize_type(sem_id, data.as_ref()) .is_err() { status.add_failure(validation::Failure::SchemaInvalidGlobalValue( - opid, *type_id, *sem_id, + opid, *type_id, sem_id, )); }; } @@ -350,10 +358,14 @@ impl Schema { )); } - let assignment = &self.owned_types.get(state_id).expect( - "If the assignment were absent, the schema would not be able to pass the internal \ - validation and we would not reach this point", - ); + let assignment = &self + .owned_types + .get(state_id) + .expect( + "If the assignment were absent, the schema would not be able to pass the \ + internal validation and we would not reach this point", + ) + .owned_state_schema; match owned_state.get(state_id) { None => {} diff --git a/src/validation/schema.rs b/src/validation/schema.rs index e87b6c85..890607c8 100644 --- a/src/validation/schema.rs +++ b/src/validation/schema.rs @@ -29,27 +29,33 @@ impl Schema { let mut status = validation::Status::new(); status += self.verify_operation(OpFullType::Genesis, &self.genesis); - for (type_id, schema) in &self.transitions { - status += self.verify_operation(OpFullType::StateTransition(*type_id), schema); + for (type_id, transition_details) in &self.transitions { + status += self.verify_operation( + OpFullType::StateTransition(*type_id), + &transition_details.transition_schema, + ); } - for (type_id, sem_id) in &self.meta_types { - if !types.contains_key(sem_id) { - status.add_failure(validation::Failure::SchemaMetaSemIdUnknown(*type_id, *sem_id)); + for (type_id, meta_details) in &self.meta_types { + if !types.contains_key(&meta_details.sem_id) { + status.add_failure(validation::Failure::SchemaMetaSemIdUnknown( + *type_id, + meta_details.sem_id, + )); } } - for (type_id, schema) in &self.global_types { - if !types.contains_key(&schema.sem_id) { + for (type_id, global_details) in &self.global_types { + if !types.contains_key(&global_details.global_state_schema.sem_id) { status.add_failure(validation::Failure::SchemaGlobalSemIdUnknown( *type_id, - schema.sem_id, + global_details.global_state_schema.sem_id, )); } } - for (type_id, schema) in &self.owned_types { - if let OwnedStateSchema::Structured(sem_id) = schema { + for (type_id, assignment_details) in &self.owned_types { + if let OwnedStateSchema::Structured(sem_id) = &assignment_details.owned_state_schema { if !types.contains_key(sem_id) { status.add_failure(validation::Failure::SchemaOwnedSemIdUnknown( *type_id, *sem_id, diff --git a/stl/RGBCommit@0.1.0.sta b/stl/RGBCommit@0.1.0.sta index d1448e35..413c4809 100644 --- a/stl/RGBCommit@0.1.0.sta +++ b/stl/RGBCommit@0.1.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:O97qYf!c-DQ5qDGf-DLQPobD-6u5bUjG-J8!Svk7-OIVz4fk#fossil-latin-random +Id: stl:BCPURiOu-GomuDWh-zQP$5BK-TMvP32R-WWBapOQ-r4CQwSI#cake-bingo-shadow Name: RGBCommit Dependencies: BPCore#symbol-tropic-grand, @@ -8,7 +8,7 @@ Dependencies: CommitVerify#miller-pancake-elastic, Std#ralph-blue-lucky, Bitcoin#signal-color-cipher -Check-SHA256: 61e41a5be1879cdc6a8740346884fb660413f1fee2d57c6fb218613c0559dfd5 +Check-SHA256: 1f6358c6bdb3c5c5e595758ff764eafad74d191ffb90bb3c7f611e5588709f80 2~tNwLvL+uX>TU76^nC$%1sKzB<;E -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 -6J>+NwrBxfixd_%u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a000000RI3000000 -010+sY-wa+bZ>G11OfmAZf|a7000011aog~WdH>M0%CAAe<9`Lptgpr6F_xjAC6(~TLj#*ewi -Hf`^rCgHqw;r~cW`-Qc;Wd#8M3IWybk`76TvuW{aQ_%-X -`?VwZ$5L?~`!+pRSq0(b70Uq%!}cPEJ+)wh?w~HsM>Kh32^DD>YKF13Ts`WEp!#kA000000003000000 -0000HM{I9mVQf=$VRU6vV`ybC`}q*rYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj2yJ0_Npxjxa{vGX4@YcoVqt7kbYXO5 -RC#b^1pxp60t`oNZ(?C=R$**)Wpf1q00;pxo>ox?`Aroor<$W|05z3@o%ygg4E?M+l67UG^w8*<_XZ#%uyqCrG{{ -7b@t4MVjY>G@u4Q3HlB(d+LiLJm-R=h;`?dxBvhE000000RImF0000000l{IaCLMB0taw%Wp+<>bODnP -ynwMZT8l5kSW@l}O=!>^xB4~9n`Dx!RtcK)nwJQ2Wpib6c4cG&dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0 -ThRw7=FYk8VVufK10Q-T=FR=Q=>S+XYD&R000000RR600000000961000000RR600000000v2JaCLNZ -1pxpF0o9FP2n?Horiuqf0^m>2O`jNRziT$b7#=ya6uYYC;s5{u000000RR600000000~WHWNBekd2nR| -0Rv%fdH)DaWprUwd2nR~0RR932~A~mVOC*mb!7zs00;m8KmY&$000000RR600000000>QGbYWy+bYTSn -015$h4P{pQ?3(@m6s4{*=wy-PiS_k>Wl|t&* -Fr0fZ0000000000{{R30000003r}NXb#iiLZewM01_A?ZX>I@j0t0PfcmMzb3{P-FZ*6U9bZupBbOs3n -W@dH)+M7`mSQb`xkca!3Clv)aMjKgwAH@`bu1x<7g|G$};xvA~n-$_S25D|^b#!wAdIKHbX?@G`sCP;~6&DQw -R5(-fxrUo0ThClv)aMjKgwAH@`bu1x<7g|G$};xvA~n-$_S3t@9}X=iS2Wo~qH0(t`- --)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCODo$h9?yTI7S;;e;>sZfv!yd427@;7veO2zMB=|GY5BR -bZ%vHa{_t;9p7nv%krpqNv2!%ioJ -pYH;+t0eX2w~A!Q+0eaZ{MVycPK^T!VRUq1V`yzox?`Aroor<$W|05z3@o%yggKU%$CX5lEZwTb6rTk%m8C`}q*rQx*t>6v={gsJ=SZlTl1iF5eQ8IAl(q%E@>So406W33O>~Wpi|4 -ZEyepNC{+Rc4cgDaAk4ioJpYH;+t0eX2w~A!Q+0eaZ{MVycPK^Kn000000093000000000YTY;R&=Y*cx0Wpe-u0oCr3 -4oQf!Y4K`P(FaQVwIle)QgI&pHa%8Z1>xis%K=jn%|ogzQLxC5#{z1Bs(ImjcZKu%4y_xMoB3q3{22fM -000000093000000000VacWz~5RC#b^a{vkfhyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0VPFr -zQMU~Cv3(oCX8r!*SiR9zOp;)>$$b(q=dpw@&Et;000000RI300000000(DfZe??6a{*3l%9@}OZ_-bc -51ndy0w1NGl_wIgUQD>ylx`L>RgMdEa$#@6CZgT(%0W?w%t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn -*%qZTXaTH$sUA5Y_V-myWDC>B9Z+BpL@OwB6}0<+4x(BzDslh-000000093000000000PbWpib6c4cG& -dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0Th;v2Uql0Ev@(iYu*+LHGLwE58< -2vcKdWo=@6CZUzbiW@dH)+M7`mSQb`xkca!3baG*1bV+0Zp9m~TI>-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b1#WL{V`TsU2o7{|VQzD2 -bZKvHRC#b^0W?w%t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXb5d(bYWy+bYTJYdQCW4e)%xftOSp9 -TD)g5B;KO;Krzd=y+`rt_<1!4XKZg`VQg~&-XoD~rmTY45rxNKIl#GTd$5`Bk}o71wcZw0Vevn_25D|^ -b#!w9siJyUlgOLOB};96cGdSG6&iv=7PD~jruGj4o;;a=3t@9}X=iS2Wo~qH0c?<6G3dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThHuhfW|3TYrJJ8wZFzp>JB4@xD;^wu&SY_r(FZYMM1xis -%Ku=2wF+7z(Wqt=tdZk`V^s(Ana000000093000000000JQZg6#Ua{vkfhyLPa -Scq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a -000000RI300000001IJrb7^O8ZDnqBa{vkfhyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0XD%j -q57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a000000RI3000000010+sY-wa+bZ>G11OfmAZf|a7 -000011aog~WdH>M0%CAAe<9`Lptgpr6F_xjAC6(~TLj#*ewiHf`^rCgHqw;r~cW`-Qb7^w`1pxuF -6jyr<)WbQ@(CZ(W=ig937K21oZj>F1*aU<1)4fLl3UqQ|ZgXjLX>V=-1p)z|2rNlD$O59e#ogQsB77jP -l+h5j^*S;EG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(18dQ03Wn@8fb7^O8b3$xs -Ze&wsVQf@*P;_zx1ON+UWn*k%a$$67c4Yts0RRXAZxMm`#T#PnhgWq`eMS>|xBI2`eUgpkI4MC;V)xV2 -0000000000|Nj60000000SIPwZf9v?Y-Ioi0RRXA$tKg)lZIpnJ?s52Lb#i5700jX62mwiP2M#dZN%AXTA9%-&dal959qWIGOJWz(UDXek -?U(=n0000000960000000093AVRUq1V`yzM -00;rIPS18A9{>CZ0|Ju;9Pya4*S_o#KSQ#S^GM -00;qJNbG0cIzBFIR(d`#um0T+f+Ht6TBtC0P;Q%&@2p?|0000000030{{R30000023UhRFbz^jOa%E%y -1pxpE0c!PSwI(YdXDh`S;c-XJf-JhsCbw@%Wz)m1PMN&5x&QzG000000RR60000000RIYMbaY{3Xl-R~ -bN~eb00;qFo~-2t-FBm?{;M?9h#oN_CYm?uXkfmH1{@T?ji$~30000000030{{R3000009R&Qx!Q*>c; -Wd#8M000 +WRm@*ULd%lgGoFTxU-Vi}-aA;vuZDDL|OmAdib7%`wbaH89bX0k8Wpe`n8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!} +0yp?_2}WsUY-CPhZDmsy2!s^Lf^?|9I@Xg>Oi(W05|TJ%PM*ricn_PmXk-Xfd2nS;VQpn=1fvw5rj-B| +XP@r^w5ufb=C_Ju$l1`nW&GEpSWb-vQ)O*QWHJJa +HJF7}X$37Y21E`BySDf%$MYb{T~|g0b97;JWdY|Ui~g5KnWLns8aO;kK`4k?o@Z%;JYn$xWqy`)_H6`g +Z)0l$dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0Th*O1aoC!Yyu&0tD*IvDh<9wi3iSCIT-Hk +A81Vlhk;Gmjr?|WwEU;2^0@;NPlb{-n1xko1uZcKL=FhMw)iW@^B~GyS4IVMbYXO50sm-Yz<5%CY59k^ +g5#W{6D&GDo53%OaP0&iRq10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8 +X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%95Mys{W@%()Zggp3Y*S@nYybuW1aoC!Yyu&0tD*IvDh<9w +i3iSCIT-HkA81Vlhk;Gmjr?|WwESop>%7&o7^|1Fn59cLW!>7R25;!;B10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC +#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%dL349yXKqquc4c8~Wn@HQbYVhlX>MdwWnpYo +cxhw=0sshdWp-s@Y-MBs1_K0hWnpXrA#kgq^`I&ZzC?)!&R01Y?(H9FO$CR6P1%k7c67A-ECY>5OGott +JZHLg1Ujv+c;>sahi1#@&^bY%hmXk);5Qh;gshq!{{oTC#gIzF4hFN<*P1RquLWiVd^ +Y;R+00(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCd;@jJLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQ +wWqKF0Ra$WZ*FF3WMyu2X<=+rWnpXp1_K0hWnpXrA#kgq^`I&ZzC?)!&R01Y?(H9FO$CR6P1%k7c67A- +Xc_Cg)w39@m$R6qOEzWQ+NTC@=;OF|0}@Y#k~NrxRcQq+F$P2q2)nlUE64L7 +%3W7R1#@&^bY%fGI))bfMMVo1jMXFjjL!_a@t08nw0vGJJY%E(q{YAlY;R+00(t`--)Viz@~C%8KNS}Z +0aQ3s^SOqbBwN-D{wl@OCd;@jJLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF0Ra$WZ*FF3WMyu2X<=+r +WnpXp1_K0hWnpXrA#kgq^`I&ZzC?)!&R01Y?(H9FO$CR6P1%k7c67A-Xc_Cg)w39@m$R6qOEzWQ+NTC@ +=;; +)g%0j&kVcqmr((;)g%0j&kVcqmr((JJa +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 +Z0H=mhJ>?uV`XBd?L00000 +000300000000007XJu|>b7^w{PHf7Wpb~G=Pm~XxYI*`6rJj{160lxOxY(3#7BW?i3v_Z}ZgXjLX>V?G +015##QV*^ZmKt8YDf|&5KZQ>65I6*X)C9iYp+?yjr7~y%r?zUHR4te2V`ybV=@3Ik?l +b^+R(Q4?4eR(6nw`65I6*X)C9iY +p+?yjr7~y;ZDn*}WMOn+0rh%KI9Y!AFx9LCk8@hQXE7w+qW3^C%eTEp@#^?_H3w&GZ(?C=a{=BXk!z-` +g4hv-$6z_YxoLZ_neUP>BpbEf7FA*KKfDHMZg6#Ua{;NMdRLRko603iZGCpt_aPM;f@L7 +b8`ZE10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)y +umJ%ORB~Z%b7^#GZ*D?$Ze(m_1_B6aZg6#UO<`~WY-4?-07e*?NIFFVu%{*cKZ@sagIb49APrl8fwmiz +5NmF4cWzX2VQzD2bZKvHa{vkfmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<0l8|LHDqDPi9@Kw +6T&e8`*mqtM#v;8$9#1*H32Q6K>+{&000000RR600000001;GjVQzD2bZKvHL}hegX>4-_0uXd^VQzD2 +bZKvHQ)6glZD9edf2kfhA@=uGO=Jtx#~n~$5JW2|a}~7vfDWQsGAeQeZeeX@0!8YhU)%QMkO4aJ;_ZeC +e;xE!X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~au8HvO>-_DBy8`Vb0jGrW9$=2qSMXvL3HGEG0000000000{{R300000025D|^b#!w83IT`y;$>KfZ0H=mhJ>?uVKfZ0H=mhJ>?uVR2X +hQO_4{AcS-HH^7AVzASV8M4NYxyCka@1Z8)ymjIKNK5;L!8FkfGTe+FK;UUh9M-4n+}vRfRB~Z%b7^#G +Z*Ek1aAgGn0006GRC#b^LvL+uX>@I6Zgd0!00(DfZe??6a{vVa0kRZVdkxgXIndDSADQRhP(T)gL{x5+ +9gElmgZ0zBM*#|Sa$#@6CZU6-W0iOsgNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G66JF53UoI +8eY9A{1GERg--GiI0S#x1is&)M%fmnGH4o9d2nT9L349yXKr&sY-w&}Q)OXnRCrKyas&hb3uI+uY+-U? +bZK^F00jX62mx;qf%wH6V(o`lby0mr6MMJ&rS^T2jpaBgK~Q4%)6)O|00000009600000000039W_507 +X<}?;00jX62m#3^)76uPWC%U${V?Tj%xE~|`pWbPFE41i6~^xq(2)QD0000000960000000006Cb98cb +V{~wU50>qi0000000000|Nj6000000{|aGr +bYWv?ZDnqB00jX62mwKgD3w^Bk@ys(*bFVu<9$b&qo7Qa-=8dhvXS#nZTEEFN&o-=000000RR6000000009VQb#7;AVr*pq1pxpE0bfY$XWlwKE^AhLJ}|HT-4B8z +CplWEFn3UHo09LWU;qFB000000RR600000000IhgbaHiLbairNWB>&L00;qU^<}jtD&%5ytTRj0000000030{{R30000303So3~VPj}*Wo~o;1pxpE0b8D|6{&FIv zea)tO0**Na8HvHUi8(nw`6-FT8Qj4oMVZMZA(aKG#mo%STOt@gC9KOm@kf(s>7Oet z@*l4Uw7ivmaL`G&oXPx05vN;bYEFt@Vs2`%7)Oi9$)=JO`>d`_4)h7oyDv1!B4zSB z1+K}$Ec%QVo1Ixgc~u1+i;FYU^Kw)3N?cM)5;Jp(*_Z|L%kxrGf=d!hQiGE-Qgah0 z+bAirvg82`ogAyEXhg^jf+?wKiKRIuAw`LK#hE3U`FWH1H550`5bR`A;&so-PfE;z z*~KK74(20Uc2^O}G6h1GZB~>>W#;4d1v(yX=;VhI?g;l1Hlj`XI;$dMi^TKJ-+t08 zE1o|7y1stb&ncB3ZKp+l?49E!EpqgJwAti&iVg}Yw;$aKRsXcCZ3EvMr75ev{E^dK z9B|qt_)Vw$^chC2PLuyB+AG{pzo}AqyiLfMPi4o=(jd3cQ)R~mw@Pe&vElc&H|Y{n zC&wyfDlFfYH8(_e`im!qZ!c?ZbnKu1$S-!fk?;cpucxa0db=DpKT~?hq$-FAM7Z|^ VO5gztjh~~)@k7|Z$5r>U005U29mW6v delta 101 zcmV-r0Gj`>T834yRRaP80F$5_Ad`0kZVn4mbaH89bX0k8Wpe@mlTHLr0W`Co1XT^Q zvJ!~~v&0!?1GB^(*9DU>C?S(x9UzmuBS4d086cA!BtMfG5+IX%Bx#ciC?K;0CE)_I HaVWn8sqG ^ ..0xff Occurrences} , validator AluVM.LibSite? +@mnemonic(eddie-super-cartoon) +data GlobalDetails : globalStateSchema GlobalStateSchema, name StrictTypes.FieldName + @mnemonic(initial-malta-sierra) data GlobalState : {GlobalStateType -> ^ ..0xff GlobalValues} @@ -197,6 +207,9 @@ data Inputs : {Input} data MediaType : any#255 | (|) +@mnemonic(arena-janet-prepare) +data MetaDetails : semId StrictTypes.SemId, name StrictTypes.FieldName + @mnemonic(quebec-mission-quota) data MetaType : U16 @@ -243,17 +256,17 @@ data RevealedData : value DataState, salt U128 @mnemonic(escape-nylon-client) data RevealedFungible : value FungibleState -@mnemonic(ohio-carrot-grand) +@mnemonic(mexico-resume-zipper) data Schema : ffv Ffv , flags CommitVerify.ReservedBytes1 , name StrictTypes.TypeName , timestamp I64 , developer Identity - , metaTypes {MetaType -> ^ ..0xff StrictTypes.SemId} - , globalTypes {GlobalStateType -> ^ ..0xff GlobalStateSchema} - , ownedTypes {AssignmentType -> ^ ..0xff OwnedStateSchema} + , metaTypes {MetaType -> ^ ..0xff MetaDetails} + , globalTypes {GlobalStateType -> ^ ..0xff GlobalDetails} + , ownedTypes {AssignmentType -> ^ ..0xff AssignmentDetails} , genesis GenesisSchema - , transitions {TransitionType -> ^ ..0xff TransitionSchema} + , transitions {TransitionType -> ^ ..0xff TransitionDetails} , reserved CommitVerify.ReservedBytes8 @mnemonic(ramirez-patron-simon) @@ -274,6 +287,9 @@ data Transition : ffv Ffv @mnemonic(rider-serpent-algebra) data TransitionBundle : inputMap InputMap, knownTransitions {OpId -> ^ 1.. Transition} +@mnemonic(orbit-pattern-goblin) +data TransitionDetails : transitionSchema TransitionSchema, name StrictTypes.FieldName + @mnemonic(scratch-magnum-polaris) data TransitionSchema : metadata {MetaType ^ ..0xff} , globals {GlobalStateType -> ^ ..0xff Occurrences} diff --git a/stl/RGBLogic@0.1.0.sta b/stl/RGBLogic@0.1.0.sta index 5110f078..0f6a67bd 100644 --- a/stl/RGBLogic@0.1.0.sta +++ b/stl/RGBLogic@0.1.0.sta @@ -1,14 +1,14 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:cpfuZutw-7s$hkuI-Q8vaRf4-XCUiAKC-glMJM!0-8hV0Gvg#monarch-detect-paradox +Id: stl:RvzTp24G-g$eJHWw-LqT0lhQ-IQuCWAD-VeQWSfN-gXQc0sQ#japan-dublin-annual Name: RGBLogic Dependencies: + RGBCommit#cake-bingo-shadow, BPCore#symbol-tropic-grand, - RGBCommit#fossil-latin-random, Bitcoin#signal-color-cipher -Check-SHA256: a12adf0516cbe1705cbf8d3968030c53d401ed53cad734e0b658d6a2113d7387 +Check-SHA256: 239c251e83485e7c2b7ae85d7f79a27eb4e300ae371e0bf58f89e8e4541a4370 -2vSEvOmAmtV*?>@tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPA_P(yEWWjo&LVgH;B4r&Z%!z}~o -Y(B2#wIdjxK1%sJIE8cJ`3X`-LPKwDZE1A%Y!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkk +2vSEvOmAmtV*>;u)J7w&8i}qAXmddS`2?iQy#4k?Wr1pwkgtG{!6FG#M?ynyZEb0EA#kgq^`I&ZzC?)! +&R01Y?(H9FO$CR6P1%k7c67A-20~CnZ*pbzY!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkk Z)t7=20~CnZ*pY?00DdlT>wB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 wjY>38tto&d&=eG4cRAF#( @@ -23,12 +23,12 @@ _r(NHa7knZ00=~4V^DH$Z)OAn0S0toaB^jI00jX8A#kgq^`I&ZzC?)!&R01Y?(H9FO$CR6P1%k7c67A- 54IneKN{_;j(f`H9IfkFzO$PG=uAF%>iaxCSnRl2&38AmXJiCw9urENI6IdKM{I9mVQf!wWCj8SZ*Wg?WC5$Mo0RIYfa$#@6CZU6=Z2X|?7Ze??G0gvlp0sK<6W+n*cBpJ9-*worFk3Ek7Mz>CQ0ZEXBf&z4T0z2O7VgH;B4r&Z% -!z}~oY(B2#wIdjxK1%sJIE8cJ`7}}wt`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zc -aA{-$JKpMH|C|jDY7A$?Ed%ImKCb1pBN(4PO8GlDg>&KgmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`Zq +X>@6CZU6=Z2X|?7Ze??G0gvlp0sK<6W+n*cBpJ9-*worFk3Ek7Mz>CQ0ZEXBf&z4T0t6$}MkB5oiLMQ3 +b3p(31fZewKt00;zc +aA{-$1S8Z&Bd!{Wt_^5&K>zs!q|Chi_C;lZYLk$!fRMo=mB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`Zq Bog<<3Rh`#Ze??GPjX}g1ONqXX>Mg?00jX7T-**L6)$-r+lRyXoI{GIo*U3CNI7Emc=xo*$N+#60SR&KgdBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W) +ZggREX?A4*00069X=iS4a%E%y0009BVRB<=X?A5~0000AS7~%^Wpi^-Z*v9%25ez@WpXhB1S8Z&Bd!{W +t_^5&K>zs!q|Chi_C;lZYLk$!fRMo=dBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W) 00aqiX>Db5bYX39002k -----END STRICT TYPE LIB----- diff --git a/stl/RGBLogic@0.1.0.stl b/stl/RGBLogic@0.1.0.stl index 1b6f7648790ecd7db09dbe15be262beb9caf879c..1cf08c38abafd62edf72674a89b934965d545e17 100644 GIT binary patch delta 192 zcmeC@?&mh)2y%Dw$xqKrW@b^o;-HpDatx?D_l6HMKEo@`Uvb6AmhI z0#!Qa=jLXXOjcl4U}tj*aLzAE-57m~S%Hw&$vsR8lS^6n2`gN}GKH|B-Asy;D_O+= D3>#CF delta 192 zcmeC@?&s#>2y%Dw$xqKrW}d9TtYFCI6yTg+lxltNRpS3SynI4$ZhU*y=Wd%9Iw zV!oZ%Piu?T;)g#ufx4XYb8|CGHb&oKRv@H&au1Wj(ud D6IxLu diff --git a/stl/RGBLogic@0.1.0.sty b/stl/RGBLogic@0.1.0.sty index f816eaf4..b991578b 100644 --- a/stl/RGBLogic@0.1.0.sty +++ b/stl/RGBLogic@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:cpfuZutw-7s$hkuI-Q8vaRf4-XCUiAKC-glMJM!0-8hV0Gvg#monarch-detect-paradox + Id: stl:RvzTp24G-g$eJHWw-LqT0lhQ-IQuCWAD-VeQWSfN-gXQc0sQ#japan-dublin-annual Name: RGBLogic Version: 0.1.0 Description: Consensus logic layer for RGB smart contracts @@ -11,6 +11,11 @@ @context typelib RGBLogic +import RGBCommit#cake-bingo-shadow + use TransitionType#picture-reflex-brigade + use Layer1#camilla-basket-justin + use OpId#picnic-single-gloria + import BPCore#symbol-tropic-grand use TapretNodePartner#roger-member-educate use TapretProof#marco-border-sample @@ -18,11 +23,6 @@ import BPCore#symbol-tropic-grand use TapretRightBranch#miracle-patriot-touch use OpretProof#good-village-flex -import RGBCommit#fossil-latin-random - use TransitionType#picture-reflex-brigade - use Layer1#camilla-basket-justin - use OpId#picnic-single-gloria - import Bitcoin#signal-color-cipher use ScriptBytes#equator-cockpit-gong use TapNodeHash#paprika-amanda-hunter diff --git a/stl/Schema.vesper b/stl/Schema.vesper index 2f71bce7..1f3ebbd6 100644 --- a/stl/Schema.vesper +++ b/stl/Schema.vesper @@ -13,19 +13,19 @@ SchemaId commitment hasher=SHA256 tagged=urn:lnp-bp:rgb:schema#2024-02-03 TypeName serialized I64 serialized Identity serialized - SemId map len=0..MAX8 + MetaDetails map len=0..MAX8 MetaType mapKey - SemId mapValue - GlobalStateSchema map len=0..MAX8 + MetaDetails mapValue + GlobalDetails map len=0..MAX8 GlobalStateType mapKey - GlobalStateSchema mapValue - OwnedStateSchema map len=0..MAX8 + GlobalDetails mapValue + AssignmentDetails map len=0..MAX8 AssignmentType mapKey - OwnedStateSchema mapValue + AssignmentDetails mapValue GenesisSchema serialized - TransitionSchema map len=0..MAX8 + TransitionDetails map len=0..MAX8 TransitionType mapKey - TransitionSchema mapValue + TransitionDetails mapValue ReservedBytes8 serialized Schema rec @@ -36,20 +36,27 @@ Schema rec developer ascii aka=Identity first=AsciiPrintable rest=AsciiPrintable len=1..4096 metaTypes map len=0..MAX8 key is U16 aka=MetaType - value bytes len=32 aka=SemId + value rec MetaDetails + semId bytes len=32 aka=SemId + name ascii aka=FieldName first=AlphaSmallLodash rest=AlphaNumLodash len=1..100 globalTypes map len=0..MAX8 key is U16 aka=GlobalStateType - value rec GlobalStateSchema - reserved bytes len=1 aka=ReservedBytes1 - semId bytes len=32 aka=SemId - maxItems is U24 + value rec GlobalDetails + globalStateSchema rec GlobalStateSchema + reserved bytes len=1 aka=ReservedBytes1 + semId bytes len=32 aka=SemId + maxItems is U24 + name ascii aka=FieldName first=AlphaSmallLodash rest=AlphaNumLodash len=1..100 ownedTypes map len=0..MAX8 key is U16 aka=AssignmentType - value union OwnedStateSchema - declarative is Unit tag=0 - fungible enum FungibleType wrapped unsigned64Bit=8 tag=1 - structured bytes len=32 wrapped aka=SemId tag=2 - attachment enum MediaType wrapped any=255 tag=3 + value rec AssignmentDetails + ownedStateSchema union OwnedStateSchema + declarative is Unit tag=0 + fungible enum FungibleType wrapped unsigned64Bit=8 tag=1 + structured bytes len=32 wrapped aka=SemId tag=2 + attachment enum MediaType wrapped any=255 tag=3 + name ascii aka=FieldName first=AlphaSmallLodash rest=AlphaNumLodash len=1..100 + defaultTransition is U16 aka=TransitionType genesis rec GenesisSchema metadata set len=0..MAX8 element is U16 aka=MetaType @@ -68,25 +75,27 @@ Schema rec pos is U16 transitions map len=0..MAX8 key is U16 aka=TransitionType - value rec TransitionSchema - metadata set len=0..MAX8 - element is U16 aka=MetaType - globals map len=0..MAX8 - key is U16 aka=GlobalStateType - value rec Occurrences - min is U16 - max is U16 - inputs map len=0..MAX8 - key is U16 aka=AssignmentType - value rec Occurrences - min is U16 - max is U16 - assignments map len=0..MAX8 - key is U16 aka=AssignmentType - value rec Occurrences - min is U16 - max is U16 - some rec LibSite option wrapped tag=1 - lib bytes len=32 aka=LibId - pos is U16 + value rec TransitionDetails + transitionSchema rec TransitionSchema + metadata set len=0..MAX8 + element is U16 aka=MetaType + globals map len=0..MAX8 + key is U16 aka=GlobalStateType + value rec Occurrences + min is U16 + max is U16 + inputs map len=0..MAX8 + key is U16 aka=AssignmentType + value rec Occurrences + min is U16 + max is U16 + assignments map len=0..MAX8 + key is U16 aka=AssignmentType + value rec Occurrences + min is U16 + max is U16 + some rec LibSite option wrapped tag=1 + lib bytes len=32 aka=LibId + pos is U16 + name ascii aka=FieldName first=AlphaSmallLodash rest=AlphaNumLodash len=1..100 From be0c9a8b7f9b8b78302a20dbf5f730616c21b78c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Tue, 11 Mar 2025 15:02:22 +0100 Subject: [PATCH 36/70] vm: remove RgbIsa::Timechain and TimechainOp --- src/vm/isa.rs | 13 +------ src/vm/macroasm.rs | 2 +- src/vm/mod.rs | 2 - src/vm/op_timechain.rs | 88 ------------------------------------------ 4 files changed, 2 insertions(+), 103 deletions(-) delete mode 100644 src/vm/op_timechain.rs diff --git a/src/vm/isa.rs b/src/vm/isa.rs index 8148b5ef..b78b4869 100644 --- a/src/vm/isa.rs +++ b/src/vm/isa.rs @@ -29,7 +29,7 @@ use aluvm::library::{CodeEofError, IsaSeg, LibSite, Read, Write}; use aluvm::reg::{CoreRegs, Reg}; use super::opcodes::{INSTR_RGBISA_FROM, INSTR_RGBISA_TO}; -use super::{ContractOp, ContractStateAccess, TimechainOp, VmContext}; +use super::{ContractOp, ContractStateAccess, VmContext}; #[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display)] #[display(inner)] @@ -37,8 +37,6 @@ use super::{ContractOp, ContractStateAccess, TimechainOp, VmContext}; pub enum RgbIsa { Contract(ContractOp), - Timechain(TimechainOp), - /// All other future unsupported operations, which must set `st0` to /// `false`. Fail(u8), @@ -52,7 +50,6 @@ impl InstructionSet for RgbIsa { fn src_regs(&self) -> BTreeSet { match self { RgbIsa::Contract(op) => op.src_regs(), - RgbIsa::Timechain(op) => op.src_regs(), RgbIsa::Fail(_) => bset![], } } @@ -60,7 +57,6 @@ impl InstructionSet for RgbIsa { fn dst_regs(&self) -> BTreeSet { match self { RgbIsa::Contract(op) => op.dst_regs(), - RgbIsa::Timechain(op) => op.dst_regs(), RgbIsa::Fail(_) => bset![], } } @@ -68,7 +64,6 @@ impl InstructionSet for RgbIsa { fn complexity(&self) -> u64 { match self { RgbIsa::Contract(op) => op.complexity(), - RgbIsa::Timechain(op) => op.complexity(), RgbIsa::Fail(_) => u64::MAX, } } @@ -76,7 +71,6 @@ impl InstructionSet for RgbIsa { fn exec(&self, regs: &mut CoreRegs, site: LibSite, context: &Self::Context<'_>) -> ExecStep { match self { RgbIsa::Contract(op) => op.exec(regs, site, context), - RgbIsa::Timechain(op) => op.exec(regs, site, &()), RgbIsa::Fail(_) => { isa::ControlFlowOp::Fail.exec(regs, site, &()); ExecStep::Stop @@ -91,7 +85,6 @@ impl Bytecode for RgbIsa { fn instr_byte(&self) -> u8 { match self { RgbIsa::Contract(op) => op.instr_byte(), - RgbIsa::Timechain(op) => op.instr_byte(), RgbIsa::Fail(code) => *code, } } @@ -100,7 +93,6 @@ impl Bytecode for RgbIsa { where W: Write { match self { RgbIsa::Contract(op) => op.encode_args(writer), - RgbIsa::Timechain(op) => op.encode_args(writer), RgbIsa::Fail(_) => Ok(()), } } @@ -115,9 +107,6 @@ impl Bytecode for RgbIsa { instr if ContractOp::::instr_range().contains(&instr) => { RgbIsa::Contract(ContractOp::decode(reader)?) } - instr if TimechainOp::instr_range().contains(&instr) => { - RgbIsa::Timechain(TimechainOp::decode(reader)?) - } x => RgbIsa::Fail(x), }) } diff --git a/src/vm/macroasm.rs b/src/vm/macroasm.rs index e28aca82..585c9592 100644 --- a/src/vm/macroasm.rs +++ b/src/vm/macroasm.rs @@ -24,7 +24,7 @@ macro_rules! rgbasm { ($( $tt:tt )+) => {{ #[allow(unused_imports)] { use amplify::num::{u4, u5}; - use $crate::vm::{RgbIsa, ContractOp, TimechainOp}; + use $crate::vm::{RgbIsa, ContractOp}; use $crate::vm::aluasm_isa; use $crate::isa_instr; aluasm_isa! { RgbIsa<_> => $( $tt )+ } diff --git a/src/vm/mod.rs b/src/vm/mod.rs index 5cda4e8d..5a3b4bed 100644 --- a/src/vm/mod.rs +++ b/src/vm/mod.rs @@ -27,7 +27,6 @@ pub mod opcodes; mod isa; mod op_contract; -mod op_timechain; #[macro_use] mod macroasm; mod contract; @@ -40,4 +39,3 @@ pub use contract::{ pub(crate) use contract::{OpInfo, VmContext}; pub use isa::RgbIsa; pub use op_contract::ContractOp; -pub use op_timechain::TimechainOp; diff --git a/src/vm/op_timechain.rs b/src/vm/op_timechain.rs deleted file mode 100644 index d258f29d..00000000 --- a/src/vm/op_timechain.rs +++ /dev/null @@ -1,88 +0,0 @@ -// RGB Core Library: consensus layer for RGB smart contracts. -// -// SPDX-License-Identifier: Apache-2.0 -// -// Written in 2019-2024 by -// Dr Maxim Orlovsky -// -// Copyright (C) 2019-2024 LNP/BP Standards Association. All rights reserved. -// Copyright (C) 2019-2024 Dr Maxim Orlovsky. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use std::collections::BTreeSet; -use std::ops::RangeInclusive; - -use aluvm::isa::{Bytecode, BytecodeError, ExecStep, InstructionSet}; -use aluvm::library::{CodeEofError, IsaSeg, LibSite, Read, Write}; -use aluvm::reg::{CoreRegs, Reg}; - -use super::opcodes::{INSTR_TIMECHAIN_FROM, INSTR_TIMECHAIN_TO}; - -// TODO: Implement bitcoin blockchain introspection - -#[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display)] -#[display(inner)] -#[non_exhaustive] -pub enum TimechainOp { - Fail, -} - -impl InstructionSet for TimechainOp { - type Context<'ctx> = (); - - fn isa_ids() -> IsaSeg { IsaSeg::with("RGB") } - - fn src_regs(&self) -> BTreeSet { bset![] } - - fn dst_regs(&self) -> BTreeSet { bset![] } - - fn complexity(&self) -> u64 { u64::MAX } - - fn exec(&self, regs: &mut CoreRegs, _site: LibSite, _context: &Self::Context<'_>) -> ExecStep { - match self { - TimechainOp::Fail => { - regs.set_failure(); - ExecStep::Stop - } - } - } -} - -impl Bytecode for TimechainOp { - fn instr_range() -> RangeInclusive { INSTR_TIMECHAIN_FROM..=INSTR_TIMECHAIN_TO } - - fn instr_byte(&self) -> u8 { - match self { - TimechainOp::Fail => INSTR_TIMECHAIN_FROM, - } - } - - fn encode_args(&self, _writer: &mut W) -> Result<(), BytecodeError> - where W: Write { - match self { - TimechainOp::Fail => Ok(()), - } - } - - fn decode(reader: &mut R) -> Result - where - Self: Sized, - R: Read, - { - match reader.read_u8()? { - INSTR_TIMECHAIN_FROM..=INSTR_TIMECHAIN_TO => Ok(Self::Fail), - _ => unreachable!(), - } - } -} From 96b543b97dfec4502415be9b66766017db70032b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Wed, 12 Mar 2025 13:25:11 +0100 Subject: [PATCH 37/70] schema: remove reserved bytes for computed state --- src/schema/state.rs | 7 -- src/stl.rs | 4 +- src/validation/logic.rs | 6 +- stl/RGBCommit@0.1.0.sta | 159 ++++++++++++++++++++-------------------- stl/RGBCommit@0.1.0.stl | Bin 11568 -> 11494 bytes stl/RGBCommit@0.1.0.sty | 8 +- stl/RGBLogic@0.1.0.sta | 20 ++--- stl/RGBLogic@0.1.0.stl | Bin 1423 -> 1423 bytes stl/RGBLogic@0.1.0.sty | 12 +-- stl/Schema.vesper | 1 - 10 files changed, 101 insertions(+), 116 deletions(-) diff --git a/src/schema/state.rs b/src/schema/state.rs index d793e395..02fc10a7 100644 --- a/src/schema/state.rs +++ b/src/schema/state.rs @@ -21,7 +21,6 @@ // limitations under the License. use amplify::num::u24; -use commit_verify::ReservedBytes; use strict_encoding::Primitive; use strict_types::SemId; @@ -66,7 +65,6 @@ pub enum OwnedStateSchema { Fungible(FungibleType), Structured(SemId), Attachment(MediaType), - // TODO: Computed state (RCP240327A) will be added here } impl OwnedStateSchema { @@ -112,9 +110,6 @@ pub enum FungibleType { serde(crate = "serde_crate", rename_all = "camelCase") )] pub struct GlobalStateSchema { - // TODO: Reserved for computed state (RCP240327A): will be used as an enum tag with computed - // state having value 1. - pub reserved: ReservedBytes<1>, pub sem_id: SemId, pub max_items: u24, } @@ -122,7 +117,6 @@ pub struct GlobalStateSchema { impl GlobalStateSchema { pub fn once(sem_id: SemId) -> Self { GlobalStateSchema { - reserved: default!(), sem_id, max_items: u24::ONE, } @@ -130,7 +124,6 @@ impl GlobalStateSchema { pub fn many(sem_id: SemId) -> Self { GlobalStateSchema { - reserved: default!(), sem_id, max_items: u24::MAX, } diff --git a/src/stl.rs b/src/stl.rs index 5a706a49..5fdf6d64 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -37,10 +37,10 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_COMMIT: &str = - "stl:BCPURiOu-GomuDWh-zQP$5BK-TMvP32R-WWBapOQ-r4CQwSI#cake-bingo-shadow"; + "stl:eyIcK1Y8-vJmWKzi-CmYdpc4-bcfjuep-b0Bom0W-h6$8hJw#culture-pamela-ballad"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:RvzTp24G-g$eJHWw-LqT0lhQ-IQuCWAD-VeQWSfN-gXQc0sQ#japan-dublin-annual"; + "stl:kVw2frMA-bnDO3Kj-QWS0pvy-Gak5E$$-U5QFgS7-vzikLJ4#cupid-felix-husband"; fn _rgb_commit_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_COMMIT), tiny_bset! { diff --git a/src/validation/logic.rs b/src/validation/logic.rs index 9b424e9f..9763357c 100644 --- a/src/validation/logic.rs +++ b/src/validation/logic.rs @@ -245,11 +245,7 @@ impl Schema { .map(Confined::release) .unwrap_or_default(); - let GlobalStateSchema { - sem_id, - max_items, - reserved: _, - } = self + let GlobalStateSchema { sem_id, max_items } = self .global_types .get(type_id) .expect( diff --git a/stl/RGBCommit@0.1.0.sta b/stl/RGBCommit@0.1.0.sta index 413c4809..4c46b02c 100644 --- a/stl/RGBCommit@0.1.0.sta +++ b/stl/RGBCommit@0.1.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:BCPURiOu-GomuDWh-zQP$5BK-TMvP32R-WWBapOQ-r4CQwSI#cake-bingo-shadow +Id: stl:eyIcK1Y8-vJmWKzi-CmYdpc4-bcfjuep-b0Bom0W-h6$8hJw#culture-pamela-ballad Name: RGBCommit Dependencies: BPCore#symbol-tropic-grand, @@ -8,7 +8,7 @@ Dependencies: CommitVerify#miller-pancake-elastic, Std#ralph-blue-lucky, Bitcoin#signal-color-cipher -Check-SHA256: 1f6358c6bdb3c5c5e595758ff764eafad74d191ffb90bb3c7f611e5588709f80 +Check-SHA256: b89f58da03351d16b6bf27ff6083e4445dbb8582f8ff6208ba69bc96e0d8acc3 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 -Z0H=mhJ>?uV`XBd?L00000 -000300000000007XJu|>b7^w{PHf7Wpb~G=Pm~XxYI*`6rJj{160lxOxY(3#7BW?i3v_Z}ZgXjLX>V?G -015##QV*^ZmKt8YDf|&5KZQ>65I6*X)C9iYp+?yjr7~y%r?zUHR4te2V`ybV=@3Ik?l -b^+R(Q4?4eR(6nw`65I6*X)C9iY -p+?yjr7~y;ZDn*}WMOn+0rh%KI9Y!AFx9LCk8@hQXE7w+qW3^C%eTEp@#^?_H3w&GZ(?C=a{=BXk!z-` -g4hv-$6z_YxoLZ_neUP>BpbEf7FA*KKfDHMZg6#Ua{;NMdRLRko603iZGCpt_aPM;f@L7 -b8`ZE10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)y -umJ%ORB~Z%b7^#GZ*D?$Ze(m_1_B6aZg6#UO<`~WY-4?-07e*?NIFFVu%{*cKZ@sagIb49APrl8fwmiz -5NmF4cWzX2VQzD2bZKvHa{vkfmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<0l8|LHDqDPi9@Kw -6T&e8`*mqtM#v;8$9#1*H32Q6K>+{&000000RR600000001;GjVQzD2bZKvHL}hegX>4-_0uXd^VQzD2 -bZKvHQ)6glZD9edf2kfhA@=uGO=Jtx#~n~$5JW2|a}~7vfDWQsGAeQeZeeX@0!8YhU)%QMkO4aJ;_ZeC -e;xE!X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~au8HvO>-_DBy8`Vb0jGrW9$=2qSMXvL3HGEG0000000000{{R300000025D|^b#!w83IT`y;$>KfZ0H=mhJ>?uVKfZ0H=mhJ>?uVR2X -hQO_4{AcS-HH^7AVzASV8M4NYxyCka@1Z8)ymjIKNK5;L!8FkfGTe+FK;UUh9M-4n+}vRfRB~Z%b7^#G -Z*Ek1aAgGn0006GRC#b^LvL+uX>@I6Zgd0!00(DfZe??6a{vVa0kRZVdkxgXIndDSADQRhP(T)gL{x5+ -9gElmgZ0zBM*#|Sa$#@6CZU6-W0iOsgNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G66JF53UoI -8eY9A{1GERg--GiI0S#x1is&)M%fmnGH4o9d2nT9L349yXKr&sY-w&}Q)OXnRCrKyas&hb3uI+uY+-U? -bZK^F00jX62mx;qf%wH6V(o`lby0mr6MMJ&rS^T2jpaBgK~Q4%)6)O|00000009600000000039W_507 -X<}?;00jX62m#3^)76uPWC%U${V?Tj%xE~|`pWbPFE41i6~^xq(2)QD0000000960000000006Cb98cb -V{~wU50>qi0000000000|Nj6000000{|aGr -bYWv?ZDnqB00jX62mwKgD3w^Bk@ys(*bFVu<9$b&qo7Qa-=8dhvXS#nZTEEFN&o-=000000RR6000000009VQb#7;AVr*pq1pxpE0bfY$XWlwKE^AhLJ}|HT-4B8z -CplWEFn3UHo09LWU;qFB000000RR600000000IhgbaHiLbairNWB>&L00;qU^<}jtD&%5ytTRj0000000030{{R30000303So3~VPj}*Wo~o;1pxpE0b8D||`fdOK000000093000000000q3Y;R&=Y*Tb$bY)XxXk~3-1_A|hWo=1h +0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*=q!&6rQG)02XJT?*g=|B=zREie$*y(7k2+*P~cY +jRc;WmI`^Wd#8M00In0Y;R&=Y*t}xb!Bq}0RRXAGM-jZ2Kh}DE2o;H +YydTtf}Q!WH{}bI!u)W*#(e~Z0RR9100000|Nj60000002uWmRZggpMc?AIg1p)%fEFN!zncXl9K5w2; +FV{y1jDTJCC^p$-mHEbO0#qkRz9SbZ=!8X@=Yuq$20sb<4l#S`iz7Vef}@Ca=a#qt2m;D19&dx0-7pM3 +Z=O*v*GCA9fL-<|HrZsA`NnJlR3}KjBNr;@ghiU?gEXK9KMDE{F?;HZBRuDVqlk6qmbd@_000000093F +00000000F^Zg6#U1_B3ga%FZ;b#wuf5WIk~G+K)5%bR49t5yk`^qQ9la%FR6a&~28 +0(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCd;@jJLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF +0SHNMaCLM|VQ>Wj015*2Y!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>jbO<32;hs$B9ZCsU(1!DsC| +W1LOd&b_IRG-(&Q$wPGj2?3SJ=6W7=VqesjRYGc!>wZFzp>JB4@xD;^wu&SY_r(AJ000000096000000 +00031000000096000000000I_Zg6#Ua|Hna2?5oOUkD7Ff~JZGMgrhZ&rP2gYrktY!x$bpv=qCl=HdVV +000000096000000000S1Wn^h#RC#b^0|5hJZh8L;O=WapL}hegX>4-_0tItrZAoMTMe3tp+xFv-0Xp&G +?S=|}9rRaeU`~uMrbA>C`}q*rYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj1a4t%WdcR&qhH(h +QGbYWy+bYTSn015$h4P{pQ?3(@m6s4{*=wy-PiS_k>Wl|t&*Fr0fZ0000000000 +{{R30000003r}NXb#iiLZewM01_A?ZX>I@j0t0PfcmMzb3{P-FZ*6U9bZupBbOs3nW@dH)+M7`mSQb`x +kca!3 +Clv)aMjKgwAH@`bu1x<7g|G$};xvA~n-$_S25D|^b#!wAdIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThClv)aMjKgwAH@`bu1x<7g|G$};xvA~n-$_S3t@9}X=iS2Wo~qH0(t`--)Viz@~C%8KNS}Z +0aQ3s^SOqbBwN-D{wl@OCODo$h9?yTI7S;;e;>sZfv!yd427@;7veO2zMB=|GY5BRbZ%vHa{_t;9p7nv +%krpqNv2!%ioJpYH;+t0eX2w~A!Q ++0eaZ{MVycPK^T!VRUq1V`yzox?`Aroor<$W|05z3@o%yggKU%$CX5lEZwTb6rTk%m8C`}q*rQx*t>6v={gsJ=SZlTl1iF5eQ8IAl(q%E@>So406W33O>~Wpi|4ZEyepNC{+Rc4cgD +aAk4xis%K;Cz%P43gO+4!q%eZVl +@Y7XFOZrI4j;@LJR>mVbPjdhO000000093000000000VacWz~5RC#b^a{vkfhyLPaScq)s9KMExvw34D +6J>+NwrBxfixd_%u|$Wt0oW(mByq=v5;G1YxY>15Mpepo#}Ty{v*@th($000000RI3000000 +00(DfZe??6a{*3l%9@}OZ_-bc51ndy0w1NGl_wIgUQD>ylx`L>RgMdEa$#@6CZgT(%0W?w%t`n9T +UcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXaT3TYMoRqm+0g%?b9i-L64u}PF +;v2Uql0Ev@(iYu*+LHGLwE58<2vcKdWo=@6CZUzbiW@dH)+M7`mSQb`x +kca!3baG*1bV+0Zp9m~TI>-W|y2ahx3nF|Vuawki#7NH?S|Q-Q +!u2{b1#WL{V`TsU2o7{|VQzD2bZKvHRC#b^0W?w%t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXb5d( +bYWy+bYTJYdQCW4e)%xftOSp9TD)g5B;KO;Krzd=y+`rt_<1!4XKZg`VQg~&-XoD~rmTY45rxNKIl#GT +d$5`Bk}o71wcZw0Vevn_25D|^b#!w9siJyUlgOLOB};96cGdSG6&iv=7PD~jruGj4o;;a=3t@9}X=iS2 +Wo~qH0c?<6G3dIKHbX?@G`sCP;~6&DQw +R5(-fxrUo0ThHuhfW|3TYrJJ8wZFzp>JB4@xD;^wu&SY_r(FZYMM1Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7 +Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pxis%Ku=2wF+7z(Wqt=tdZk`V^ +s(Ana000000093000000000JQZg6#Ua{vkfhyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0XD%j +q57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a000000RI300000001IJrb7^O8ZDnqBa{vkfhyLPa +Scq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a +000000RI3000000010+sY-wa+bZ>G11OfmAZf|a7000011aog~WdH>M0%CAAe<9`Lptgpr6F_ +xjAC6(~TLj#*ewiHf`^rCgHqw;r~cW`-Qb7^w`1pxuF6jyr<)WbQ@(CZ(W=ig937K21oZj>F1*aU<1)4fLl +3UqQ|ZgXjLX>V=-1p)z|2rNlD$O59e#ogQsB77jPl+h5j^*S;EG*S<)6P6lYy(#<=BR_>s +@(?%#f7ArN-=Rj?7Ns(18dQ03Wn@8fb7^O8b3$xsZe&wsVQf@*P;_zx1ON+UWn*k%a$$67c4Yts0RRXA +ZxMm`#T#PnhgWq`eMS>|xBI2`eUgpkI4MC;V)xV20000000000|Nj60000000SIPwZf9v?Y-Ioi0RRXA +$tKg)lZIpnJ?s52Lb#i5700jX6 +2mwiP2M#dZN%AXTA9%-&dal959qWIGOJWz(UDXek?U(=n0000000960000000093AVRUq1V`yzM00;rIPS18A9{>CZ0|Ju;9Pya4*S_o#KSQ#S^GM00;qJNbG0cIzBFIR(d`#um0T+f+Ht6TBtC0P;Q%& +@2p?|0000000030{{R30000023UhRFbz^jOa%E%y1pxpE0c!PSwI(YdXDh`S;c-XJf-JhsCbw@%Wz)m1 +PMN&5x&QzG000000RR60000000RIYMbaY{3Xl-R~bN~eb00;qFo~-2t-FBm?{;M?9h#oN_CYm?uXkfmH +1{@T?ji$~30000000030{{R3000009R&Qx!Q*>c;Wd#8M000 -----END STRICT TYPE LIB----- diff --git a/stl/RGBCommit@0.1.0.stl b/stl/RGBCommit@0.1.0.stl index 489f27fc06a2f85b85784ee030a0ca85757a6d35..7d03f41213cb8198e318912a6530ecdba1d1be86 100644 GIT binary patch delta 111 zcmV-#0FeK%TIN}>UKt>EnB!jSlPQjTl%(2ntadXH-EO|kM)2Suin@FFIY zUlJgb#2Ix50tItrZAoO4Feo9DUL7E_%Nj8WAP=_7C}<;1JnIz8xNJV~(^X1K`bf%- Ru8H ^ ..0xff GlobalValues} -@mnemonic(silk-college-august) -data GlobalStateSchema : reserved CommitVerify.ReservedBytes1 - , semId StrictTypes.SemId - , maxItems U24 +@mnemonic(zipper-pioneer-visa) +data GlobalStateSchema : semId StrictTypes.SemId, maxItems U24 @mnemonic(yoga-quick-jasmine) data GlobalStateType : U16 diff --git a/stl/RGBLogic@0.1.0.sta b/stl/RGBLogic@0.1.0.sta index 0f6a67bd..c6b24efe 100644 --- a/stl/RGBLogic@0.1.0.sta +++ b/stl/RGBLogic@0.1.0.sta @@ -1,14 +1,14 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:RvzTp24G-g$eJHWw-LqT0lhQ-IQuCWAD-VeQWSfN-gXQc0sQ#japan-dublin-annual +Id: stl:kVw2frMA-bnDO3Kj-QWS0pvy-Gak5E$$-U5QFgS7-vzikLJ4#cupid-felix-husband Name: RGBLogic Dependencies: - RGBCommit#cake-bingo-shadow, BPCore#symbol-tropic-grand, + RGBCommit#culture-pamela-ballad, Bitcoin#signal-color-cipher -Check-SHA256: 239c251e83485e7c2b7ae85d7f79a27eb4e300ae371e0bf58f89e8e4541a4370 +Check-SHA256: 72dbc85dfee7b148e32f392392a3ba29561a3452726e9319470d877371c5c541 -2vSEvOmAmtV*>;u)J7w&8i}qAXmddS`2?iQy#4k?Wr1pwkgtG{!6FG#M?ynyZEb0EA#kgq^`I&ZzC?)! -&R01Y?(H9FO$CR6P1%k7c67A-20~CnZ*pbzY!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkk +2vSEvOmAmtV*?>@tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPA_P(yEWWqTqVD^@(bnU*U!f|-YD +bB5f0JD#Pz0itadhp+sEoC#7#LPKwDZE1A%Y!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkk Z)t7=20~CnZ*pY?00DdlT>wB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 wjY>38tto&d&=eG4cRAF#( @@ -23,12 +23,12 @@ _r(NHa7knZ00=~4V^DH$Z)OAn0S0toaB^jI00jX8A#kgq^`I&ZzC?)!&R01Y?(H9FO$CR6P1%k7c67A- 54IneKN{_;j(f`H9IfkFzO$PG=uAF%>iaxCSnRl2&38AmXJiCw9urENI6IdKM{I9mVQf!wWCj8SZ*Wg?WC5$Mo0RIYfa$#@6CZU6=Z2X|?7Ze??G0gvlp0sK<6W+n*cBpJ9-*worFk3Ek7Mz>CQ0ZEXBf&z4T0t6$}MkB5oiLMQ3 -b3p(31fZewKt00;zc -aA{-$1S8Z&Bd!{Wt_^5&K>zs!q|Chi_C;lZYLk$!fRMo=mB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`Zq +X>@6CZU6=Z2X|?7Ze??G0gvlp0sK<6W+n*cBpJ9-*worFk3Ek7Mz>CQ0ZEXBf&z4T0(&AHD^@(bnU*U! +f|-YDbB5f0JD#Pz0itadhp+sEoHSAot`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zc +aA{-$dmMg?00jX7T-**L6)$-r+lRyXoI{GIo*U3CNI7Emc=xo*$N+#60SRzs!q|Chi_C;lZYLk$!fRMo=dBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W) +ZggREX?A4*00069X=iS4a%E%y0009BVRB<=X?A5~0000AS7~%^Wpi^-Z*v9%25ez@WpXhBdmDb5bYX39002k -----END STRICT TYPE LIB----- diff --git a/stl/RGBLogic@0.1.0.stl b/stl/RGBLogic@0.1.0.stl index 1cf08c38abafd62edf72674a89b934965d545e17..d4f9e160430c8ff1193126a852fb22eeaca4717e 100644 GIT binary patch delta 192 zcmeC@?&s#>2y%Dw$xqKrW}d9TtYFCI6yTg+lv=GMqa9|mXXZ3*i>8_FnZ<2)>a6E2 z-OIQrSFC;gpO!hCKwZxHxw)Ao8>4SAD-cpXxra$%aw!WxVTDUrrVv)Nn@MqUC94HpDatx?D_l6HMKEo@`Uvb6AmhI z0#!Qa=jLXXOjcl4U}tj*aLzAE-57m~S%Hw&$vsR8lS^6n2`gN}GKH|B-Asy;D_O+= D3>#CF diff --git a/stl/RGBLogic@0.1.0.sty b/stl/RGBLogic@0.1.0.sty index b991578b..a0fbdba7 100644 --- a/stl/RGBLogic@0.1.0.sty +++ b/stl/RGBLogic@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:RvzTp24G-g$eJHWw-LqT0lhQ-IQuCWAD-VeQWSfN-gXQc0sQ#japan-dublin-annual + Id: stl:kVw2frMA-bnDO3Kj-QWS0pvy-Gak5E$$-U5QFgS7-vzikLJ4#cupid-felix-husband Name: RGBLogic Version: 0.1.0 Description: Consensus logic layer for RGB smart contracts @@ -11,11 +11,6 @@ @context typelib RGBLogic -import RGBCommit#cake-bingo-shadow - use TransitionType#picture-reflex-brigade - use Layer1#camilla-basket-justin - use OpId#picnic-single-gloria - import BPCore#symbol-tropic-grand use TapretNodePartner#roger-member-educate use TapretProof#marco-border-sample @@ -23,6 +18,11 @@ import BPCore#symbol-tropic-grand use TapretRightBranch#miracle-patriot-touch use OpretProof#good-village-flex +import RGBCommit#culture-pamela-ballad + use TransitionType#picture-reflex-brigade + use Layer1#camilla-basket-justin + use OpId#picnic-single-gloria + import Bitcoin#signal-color-cipher use ScriptBytes#equator-cockpit-gong use TapNodeHash#paprika-amanda-hunter diff --git a/stl/Schema.vesper b/stl/Schema.vesper index 1f3ebbd6..b1c8837b 100644 --- a/stl/Schema.vesper +++ b/stl/Schema.vesper @@ -43,7 +43,6 @@ Schema rec key is U16 aka=GlobalStateType value rec GlobalDetails globalStateSchema rec GlobalStateSchema - reserved bytes len=1 aka=ReservedBytes1 semId bytes len=32 aka=SemId maxItems is U24 name ascii aka=FieldName first=AlphaSmallLodash rest=AlphaNumLodash len=1..100 From 0ba254cb73d84f961ba99c9f354c7e18c19a2960 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Fri, 21 Mar 2025 15:33:41 +0100 Subject: [PATCH 38/70] vm: use BlockHeight from bp-consensus --- Cargo.lock | 12 ++++-------- Cargo.toml | 4 ++++ src/vm/contract.rs | 5 ++--- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2ca8a564..9a6c570f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -213,8 +213,7 @@ dependencies = [ [[package]] name = "bp-consensus" version = "0.11.1-alpha.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40f227ce25d185bc5fc9109ca83dfa8bd0e745f219e320f3da658aaf4fd7e0c5" +source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#ac79e142ff4a9756c0e61bd5f3234b41d27fa110" dependencies = [ "amplify", "chrono", @@ -228,8 +227,7 @@ dependencies = [ [[package]] name = "bp-core" version = "0.11.1-alpha.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40c6b213ada98fe5e78a978e67a7044d16d2571edb3f85fcdb4246324ec9514a" +source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#ac79e142ff4a9756c0e61bd5f3234b41d27fa110" dependencies = [ "amplify", "bp-consensus", @@ -247,8 +245,7 @@ dependencies = [ [[package]] name = "bp-dbc" version = "0.11.1-alpha.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d33d4cc345a595236441fc2b8726ca7eb693947914b278849d1e2c1923dcb314" +source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#ac79e142ff4a9756c0e61bd5f3234b41d27fa110" dependencies = [ "amplify", "base85", @@ -262,8 +259,7 @@ dependencies = [ [[package]] name = "bp-seals" version = "0.11.1-alpha.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a7a009fbf7e71be7ab5f43e032c69927f58cd7f59a6a822af64f84d3e8d41c5" +source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#ac79e142ff4a9756c0e61bd5f3234b41d27fa110" dependencies = [ "amplify", "baid64", diff --git a/Cargo.toml b/Cargo.toml index 7c602de6..e2c5d62e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -60,3 +60,7 @@ wasm-bindgen-test = "0.3" [package.metadata.docs.rs] features = ["all"] + +[patch.crates-io] +bp-consensus = { git = "https://github.com/zoedberg/bp-core", branch = "0.11.1-2" } +bp-core = { git = "https://github.com/zoedberg/bp-core", branch = "0.11.1-2" } diff --git a/src/vm/contract.rs b/src/vm/contract.rs index 48defcd6..43374d3b 100644 --- a/src/vm/contract.rs +++ b/src/vm/contract.rs @@ -29,7 +29,7 @@ use std::rc::Rc; use amplify::confinement; use amplify::num::u24; -use bp::{Outpoint, Txid}; +use bp::{BlockHeight, Outpoint, Txid}; use chrono::{MappedLocalTime, TimeZone, Utc}; use strict_encoding::{StrictDecode, StrictDumb, StrictEncode}; @@ -178,9 +178,8 @@ pub struct WitnessPos { #[getter(as_copy)] layer1: Layer1, - // TODO: Move BlockHeight from bp-wallet to bp-consensus and use it here #[getter(as_copy)] - height: NonZeroU32, + height: BlockHeight, #[getter(as_copy)] timestamp: i64, From 7c77e62d24a90e0223df5d54d72948858f55d20c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Fri, 21 Mar 2025 17:39:07 +0100 Subject: [PATCH 39/70] operation: use NonEmptyVec for TypedAssigns --- src/operation/assignments.rs | 85 ++++++++---- src/stl.rs | 4 +- src/validation/logic.rs | 76 ++++++---- stl/AnchoredBundle.vesper | 8 +- stl/RGBCommit@0.1.0.sta | 260 ++++++++++++++++++----------------- stl/RGBCommit@0.1.0.stl | Bin 11494 -> 12106 bytes stl/RGBCommit@0.1.0.sty | 48 +++++-- stl/RGBLogic@0.1.0.sta | 24 ++-- stl/RGBLogic@0.1.0.stl | Bin 1423 -> 1423 bytes stl/RGBLogic@0.1.0.sty | 12 +- stl/Transition.vesper | 8 +- 11 files changed, 304 insertions(+), 221 deletions(-) diff --git a/src/operation/assignments.rs b/src/operation/assignments.rs index 65459a67..1cc58196 100644 --- a/src/operation/assignments.rs +++ b/src/operation/assignments.rs @@ -25,9 +25,9 @@ use core::fmt::Debug; use std::collections::{btree_map, BTreeSet}; use std::hash::Hash; -use amplify::confinement::{Confined, SmallVec, TinyOrdMap}; +use amplify::confinement::{Confined, NonEmptyVec, TinyOrdMap, U16}; use commit_verify::{Conceal, ReservedBytes}; -use strict_encoding::{StrictDumb, StrictEncode}; +use strict_encoding::{StrictDecode, StrictDumb, StrictEncode}; use super::ExposedState; use crate::operation::seal::GenesisSeal; @@ -36,6 +36,34 @@ use crate::{ SecretSeal, StateType, VoidState, LIB_NAME_RGB_COMMIT, }; +#[derive(Wrapper, WrapperMut, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, From)] +#[wrapper(Deref)] +#[wrapper_mut(DerefMut)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_COMMIT, dumb = Self(NonEmptyVec::with(A::strict_dumb())))] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde( + crate = "serde_crate", + transparent, + bound = "A: serde::Serialize + serde::de::DeserializeOwned" + ) +)] +pub struct AssignVec(NonEmptyVec) +where A: StrictDumb + StrictEncode + StrictDecode; + +impl AssignVec { + pub fn with(vec: NonEmptyVec) -> Self { Self(vec) } +} + +impl IntoIterator for AssignVec { + type Item = A; + type IntoIter = std::vec::IntoIter; + + fn into_iter(self) -> Self::IntoIter { self.0.into_iter() } +} + #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Display, Error)] #[display(doc_comments)] /// the requested data are not present. @@ -231,15 +259,14 @@ impl Assign { ) )] pub enum TypedAssigns { - // TODO: Consider using non-empty variants #[strict_type(tag = 0x00)] - Declarative(SmallVec>), + Declarative(AssignVec>), #[strict_type(tag = 0x01)] - Fungible(SmallVec>), + Fungible(AssignVec>), #[strict_type(tag = 0x02)] - Structured(SmallVec>), + Structured(AssignVec>), #[strict_type(tag = 0xFF)] - Attachment(SmallVec>), + Attachment(AssignVec>), } impl Conceal for TypedAssigns { @@ -248,23 +275,23 @@ impl Conceal for TypedAssigns { match self { TypedAssigns::Declarative(s) => { let concealed_iter = s.iter().map(AssignRights::::conceal); - let inner = SmallVec::try_from_iter(concealed_iter).expect("same size"); - TypedAssigns::Declarative(inner) + let inner = NonEmptyVec::try_from_iter(concealed_iter).expect("same size"); + TypedAssigns::Declarative(AssignVec::with(inner)) } TypedAssigns::Fungible(s) => { let concealed_iter = s.iter().map(AssignFungible::::conceal); - let inner = SmallVec::try_from_iter(concealed_iter).expect("same size"); - TypedAssigns::Fungible(inner) + let inner = NonEmptyVec::try_from_iter(concealed_iter).expect("same size"); + TypedAssigns::Fungible(AssignVec::with(inner)) } TypedAssigns::Structured(s) => { let concealed_iter = s.iter().map(AssignData::::conceal); - let inner = SmallVec::try_from_iter(concealed_iter).expect("same size"); - TypedAssigns::Structured(inner) + let inner = NonEmptyVec::try_from_iter(concealed_iter).expect("same size"); + TypedAssigns::Structured(AssignVec::with(inner)) } TypedAssigns::Attachment(s) => { let concealed_iter = s.iter().map(AssignAttach::::conceal); - let inner = SmallVec::try_from_iter(concealed_iter).expect("same size"); - TypedAssigns::Attachment(inner) + let inner = NonEmptyVec::try_from_iter(concealed_iter).expect("same size"); + TypedAssigns::Attachment(AssignVec::with(inner)) } } } @@ -344,7 +371,7 @@ impl TypedAssigns { } #[inline] - pub fn as_declarative_mut(&mut self) -> Option<&mut SmallVec>> { + pub fn as_declarative_mut(&mut self) -> Option<&mut NonEmptyVec, U16>> { match self { TypedAssigns::Declarative(set) => Some(set), _ => None, @@ -352,7 +379,7 @@ impl TypedAssigns { } #[inline] - pub fn as_fungible_mut(&mut self) -> Option<&mut SmallVec>> { + pub fn as_fungible_mut(&mut self) -> Option<&mut NonEmptyVec, U16>> { match self { TypedAssigns::Fungible(set) => Some(set), _ => None, @@ -360,7 +387,7 @@ impl TypedAssigns { } #[inline] - pub fn as_structured_mut(&mut self) -> Option<&mut SmallVec>> { + pub fn as_structured_mut(&mut self) -> Option<&mut NonEmptyVec, U16>> { match self { TypedAssigns::Structured(set) => Some(set), _ => None, @@ -368,7 +395,7 @@ impl TypedAssigns { } #[inline] - pub fn as_attachment_mut(&mut self) -> Option<&mut SmallVec>> { + pub fn as_attachment_mut(&mut self) -> Option<&mut NonEmptyVec, U16>> { match self { TypedAssigns::Attachment(set) => Some(set), _ => None, @@ -446,7 +473,7 @@ impl TypedAssigns { if index as usize >= vec.len() { return Err(UnknownDataError); } - Ok(vec.release().remove(index as usize).into_revealed_state()) + Ok(vec.0.release().remove(index as usize).into_revealed_state()) } _ => Err(UnknownDataError), } @@ -458,7 +485,7 @@ impl TypedAssigns { if index as usize >= vec.len() { return Err(UnknownDataError); } - Ok(vec.release().remove(index as usize).into_revealed_state()) + Ok(vec.0.release().remove(index as usize).into_revealed_state()) } _ => Err(UnknownDataError), } @@ -468,22 +495,22 @@ impl TypedAssigns { impl TypedAssigns { pub fn transmutate_seals(&self) -> TypedAssigns { match self { - TypedAssigns::Declarative(a) => TypedAssigns::Declarative( + TypedAssigns::Declarative(a) => TypedAssigns::Declarative(AssignVec::with( Confined::try_from_iter(a.iter().map(|a| a.transmutate_seals())) .expect("same size"), - ), - TypedAssigns::Fungible(a) => TypedAssigns::Fungible( + )), + TypedAssigns::Fungible(a) => TypedAssigns::Fungible(AssignVec::with( Confined::try_from_iter(a.iter().map(|a| a.transmutate_seals())) .expect("same size"), - ), - TypedAssigns::Structured(a) => TypedAssigns::Structured( + )), + TypedAssigns::Structured(a) => TypedAssigns::Structured(AssignVec::with( Confined::try_from_iter(a.iter().map(|a| a.transmutate_seals())) .expect("same size"), - ), - TypedAssigns::Attachment(a) => TypedAssigns::Attachment( + )), + TypedAssigns::Attachment(a) => TypedAssigns::Attachment(AssignVec::with( Confined::try_from_iter(a.iter().map(|a| a.transmutate_seals())) .expect("same size"), - ), + )), } } } diff --git a/src/stl.rs b/src/stl.rs index 5fdf6d64..c9aba6ab 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -37,10 +37,10 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_COMMIT: &str = - "stl:eyIcK1Y8-vJmWKzi-CmYdpc4-bcfjuep-b0Bom0W-h6$8hJw#culture-pamela-ballad"; + "stl:!biPP1$Y-7BZyhSV-G4WQNlq-eDiicmt-K7hBJq9-4cyQk8o#tennis-nirvana-asia"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:kVw2frMA-bnDO3Kj-QWS0pvy-Gak5E$$-U5QFgS7-vzikLJ4#cupid-felix-husband"; + "stl:p0BiRWGC-gBDpjuB-$tqrAMO-hkin3Mv-NYUjn9j-!4n9p7o#miguel-motor-victor"; fn _rgb_commit_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_COMMIT), tiny_bset! { diff --git a/src/validation/logic.rs b/src/validation/logic.rs index 9763357c..563dd42a 100644 --- a/src/validation/logic.rs +++ b/src/validation/logic.rs @@ -21,17 +21,19 @@ // limitations under the License. use std::cell::RefCell; -use std::collections::BTreeSet; +use std::collections::btree_map::Entry; +use std::collections::{BTreeMap, BTreeSet}; use std::rc::Rc; use aluvm::data::Number; use aluvm::isa::Instr; use aluvm::reg::{Reg32, RegA}; use aluvm::Vm; -use amplify::confinement::Confined; +use amplify::confinement::{Confined, NonEmptyVec}; use amplify::Wrapper; use strict_types::TypeSystem; +use crate::assignments::AssignVec; use crate::schema::{AssignmentsSchema, GlobalSchema}; use crate::validation::{CheckedConsignment, ConsignmentApi}; use crate::vm::{ContractStateAccess, ContractStateEvolve, OpInfo, OrdOpRef, RgbIsa, VmContext}; @@ -390,7 +392,7 @@ fn extract_prev_state( inputs: &Inputs, status: &mut validation::Status, ) -> Assignments { - let mut assignments = bmap! {}; + let mut assignments: BTreeMap> = bmap! {}; for input in inputs { let Opout { op, ty, no } = input.prev_out; @@ -406,12 +408,17 @@ fn extract_prev_state( match prev_op.assignments_by_type(ty) { Some(TypedAssigns::Declarative(prev_assignments)) => { if let Some(prev_assign) = prev_assignments.get(no) { - if let Some(typed_assigns) = assignments - .entry(ty) - .or_insert_with(|| TypedAssigns::Declarative(Default::default())) - .as_declarative_mut() - { - typed_assigns.push(prev_assign.clone()).expect("same size"); + match assignments.entry(ty) { + Entry::Occupied(mut entry) => { + if let Some(typed_assigns) = entry.get_mut().as_declarative_mut() { + typed_assigns.push(prev_assign.clone()).expect("same size"); + } + } + Entry::Vacant(entry) => { + entry.insert(TypedAssigns::Declarative(AssignVec::with( + NonEmptyVec::with(prev_assign.clone()), + ))); + } } } else { status.add_failure(validation::Failure::NoPrevOut(opid, input.prev_out)); @@ -419,12 +426,17 @@ fn extract_prev_state( } Some(TypedAssigns::Fungible(prev_assignments)) => { if let Some(prev_assign) = prev_assignments.get(no) { - if let Some(typed_assigns) = assignments - .entry(ty) - .or_insert_with(|| TypedAssigns::Fungible(Default::default())) - .as_fungible_mut() - { - typed_assigns.push(prev_assign.clone()).expect("same size"); + match assignments.entry(ty) { + Entry::Occupied(mut entry) => { + if let Some(typed_assigns) = entry.get_mut().as_fungible_mut() { + typed_assigns.push(prev_assign.clone()).expect("same size"); + } + } + Entry::Vacant(entry) => { + entry.insert(TypedAssigns::Fungible(AssignVec::with( + NonEmptyVec::with(prev_assign.clone()), + ))); + } } } else { status.add_failure(validation::Failure::NoPrevOut(opid, input.prev_out)); @@ -432,12 +444,17 @@ fn extract_prev_state( } Some(TypedAssigns::Structured(prev_assignments)) => { if let Some(prev_assign) = prev_assignments.get(no) { - if let Some(typed_assigns) = assignments - .entry(ty) - .or_insert_with(|| TypedAssigns::Structured(Default::default())) - .as_structured_mut() - { - typed_assigns.push(prev_assign.clone()).expect("same size"); + match assignments.entry(ty) { + Entry::Occupied(mut entry) => { + if let Some(typed_assigns) = entry.get_mut().as_structured_mut() { + typed_assigns.push(prev_assign.clone()).expect("same size"); + } + } + Entry::Vacant(entry) => { + entry.insert(TypedAssigns::Structured(AssignVec::with( + NonEmptyVec::with(prev_assign.clone()), + ))); + } } } else { status.add_failure(validation::Failure::NoPrevOut(opid, input.prev_out)); @@ -445,12 +462,17 @@ fn extract_prev_state( } Some(TypedAssigns::Attachment(prev_assignments)) => { if let Some(prev_assign) = prev_assignments.get(no) { - if let Some(typed_assigns) = assignments - .entry(ty) - .or_insert_with(|| TypedAssigns::Attachment(Default::default())) - .as_attachment_mut() - { - typed_assigns.push(prev_assign.clone()).expect("same size"); + match assignments.entry(ty) { + Entry::Occupied(mut entry) => { + if let Some(typed_assigns) = entry.get_mut().as_attachment_mut() { + typed_assigns.push(prev_assign.clone()).expect("same size"); + } + } + Entry::Vacant(entry) => { + entry.insert(TypedAssigns::Attachment(AssignVec::with( + NonEmptyVec::with(prev_assign.clone()), + ))); + } } } else { status.add_failure(validation::Failure::NoPrevOut(opid, input.prev_out)); diff --git a/stl/AnchoredBundle.vesper b/stl/AnchoredBundle.vesper index cf414146..4b7afcce 100644 --- a/stl/AnchoredBundle.vesper +++ b/stl/AnchoredBundle.vesper @@ -47,7 +47,7 @@ TransitionBundle rec assignments map len=0..MAX8 aka=AssignmentsBlindSealTxPtr key is U16 aka=AssignmentType value union TypedAssignsBlindSealTxPtr - declarative list len=0..MAX16 wrapped tag=0 + declarative list len=1..MAX16 wrapped aka=AssignVecAssignVoidStateBlindSealTxPtr tag=0 AssignVoidStateBlindSealTxPtr union revealed rec tag=0 seal rec BlindSealTxPtr @@ -62,7 +62,7 @@ TransitionBundle rec seal bytes len=32 aka=SecretSeal state is Unit aka=VoidState lock bytes len=2 aka=ReservedBytes2 - fungible list len=0..MAX16 wrapped tag=1 + fungible list len=1..MAX16 wrapped aka=AssignVecAssignRevealedValueBlindSealTxPtr tag=1 AssignRevealedValueBlindSealTxPtr union revealed rec tag=0 seal rec BlindSealTxPtr @@ -81,7 +81,7 @@ TransitionBundle rec value union FungibleState bits64 is U64 wrapped tag=0 lock bytes len=2 aka=ReservedBytes2 - structured list len=0..MAX16 wrapped tag=2 + structured list len=1..MAX16 wrapped aka=AssignVecAssignRevealedDataBlindSealTxPtr tag=2 AssignRevealedDataBlindSealTxPtr union revealed rec tag=0 seal rec BlindSealTxPtr @@ -100,7 +100,7 @@ TransitionBundle rec value bytes len=0..MAX16 aka=DataState salt is U128 lock bytes len=2 aka=ReservedBytes2 - attachment list len=0..MAX16 wrapped tag=3 + attachment list len=1..MAX16 wrapped aka=AssignVecAssignRevealedAttachBlindSealTxPtr tag=3 AssignRevealedAttachBlindSealTxPtr union revealed rec tag=0 seal rec BlindSealTxPtr diff --git a/stl/RGBCommit@0.1.0.sta b/stl/RGBCommit@0.1.0.sta index 4c46b02c..e06df20d 100644 --- a/stl/RGBCommit@0.1.0.sta +++ b/stl/RGBCommit@0.1.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:eyIcK1Y8-vJmWKzi-CmYdpc4-bcfjuep-b0Bom0W-h6$8hJw#culture-pamela-ballad +Id: stl:!biPP1$Y-7BZyhSV-G4WQNlq-eDiicmt-K7hBJq9-4cyQk8o#tennis-nirvana-asia Name: RGBCommit Dependencies: BPCore#symbol-tropic-grand, @@ -8,7 +8,7 @@ Dependencies: CommitVerify#miller-pancake-elastic, Std#ralph-blue-lucky, Bitcoin#signal-color-cipher -Check-SHA256: b89f58da03351d16b6bf27ff6083e4445dbb8582f8ff6208ba69bc96e0d8acc3 +Check-SHA256: 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 -kca!3 -Clv)aMjKgwAH@`bu1x<7g|G$};xvA~n-$_S25D|^b#!wAdIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThClv)aMjKgwAH@`bu1x<7g|G$};xvA~n-$_S3t@9}X=iS2Wo~qH0(t`--)Viz@~C%8KNS}Z -0aQ3s^SOqbBwN-D{wl@OCODo$h9?yTI7S;;e;>sZfv!yd427@;7veO2zMB=|GY5BRbZ%vHa{_t;9p7nv -%krpqNv2!%ioJpYH;+t0eX2w~A!Q -+0eaZ{MVycPK^T!VRUq1V`yzox?`Aroor<$W|05z3@o%yggKU%$CX5lEZwTb6rTk%m8C`}q*rQx*t>6v={gsJ=SZlTl1iF5eQ8IAl(q%E@>So406W33O>~Wpi|4ZEyepNC{+Rc4cgD -aAk4xis%K;Cz%P43gO+4!q%eZVl -@Y7XFOZrI4j;@LJR>mVbPjdhO000000093000000000VacWz~5RC#b^a{vkfhyLPaScq)s9KMExvw34D -6J>+NwrBxfixd_%u|$Wt0oW(mByq=v5;G1YxY>15Mpepo#}Ty{v*@th($000000RI3000000 -00(DfZe??6a{*3l%9@}OZ_-bc51ndy0w1NGl_wIgUQD>ylx`L>RgMdEa$#@6CZgT(%0W?w%t`n9T -UcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXaT3TYMoRqm+0g%?b9i-L64u}PF -;v2Uql0Ev@(iYu*+LHGLwE58<2vcKdWo=@6CZUzbiW@dH)+M7`mSQb`x -kca!3baG*1bV+0Zp9m~TI>-W|y2ahx3nF|Vuawki#7NH?S|Q-Q -!u2{b1#WL{V`TsU2o7{|VQzD2bZKvHRC#b^0W?w%t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXb5d( -bYWy+bYTJYdQCW4e)%xftOSp9TD)g5B;KO;Krzd=y+`rt_<1!4XKZg`VQg~&-XoD~rmTY45rxNKIl#GT -d$5`Bk}o71wcZw0Vevn_25D|^b#!w9siJyUlgOLOB};96cGdSG6&iv=7PD~jruGj4o;;a=3t@9}X=iS2 -Wo~qH0c?<6G3dIKHbX?@G`sCP;~6&DQw -R5(-fxrUo0ThHuhfW|3TYrJJ8wZFzp>JB4@xD;^wu&SY_r(FZYMM1Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7 -Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pxis%Ku=2wF+7z(Wqt=tdZk`V^ -s(Ana000000093000000000JQZg6#Ua{vkfhyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0XD%j -q57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a000000RI300000001IJrb7^O8ZDnqBa{vkfhyLPa -Scq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a -000000RI3000000010+sY-wa+bZ>G11OfmAZf|a7000011aog~WdH>M0%CAAe<9`Lptgpr6F_ -xjAC6(~TLj#*ewiHf`^rCgHqw;r~cW`-Qb7^w`1pxuF6jyr<)WbQ@(CZ(W=ig937K21oZj>F1*aU<1)4fLl -3UqQ|ZgXjLX>V=-1p)z|2rNlD$O59e#ogQsB77jPl+h5j^*S;EG*S<)6P6lYy(#<=BR_>s -@(?%#f7ArN-=Rj?7Ns(18dQ03Wn@8fb7^O8b3$xsZe&wsVQf@*P;_zx1ON+UWn*k%a$$67c4Yts0RRXA -ZxMm`#T#PnhgWq`eMS>|xBI2`eUgpkI4MC;V)xV20000000000|Nj60000000SIPwZf9v?Y-Ioi0RRXA -$tKg)lZIpnJ?s52Lb#i5700jX6 -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 +Q*>c;Wd#8M000 -----END STRICT TYPE LIB----- diff --git a/stl/RGBCommit@0.1.0.stl b/stl/RGBCommit@0.1.0.stl index 7d03f41213cb8198e318912a6530ecdba1d1be86..c767da13d531e42c11388f9986fa80fe73666588 100644 GIT binary patch delta 896 zcmaDBc`9zhToy)$>5;xVW?(i;FYU^TJY-Cof=8nq04~D#geE0ssF)Xf0$V@=Td2 zlNae=s?tQL`pK>^*%pgI8pujyK?WsYF$l>zKW@dzzqRn%<;N`tGDr@KL23x=dSrlZanDb0oEBD}I*n6L$!fy>3SVAk&i|m~xq*FGY5(LOX#&^(g;wAE)bcst?ysbo&o8EK zo+^BqS;6PngfF`bm+WnLS!AGR;`FoNwU@Kqx9gKGPWk0~#b?Ta$-m^aCr?mQ*nC;M zh)>~CE`| z4gZ_}FP!W9YXy5FBS%_kUV3IyPAUT{BjffZTfWFDNzSpJ{C8(iN9ru$j~~xJ|6J6U z)RwzT|LIp9Ca&U=qSEA&(xTK9kop^B_Ivv|AekTj0-E=yw~3;cK6iRC);o3H$K?IJaOT#(0j9% zvP({$s3ku6jJ8NU;~{0vFTXW;uDofxX!>Q^w!71|6$bTPtGCN6 SoMHKyDZwR)C8?~SbOiuos$kCm delta 494 zcmX>V_bhV5Toy))>5;xEN(8I|@rp&f$*VEF|=TSz!}<=r7v`+={0JcF*hHW!`F6 zq%v#onaV|iYrL;C&Y639vXq#=!VNx2)wI0VHbbkQQ|vOcf|K+SE*AF=zW>_my&q>DEcw0Gv+%-|FQxM{&sEJ`ye)q6J0d8wqcPs47nq``j zc%svJ#S!5{hK#>UGh^INsAwIpDK#@?)LrDbxn9eNc`}!vvNQt}{QnPOFmj}o=A~yQ z<)ku9_7zZ-MVDvdDlRE1O)e=dN=;#y+|Q4x;y+hnNl9XIMs8|e3B%+Ie5wNIW=u}d l)0vz~!16T&Eq_bUasz%+asZk`pppOp diff --git a/stl/RGBCommit@0.1.0.sty b/stl/RGBCommit@0.1.0.sty index 46e8265b..ab820975 100644 --- a/stl/RGBCommit@0.1.0.sty +++ b/stl/RGBCommit@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:eyIcK1Y8-vJmWKzi-CmYdpc4-bcfjuep-b0Bom0W-h6$8hJw#culture-pamela-ballad + Id: stl:!biPP1$Y-7BZyhSV-G4WQNlq-eDiicmt-K7hBJq9-4cyQk8o#tennis-nirvana-asia Name: RGBCommit Version: 0.1.0 Description: Consensus commitment layer for RGB smart contracts @@ -92,6 +92,30 @@ data AssignRevealedValueBlindSealTxid : revealed (seal BPCore.BlindSealTxid , state RevealedFungible , lock CommitVerify.ReservedBytes2) +@mnemonic(pearl-epoxy-glass) +data AssignVecAssignRevealedAttachBlindSealTxPtr : [AssignRevealedAttachBlindSealTxPtr ^ 1..] + +@mnemonic(person-finance-visible) +data AssignVecAssignRevealedAttachBlindSealTxid : [AssignRevealedAttachBlindSealTxid ^ 1..] + +@mnemonic(critic-alcohol-actor) +data AssignVecAssignRevealedDataBlindSealTxPtr : [AssignRevealedDataBlindSealTxPtr ^ 1..] + +@mnemonic(sonata-food-tina) +data AssignVecAssignRevealedDataBlindSealTxid : [AssignRevealedDataBlindSealTxid ^ 1..] + +@mnemonic(magic-pupil-model) +data AssignVecAssignRevealedValueBlindSealTxPtr : [AssignRevealedValueBlindSealTxPtr ^ 1..] + +@mnemonic(equator-sector-regard) +data AssignVecAssignRevealedValueBlindSealTxid : [AssignRevealedValueBlindSealTxid ^ 1..] + +@mnemonic(begin-process-outside) +data AssignVecAssignVoidStateBlindSealTxPtr : [AssignVoidStateBlindSealTxPtr ^ 1..] + +@mnemonic(arena-neuron-cantina) +data AssignVecAssignVoidStateBlindSealTxid : [AssignVoidStateBlindSealTxid ^ 1..] + @mnemonic(cannon-present-weekend) data AssignVoidStateBlindSealTxPtr : revealed (seal BPCore.BlindSealTxPtr , state VoidState @@ -302,17 +326,17 @@ data TransitionType : U16 data TypeCommitment : genesis BaseCommitment | transition (ContractId, TransitionType) -@mnemonic(giant-trinity-lagoon) -data TypedAssignsBlindSealTxPtr : declarative [AssignVoidStateBlindSealTxPtr] - | fungible [AssignRevealedValueBlindSealTxPtr] - | structured [AssignRevealedDataBlindSealTxPtr] - | attachment#255 [AssignRevealedAttachBlindSealTxPtr] - -@mnemonic(penguin-raja-machine) -data TypedAssignsBlindSealTxid : declarative [AssignVoidStateBlindSealTxid] - | fungible [AssignRevealedValueBlindSealTxid] - | structured [AssignRevealedDataBlindSealTxid] - | attachment#255 [AssignRevealedAttachBlindSealTxid] +@mnemonic(alarm-genesis-mambo) +data TypedAssignsBlindSealTxPtr : declarative AssignVecAssignVoidStateBlindSealTxPtr + | fungible AssignVecAssignRevealedValueBlindSealTxPtr + | structured AssignVecAssignRevealedDataBlindSealTxPtr + | attachment#255 AssignVecAssignRevealedAttachBlindSealTxPtr + +@mnemonic(initial-robot-archive) +data TypedAssignsBlindSealTxid : declarative AssignVecAssignVoidStateBlindSealTxid + | fungible AssignVecAssignRevealedValueBlindSealTxid + | structured AssignVecAssignRevealedDataBlindSealTxid + | attachment#255 AssignVecAssignRevealedAttachBlindSealTxid @mnemonic(email-snow-safari) data VoidState : () diff --git a/stl/RGBLogic@0.1.0.sta b/stl/RGBLogic@0.1.0.sta index c6b24efe..5398624a 100644 --- a/stl/RGBLogic@0.1.0.sta +++ b/stl/RGBLogic@0.1.0.sta @@ -1,15 +1,15 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:kVw2frMA-bnDO3Kj-QWS0pvy-Gak5E$$-U5QFgS7-vzikLJ4#cupid-felix-husband +Id: stl:p0BiRWGC-gBDpjuB-$tqrAMO-hkin3Mv-NYUjn9j-!4n9p7o#miguel-motor-victor Name: RGBLogic Dependencies: BPCore#symbol-tropic-grand, - RGBCommit#culture-pamela-ballad, - Bitcoin#signal-color-cipher -Check-SHA256: 72dbc85dfee7b148e32f392392a3ba29561a3452726e9319470d877371c5c541 + Bitcoin#signal-color-cipher, + RGBCommit#tennis-nirvana-asia +Check-SHA256: 099d8d860c90b6b18c738e6cc1845c724f8c544655c7c3989db6810467c7c75c -2vSEvOmAmtV*?>@tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPA_P(yEWWqTqVD^@(bnU*U!f|-YD -bB5f0JD#Pz0itadhp+sEoC#7#LPKwDZE1A%Y!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkk -Z)t7=20~CnZ*pY?00DdlT>wB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 +2vSEvOmAmtV*?>@tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPA_P(yEWW%XwB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 wjY>38tto&d&=eG4cRAF#( Wpq+$XJ~Xna$#;`Xh%-ZT+rxDK6vW;JU&?LxLM72H?wDC1Zo}=N}D)4mkLjCa%FT-a&K>D2SRCdV{d70 @@ -23,12 +23,12 @@ _r(NHa7knZ00=~4V^DH$Z)OAn0S0toaB^jI00jX8A#kgq^`I&ZzC?)!&R01Y?(H9FO$CR6P1%k7c67A- 54IneKN{_;j(f`H9IfkFzO$PG=uAF%>iaxCSnRl2&38AmXJiCw9urENI6IdKM{I9mVQf!wWCj8SZ*Wg?WC5$Mo0RIYfa$#@6CZU6=Z2X|?7Ze??G0gvlp0sK<6W+n*cBpJ9-*worFk3Ek7Mz>CQ0ZEXBf&z4T0(&AHD^@(bnU*U! -f|-YDbB5f0JD#Pz0itadhp+sEoHSAot`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zc -aA{-$dm@6CZU6=Z2X|?7Ze??G0gvlp0sK<6W+n*cBpJ9-*worFk3Ek7Mz>CQ0ZEXBf&z4T0{OU)KVR7F7IK9p +M&V=)mZyV?CnmJ6;RKq!;mnYe$~00Bt`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zc +aA{-$`M8fiU)byxa)l*E;baY#r-OMg?00jX7T-**L6)$-r+lRyXoI{GIo*U3CNI7Emc=xo*$N+#60SRDb5bYX39002k -----END STRICT TYPE LIB----- diff --git a/stl/RGBLogic@0.1.0.stl b/stl/RGBLogic@0.1.0.stl index d4f9e160430c8ff1193126a852fb22eeaca4717e..3a9ba6aeefc1e18784cb84de3871f357d8f91810 100644 GIT binary patch delta 175 zcmeC@?&qFhI5Ap7>*tPs`}iAg#EM!~-5#d!PFvpGrLMMR-9wgHdmo;eF!>Z`kh_y} oer|4N$;ReQ%nF2*Pwrt-m|V)jPgvm+mMMf4?PgM(T*)d10Fh8sc>n+a delta 175 zcmeC@?&qFhs8y{bqa9|mXXZ3*i>8_FnZ<2)>a6E2-OIQrSFC;gpO!hCLGDh@`MJ57 nB@+!bHa2f!Rv@Hfau1Wj(ud7V%2A diff --git a/stl/RGBLogic@0.1.0.sty b/stl/RGBLogic@0.1.0.sty index a0fbdba7..881d400e 100644 --- a/stl/RGBLogic@0.1.0.sty +++ b/stl/RGBLogic@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:kVw2frMA-bnDO3Kj-QWS0pvy-Gak5E$$-U5QFgS7-vzikLJ4#cupid-felix-husband + Id: stl:p0BiRWGC-gBDpjuB-$tqrAMO-hkin3Mv-NYUjn9j-!4n9p7o#miguel-motor-victor Name: RGBLogic Version: 0.1.0 Description: Consensus logic layer for RGB smart contracts @@ -18,11 +18,6 @@ import BPCore#symbol-tropic-grand use TapretRightBranch#miracle-patriot-touch use OpretProof#good-village-flex -import RGBCommit#culture-pamela-ballad - use TransitionType#picture-reflex-brigade - use Layer1#camilla-basket-justin - use OpId#picnic-single-gloria - import Bitcoin#signal-color-cipher use ScriptBytes#equator-cockpit-gong use TapNodeHash#paprika-amanda-hunter @@ -31,6 +26,11 @@ import Bitcoin#signal-color-cipher use LeafVer#benefit-carbon-africa use XOnlyPk#clever-swim-carpet +import RGBCommit#tennis-nirvana-asia + use TransitionType#picture-reflex-brigade + use Layer1#camilla-basket-justin + use OpId#picnic-single-gloria + @mnemonic(needle-change-forest) data DbcProof : tapret#1 BPCore.TapretProof diff --git a/stl/Transition.vesper b/stl/Transition.vesper index 2b16aa95..8983099d 100644 --- a/stl/Transition.vesper +++ b/stl/Transition.vesper @@ -52,7 +52,7 @@ Transition rec assignments map len=0..MAX8 aka=AssignmentsBlindSealTxPtr key is U16 aka=AssignmentType value union TypedAssignsBlindSealTxPtr - declarative list len=0..MAX16 wrapped tag=0 + declarative list len=1..MAX16 wrapped aka=AssignVecAssignVoidStateBlindSealTxPtr tag=0 AssignVoidStateBlindSealTxPtr union revealed rec tag=0 seal rec BlindSealTxPtr @@ -67,7 +67,7 @@ Transition rec seal bytes len=32 aka=SecretSeal state is Unit aka=VoidState lock bytes len=2 aka=ReservedBytes2 - fungible list len=0..MAX16 wrapped tag=1 + fungible list len=1..MAX16 wrapped aka=AssignVecAssignRevealedValueBlindSealTxPtr tag=1 AssignRevealedValueBlindSealTxPtr union revealed rec tag=0 seal rec BlindSealTxPtr @@ -86,7 +86,7 @@ Transition rec value union FungibleState bits64 is U64 wrapped tag=0 lock bytes len=2 aka=ReservedBytes2 - structured list len=0..MAX16 wrapped tag=2 + structured list len=1..MAX16 wrapped aka=AssignVecAssignRevealedDataBlindSealTxPtr tag=2 AssignRevealedDataBlindSealTxPtr union revealed rec tag=0 seal rec BlindSealTxPtr @@ -105,7 +105,7 @@ Transition rec value bytes len=0..MAX16 aka=DataState salt is U128 lock bytes len=2 aka=ReservedBytes2 - attachment list len=0..MAX16 wrapped tag=3 + attachment list len=1..MAX16 wrapped aka=AssignVecAssignRevealedAttachBlindSealTxPtr tag=3 AssignRevealedAttachBlindSealTxPtr union revealed rec tag=0 seal rec BlindSealTxPtr From 5e366e259bfd6fb7a4cf762c54ac1e53aecab016 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Mon, 24 Mar 2025 17:07:12 +0100 Subject: [PATCH 40/70] chore: remove commented code --- src/operation/seal.rs | 12 ------------ src/vm/op_contract.rs | 37 ------------------------------------- 2 files changed, 49 deletions(-) diff --git a/src/operation/seal.rs b/src/operation/seal.rs index 7b39baba..94dab24e 100644 --- a/src/operation/seal.rs +++ b/src/operation/seal.rs @@ -64,18 +64,6 @@ impl ExposedSeal for GraphSeal {} impl ExposedSeal for GenesisSeal {} -/* -#[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", transparent) -)] -pub struct SealPreimage(Bytes32); - */ - #[cfg(test)] mod test { use amplify::hex::FromHex; diff --git a/src/vm/op_contract.rs b/src/vm/op_contract.rs index 930a312d..1299ce7c 100644 --- a/src/vm/op_contract.rs +++ b/src/vm/op_contract.rs @@ -624,40 +624,3 @@ impl Bytecode for ContractOp { }) } } - -// TODO: Re-enable once we will have a test ContractState object -/* -#[cfg(test)] -mod test { - use aluvm::isa::Instr; - use aluvm::library::Lib; - use amplify::hex::ToHex; - use strict_encoding::StrictSerialize; - - use super::*; - use crate::vm::RgbIsa; - - #[test] - fn encoding() { - let code = - [Instr::ExtensionCodes(RgbIsa::Contract(ContractOp::Svs(AssignmentType::from(4000))))]; - let alu_lib = Lib::assemble(&code).unwrap(); - eprintln!("{alu_lib}"); - let alu_id = alu_lib.id(); - - assert_eq!( - alu_id.to_string(), - "alu:zI4PtPCR-Eut023!-Hqblf3X-N2J4GZb-TR2ZEsI-vQfhKOU#ruby-sherman-tonight" - ); - assert_eq!(alu_lib.code.as_ref().to_hex(), "d0a00f"); - assert_eq!( - alu_lib - .to_strict_serialized::<{ usize::MAX }>() - .unwrap() - .to_hex(), - "0303414c55084250444947455354035247420300d0a00f000000" - ); - assert_eq!(alu_lib.disassemble::>>().unwrap(), code); - } -} -*/ From 60237a7be96d3f9f338e7648989c1c3ade6812bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Sat, 22 Mar 2025 14:13:05 +0100 Subject: [PATCH 41/70] vm: change evolve_state error --- src/vm/contract.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/vm/contract.rs b/src/vm/contract.rs index 43374d3b..219a404d 100644 --- a/src/vm/contract.rs +++ b/src/vm/contract.rs @@ -27,7 +27,6 @@ use std::fmt::{self, Debug, Display, Formatter}; use std::num::NonZeroU32; use std::rc::Rc; -use amplify::confinement; use amplify::num::u24; use bp::{BlockHeight, Outpoint, Txid}; use chrono::{MappedLocalTime, TimeZone, Utc}; @@ -540,10 +539,9 @@ pub trait ContractStateAccess: Debug { pub trait ContractStateEvolve { type Context<'ctx>; + type Error: std::error::Error; fn init(context: Self::Context<'_>) -> Self; - // TODO: distinguish contract validation failure errors from connectivity - // errors. Allow custom error types here. - fn evolve_state(&mut self, op: OrdOpRef) -> Result<(), confinement::Error>; + fn evolve_state(&mut self, op: OrdOpRef) -> Result<(), Self::Error>; } pub struct VmContext<'op, S: ContractStateAccess> { From 41a425b3c02a3a14c25cfa9f05b7fa5ef799b50d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Sat, 22 Mar 2025 14:28:31 +0100 Subject: [PATCH 42/70] operation: use NonEmptyOrdSet for Inputs --- src/operation/operations.rs | 21 +++++++-------------- src/stl.rs | 4 ++-- src/validation/consignment.rs | 9 +-------- src/vm/contract.rs | 12 ++---------- stl/AnchoredBundle.vesper | 2 +- stl/RGBCommit@0.1.0.sta | 10 +++++----- stl/RGBCommit@0.1.0.stl | Bin 12106 -> 12106 bytes stl/RGBCommit@0.1.0.sty | 6 +++--- stl/RGBLogic@0.1.0.sta | 24 ++++++++++++------------ stl/RGBLogic@0.1.0.stl | Bin 1423 -> 1423 bytes stl/RGBLogic@0.1.0.sty | 12 ++++++------ stl/Transition.vesper | 2 +- 12 files changed, 40 insertions(+), 62 deletions(-) diff --git a/src/operation/operations.rs b/src/operation/operations.rs index 29101d1a..63e15094 100644 --- a/src/operation/operations.rs +++ b/src/operation/operations.rs @@ -26,7 +26,7 @@ use std::iter; use std::num::ParseIntError; use std::str::FromStr; -use amplify::confinement::{Confined, SmallOrdSet, TinyOrdSet}; +use amplify::confinement::{Confined, NonEmptyOrdSet, TinyOrdSet, U16}; use amplify::{hex, Wrapper}; use commit_verify::{ CommitEncode, CommitEngine, CommitId, Conceal, MerkleHash, MerkleLeaves, ReservedBytes, @@ -95,18 +95,17 @@ impl FromStr for Opout { } } -#[derive(Wrapper, WrapperMut, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Default, From)] +#[derive(Wrapper, WrapperMut, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From)] #[wrapper(Deref)] #[wrapper_mut(DerefMut)] -#[derive(StrictType, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_COMMIT, dumb = Self(NonEmptyOrdSet::with(Input::strict_dumb())))] #[cfg_attr( feature = "serde", derive(Serialize, Deserialize), serde(crate = "serde_crate", transparent) )] -// TODO: Consider requiring minimum number of inputs to be 1 -pub struct Inputs(SmallOrdSet); +pub struct Inputs(NonEmptyOrdSet); impl<'a> IntoIterator for &'a Inputs { type Item = Input; @@ -188,9 +187,6 @@ pub trait Operation { fn assignments_by_type(&self, t: AssignmentType) -> Option>; - /// For genesis always returns an empty list. - fn inputs(&self) -> Inputs; - /// Provides summary about parts of the operation which are revealed. fn disclose(&self) -> OpDisclose { fn proc_seals( @@ -374,6 +370,8 @@ impl Transition { /// [`Inputs`] wrapper structure which this operation updates with /// state transition ("parent owned rights"). pub fn prev_state(&self) -> &Inputs { &self.inputs } + + pub fn inputs(&self) -> Inputs { self.inputs.clone() } } impl Operation for Genesis { @@ -410,9 +408,6 @@ impl Operation for Genesis { .get(&t) .map(TypedAssigns::transmutate_seals) } - - #[inline] - fn inputs(&self) -> Inputs { empty!() } } impl Operation for Transition { @@ -447,8 +442,6 @@ impl Operation for Transition { fn assignments_by_type(&self, t: AssignmentType) -> Option> { self.assignments.get(&t).cloned() } - - fn inputs(&self) -> Inputs { self.inputs.clone() } } #[cfg(test)] diff --git a/src/stl.rs b/src/stl.rs index c9aba6ab..f4e1a2b2 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -37,10 +37,10 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_COMMIT: &str = - "stl:!biPP1$Y-7BZyhSV-G4WQNlq-eDiicmt-K7hBJq9-4cyQk8o#tennis-nirvana-asia"; + "stl:WKkN3tFN-zijlQzg-i7tPNQI-dIkgj2j-urx56ZP-k2fGksY#visible-salt-vodka"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:p0BiRWGC-gBDpjuB-$tqrAMO-hkin3Mv-NYUjn9j-!4n9p7o#miguel-motor-victor"; + "stl:u!FtHasp-Dg!2Pkq-cOUiP1d-Db7N0Z3-bHyAZ8u-aLBWSM4#canvas-heart-company"; fn _rgb_commit_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_COMMIT), tiny_bset! { diff --git a/src/validation/consignment.rs b/src/validation/consignment.rs index 07e817cc..7f4a543b 100644 --- a/src/validation/consignment.rs +++ b/src/validation/consignment.rs @@ -30,7 +30,7 @@ use strict_types::TypeSystem; use super::EAnchor; use crate::{ - AssignmentType, AssignmentsRef, BundleId, ContractId, Genesis, GlobalState, GraphSeal, Inputs, + AssignmentType, AssignmentsRef, BundleId, ContractId, Genesis, GlobalState, GraphSeal, Metadata, OpFullType, OpId, OpType, Operation, Schema, Transition, TransitionBundle, TransitionType, TypedAssigns, }; @@ -117,13 +117,6 @@ impl<'op> Operation for OpRef<'op> { Self::Transition(op) => op.assignments_by_type(t), } } - - fn inputs(&self) -> Inputs { - match self { - Self::Genesis(op) => op.inputs(), - Self::Transition(op) => op.inputs(), - } - } } pub struct CheckedConsignment<'consignment, C: ConsignmentApi>(&'consignment C); diff --git a/src/vm/contract.rs b/src/vm/contract.rs index 219a404d..dd471d1c 100644 --- a/src/vm/contract.rs +++ b/src/vm/contract.rs @@ -34,9 +34,8 @@ use strict_encoding::{StrictDecode, StrictDumb, StrictEncode}; use crate::{ AssignmentType, Assignments, AssignmentsRef, AttachState, BundleId, ContractId, DataState, - FungibleState, Genesis, GlobalState, GlobalStateType, GraphSeal, Inputs, Layer1, Metadata, - OpFullType, OpId, OpType, Operation, Transition, TransitionType, TypedAssigns, - LIB_NAME_RGB_LOGIC, + FungibleState, Genesis, GlobalState, GlobalStateType, GraphSeal, Layer1, Metadata, OpFullType, + OpId, OpType, Operation, Transition, TransitionType, TypedAssigns, LIB_NAME_RGB_LOGIC, }; /// The type is used during validation and computing a contract state. It @@ -156,13 +155,6 @@ impl<'op> Operation for OrdOpRef<'op> { OrdOpRef::Transition(op, ..) => op.assignments_by_type(t), } } - - fn inputs(&self) -> Inputs { - match self { - OrdOpRef::Genesis(op) => op.inputs(), - OrdOpRef::Transition(op, ..) => op.inputs(), - } - } } #[derive(Getters, Copy, Clone, PartialEq, Eq, Hash, Debug)] diff --git a/stl/AnchoredBundle.vesper b/stl/AnchoredBundle.vesper index 4b7afcce..c821d782 100644 --- a/stl/AnchoredBundle.vesper +++ b/stl/AnchoredBundle.vesper @@ -37,7 +37,7 @@ TransitionBundle rec key is U16 aka=GlobalStateType value list len=1..MAX16 aka=GlobalValues element bytes len=0..MAX16 aka=DataState - inputs set len=0..MAX16 aka=Inputs + inputs set len=1..MAX16 aka=Inputs Input rec prevOut rec Opout op bytes len=32 aka=OpId diff --git a/stl/RGBCommit@0.1.0.sta b/stl/RGBCommit@0.1.0.sta index e06df20d..e2af35b5 100644 --- a/stl/RGBCommit@0.1.0.sta +++ b/stl/RGBCommit@0.1.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:!biPP1$Y-7BZyhSV-G4WQNlq-eDiicmt-K7hBJq9-4cyQk8o#tennis-nirvana-asia +Id: stl:WKkN3tFN-zijlQzg-i7tPNQI-dIkgj2j-urx56ZP-k2fGksY#visible-salt-vodka Name: RGBCommit Dependencies: BPCore#symbol-tropic-grand, @@ -8,7 +8,7 @@ Dependencies: CommitVerify#miller-pancake-elastic, Std#ralph-blue-lucky, Bitcoin#signal-color-cipher -Check-SHA256: 2e9d0f75d3fc5f249bd7d1ceb77db6dbe714a05d759966a793eaa03a1979d51f +Check-SHA256: 5195513070bff3d6ebf15bb68a089795d43efc976fba4fadb0aeca99bb07d668 2~tNwLvL+uX>Wj 015*2Y!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>jbO<32;hs$B9ZCsU(1!DsC|W1LOd&b_IRG-(&Q $wPGj2?3SJ=6W7=VqesjRYGc!>wZFzp>JB4@xD;^wu&SY_r(AJ000000096000000000310000000960 -00000000I_Zg6#Ua|Hna2?5oOUkD7Ff~JZGMgrhZ&rP2gYrktY!x$bpv=qCl=HdVV000000096000000 +00000000I_Zg6#Ua|Hna2?5oOUkD7Ff~JZGMgrhZ&rP2gYrktY!x$bpv=qCl=HdYW000000096000000 000S1Wn^h#RC#b^0|5hJZh8L;O=WapL}hegX>4-_0tItrZAoMTMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uM rbA>C`}q*rYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj1a4t%WdcR&qhH(h;v2Uql0Ev@(iYu* 3baG*1bV+0Zp9m~TI>-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b1#WL{V`TsU 2o7{|VQzD2bZKvHRC#b^0W?w%t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXb5d(bYWy+bYTJYdQCW4 e)%xftOSp9TD)g5B;KO;Krzd=y+`rt_<1!4XKZg`VQg~&-XoD~rmTY45rxNKIl#GTd$5`Bk}o71wcZw0 -Vevn_25D|^b#!w9siJyUlgOLOB};96cGdSG6&iv=7PD~jruGj4o;;a=3t@9}X=iS2Wo~qH0n&lodx<5) +Vevn_25D|^b#!w9j2xe;NeyDXwS^Z_Df2{NkMHtYL>&XXK#C7DbFV3x3t@9}X=iS2Wo~qH0n&lodx<5) d1V&ObY9cwnuf23b*|D#v%Ca#oZ(}P7zuV^Y-wa+bZ>G3dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThHuhfW|3TYrJJ8wZFzp>JB4@xD;^wu&SY_r(E|)sHNeqeX|#OPYZt!GMdiWgDIdUFv&e%#uFDO{V_= +=6W7=VqesjRYGc!>wZFzp>JB4@xD;^wu&SY_r(EfUh|Q$qbPaaw)|dR-&<7$AoMB$0Rh-t2IyK`k-KUE 0000000030{{R300000HRB~Z%b7^#GZ*D|obYW?1a|QwsbaG*Cb7^#GZ*Eg#Xk~3-0jz(i9yuZQ_f<_~ 3)9CPP+$;5D=2dnwEKV#qFOR4as+N+ZDj&Q>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1 V6JV*{3!yZ{M3XW@z+pV!gG67g8znL|~8a@>)b41H3?r4>NPG wDVeh@DKh~eYF_h^v7;z?-nRT+Uf)|)1t9b)0RaKnTn6Y`T#>tKvwtef1ho?-^#A|> delta 90 zcmV-g0Hy!RUdmpuvL68ev$G#r2_UJWdRLRko603iZGCpt_aPM;f ^ 1.. {OpId}} -@mnemonic(sector-charlie-diagram) -data Inputs : {Input} +@mnemonic(taboo-lazarus-sushi) +data Inputs : {Input ^ 1..} @mnemonic(isabel-heaven-north) data MediaType : any#255 | (|) diff --git a/stl/RGBLogic@0.1.0.sta b/stl/RGBLogic@0.1.0.sta index 5398624a..51f412ff 100644 --- a/stl/RGBLogic@0.1.0.sta +++ b/stl/RGBLogic@0.1.0.sta @@ -1,15 +1,15 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:p0BiRWGC-gBDpjuB-$tqrAMO-hkin3Mv-NYUjn9j-!4n9p7o#miguel-motor-victor +Id: stl:u!FtHasp-Dg!2Pkq-cOUiP1d-Db7N0Z3-bHyAZ8u-aLBWSM4#canvas-heart-company Name: RGBLogic Dependencies: BPCore#symbol-tropic-grand, - Bitcoin#signal-color-cipher, - RGBCommit#tennis-nirvana-asia -Check-SHA256: 099d8d860c90b6b18c738e6cc1845c724f8c544655c7c3989db6810467c7c75c + RGBCommit#visible-salt-vodka, + Bitcoin#signal-color-cipher +Check-SHA256: 4591bf77f92c6ce40ed2d2c6c4f046c633c7b0f5f372651411bed1604bdf8f55 -2vSEvOmAmtV*?>@tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPA_P(yEWW%XwB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 +2vSEvOmAmtV*?>@tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPA_P(yEWWmu^V-qB6YDCI*qBJR`8 +K!-?@2=ja}LTPkk +Z)t7=20~CnZ*pY?00DdlT>wB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 wjY>38tto&d&=eG4cRAF#( Wpq+$XJ~Xna$#;`Xh%-ZT+rxDK6vW;JU&?LxLM72H?wDC1Zo}=N}D)4mkLjCa%FT-a&K>D2SRCdV{d70 @@ -23,12 +23,12 @@ _r(NHa7knZ00=~4V^DH$Z)OAn0S0toaB^jI00jX8A#kgq^`I&ZzC?)!&R01Y?(H9FO$CR6P1%k7c67A- 54IneKN{_;j(f`H9IfkFzO$PG=uAF%>iaxCSnRl2&38AmXJiCw9urENI6IdKM{I9mVQf!wWCj8SZ*Wg?WC5$Mo0RIYfa$#@6CZU6=Z2X|?7Ze??G0gvlp0sK<6W+n*cBpJ9-*worFk3Ek7Mz>CQ0ZEXBf&z4T0{OU)KVR7F7IK9p -M&V=)mZyV?CnmJ6;RKq!;mnYe$~00Bt`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zc -aA{-$`M8fiU)byxa)l*E;baY#r-O@6CZU6=Z2X|?7Ze??G0gvlp0sK<6W+n*cBpJ9-*worFk3Ek7Mz>CQ0ZEXBf&z4T0$8aH-qB6YDCI*q +BJR`8K!-?@2=ZewKt00;zc +aA{-$Sg8%((M`@MMg?00jX7T-**L6)$-r+lRyXoI{GIo*U3CNI7Emc=xo*$N+#60SRDb5bYX39002k -----END STRICT TYPE LIB----- diff --git a/stl/RGBLogic@0.1.0.stl b/stl/RGBLogic@0.1.0.stl index 3a9ba6aeefc1e18784cb84de3871f357d8f91810..c2b6f521c6298fae74ac78831d8cca7356fb7077 100644 GIT binary patch delta 175 zcmeC@?&qFhs1>o2_ufU{a~e;bEtK9}KI_o#F^S__->Z+$m-$alKQ`$YXOO#-bAE1a oX30cDjg8Hlm=y@=nB2ppFu9b4pRmFuEK>+8+Rdamxsp{30DtmVlK=n! delta 175 zcmeC@?&qFhI5Ap7>*tPs`}iAg#EM!~-5#d!PFvpGrLMMR-9wgHdmo;eF!>Z`kh_y} oer|4N$;ReQ%nF2*Pwrt-m|V)jPgvm+mMMf4?PgM(T*)d10Fh8sc>n+a diff --git a/stl/RGBLogic@0.1.0.sty b/stl/RGBLogic@0.1.0.sty index 881d400e..16a93972 100644 --- a/stl/RGBLogic@0.1.0.sty +++ b/stl/RGBLogic@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:p0BiRWGC-gBDpjuB-$tqrAMO-hkin3Mv-NYUjn9j-!4n9p7o#miguel-motor-victor + Id: stl:u!FtHasp-Dg!2Pkq-cOUiP1d-Db7N0Z3-bHyAZ8u-aLBWSM4#canvas-heart-company Name: RGBLogic Version: 0.1.0 Description: Consensus logic layer for RGB smart contracts @@ -18,6 +18,11 @@ import BPCore#symbol-tropic-grand use TapretRightBranch#miracle-patriot-touch use OpretProof#good-village-flex +import RGBCommit#visible-salt-vodka + use TransitionType#picture-reflex-brigade + use Layer1#camilla-basket-justin + use OpId#picnic-single-gloria + import Bitcoin#signal-color-cipher use ScriptBytes#equator-cockpit-gong use TapNodeHash#paprika-amanda-hunter @@ -26,11 +31,6 @@ import Bitcoin#signal-color-cipher use LeafVer#benefit-carbon-africa use XOnlyPk#clever-swim-carpet -import RGBCommit#tennis-nirvana-asia - use TransitionType#picture-reflex-brigade - use Layer1#camilla-basket-justin - use OpId#picnic-single-gloria - @mnemonic(needle-change-forest) data DbcProof : tapret#1 BPCore.TapretProof diff --git a/stl/Transition.vesper b/stl/Transition.vesper index 8983099d..75b869a2 100644 --- a/stl/Transition.vesper +++ b/stl/Transition.vesper @@ -42,7 +42,7 @@ Transition rec key is U16 aka=GlobalStateType value list len=1..MAX16 aka=GlobalValues element bytes len=0..MAX16 aka=DataState - inputs set len=0..MAX16 aka=Inputs + inputs set len=1..MAX16 aka=Inputs Input rec prevOut rec Opout op bytes len=32 aka=OpId From bb837d720ee5c56183371dd11f987f24b632b71c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Wed, 2 Apr 2025 15:44:50 +0200 Subject: [PATCH 43/70] operation: add signature to Transition --- src/operation/mod.rs | 2 +- src/operation/operations.rs | 15 +++++++- src/stl.rs | 4 +-- stl/AnchoredBundle.vesper | 1 + stl/RGBCommit@0.1.0.sta | 67 ++++++++++++++++++------------------ stl/RGBCommit@0.1.0.stl | Bin 12106 -> 12189 bytes stl/RGBCommit@0.1.0.sty | 8 +++-- stl/RGBLogic@0.1.0.sta | 20 +++++------ stl/RGBLogic@0.1.0.stl | Bin 1423 -> 1423 bytes stl/RGBLogic@0.1.0.sty | 4 +-- stl/Transition.vesper | 1 + 11 files changed, 71 insertions(+), 51 deletions(-) diff --git a/src/operation/mod.rs b/src/operation/mod.rs index 7d479a7d..8aa3c2a6 100644 --- a/src/operation/mod.rs +++ b/src/operation/mod.rs @@ -49,7 +49,7 @@ pub use global::{GlobalState, GlobalValues}; pub use layer1::{ChainNet, Layer1}; pub use meta::{MetaValue, Metadata, MetadataError}; pub use operations::{ - Genesis, Identity, Input, Inputs, Operation, Opout, OpoutParseError, Transition, + Genesis, Identity, Input, Inputs, Operation, Opout, OpoutParseError, Signature, Transition, }; pub use seal::{ExposedSeal, GenesisSeal, GraphSeal, OutputSeal, SecretSeal, TxoSeal}; pub use state::{ExposedState, RevealedState, StateType}; diff --git a/src/operation/operations.rs b/src/operation/operations.rs index 63e15094..54ae9e56 100644 --- a/src/operation/operations.rs +++ b/src/operation/operations.rs @@ -27,7 +27,7 @@ use std::num::ParseIntError; use std::str::FromStr; use amplify::confinement::{Confined, NonEmptyOrdSet, TinyOrdSet, U16}; -use amplify::{hex, Wrapper}; +use amplify::{hex, Bytes64, Wrapper}; use commit_verify::{ CommitEncode, CommitEngine, CommitId, Conceal, MerkleHash, MerkleLeaves, ReservedBytes, StrictHash, @@ -299,6 +299,18 @@ pub struct Genesis { impl StrictSerialize for Genesis {} impl StrictDeserialize for Genesis {} +#[derive(Wrapper, WrapperMut, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From)] +#[wrapper(Deref)] +#[wrapper_mut(DerefMut)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_COMMIT)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", rename_all = "camelCase") +)] +pub struct Signature(Bytes64); + #[derive(Clone, PartialEq, Eq, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB_COMMIT)] @@ -318,6 +330,7 @@ pub struct Transition { pub assignments: Assignments, pub validator: ReservedBytes<1, 0>, pub witness: ReservedBytes<2, 0>, + pub signature: Option, } impl StrictSerialize for Transition {} diff --git a/src/stl.rs b/src/stl.rs index f4e1a2b2..1a8608f3 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -37,10 +37,10 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_COMMIT: &str = - "stl:WKkN3tFN-zijlQzg-i7tPNQI-dIkgj2j-urx56ZP-k2fGksY#visible-salt-vodka"; + "stl:zBxngQHW-1QPll66-1Mlwfe2-KaK0$jC-k6keyzn-6g8vMMs#media-norway-talent"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:u!FtHasp-Dg!2Pkq-cOUiP1d-Db7N0Z3-bHyAZ8u-aLBWSM4#canvas-heart-company"; + "stl:4r1e4Zge-R7BGePj-HvErZAg-kD4c5sB-Wv9QQD1-4aCroxM#postage-speed-vodka"; fn _rgb_commit_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_COMMIT), tiny_bset! { diff --git a/stl/AnchoredBundle.vesper b/stl/AnchoredBundle.vesper index c821d782..0f2c8b66 100644 --- a/stl/AnchoredBundle.vesper +++ b/stl/AnchoredBundle.vesper @@ -125,4 +125,5 @@ TransitionBundle rec lock bytes len=2 aka=ReservedBytes2 validator bytes len=1 aka=ReservedBytes1 witness bytes len=2 aka=ReservedBytes2 + some bytes len=64 option wrapped aka=Signature tag=1 diff --git a/stl/RGBCommit@0.1.0.sta b/stl/RGBCommit@0.1.0.sta index e2af35b5..104dab53 100644 --- a/stl/RGBCommit@0.1.0.sta +++ b/stl/RGBCommit@0.1.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:WKkN3tFN-zijlQzg-i7tPNQI-dIkgj2j-urx56ZP-k2fGksY#visible-salt-vodka +Id: stl:zBxngQHW-1QPll66-1Mlwfe2-KaK0$jC-k6keyzn-6g8vMMs#media-norway-talent Name: RGBCommit Dependencies: BPCore#symbol-tropic-grand, @@ -8,7 +8,7 @@ Dependencies: CommitVerify#miller-pancake-elastic, Std#ralph-blue-lucky, Bitcoin#signal-color-cipher -Check-SHA256: 5195513070bff3d6ebf15bb68a089795d43efc976fba4fadb0aeca99bb07d668 +Check-SHA256: 47fb89f9763dce93b32fc0ce2861a915039c1adbce7c065847ee221c44b3f6ef 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 -Q*>c;Wd#8M000 ++LHGLwE58<2vcKdWo=bairN1pxpD002Nh018xcVQzD2bZKvH1`7jbW_AJE +n^6;37FKqUhx?i3R+Mr!fY&(;2BFL(m@EZk_srD_V{dMBa$#e1Nn`<^2rNlD$O59e#ogQsB77jPl+h5j^*S;IZf|a5WdHyO4s>#1ZgXjLX>V>+d2nR`G*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj? +7Ns(12yJC_VPs)+VFC4eO*mP8`7qV21dnrCyk{{a-lF$FG0V5TNAc?Tc{K-TY;R&=Y;ytLBav&Stb*7P +g~wnyz`1FAu$k|YFC-ha-WFA1@jtuM?JbaMfW9G|L54Pw2ug%?sO^F&~e@A6ti9Rs{TiVrh$uPK=e +VRLh7XKrm}Zgg`2(t+H2i6z8&WfskJUeoBBhOdWpuF^=eyaaWe;bV*#33g#@X=Gt^Z*l^910COKearHw +cS=7M7YzYaI8*bvhMOc?)(rkC#nUE}_h5K%L=laq&yA1JoJ^{7>oKLkF4~iax8KK|47hp+cWHEPWpi@^ +dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThV>qb#7#AWd;HWX>M?JbWLG!0c>M^qyR=3m`FNB0@6CZgT(%0hP$+dLDIRU(}XWLTZugenOC;Z(5k~zEJnJiX;;E#Q`Mx-Kk4)-%knAfsyhG +fiQO+BF-bg$DT0oBAj^KornPd000000096000000000qGa$#@6CZbW5tVQFl01_BUta$#@6C +Zc}4uWo=;rtbeH@6CZc}4uWo=;w +1qf|rbYWy+bYTDq0d?d}_}|Wp0vpvv$c&#PW69R$ltr%da5t5w^x+8!q5uE@000000RI300000000(Dm +Z(?C=a{vkf)$WoGNrn+a000000RI300000000wDpaCLNZ015$z{^Dg=h-~N_zJ`Red1EINWrM}GXaQb}6c#qI +M2EQnHo-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4>GEG0000000000{{R30000003t@9}X=iS2Wo~qH +015$z{^Dg=h-~N_zJ`Red1EINWrM}GXaQb}6c#qIM2EQnHo-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF +4>GEG0000000000{{R300000033g#@X=Gt^Z*l+x0ssVVZ*FA(00035b8l^B00jX8VsJHoA?4$swuZp1 +Wc+9AOf`(TIbyKWjTy4WkGaM+ZSSEb;k|42*wg~2q@3^Lq|9zft}OB~jx>)hO74peesZgXjLX>V>+ +d2nR~0RR934pez?WkYXmZE19EWo~o?0sseRWo~72X>$Mt0RgfUS9=ZA!#U8<>mQlt-%vmngG5wrlpTxM +1cUX{y+;8GbaG*Cb7^#GZ*Bku0s)^0EJ-@Z0;0Ob-P{Wzd?2rs)M&&=&l*}G;Jw22Ix+z?QV*^ZmKt8Y +Df|&5KZQ>65I6*X)C9iYp+?yjr7~z5RC#b^WI=OtX=iS8LTqVnWK(5fY*ctqbaDg)01ISgV{Bn^VRUJB +WdH>M0j(jE&eecyOX`?BQh&gbPLP<**L?HpRHYibC-rPql*0M +HjK#s3So3~VPj}*Wo~o;1pxs!{u0;WURH6ly-z}2yOrz7huUv};JgEoq54(cnxzLBRC#b^WI=OtX=iS8 +LTqVnWK(5fY*ct@WCR2N3uI+uY+-U?bZK^F00jX7!XpXv`zZ|6?1s@b^p>{WmbP(Hj@ExZvrhwOvY8u3 +0SIPwZf9v?Y-Ioi0ReRpO4k)${LVH#dI6Toy*h>4ll;t>sGt=`DOG=AUSs5AF85kTK7`Q@;67z~POEUBGChMrG zZ}!nx$mqaX3{%Iz!o`qU9t68L=^6TzO@51~3oEIA>e&T90D3?__r+nb}JcAEPb1Lr4 L?buweb(#eLnl(Qe delta 79 zcmV-V0I>g^U&>yvodf|uvz`QeBMk~va$#@6CZUzdIE+r+iUnrpglRzqRAZlLo lk+GvFdEU1CUS8i@RRtjQDgglj*jxtaT3nI4YO~TR%LKvlAK?H1 diff --git a/stl/RGBCommit@0.1.0.sty b/stl/RGBCommit@0.1.0.sty index 54800400..acead0de 100644 --- a/stl/RGBCommit@0.1.0.sty +++ b/stl/RGBCommit@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:WKkN3tFN-zijlQzg-i7tPNQI-dIkgj2j-urx56ZP-k2fGksY#visible-salt-vodka + Id: stl:zBxngQHW-1QPll66-1Mlwfe2-KaK0$jC-k6keyzn-6g8vMMs#media-norway-talent Name: RGBCommit Version: 0.1.0 Description: Consensus commitment layer for RGB smart contracts @@ -294,7 +294,10 @@ data Schema : ffv Ffv @mnemonic(ramirez-patron-simon) data SchemaId : [Byte ^ 32] -@mnemonic(gizmo-plastic-hazard) +@mnemonic(ferrari-zebra-tempo) +data Signature : [Byte ^ 64] + +@mnemonic(extra-member-guide) data Transition : ffv Ffv , contractId ContractId , nonce U64 @@ -305,6 +308,7 @@ data Transition : ffv Ffv , assignments AssignmentsBlindSealTxPtr , validator CommitVerify.ReservedBytes1 , witness CommitVerify.ReservedBytes2 + , signature Signature? @mnemonic(rider-serpent-algebra) data TransitionBundle : inputMap InputMap, knownTransitions {OpId -> ^ 1.. Transition} diff --git a/stl/RGBLogic@0.1.0.sta b/stl/RGBLogic@0.1.0.sta index 51f412ff..8832e7a3 100644 --- a/stl/RGBLogic@0.1.0.sta +++ b/stl/RGBLogic@0.1.0.sta @@ -1,14 +1,14 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:u!FtHasp-Dg!2Pkq-cOUiP1d-Db7N0Z3-bHyAZ8u-aLBWSM4#canvas-heart-company +Id: stl:4r1e4Zge-R7BGePj-HvErZAg-kD4c5sB-Wv9QQD1-4aCroxM#postage-speed-vodka Name: RGBLogic Dependencies: BPCore#symbol-tropic-grand, - RGBCommit#visible-salt-vodka, + RGBCommit#media-norway-talent, Bitcoin#signal-color-cipher -Check-SHA256: 4591bf77f92c6ce40ed2d2c6c4f046c633c7b0f5f372651411bed1604bdf8f55 +Check-SHA256: 68307f6d798928fb76b489320492e0dde490af63d47a2b34a2f335d5da58c5f1 -2vSEvOmAmtV*?>@tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPA_P(yEWWmu^V-qB6YDCI*qBJR`8 -K!-?@2=ja}LTPkk +2vSEvOmAmtV*?>@tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPA_P(yEWWy~CBfdSUl1Lc>lwK7~E +dt#a^PvZ(sqJKk4%L!6PLPKwDZE1A%Y!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkk Z)t7=20~CnZ*pY?00DdlT>wB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 wjY>38tto&d&=eG4cRAF#( @@ -23,12 +23,12 @@ _r(NHa7knZ00=~4V^DH$Z)OAn0S0toaB^jI00jX8A#kgq^`I&ZzC?)!&R01Y?(H9FO$CR6P1%k7c67A- 54IneKN{_;j(f`H9IfkFzO$PG=uAF%>iaxCSnRl2&38AmXJiCw9urENI6IdKM{I9mVQf!wWCj8SZ*Wg?WC5$Mo0RIYfa$#@6CZU6=Z2X|?7Ze??G0gvlp0sK<6W+n*cBpJ9-*worFk3Ek7Mz>CQ0ZEXBf&z4T0$8aH-qB6YDCI*q -BJR`8K!-?@2=ZewKt00;zc -aA{-$Sg8%((M`@M@6CZU6=Z2X|?7Ze??G0gvlp0sK<6W+n*cBpJ9-*worFk3Ek7Mz>CQ0ZEXBf&z4T0?Zs|fdSUl1Lc>l +wK7~Edt#a^PvZ(sqJKk4%QR9Ct`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zc +aA{-$%p7Nd0oK(6<(ICtGF%^fVwx*Y;|flsdo1Vb4=*swmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`Zq Bog<<3Rh`#Ze??GPjX}g1ONqXX>Mg?00jX7T-**L6)$-r+lRyXoI{GIo*U3CNI7Emc=xo*$N+#60SRDb5bYX39002k -----END STRICT TYPE LIB----- diff --git a/stl/RGBLogic@0.1.0.stl b/stl/RGBLogic@0.1.0.stl index c2b6f521c6298fae74ac78831d8cca7356fb7077..aeec522fac88c9b89705a0fe8f8d3bede3796656 100644 GIT binary patch delta 162 zcmeC@?&qFhsBlImy^-Z+$m-$alKQ`&u#=s}c1Qkv0 aVN#e}%EC`r;S!c9gca>(Qk-1LDh2>iZc|bK diff --git a/stl/RGBLogic@0.1.0.sty b/stl/RGBLogic@0.1.0.sty index 16a93972..b0a747ac 100644 --- a/stl/RGBLogic@0.1.0.sty +++ b/stl/RGBLogic@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:u!FtHasp-Dg!2Pkq-cOUiP1d-Db7N0Z3-bHyAZ8u-aLBWSM4#canvas-heart-company + Id: stl:4r1e4Zge-R7BGePj-HvErZAg-kD4c5sB-Wv9QQD1-4aCroxM#postage-speed-vodka Name: RGBLogic Version: 0.1.0 Description: Consensus logic layer for RGB smart contracts @@ -18,7 +18,7 @@ import BPCore#symbol-tropic-grand use TapretRightBranch#miracle-patriot-touch use OpretProof#good-village-flex -import RGBCommit#visible-salt-vodka +import RGBCommit#media-norway-talent use TransitionType#picture-reflex-brigade use Layer1#camilla-basket-justin use OpId#picnic-single-gloria diff --git a/stl/Transition.vesper b/stl/Transition.vesper index 75b869a2..20c5b02a 100644 --- a/stl/Transition.vesper +++ b/stl/Transition.vesper @@ -130,4 +130,5 @@ Transition rec lock bytes len=2 aka=ReservedBytes2 validator bytes len=1 aka=ReservedBytes1 witness bytes len=2 aka=ReservedBytes2 + some bytes len=64 option wrapped aka=Signature tag=1 From 3a6d35461bfe789d56b3c4ca64e449b90cad8f3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Wed, 2 Apr 2025 15:45:43 +0200 Subject: [PATCH 44/70] vm: fix nth subtract with overflow --- src/vm/contract.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vm/contract.rs b/src/vm/contract.rs index dd471d1c..ec9538e5 100644 --- a/src/vm/contract.rs +++ b/src/vm/contract.rs @@ -468,7 +468,7 @@ impl GlobalContractState { /// recent global state value. Ensures that the global state ordering is /// consensus-based. pub fn nth(&mut self, depth: u24) -> Option + '_> { - if depth >= self.iter.size() { + if depth > self.iter.size() { return None; } if depth >= self.checked_depth { @@ -476,7 +476,7 @@ impl GlobalContractState { } else { self.iter.reset(self.checked_depth); let size = self.iter.size(); - let to = (depth - self.checked_depth).to_u32(); + let to = (self.checked_depth - depth).to_u32(); for inc in 0..to { if self.prev_checked().is_none() { panic!( From 06d8acc23774d040617b2d8115a1747447928b29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Wed, 2 Apr 2025 15:47:15 +0200 Subject: [PATCH 45/70] vm: add Vts operator --- src/vm/contract.rs | 20 ++++++-------- src/vm/macroasm.rs | 6 ++++ src/vm/op_contract.rs | 64 ++++++++++++++++++++++++++++++++++++++----- src/vm/opcodes.rs | 15 +++------- 4 files changed, 75 insertions(+), 30 deletions(-) diff --git a/src/vm/contract.rs b/src/vm/contract.rs index ec9538e5..1df8933d 100644 --- a/src/vm/contract.rs +++ b/src/vm/contract.rs @@ -544,24 +544,20 @@ pub struct VmContext<'op, S: ContractStateAccess> { pub struct OpInfo<'op> { pub id: OpId, - pub ty: OpFullType, - pub metadata: &'op Metadata, pub prev_state: &'op Assignments, - pub owned_state: AssignmentsRef<'op>, - pub global: &'op GlobalState, + pub op: &'op OrdOpRef<'op>, } impl<'op> OpInfo<'op> { pub fn with(id: OpId, op: &'op OrdOpRef<'op>, prev_state: &'op Assignments) -> Self { - OpInfo { - id, - ty: op.full_type(), - metadata: op.metadata(), - prev_state, - owned_state: op.assignments(), - global: op.globals(), - } + OpInfo { id, prev_state, op } } + + pub fn global(&self) -> &'op GlobalState { self.op.globals() } + + pub fn metadata(&self) -> &'op Metadata { self.op.metadata() } + + pub fn owned_state(&self) -> AssignmentsRef<'op> { self.op.assignments() } } #[cfg(test)] diff --git a/src/vm/macroasm.rs b/src/vm/macroasm.rs index 585c9592..d702e1ed 100644 --- a/src/vm/macroasm.rs +++ b/src/vm/macroasm.rs @@ -48,6 +48,9 @@ macro_rules! isa_instr { (cnc $t:ident,a16[$a_idx:literal]) => {{ RgbIsa::Contract(ContractOp::CnC($t, Reg32::from(u5::with($a_idx)))) }}; + (ldc $t:ident,a32[$a_idx:literal],s16[$s_idx:literal]) => {{ + RgbIsa::Contract(ContractOp::LdC($t, Reg16::from(u4::with($a_idx)), RegS::from($s_idx))) + }}; (ldm $t:ident,s16[$s_idx:literal]) => {{ RgbIsa::Contract(ContractOp::LdM($t, RegS::from($s_idx))) }}; @@ -60,6 +63,9 @@ macro_rules! isa_instr { (lds $t:ident,a16[$a_idx:literal],s16[$s_idx:literal]) => {{ RgbIsa::Contract(ContractOp::LdS($t, Reg16::from(u4::with($a_idx)), RegS::from($s_idx))) }}; + (vts s16[$s_idx:literal]) => {{ + RgbIsa::Contract(ContractOp::Vts(RegS::from($s_idx))) + }}; ($op:ident $($tt:tt)+) => {{ compile_error!(concat!("unknown RGB assembly opcode `", stringify!($op), "`")) }}; diff --git a/src/vm/op_contract.rs b/src/vm/op_contract.rs index 1299ce7c..d26a33f4 100644 --- a/src/vm/op_contract.rs +++ b/src/vm/op_contract.rs @@ -33,9 +33,11 @@ use aluvm::library::{CodeEofError, IsaSeg, LibSite, Read, Write}; use aluvm::reg::{CoreRegs, Reg, Reg16, Reg32, RegA, RegS}; use amplify::num::{u24, u3, u4}; use amplify::Wrapper; +use secp256k1::{ecdsa, Message, PublicKey}; use super::opcodes::*; use super::{ContractStateAccess, VmContext}; +use crate::vm::OrdOpRef; use crate::{Assign, AssignmentType, GlobalStateType, MetaType, TypedAssigns}; #[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display)] @@ -170,6 +172,14 @@ pub enum ContractOp { #[display("sps {0}")] Sps(/** owned state type */ AssignmentType), + /// Verifies the signature of a transition against the pubkey in the first argument. + /// + /// If the register doesn't contain a valid public key or the operation + /// signature is missing or invalid, sets `st0` to fail state and terminates + /// the program. + #[display("vts {0}")] + Vts(RegS), + /// All other future unsupported operations, which must set `st0` to /// `false` and stop the execution. #[display("fail {0}")] @@ -196,6 +206,9 @@ impl InstructionSet for ContractOp { | ContractOp::LdM(_, _) => bset![], ContractOp::Svs(_) => bset![], ContractOp::Sas(_) | ContractOp::Sps(_) => bset![Reg::A(RegA::A64, Reg32::Reg0)], + + ContractOp::Vts(_) => bset![], + ContractOp::Fail(_, _) => bset![], } } @@ -221,6 +234,7 @@ impl InstructionSet for ContractOp { ContractOp::Svs(_) | ContractOp::Sas(_) | ContractOp::Sps(_) => { bset![] } + ContractOp::Vts(reg) => bset![Reg::S(*reg)], ContractOp::Fail(_, _) => bset![], } } @@ -238,6 +252,7 @@ impl InstructionSet for ContractOp { | ContractOp::LdC(_, _, _) => 8, ContractOp::LdM(_, _) => 6, ContractOp::Svs(_) | ContractOp::Sas(_) | ContractOp::Sps(_) => 20, + ContractOp::Vts(_) => 512, ContractOp::Fail(_, _) => u64::MAX, } } @@ -268,7 +283,7 @@ impl InstructionSet for ContractOp { } macro_rules! load_revealed_outputs { ($state_type:ident) => {{ - let Some(new_state) = context.op_info.owned_state.get(*$state_type) else { + let Some(new_state) = context.op_info.owned_state().get(*$state_type) else { fail!() }; match new_state { @@ -302,7 +317,7 @@ impl InstructionSet for ContractOp { *reg, context .op_info - .owned_state + .owned_state() .get(*state_type) .map(|a| a.len_u16()), ); @@ -311,7 +326,11 @@ impl InstructionSet for ContractOp { regs.set_n( RegA::A8, *reg, - context.op_info.global.get(state_type).map(|a| a.len_u16()), + context + .op_info + .global() + .get(state_type) + .map(|a| a.len_u16()), ); } ContractOp::CnC(state_type, reg) => { @@ -347,7 +366,7 @@ impl InstructionSet for ContractOp { let Some(Ok(state)) = context .op_info - .owned_state + .owned_state() .get(*state_type) .map(|a| a.into_structured_state_at(index)) else { @@ -364,7 +383,7 @@ impl InstructionSet for ContractOp { let Some(Ok(state)) = context .op_info - .owned_state + .owned_state() .get(*state_type) .map(|a| a.into_fungible_state_at(index)) else { @@ -380,7 +399,7 @@ impl InstructionSet for ContractOp { let Some(state) = context .op_info - .global + .global() .get(state_type) .and_then(|a| a.get(index as usize)) else { @@ -407,7 +426,7 @@ impl InstructionSet for ContractOp { regs.set_s16(*reg_s, state.borrow().as_inner()); } ContractOp::LdM(type_id, reg) => { - let Some(meta) = context.op_info.metadata.get(type_id) else { + let Some(meta) = context.op_info.metadata().get(type_id) else { fail!() }; regs.set_s16(*reg, meta.to_inner()); @@ -463,6 +482,31 @@ impl InstructionSet for ContractOp { fail!() } } + ContractOp::Vts(reg_s) => match context.op_info.op { + OrdOpRef::Genesis(_) => fail!(), + OrdOpRef::Transition(transition, _, _, _) => { + let Some(pubkey) = regs.s16(*reg_s) else { + fail!() + }; + let Ok(pubkey) = PublicKey::from_slice(&pubkey.to_vec()) else { + fail!() + }; + let Some(ref witness) = transition.signature else { + fail!() + }; + let sig_bytes = witness.clone().into_inner().into_inner(); + let Ok(sig) = ecdsa::Signature::from_compact(&sig_bytes) else { + fail!() + }; + + let transition_id = context.op_info.id.into_inner().into_inner(); + let msg = Message::from_digest(transition_id); + + if sig.verify(&msg, &pubkey).is_err() { + fail!() + } + } + }, // All other future unsupported operations, which must set `st0` to `false`. _ => fail!(), } @@ -491,6 +535,8 @@ impl Bytecode for ContractOp { ContractOp::Sas(_) => INSTR_SAS, ContractOp::Sps(_) => INSTR_SPS, + ContractOp::Vts(_) => INSTR_VTS, + ContractOp::Fail(other, _) => *other, } } @@ -553,6 +599,8 @@ impl Bytecode for ContractOp { ContractOp::Sas(owned_type) => writer.write_u16(*owned_type)?, ContractOp::Sps(owned_type) => writer.write_u16(*owned_type)?, + ContractOp::Vts(reg_s) => writer.write_u4(*reg_s)?, + ContractOp::Fail(_, _) => {} } Ok(()) @@ -620,6 +668,8 @@ impl Bytecode for ContractOp { INSTR_SAS => Self::Sas(reader.read_u16()?.into()), INSTR_SPS => Self::Sps(reader.read_u16()?.into()), + INSTR_VTS => Self::Vts(reader.read_u4()?.into()), + x => Self::Fail(x, PhantomData), }) } diff --git a/src/vm/opcodes.rs b/src/vm/opcodes.rs index e14d370a..8b189a23 100644 --- a/src/vm/opcodes.rs +++ b/src/vm/opcodes.rs @@ -46,15 +46,8 @@ pub const INSTR_LDM: u8 = 0b11_001_010; pub const INSTR_SVS: u8 = 0b11_010_000; pub const INSTR_SAS: u8 = 0b11_010_001; pub const INSTR_SPS: u8 = 0b11_010_010; -// Reserved 0b11_010_011 -pub const INSTR_CONTRACT_FROM: u8 = 0b11_000_000; -pub const INSTR_CONTRACT_TO: u8 = 0b11_010_011; - -// TIMECHAIN: -pub const INSTR_TIMECHAIN_FROM: u8 = 0b11_011_100; -pub const INSTR_TIMECHAIN_TO: u8 = 0b11_011_111; +pub const INSTR_VTS: u8 = 0b11_010_011; +// Reserved 0b11_010_100 -// Reserved 0b11_011_100 -// Reserved 0b11_011_101 -// Reserved 0b11_011_110 -// Reserved 0b11_011_111 +pub const INSTR_CONTRACT_FROM: u8 = 0b11_000_000; +pub const INSTR_CONTRACT_TO: u8 = 0b11_010_100; From dac80b994329e057398151467547b9b2d2d90ee0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Wed, 2 Apr 2025 16:33:36 +0200 Subject: [PATCH 46/70] chore: bump MSRV to 1.81.0 --- .github/workflows/build.yml | 2 +- Cargo.lock | 317 ++++++++++++++++++++---------------- Cargo.toml | 6 +- MANIFEST.yml | 2 +- 4 files changed, 181 insertions(+), 146 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index db0669f1..07aeb3c3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -57,7 +57,7 @@ jobs: strategy: fail-fast: false matrix: - toolchain: [ nightly, beta, stable, 1.77.0 ] + toolchain: [ nightly, beta, stable, 1.81.0 ] steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@master diff --git a/Cargo.lock b/Cargo.lock index 9a6c570f..e6200df6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,8 @@ version = 3 [[package]] name = "aluvm" -version = "0.11.0-beta.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2a6767842958f458dc7010a2a1005db96dfaceadd366d07532c5045bbc81f24" +version = "0.11.0" +source = "git+https://github.com/zoedberg/rust-aluvm?branch=0.11.1-2#902d863c0969722aad07a3ec6288d0ff70697a1f" dependencies = [ "amplify", "ascii-armor", @@ -168,9 +167,9 @@ dependencies = [ [[package]] name = "bitcoin-io" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "340e09e8399c7bd8912f495af6aa58bea0c9214773417ffaa8f6460f93aaee56" +checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" [[package]] name = "bitcoin_hashes" @@ -184,15 +183,15 @@ dependencies = [ [[package]] name = "bitflags" -version = "2.6.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" [[package]] name = "blake3" -version = "1.5.4" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" +checksum = "34a796731680be7931955498a16a10b2270c7762963d5d570fdbfe02dcbf314f" dependencies = [ "arrayref", "arrayvec", @@ -213,7 +212,7 @@ dependencies = [ [[package]] name = "bp-consensus" version = "0.11.1-alpha.1" -source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#ac79e142ff4a9756c0e61bd5f3234b41d27fa110" +source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#2f0fd1f6c5cd81f748bacd8237993bdb7bdfe9d1" dependencies = [ "amplify", "chrono", @@ -227,7 +226,7 @@ dependencies = [ [[package]] name = "bp-core" version = "0.11.1-alpha.1" -source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#ac79e142ff4a9756c0e61bd5f3234b41d27fa110" +source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#2f0fd1f6c5cd81f748bacd8237993bdb7bdfe9d1" dependencies = [ "amplify", "bp-consensus", @@ -245,7 +244,7 @@ dependencies = [ [[package]] name = "bp-dbc" version = "0.11.1-alpha.1" -source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#ac79e142ff4a9756c0e61bd5f3234b41d27fa110" +source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#2f0fd1f6c5cd81f748bacd8237993bdb7bdfe9d1" dependencies = [ "amplify", "base85", @@ -259,7 +258,7 @@ dependencies = [ [[package]] name = "bp-seals" version = "0.11.1-alpha.1" -source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#ac79e142ff4a9756c0e61bd5f3234b41d27fa110" +source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#2f0fd1f6c5cd81f748bacd8237993bdb7bdfe9d1" dependencies = [ "amplify", "baid64", @@ -274,21 +273,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "cc" -version = "1.1.31" +version = "1.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" dependencies = [ "shlex", ] @@ -301,23 +294,22 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "wasm-bindgen", - "windows-targets", + "windows-link", ] [[package]] name = "commit_encoding_derive" version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc09678c15e9280cc6eaf29bf437a2cf18fadedd8bf78c369b8ac15fa217dbe5" +source = "git+https://github.com/zoedberg/client_side_validation?branch=0.11.1-2#c6bdd35814dc2d316bc5d1f0f1d13293ca2ec64e" dependencies = [ "amplify", "amplify_syn", @@ -329,8 +321,7 @@ dependencies = [ [[package]] name = "commit_verify" version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcf5f557e112c684f2458f20c66bab865c01cab56d6a318f64243cba9b163a7" +source = "git+https://github.com/zoedberg/client_side_validation?branch=0.11.1-2#c6bdd35814dc2d316bc5d1f0f1d13293ca2ec64e" dependencies = [ "amplify", "commit_encoding_derive", @@ -343,16 +334,6 @@ dependencies = [ "vesper-lang", ] -[[package]] -name = "console_error_panic_hook" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" -dependencies = [ - "cfg-if", - "wasm-bindgen", -] - [[package]] name = "constant_time_eq" version = "0.3.1" @@ -367,18 +348,18 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.14" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" [[package]] name = "crypto-common" @@ -402,9 +383,9 @@ dependencies = [ [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "generic-array" @@ -431,9 +412,9 @@ dependencies = [ [[package]] name = "half" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +checksum = "7db2ff139bba50379da6aa0766b52fdcb62cb5b263009b09ed58ba604e14bbd1" dependencies = [ "cfg-if", "crunchy", @@ -441,9 +422,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" [[package]] name = "heck" @@ -462,14 +443,15 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.61" +version = "0.1.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", "windows-core", ] @@ -485,9 +467,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" dependencies = [ "equivalent", "hashbrown", @@ -496,30 +478,31 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ + "once_cell", "wasm-bindgen", ] [[package]] name = "libc" -version = "0.2.161" +version = "0.2.171" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" [[package]] name = "log" -version = "0.4.22" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "memchr" @@ -535,9 +518,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "minicov" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "def6d99771d7c499c26ad4d40eb6645eafd3a1553b35fc26ea5a489a45e82d9a" +checksum = "f27fe9f1cc3c22e1687f9446c2083c4c5fc7f0bcf1c7a86bdbded14985895b4b" dependencies = [ "cc", "walkdir", @@ -560,9 +543,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.2" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "paste" @@ -572,27 +555,27 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ "zerocopy", ] [[package]] name = "proc-macro2" -version = "1.0.89" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.37" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] @@ -658,11 +641,17 @@ dependencies = [ "digest", ] +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "same-file" @@ -673,12 +662,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - [[package]] name = "secp256k1" version = "0.30.0" @@ -702,29 +685,29 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.214" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.214" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.100", ] [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", @@ -792,12 +775,11 @@ dependencies = [ [[package]] name = "strict_encoding" -version = "2.7.0" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d69b4893cf054e129d5288a565102124520d7b94eb9589d1e78202abc7e2092d" +checksum = "22e4b581b61221082818d58db91630aed6e4a3237afb775fc7e5e4e2eba50d5e" dependencies = [ "amplify", - "half", "serde", "strict_encoding_derive", "wasm-bindgen", @@ -805,9 +787,9 @@ dependencies = [ [[package]] name = "strict_encoding_derive" -version = "2.7.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d4f9b678862372f8e439bcaafc27df7610ea93b06d2deb6244dec0af4259ce6" +checksum = "34e3bc6e4a2450420b4dbfb6929d9ce005e8c36cf73bf215db99f0d09c9fa79f" dependencies = [ "amplify_syn", "heck", @@ -860,9 +842,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.85" +version = "2.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" dependencies = [ "proc-macro2", "quote", @@ -871,29 +853,29 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.65" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.65" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.100", ] [[package]] name = "toml" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" dependencies = [ "serde", "serde_spanned", @@ -912,9 +894,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.22" +version = "0.22.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ "indexmap", "serde", @@ -925,15 +907,15 @@ dependencies = [ [[package]] name = "typenum" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unsafe-libyaml" @@ -975,47 +957,48 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.100", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1023,33 +1006,34 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.100", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasm-bindgen-test" -version = "0.3.45" +version = "0.3.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d381749acb0943d357dcbd8f0b100640679883fcdeeef04def49daf8d33a5426" +checksum = "66c8d5e33ca3b6d9fa3b4676d774c5778031d27a578c2b007f905acf816152c3" dependencies = [ - "console_error_panic_hook", "js-sys", "minicov", - "scoped-tls", "wasm-bindgen", "wasm-bindgen-futures", "wasm-bindgen-test-macro", @@ -1057,20 +1041,20 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.45" +version = "0.3.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c97b2ef2c8d627381e51c071c2ab328eac606d3f69dd82bcbca20a9e389d95f0" +checksum = "17d5042cc5fa009658f9a7333ef24291b1291a25b6382dd68862a7f3b969f69b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.100", ] [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -1087,11 +1071,61 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.52.0" +version = "0.61.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" dependencies = [ - "windows-targets", + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-result" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +dependencies = [ + "windows-link", ] [[package]] @@ -1169,30 +1203,29 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.20" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36" dependencies = [ "memchr", ] [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" dependencies = [ - "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.100", ] diff --git a/Cargo.toml b/Cargo.toml index e2c5d62e..4f33d8a0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ categories = ["cryptography::cryptocurrencies"] readme = "README.md" license = "Apache-2.0" edition = "2021" -rust-version = "1.77.0" # Due to `rustfix` +rust-version = "1.81.0" exclude = [".github"] [lib] @@ -26,7 +26,7 @@ amplify = { version = "~4.7.0", features = ["rand"] } baid64 = "~0.2.2" strict_encoding = "~2.7.0" strict_types = { version = "~2.7.2", features = ["armor"] } -aluvm = { version = "~0.11.0-beta.9", features = ["std", "ascii-armor"] } +aluvm = { version = "~0.11.0", features = ["std", "ascii-armor"] } commit_verify = { version = "~0.11.0-beta.9", features = ["rand", "derive"] } single_use_seals = "~0.11.0-beta.9" bp-core = { version = "~0.11.1-alpha.1" } @@ -62,5 +62,7 @@ wasm-bindgen-test = "0.3" features = ["all"] [patch.crates-io] +aluvm = { git = "https://github.com/zoedberg/rust-aluvm", branch = "0.11.1-2" } +commit_verify = { git = "https://github.com/zoedberg/client_side_validation", branch = "0.11.1-2" } bp-consensus = { git = "https://github.com/zoedberg/bp-core", branch = "0.11.1-2" } bp-core = { git = "https://github.com/zoedberg/bp-core", branch = "0.11.1-2" } diff --git a/MANIFEST.yml b/MANIFEST.yml index 5d9baa92..62511887 100644 --- a/MANIFEST.yml +++ b/MANIFEST.yml @@ -3,7 +3,7 @@ Type: Library Kind: Free software License: Apache-2.0 Language: Rust -Compiler: 1.77 +Compiler: 1.81 Author: Maxim Orlovsky Maintained: LNP/BP Standards Association, Switzerland Maintainers: From ec336165ee35371b46fc4160f67131233acd31f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Fri, 28 Mar 2025 15:14:15 +0100 Subject: [PATCH 47/70] operation: remove attachment assignment --- src/operation/assignments.rs | 46 +---- src/operation/attachment.rs | 167 ------------------ src/operation/commit.rs | 11 +- src/operation/mod.rs | 5 +- src/operation/operations.rs | 8 +- src/operation/state.rs | 7 +- src/schema/mod.rs | 2 +- src/schema/state.rs | 27 --- src/stl.rs | 4 +- src/validation/logic.rs | 32 ---- src/validation/status.rs | 8 - src/vm/contract.rs | 12 +- stl/AnchoredBundle.vesper | 23 --- stl/RGBCommit@0.1.0.sta | 322 ++++++++++++++++------------------- stl/RGBCommit@0.1.0.stl | Bin 12189 -> 10804 bytes stl/RGBCommit@0.1.0.sty | 46 +---- stl/RGBLogic@0.1.0.sta | 20 +-- stl/RGBLogic@0.1.0.stl | Bin 1423 -> 1423 bytes stl/RGBLogic@0.1.0.sty | 4 +- stl/Schema.vesper | 1 - stl/Transition.vesper | 23 --- 21 files changed, 180 insertions(+), 588 deletions(-) delete mode 100644 src/operation/attachment.rs diff --git a/src/operation/assignments.rs b/src/operation/assignments.rs index 1cc58196..1b6a237e 100644 --- a/src/operation/assignments.rs +++ b/src/operation/assignments.rs @@ -32,8 +32,8 @@ use strict_encoding::{StrictDecode, StrictDumb, StrictEncode}; use super::ExposedState; use crate::operation::seal::GenesisSeal; use crate::{ - AssignmentType, ExposedSeal, GraphSeal, RevealedAttach, RevealedData, RevealedValue, - SecretSeal, StateType, VoidState, LIB_NAME_RGB_COMMIT, + AssignmentType, ExposedSeal, GraphSeal, RevealedData, RevealedValue, SecretSeal, StateType, + VoidState, LIB_NAME_RGB_COMMIT, }; #[derive(Wrapper, WrapperMut, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, From)] @@ -72,7 +72,6 @@ pub struct UnknownDataError; pub type AssignRights = Assign; pub type AssignFungible = Assign; pub type AssignData = Assign; -pub type AssignAttach = Assign; /// State data are assigned to a seal definition, which means that they are /// owned by a person controlling spending of the seal UTXO, unless the seal @@ -265,8 +264,6 @@ pub enum TypedAssigns { Fungible(AssignVec>), #[strict_type(tag = 0x02)] Structured(AssignVec>), - #[strict_type(tag = 0xFF)] - Attachment(AssignVec>), } impl Conceal for TypedAssigns { @@ -288,11 +285,6 @@ impl Conceal for TypedAssigns { let inner = NonEmptyVec::try_from_iter(concealed_iter).expect("same size"); TypedAssigns::Structured(AssignVec::with(inner)) } - TypedAssigns::Attachment(s) => { - let concealed_iter = s.iter().map(AssignAttach::::conceal); - let inner = NonEmptyVec::try_from_iter(concealed_iter).expect("same size"); - TypedAssigns::Attachment(AssignVec::with(inner)) - } } } } @@ -303,7 +295,6 @@ impl TypedAssigns { TypedAssigns::Declarative(set) => set.is_empty(), TypedAssigns::Fungible(set) => set.is_empty(), TypedAssigns::Structured(set) => set.is_empty(), - TypedAssigns::Attachment(set) => set.is_empty(), } } @@ -312,7 +303,6 @@ impl TypedAssigns { TypedAssigns::Declarative(set) => set.len_u16(), TypedAssigns::Fungible(set) => set.len_u16(), TypedAssigns::Structured(set) => set.len_u16(), - TypedAssigns::Attachment(set) => set.len_u16(), } } @@ -322,7 +312,6 @@ impl TypedAssigns { TypedAssigns::Declarative(_) => StateType::Void, TypedAssigns::Fungible(_) => StateType::Fungible, TypedAssigns::Structured(_) => StateType::Structured, - TypedAssigns::Attachment(_) => StateType::Attachment, } } @@ -335,9 +324,6 @@ impl TypedAssigns { #[inline] pub fn is_structured(&self) -> bool { matches!(self, TypedAssigns::Structured(_)) } - #[inline] - pub fn is_attachment(&self) -> bool { matches!(self, TypedAssigns::Attachment(_)) } - #[inline] pub fn as_declarative(&self) -> &[AssignRights] { match self { @@ -362,14 +348,6 @@ impl TypedAssigns { } } - #[inline] - pub fn as_attachment(&self) -> &[AssignAttach] { - match self { - TypedAssigns::Attachment(set) => set, - _ => Default::default(), - } - } - #[inline] pub fn as_declarative_mut(&mut self) -> Option<&mut NonEmptyVec, U16>> { match self { @@ -394,14 +372,6 @@ impl TypedAssigns { } } - #[inline] - pub fn as_attachment_mut(&mut self) -> Option<&mut NonEmptyVec, U16>> { - match self { - TypedAssigns::Attachment(set) => Some(set), - _ => None, - } - } - /// If seal definition does not exist, returns [`UnknownDataError`]. If the /// seal is confidential, returns `Ok(None)`; otherwise returns revealed /// seal data packed as `Ok(Some(`[`Seal`]`))` @@ -419,10 +389,6 @@ impl TypedAssigns { .get(index as usize) .ok_or(UnknownDataError)? .revealed_seal(), - TypedAssigns::Attachment(vec) => vec - .get(index as usize) - .ok_or(UnknownDataError)? - .revealed_seal(), }) } @@ -440,10 +406,6 @@ impl TypedAssigns { .iter() .map(AssignData::::to_confidential_seal) .collect(), - TypedAssigns::Attachment(s) => s - .iter() - .map(AssignAttach::::to_confidential_seal) - .collect(), } } @@ -507,10 +469,6 @@ impl TypedAssigns { Confined::try_from_iter(a.iter().map(|a| a.transmutate_seals())) .expect("same size"), )), - TypedAssigns::Attachment(a) => TypedAssigns::Attachment(AssignVec::with( - Confined::try_from_iter(a.iter().map(|a| a.transmutate_seals())) - .expect("same size"), - )), } } } diff --git a/src/operation/attachment.rs b/src/operation/attachment.rs deleted file mode 100644 index 2d53e1b7..00000000 --- a/src/operation/attachment.rs +++ /dev/null @@ -1,167 +0,0 @@ -// RGB Core Library: consensus layer for RGB smart contracts. -// -// SPDX-License-Identifier: Apache-2.0 -// -// Written in 2019-2024 by -// Dr Maxim Orlovsky -// -// Copyright (C) 2019-2024 LNP/BP Standards Association. All rights reserved. -// Copyright (C) 2019-2024 Dr Maxim Orlovsky. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use std::fmt; -use std::fmt::{Display, Formatter}; -use std::str::FromStr; - -use amplify::{ByteArray, Bytes32}; -use baid64::{Baid64ParseError, DisplayBaid64, FromBaid64Str}; -use bp::secp256k1::rand::{random, Rng, RngCore}; -use strict_encoding::{StrictEncode, StrictSerialize}; - -use super::ExposedState; -use crate::{impl_serde_baid64, MediaType, RevealedState, StateType, LIB_NAME_RGB_COMMIT}; - -/// Unique data attachment identifier -#[derive(Wrapper, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From)] -#[wrapper(Deref, BorrowSlice, Hex, Index, RangeOps)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT)] -pub struct AttachId( - #[from] - #[from([u8; 32])] - Bytes32, -); - -impl DisplayBaid64 for AttachId { - const HRI: &'static str = "rgb:fs"; - const CHUNKING: bool = true; - const PREFIX: bool = true; - const EMBED_CHECKSUM: bool = false; - const MNEMONIC: bool = true; - fn to_baid64_payload(&self) -> [u8; 32] { self.to_byte_array() } -} -impl FromBaid64Str for AttachId {} -impl FromStr for AttachId { - type Err = Baid64ParseError; - fn from_str(s: &str) -> Result { Self::from_baid64_str(s) } -} -impl Display for AttachId { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { self.fmt_baid64(f) } -} - -impl_serde_baid64!(AttachId); - -#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Display)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT)] -#[display("{id}:{media_type}")] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", rename_all = "camelCase") -)] -pub struct AttachState { - pub id: AttachId, - /// We do not enforce a MIME standard since non-standard types can be also - /// used - pub media_type: MediaType, -} -impl StrictSerialize for AttachState {} - -impl From for AttachState { - fn from(attach: RevealedAttach) -> Self { - AttachState { - id: attach.file.id, - media_type: attach.file.media_type, - } - } -} - -#[derive(Clone, PartialOrd, Ord, PartialEq, Eq, Hash, Debug)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", rename_all = "camelCase") -)] -pub struct RevealedAttach { - pub file: AttachState, - pub salt: u64, -} - -impl RevealedAttach { - /// Constructs new state using the provided value using random blinding - /// factor. - pub fn new_random_salt(id: AttachId, media_type: impl Into) -> Self { - Self::with_salt(id, media_type, random()) - } - - /// Constructs new state using the provided value and random generator for - /// creating blinding factor. - pub fn with_rng( - id: AttachId, - media_type: impl Into, - rng: &mut R, - ) -> Self { - Self::with_salt(id, media_type, rng.next_u64()) - } - - /// Convenience constructor. - pub fn with_salt(id: AttachId, media_type: impl Into, salt: u64) -> Self { - Self { - file: AttachState { - id, - media_type: media_type.into(), - }, - salt, - } - } -} - -impl ExposedState for RevealedAttach { - fn state_type(&self) -> StateType { StateType::Attachment } - fn state_data(&self) -> RevealedState { RevealedState::Attachment(self.clone()) } -} - -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn attach_id_display() { - const ID: &str = - "rgb:fs:bGxsbGxs-bGxsbGx-sbGxsbG-xsbGxsb-GxsbGxs-bGxsbGw#invite-potato-oval"; - let id = AttachId::from_byte_array([0x6c; 32]); - assert_eq!(ID, id.to_string()); - assert_eq!(ID, id.to_baid64_string()); - assert_eq!("invite-potato-oval", id.to_baid64_mnemonic()); - } - - #[test] - fn attach_id_from_str() { - let id = AttachId::from_byte_array([0x6c; 32]); - assert_eq!( - id, - AttachId::from_str( - "rgb:fs:bGxsbGxs-bGxsbGx-sbGxsbG-xsbGxsb-GxsbGxs-bGxsbGw#invite-potato-oval" - ) - .unwrap() - ); - assert_eq!( - id, - AttachId::from_str("rgb:fs:bGxsbGxs-bGxsbGx-sbGxsbG-xsbGxsb-GxsbGxs-bGxsbGw").unwrap() - ); - } -} diff --git a/src/operation/commit.rs b/src/operation/commit.rs index a869a0e1..7a16b000 100644 --- a/src/operation/commit.rs +++ b/src/operation/commit.rs @@ -38,9 +38,9 @@ use strict_encoding::StrictDumb; use crate::{ impl_serde_baid64, Assign, AssignmentType, Assignments, BundleId, ChainNet, DataState, - ExposedSeal, ExposedState, Ffv, Genesis, GlobalState, GlobalStateType, Operation, - RevealedAttach, RevealedData, RevealedState, RevealedValue, SchemaId, SecretSeal, Transition, - TransitionBundle, TransitionType, TypedAssigns, LIB_NAME_RGB_COMMIT, + ExposedSeal, ExposedState, Ffv, Genesis, GlobalState, GlobalStateType, Operation, RevealedData, + RevealedState, RevealedValue, SchemaId, SecretSeal, Transition, TransitionBundle, + TransitionType, TypedAssigns, LIB_NAME_RGB_COMMIT, }; /// Unique contract identifier equivalent to the contract genesis commitment @@ -190,7 +190,6 @@ pub struct OpDisclose { pub seals: MediumOrdMap, pub fungible: MediumOrdMap, pub data: MediumOrdMap, - pub attach: MediumOrdMap, } #[derive(Clone, Eq, PartialEq, Hash, Debug)] @@ -313,7 +312,6 @@ impl RevealedState { Self::Void => {} Self::Fungible(val) => e.commit_to_serialized(&val), Self::Structured(dat) => e.commit_to_serialized(dat), - Self::Attachment(att) => e.commit_to_serialized(att), } } } @@ -371,9 +369,6 @@ impl MerkleLeaves for Assignments { TypedAssigns::Structured(list) => { list.iter().map(|a| a.commitment(*ty)).collect() } - TypedAssigns::Attachment(list) => { - list.iter().map(|a| a.commitment(*ty)).collect() - } } .into_iter() }) diff --git a/src/operation/mod.rs b/src/operation/mod.rs index 8aa3c2a6..4e016fb0 100644 --- a/src/operation/mod.rs +++ b/src/operation/mod.rs @@ -24,7 +24,6 @@ mod meta; mod global; mod data; mod fungible; -mod attachment; mod state; pub mod seal; pub mod assignments; @@ -34,10 +33,8 @@ mod layer1; mod commit; pub use assignments::{ - Assign, AssignAttach, AssignData, AssignFungible, AssignRights, Assignments, AssignmentsRef, - TypedAssigns, + Assign, AssignData, AssignFungible, AssignRights, Assignments, AssignmentsRef, TypedAssigns, }; -pub use attachment::{AttachId, AttachState, RevealedAttach}; pub use bundle::{BundleId, InputMap, TransitionBundle, Vin}; pub use commit::{ AssignmentCommitment, AssignmentIndex, BaseCommitment, BundleDisclosure, ContractId, diff --git a/src/operation/operations.rs b/src/operation/operations.rs index 54ae9e56..aa52c85b 100644 --- a/src/operation/operations.rs +++ b/src/operation/operations.rs @@ -39,8 +39,7 @@ use crate::schema::{OpFullType, OpType, SchemaId, TransitionType}; use crate::{ Assign, AssignmentIndex, AssignmentType, Assignments, AssignmentsRef, ChainNet, ContractId, DiscloseHash, ExposedState, Ffv, GenesisSeal, GlobalState, GraphSeal, Metadata, OpDisclose, - OpId, RevealedAttach, RevealedData, RevealedValue, SecretSeal, TypedAssigns, VoidState, - LIB_NAME_RGB_COMMIT, + OpId, RevealedData, RevealedValue, SecretSeal, TypedAssigns, VoidState, LIB_NAME_RGB_COMMIT, }; #[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display)] @@ -210,7 +209,6 @@ pub trait Operation { let mut void: BTreeMap = bmap!(); let mut fungible: BTreeMap = bmap!(); let mut data: BTreeMap = bmap!(); - let mut attach: BTreeMap = bmap!(); for (ty, assigns) in self.assignments().flat() { match assigns { TypedAssigns::Declarative(a) => { @@ -222,9 +220,6 @@ pub trait Operation { TypedAssigns::Structured(a) => { proc_seals(ty, &a, &mut seals, &mut data); } - TypedAssigns::Attachment(a) => { - proc_seals(ty, &a, &mut seals, &mut attach); - } } } @@ -233,7 +228,6 @@ pub trait Operation { seals: Confined::from_checked(seals), fungible: Confined::from_iter_checked(fungible), data: Confined::from_checked(data), - attach: Confined::from_checked(attach), } } diff --git a/src/operation/state.rs b/src/operation/state.rs index 5edb64e6..a0e92e80 100644 --- a/src/operation/state.rs +++ b/src/operation/state.rs @@ -25,7 +25,7 @@ use core::hash::Hash; use strict_encoding::{StrictDecode, StrictDumb, StrictEncode}; -use crate::{RevealedAttach, RevealedData, RevealedValue}; +use crate::{RevealedData, RevealedValue}; /// Marker trait for types of state holding explicit state data. pub trait ExposedState: @@ -52,9 +52,6 @@ pub enum StateType { /// State defined with custom data Structured, - - /// Attached data container - Attachment, } /// Categories of the state @@ -68,7 +65,6 @@ pub enum RevealedState { Void, Fungible(RevealedValue), Structured(RevealedData), - Attachment(RevealedAttach), } impl RevealedState { @@ -77,7 +73,6 @@ impl RevealedState { RevealedState::Void => StateType::Void, RevealedState::Fungible(_) => StateType::Fungible, RevealedState::Structured(_) => StateType::Structured, - RevealedState::Attachment(_) => StateType::Attachment, } } } diff --git a/src/schema/mod.rs b/src/schema/mod.rs index 34f6fa63..ce9343a9 100644 --- a/src/schema/mod.rs +++ b/src/schema/mod.rs @@ -35,4 +35,4 @@ pub use schema::{ AssignmentDetails, GlobalDetails, GlobalStateType, MetaDetails, MetaType, Schema, SchemaId, TransitionDetails, TransitionType, }; -pub use state::{FungibleType, GlobalStateSchema, MediaType, OwnedStateSchema}; +pub use state::{FungibleType, GlobalStateSchema, OwnedStateSchema}; diff --git a/src/schema/state.rs b/src/schema/state.rs index 02fc10a7..7b9072d8 100644 --- a/src/schema/state.rs +++ b/src/schema/state.rs @@ -26,31 +26,6 @@ use strict_types::SemId; use crate::{StateType, LIB_NAME_RGB_COMMIT}; -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Display)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT, tags = repr, into_u8, try_from_u8)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", rename_all = "camelCase", tag = "type") -)] -#[non_exhaustive] -#[repr(u8)] -pub enum MediaType { - #[display("*/*")] - #[strict_type(dumb)] - Any = 0xFF, - // TODO: Complete MIME type implementation -} - -impl MediaType { - pub fn conforms(&self, other: &MediaType) -> bool { - match (self, other) { - (MediaType::Any, MediaType::Any) => true, - } - } -} - #[derive(Copy, Clone, PartialEq, Eq, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB_COMMIT, tags = order)] @@ -64,7 +39,6 @@ pub enum OwnedStateSchema { Declarative, Fungible(FungibleType), Structured(SemId), - Attachment(MediaType), } impl OwnedStateSchema { @@ -73,7 +47,6 @@ impl OwnedStateSchema { OwnedStateSchema::Declarative => StateType::Void, OwnedStateSchema::Fungible(_) => StateType::Fungible, OwnedStateSchema::Structured(_) => StateType::Structured, - OwnedStateSchema::Attachment(_) => StateType::Attachment, } } diff --git a/src/stl.rs b/src/stl.rs index 1a8608f3..65e618f6 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -37,10 +37,10 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_COMMIT: &str = - "stl:zBxngQHW-1QPll66-1Mlwfe2-KaK0$jC-k6keyzn-6g8vMMs#media-norway-talent"; + "stl:pjinUG!S-9vK!Zks-lJfwoRW-XvQYSuF-90Dpgm0-gP$TQ7c#ibiza-monica-quiz"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:4r1e4Zge-R7BGePj-HvErZAg-kD4c5sB-Wv9QQD1-4aCroxM#postage-speed-vodka"; + "stl:o5J6JwXD-3EVitHi-mleEGlu-gsebHqL-SRCL!cb-9S1pGDc#tonight-clock-insect"; fn _rgb_commit_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_COMMIT), tiny_bset! { diff --git a/src/validation/logic.rs b/src/validation/logic.rs index 563dd42a..6f75a8c2 100644 --- a/src/validation/logic.rs +++ b/src/validation/logic.rs @@ -376,9 +376,6 @@ impl Schema { Some(TypedAssigns::Structured(set)) => set .iter() .for_each(|data| status += assignment.validate(id, *state_id, data, types)), - Some(TypedAssigns::Attachment(set)) => set - .iter() - .for_each(|data| status += assignment.validate(id, *state_id, data, types)), }; } @@ -460,24 +457,6 @@ fn extract_prev_state( status.add_failure(validation::Failure::NoPrevOut(opid, input.prev_out)); } } - Some(TypedAssigns::Attachment(prev_assignments)) => { - if let Some(prev_assign) = prev_assignments.get(no) { - match assignments.entry(ty) { - Entry::Occupied(mut entry) => { - if let Some(typed_assigns) = entry.get_mut().as_attachment_mut() { - typed_assigns.push(prev_assign.clone()).expect("same size"); - } - } - Entry::Vacant(entry) => { - entry.insert(TypedAssigns::Attachment(AssignVec::with( - NonEmptyVec::with(prev_assign.clone()), - ))); - } - } - } else { - status.add_failure(validation::Failure::NoPrevOut(opid, input.prev_out)); - } - } None => { // Presence of the required owned rights type in the // parent operation was already validated; we have nothing @@ -503,17 +482,6 @@ impl OwnedStateSchema { Assign::Revealed { state, .. } | Assign::ConfidentialSeal { state, .. } => { match (self, state.state_data()) { (OwnedStateSchema::Declarative, RevealedState::Void) => {} - ( - OwnedStateSchema::Attachment(media_type), - RevealedState::Attachment(attach), - ) if !attach.file.media_type.conforms(media_type) => { - status.add_failure(validation::Failure::MediaTypeMismatch { - opid, - state_type, - expected: *media_type, - found: attach.file.media_type, - }); - } (OwnedStateSchema::Fungible(schema), RevealedState::Fungible(v)) if v.value.fungible_type() != *schema => { diff --git a/src/validation/status.rs b/src/validation/status.rs index d03035e0..1b619685 100644 --- a/src/validation/status.rs +++ b/src/validation/status.rs @@ -306,14 +306,6 @@ pub enum Failure { }, /// state in {opid}/{state_type} is of {found} type, while schema requires /// it to be {expected}. - MediaTypeMismatch { - opid: OpId, - state_type: schema::AssignmentType, - expected: schema::MediaType, - found: schema::MediaType, - }, - /// state in {opid}/{state_type} is of {found} type, while schema requires - /// it to be {expected}. FungibleTypeMismatch { opid: OpId, state_type: schema::AssignmentType, diff --git a/src/vm/contract.rs b/src/vm/contract.rs index 1df8933d..181e28fb 100644 --- a/src/vm/contract.rs +++ b/src/vm/contract.rs @@ -33,9 +33,9 @@ use chrono::{MappedLocalTime, TimeZone, Utc}; use strict_encoding::{StrictDecode, StrictDumb, StrictEncode}; use crate::{ - AssignmentType, Assignments, AssignmentsRef, AttachState, BundleId, ContractId, DataState, - FungibleState, Genesis, GlobalState, GlobalStateType, GraphSeal, Layer1, Metadata, OpFullType, - OpId, OpType, Operation, Transition, TransitionType, TypedAssigns, LIB_NAME_RGB_LOGIC, + AssignmentType, Assignments, AssignmentsRef, BundleId, ContractId, DataState, FungibleState, + Genesis, GlobalState, GlobalStateType, GraphSeal, Layer1, Metadata, OpFullType, OpId, OpType, + Operation, Transition, TransitionType, TypedAssigns, LIB_NAME_RGB_LOGIC, }; /// The type is used during validation and computing a contract state. It @@ -521,12 +521,6 @@ pub trait ContractStateAccess: Debug { outpoint: Outpoint, ty: AssignmentType, ) -> impl DoubleEndedIterator>; - - fn attach( - &self, - outpoint: Outpoint, - ty: AssignmentType, - ) -> impl DoubleEndedIterator>; } pub trait ContractStateEvolve { diff --git a/stl/AnchoredBundle.vesper b/stl/AnchoredBundle.vesper index 0f2c8b66..b3a7eebb 100644 --- a/stl/AnchoredBundle.vesper +++ b/stl/AnchoredBundle.vesper @@ -100,29 +100,6 @@ TransitionBundle rec value bytes len=0..MAX16 aka=DataState salt is U128 lock bytes len=2 aka=ReservedBytes2 - attachment list len=1..MAX16 wrapped aka=AssignVecAssignRevealedAttachBlindSealTxPtr tag=3 - AssignRevealedAttachBlindSealTxPtr union - revealed rec tag=0 - seal rec BlindSealTxPtr - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state rec RevealedAttach - file rec AttachState - id bytes len=32 aka=AttachId - mediaType enum MediaType any=255 - salt is U64 - lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=1 - seal bytes len=32 aka=SecretSeal - state rec RevealedAttach - file rec AttachState - id bytes len=32 aka=AttachId - mediaType enum MediaType any=255 - salt is U64 - lock bytes len=2 aka=ReservedBytes2 validator bytes len=1 aka=ReservedBytes1 witness bytes len=2 aka=ReservedBytes2 some bytes len=64 option wrapped aka=Signature tag=1 diff --git a/stl/RGBCommit@0.1.0.sta b/stl/RGBCommit@0.1.0.sta index 104dab53..8a779de7 100644 --- a/stl/RGBCommit@0.1.0.sta +++ b/stl/RGBCommit@0.1.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:zBxngQHW-1QPll66-1Mlwfe2-KaK0$jC-k6keyzn-6g8vMMs#media-norway-talent +Id: stl:pjinUG!S-9vK!Zks-lJfwoRW-XvQYSuF-90Dpgm0-gP$TQ7c#ibiza-monica-quiz Name: RGBCommit Dependencies: BPCore#symbol-tropic-grand, @@ -8,7 +8,7 @@ Dependencies: CommitVerify#miller-pancake-elastic, Std#ralph-blue-lucky, Bitcoin#signal-color-cipher -Check-SHA256: 47fb89f9763dce93b32fc0ce2861a915039c1adbce7c065847ee221c44b3f6ef +Check-SHA256: 55c75be3a790e121a64a50dea82730ccea21eb4fc1c7899b1c392826a65864fa 2~tNwLvL+uX>-Vi}-aA;vuZDDL|OmAdib7%`wbaH89bX0k8Wpe`n8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!} 0yp?_2}WsUY-CPhZDmsy2!s^Lf^?|9I@Xg>Oi(W05|TJ%PM*ricn_PmXk-Xfd2nS;VQpn=1fvw5rj-B| -XP@r^w5ufb=C_Ju$l1`nW&GEpSWb-vQ)O*QWI+HTL349yXKqquc4c8~Wn@8gbYWv?LTqVnWK(5fY*ctq -baDg&00?qrc4c8~Wn=&b0|awrVQc~+aI2y9pehZ%M2QE^S2-B&?H_1O1&4u6*^T^mbhP}ZsPef35>JJa -HJF7}X$37Y21E`BySDf%$MYb{T~|g0b97;JWdY|Ui~g5KnWLns8aO;kK`4k?o@Z%;JYn$xWqy`)_H6`g -Z)0l$dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0Th*O1aoC!Yyu&0tD*IvDh<9wi3iSCIT-Hk -A81Vlhk;Gmjr?|WwEU;2^0@;NPlb{-n1xko1uZcKL=FhMw)iW@^B~GyS4IVMbYXO50sm-Yz<5%CY59k^ -g5#W{6D&GDo53%OaP0&iRq10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8 -X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%95Mys{W@%()Zggp3Y*S@nYybuW1aoC!Yyu&0tD*IvDh<9w -i3iSCIT-HkA81Vlhk;Gmjr?|WwESop>%7&o7^|1Fn59cLW!>7R25;!;B10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC -#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%dL349yXKqquc4c8~Wn@HQbYVhlX>MdwWnpYo +XP@r^w5ufb=C_Ju$l1`nW&GEpSWb-vQ)O*QWH|sJL349yXKqquc4c8~Wn@HQbYVhlX>MdwWnpYocu;h5 +1OfmEa%Fa9VQgh&00sjDb7f&{0wHj#q4l6D4ZcK)2hLYH81C&KXiWu&flb+s{C0G-{HLh$xdReUg_1Rx +g;i+fIfIJJaHJF7}X$37Y21E`BySDf%$MYb{T~|g0b97;JWdSuhh8FxqMGF>;)g%0j +&kVcqmr((;)g%0j&kVcqmr((*O1aoC!Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEQdsjYvyJ^#nX; +x^@N4Cyn`(=BbYXO50W~^?7W_p;3l@ykBm9id47>4{Q314kUM@UiqyMDEzyxe> +V`~C>10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)y +umJ%95Mys{W@%()Zggp3Y*S@nYybuW1aoC!Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwESop +>%7&o7^|1Fn59cLW!>7R25;!;B4{Q314kUM@Ui +qyMDEzyxe>V`~C>10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^ +^xj-FXm+)yumJ%nL349yXKq$yV?lFsX=iRyWp-s@Y-MCbVRT_aY-w&}Q)OXnRCrKyas>eZ2mwiP2M#dZ +N%AXTA9%-&dal959qWIGOJWz(UDXek?U(@o000000096000000001aKb8~5DZdPSuL349yXKqquc4c8~ +Wn@HQbYVhlX>MdwWnpYocxhw>0RRXAYV~EcCMzIkE5#Y%aYxO9EV|4lw{J;h)5ES#nY^{S0RR9100000 +|Nj6000000DnWB|X=iR$Wn)2eb7^O8Qe}2!VQgh&R$**)WkPIeZe&wsVQf@*P;_zy0RRXA$tKg)lZIpn +J?s520000000030{{R300000bL349yXKq$yV?lFsX=iR$Z)s#xbYXO5LTqVn +WK(5fY*ct@WCZ~L2m!NB&vqal|NIC80+R(C@tCsLzU&b{L$ZMdwWnpYocu;h51OfmEa%Fa9VQgh&00sjDb7f&{0wHj#q4l6D4ZcK)2hLYH +81C&KXiWu&flb+s{C0G-{HLh$xdReUg_1Rxg;i+MdwWnpYo cxhw=0sshdWp-s@Y-MBs1_K0hWnpXrA#kgq^`I&ZzC?)!&R01Y?(H9FO$CR6P1%k7c67A-ECY>5OGott -JZHLg1Ujv+c;>sahi1#@&^bY%hmXk);5Qh;gshq!{{oTC#gIzF4hFN<*P1RquLWiVd^ +JZHLg1Ujv+c;>sahi1#@&^bY%f9vZekPz%WEGnBZKS8(M7E9_@AwVcyGtCevi|7U8=D Y;R+00(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCd;@jJLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQ wWqKF0Ra$WZ*FF3WMyu2X<=+rWnpXp1_K0hWnpXrA#kgq^`I&ZzC?)!&R01Y?(H9FO$CR6P1%k7c67A- -Xc_Cg)w39@m$R6qOEzWQ+NTC@=;OF|0}@Y#k~NrxRcQq+F$P2q2)nlUE64L7 -%3W7R1#@&^bY%fGI))bfMMVo1jMXFjjL!_a@t08nw0vGJJY%E(q{YAlY;R+00(t`--)Viz@~C%8KNS}Z -0aQ3s^SOqbBwN-D{wl@OCd;@jJLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF0Ra$WZ*FF3WMyu2X<=+r -WnpXp1_K0hWnpXrA#kgq^`I&ZzC?)!&R01Y?(H9FO$CR6P1%k7c67A-Xc_Cg)w39@m$R6qOEzWQ+NTC@ -=;; -)g%0j&kVcqmr((;)g%0j&kVcqmr((MdwWnpYocu;h51pxpE0YQo=l~|vV_!Okr3@y;(eMgz2piGnBnVrO&*=|!w7y$qP000000RR60 -0000004hOqb7^O8R%K&Bb8~5DZc=4-WnpY(WI=RvVPj}QY-w&}Q)OXnRCsA*1pxpE0b8D|wU50>qi0RR9100000|Nj60 -00000C_!^`X=iR$Wn)2eb7^O8Qe}2!VQgh&L}7GcLTqVnWK(5fY*ct@WCZ~L2mxyKWwjeZ2m#3^)76uPWC%U${V?Tj%xE~|`pWbPFE41i6~^xq(2)TE000000096000000 -001dLb8~5DZdPSuL349yXKqquc4c8~Wn@-iY;|QqY-w&}Q)OXnRCsA*1pxpE0bfY$XWlwKE^AhLJ}|HT --4B8zCplWEFn3UHo09LWU;zLC000000RR60000000470mb7^O8R%K&Bb8~5DZdPw;WK(oubY((pX>Mdw -WnpYocu;h51pxpE0dEn3_{AGy?T1%&QGG@ed$;?g_I;9#MdwWnpYocxhw>0RRXAvrf-;ARhnx2m=C>1sw61ve&-s5kEt+ -k@HS%_jKP%0RR9100000|Nj60000009YJ$*X=iR$Z)s#xbYXO5LTqVnWK(5fY*ctqbaDg&00?qrc4c8~ -Wn=&b0|awrVQc~+aI2y9pehZ%M2QE^S2-B&?H_1O1&4u6*^T^mbhP}ZsPef35>JJaHJF7}X$37Y21E`B -ySDf%$MYb{T~|g0b97;JWdSa-rT!PdFhnqz;9Q#*O1aoC!Yyu&0tD*IvDh<9wi3iSC -IT-HkA81Vlhk;Gmjr?|WwEQdsjYvyJ^#nX;x^@N4Cyn`(=BbYXO50WPwo{ujV7 -L@=1(T$>wOY}Ov_b`4?P%YY`+Wb+o`y98`+V`~C>10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFs -xGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%95Mys{W@%()Zggp3Y*S@nYybuW1aoC!Yyu&0tD*Iv -Dh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwESop>%7&o7^|1Fn59cLW!>7R25;!;BwOY}Ov_b`4?P%YY`+Wb+o`y98`+V`~C>10COKearHwcS=7M7YzYaI8*bvhMOc? -)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%PL349yXKrm}ZgfOtbYW?1a|QztZ+C8G -WK(oubY)XxXk~3-0VPFrzQMU~Cv3(oCX8r!*SiR9zOp;)>$$b(q=dpw@&s;SZDj&Q>Z4!V_T!KNI`QJ| -h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pE0a$#@6CZUHn>53UoI8eY9A{1GERg--GiI0S#x1is&)M%fmnGH4D#b8~5DZf#|5bX0k8Wd#8M00J37b8~5D -Zf#|5baO&%X>MdwWnpYocu;h51pxpG0f+wLWmt%8=p4R=gtK{LClh6Z#kObxUW*hKHnBv9xd9!NHw=`m -9^mnTyifqo!b}F#nnEANII!njWk~CTja~o%000000093000000000<4b8~5DZf#|5baO&%X>MdwWnpYo -cxhw>0RRdChyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0rcrJbYWv?Nn`~900#g7Kp+4ML3DIsV`x)!VRU5%0s?7d0fcc4 -lPpg3!?y@aX^XIja4CK{WF&t@k=WXUZP9(YI0Db5bYX39002k^X>)URWpV;~10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUEj -udT)PryvH%qoUf%jN6#Tx81sfg4O?s`uaep_R|IkV`yP%Zcb%%0j(ZClptSlj45aI>Ppga1W- -frt90uqg8@)(AsrVQFqoWpo1v4q|C^V{d70O<`$nZe?@;4`OL_V{d70RAqB?Ze?^c0S{tnbYpL6Zd7G+ -bZ%vIGy)A`X>?<6X>L<#XKrP50}f(obYpL6Zc=4ubY*jN1PyFyadl~AO<`$nZe?@@4Qy#~b!lW&Wpi|H -WpoA#LvL<$a$#e1Nn`~900#g7Kp+4KL}7GcQ*>c;Wd#8M2mk;;0000000000|Nj600000014d?c1pxp6 -0u4rWZf9v?Y-Lk)VRU5#0SE?SX>@ZoGynww000OKMs;pyX<}?;RC#b^0|5bs~EXcCXx( -drQcb3B`Fx$)^%va$Ar)C7cLjXklq?PGxiftsXy=AYX8dDQEQRO5D(yMKm~r|3!X*hx(?lDDx}U2yJC_ -VPs)+VFC4eO*mP8`7qV21dnrCyk{{a-lF$FG0V5TNAc?Tc{K-TY;R&=Y;ytLBav&Stb*7Pg~wnyz`1FA -u$k|YFC-ha-WFA1@jtu^VRLh7XKrm}Zgg`2OvaG(yK$twfa!8DE;K^oKLkF4~ia -x8KK|47hp?M`dnhb7^x^V`ybKfZ0H=mhJ>?uVR2XhQO_4{AcS- -HH^7AVzASV8M4NYxyCka@1Z8)ymjIKNK5;L!8FkfGTe+FK;UUh9M-4n+}vReM{I9mVQfTYbYW?1a|Qwt -XKZg`VQf=$VRU6vV`ybC`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_3rB2kVqt7k -bYXO51pxpG0oCr34oQf!Y4K`P(FaQVwIle)QgI&pHa%8Z1>xis%K-|*_9BKowP1qopf1fvG|`fdOK000000093000000000q3Y;R&=Y*Tb$bY)XxXk~3-1_A|hWo=1h0!8YhU)%QMkO4aJ -;_ZeCe;xE!X<$x_Fs4If6Z`oP*=q!&6rQG)02XJT?*g=|B=zREie$*y(7k2+*P~cYjRc;WmI`^Wd#8M00In0Y;R&=Y*t}xb!Bq}0RRXAGM-jZ2Kh}DE2o;HYydTtf}Q!WH{}bI -!u)W*#(e~Z0RR9100000|Nj60000002uWmRZggpMc?AIg1p)%fEFN!zncXl9K5w2;FV{y1jDTJCC^p$- -mHEbO0#qkRz9SbZ=!8X@=Yuq$20sb<4l#S`iz7Vef}@Ca=a#qt2m;D19&dx0-7pM3Z=O*v*GCA9fL-<| -HrZsA`NnJlR3}KjBNr;@ghiU?gEXK9KMDE{F?;HZBRuDVqlk6qmbd@_000000093F00000000F^Zg6#U -1_B3ga%FZ;b#wuf5WIk~G+K)5%bR49t5yk`^qQ9la%FR6a&~280(t`--)Viz@~C%8 -KNS}Z0aQ3s^SOqbBwN-D{wl@OCd;@jJLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF0SHNMaCLM|VQ>Wj -015*2Y!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>jbO<32;hs$B9ZCsU(1!DsC|W1LOd&b_IRG-(&Q -$wPGj2?3SJ=6W7=VqesjRYGc!>wZFzp>JB4@xD;^wu&SY_r(AJ000000096000000000310000000960 -00000000I_Zg6#Ua|Hna2?5oOUkD7Ff~JZGMgrhZ&rP2gYrktY!x$bpv=qCl=HdYW000000096000000 -000S1Wn^h#RC#b^0|5hJZh8L;O=WapL}hegX>4-_0tItrZAoMTMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uM -rbA>C`}q*rYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj1a4t%WdcR&qhH(hQGbYWy+bYTSn015$h4P{pQ?3(@m6s4{*=wy-PiS_k>Wl|t&*Fr0fZ0000000000{{R30000003r}NX -b#iiLZewM01_A?ZX>I@j0t0PfcmMzb3{P-FZ*6U9bZupBbOs3nW@dH)+M7`mSQb`xkca!3Clv)aMjKgwAH@`b -u1x<7g|G$};xvA~n-$_S25D|^b#!wAdIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThClv)a -MjKgwAH@`bu1x<7g|G$};xvA~n-$_S3t@9}X=iS2Wo~qH0(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D -{wl@OCODo$h9?yTI7S;;e;>sZfv!yd427@;7veO2zMB=|GY5BRbZ%vHa{_t;9p7nv%krpqNv2!%ioJpYH;+t0eX2w~A!Q+0eaZ{MVycPK^T! -VRUq1V`yzox?`Aroor<$W|05z3@o%yggKU%$CX5lEZwTb6rTk%m8C`}q*r -Qx*t>6v={gsJ=SZlTl1iF5eQ8IAl(q%E@>So406W33O>~Wpi|4ZEyepNC{+Rc4cgDaAk4xis%K;Cz%P43gO+4!q%eZVl@Y7XFOZrI4j;@LJ -R>mVbPjdhO000000093000000000VacWz~5RC#b^a{vkfhyLPaScq)s9KMExvw34D6J>+NwrBxfixd_% -u|$Wt0oW(mByq=v5;G1YxY>15Mpepo#}Ty{v*@th($000000RI300000000(DfZe??6a{*3l -%9@}OZ_-bc51ndy0w1NGl_wIgUQD>ylx`L>RgMdEa$#@6CZgT(%0W?w%t`n9TUcD*&5hFi^PVx{q -1b@^7zTcrn*%qZTXaT3TYMoRqm+0g%?b9i-L64u}PF;v2Uql0Ev@(iYu* -+LHGLwE58<2vcKdWo=bairN1pxpD002Nh018xcVQzD2bZKvH1`7jbW_AJE -n^6;37FKqUhx?i3R+Mr!fY&(;2BFL(m@EZk_srD_V{dMBa$#e1Nn`<^2rNlD$O59e#ogQsB77jPl+h5j^*S;IZf|a5WdHyO4s>#1ZgXjLX>V>+d2nR`G*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj? -7Ns(12yJC_VPs)+VFC4eO*mP8`7qV21dnrCyk{{a-lF$FG0V5TNAc?Tc{K-TY;R&=Y;ytLBav&Stb*7P -g~wnyz`1FAu$k|YFC-ha-WFA1@jtuM?JbaMfW9G|L54Pw2ug%?sO^F&~e@A6ti9Rs{TiVrh$uPK=e -VRLh7XKrm}Zgg`2(t+H2i6z8&WfskJUeoBBhOdWpuF^=eyaaWe;bV*#33g#@X=Gt^Z*l^910COKearHw -cS=7M7YzYaI8*bvhMOc?)(rkC#nUE}_h5K%L=laq&yA1JoJ^{7>oKLkF4~iax8KK|47hp+cWHEPWpi@^ -dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThV>qb#7#AWd;HWX>M?JbWLG!0c>M^qyR=3m`FNB0@6CZgT(%0hP$+dLDIRU(}XWLTZugenOC;Z(5k~zEJnJiX;;E#Q`Mx-Kk4)-%knAfsyhG -fiQO+BF-bg$DT0oBAj^KornPd000000096000000000qGa$#@6CZbW5tVQFl01_BUta$#@6C -Zc}4uWo=;rtbeH@6CZc}4uWo=;w -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 +bY)XxXk~3-0d|<Z4!V_T!KNI`QJ|h6;Zj +^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pWQHG +ZU6uP000000RI300000001-!QZ(?C=Q*>c;Wm98lWo=;w0tItrZAoMTMe3tp+xFv-0Xp&G?S=|}9rRae +U`~uMrbA>C`}q*rYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj2yJ0_Npxjxa{vGX4@YcoVqt7k +bYXO5RC#b^1pxp60t`oNZ(?C=R$**)Wpf1q00;pxo>ox?`Aroor<$W|05z3@o%ygg4E?M+l67UG^w8*<_XZ#%uyq +CrG{{7b@t4MVjY>G@u4Q3HlB(d+LiLJm-R=h;`?dxBvhE000000RImF0000000l{IaCLMB0taw%Wp+<> +bODnPynwMZT8l5kSW@l}O=!>^xB4~9n`Dx!RtcK)nwJQ2Wpib6c4cG&dIKHbX?@G`sCP;~6&DQwR5(-f +xrUo0ThRw7=FYk8VVufK10Q-T=FR=Q=>S+XYD&R000000RR600000000961000000RR600000000v2J +aCLNZ1pxpF0o9FP2n?Horiuqf0^m>2O`jNRziT$b7#=ya6uYYC;sF2v000000RR600000001HiJbYVng +bYW?1a|Qwhb7gHwWCBI%qhH(hioJpYH;+t0eX2 +w~A!Q+0eaZ{MVycPK^X^VQpmsMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r8?;yf@?frQ$owe+ +rTo-{AMw{vgzX#P!9p!}0yp?_2u)>lVN`i=Wd#8M00Ie3WprUyVQh6}1pxpE002M$0000000030{{R30 +00008O=WapWMOn+1pxpG0d?d}_}|Wp0vpvv$c&#PW69R$ltr%da5t5w^x+8!q5%{oJdRMsrjHBJ^EIe4 +enz&iEACnc`NWk%>en!wdoTb1000000093000000000Y5V`Fu4a%FB~Wpf4s18r$;00065ZDDu-00In8 +a6@lxZE19EWo~o^2?J(kb^+R(Q4?4eR(6nw`MZ*F5{000OEZ*Ww3 +aAg7TaJlIZe;lLwh&e1WN~xVDb>d|F)wKS0Bv(XzubJrxZDn*}WMOn+0(t`--)Viz@~C%8KNS}Z0aQ3s +^SOqbBwN-D{wl@OCT*{+#r3Bk2FRnL+RBXEn8vr=x`Tq%|A_kfK&ST81_x(sZ(?C=a{_t;9p7nv%krpq +NClv)aMjKgw +AH@`bu1x<7g|G$};xvA~n-$_S33g#@X=Gt^Z*l^910COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUEj +udT)PryvH%qoUf%jN6#Tx81sfg4O?s`uaep_R|IgPjE?O1pxpD002NB00mEQZ*_DA0|IYw0hP$+dLDIR +U(}XWLTZugenOC;Z(5k~zEJnJiX;;E#R7DB0f+wLWmt%8=p4R=gtK{LClh6Z#kObxUW*hKHnBv9xdLu) +0006IPj_x*WK(oubY)XxXk~3-1OosIWMyM)VRB(~X?A4*00039W_507X<}?;00jX7`Sh#^X0AbZX4L%* +5q$))*;M@wXI>IJVg&1PPwC}G0t$0Lb#i5700jX8Me3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C +`}q*rYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj3{quwWnpY(WJFEY++|}0(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCX@GIcyL4!ji%3ykIZ4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HJt76^nC$%1sK +zB<;EQA|)S-x88IWKN#S$#@T&w`gPubZKp6b97;CZ~y>E31nqvO>-_DBy8`Vb0jGrW9$=2qSMXvL3Hm|g$K5F!?HDuBcElf~?0000000000{{R30000002WMq&WpinB0ZwennxGPI(od8R +ooadlAElm^Clat;Ot{#TZWc0Cjtg{hVQzD2bZKvHa{vkfG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj? +7Ns(10jIWVom4HC=;Sf&(V=@3j=0mb^+R(Q4?4eR(6nw +`65I6*X)C9iYp+?yjr7~y;ZDn*} +WMOn+0rh%KI9Y!AFx9LCk8@hQXE7w+qW3^C%eTEp@#^?_H3w&GZ(?C=a{=BXk!z-`g4hv-$6z_YxoLZ_ +neUP>BpbEf7FA*KKfDHMZg6#Ua{-JTpQ=d>V!gG67g8znL|~8a@>)b41H3?r4>NPGDVYmlb8~5DZf#|5 +baMfWk0~o57O4jQiSPQLM-Anyjgk|p#*FIpQO-iyoZ8t5c42I3WMOn~asqk-9p7nv%krpqN@L7b8`ZE10COKearHw +cS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%Hb7^O8VRUtJ +WdH;M00eGtZe;)f009JZZ*64&1pxs>!tI8CO};e1CqOk74-_0uXd^VQzD2bZKvHQ)6glZD9ed +f2kfhA@=uGO=Jtx#~n~$5JW2|a}~7vfDWQsGAeQeZeeX@0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If +6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~au8HvO>-_DBy8`Vb0jGrW9$=2qSMXvL3HGEG +0000000000{{R300000025D|^b#!w83IT`y;$>KfZ0H=mhJ>?uVKf +Z0H=mhJ>?uVR2XhQO_4{AcS-HH^7A +VzASV8M4NYxyCka@1Z8)ymjIKNK5;L!8FkfGTe+FK;UUh9M-4n+}vRfRB~Z%b7^#GZ*Ek1aAgGn0006G +RC#b^LvL+uX>@I6Zgd0!00(DfZe??6a{vVa0kRZVdkxgXIndDSADQRhP(T)gL{x5+9gElmgZ0zBM*#|S +a$#@6CZU6-W0iOsgNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G66JF53UoI8eY9A{1GERg--Gi +I0S#x1is&)M%fmnGH4o9d2nT9L349yXKr&sY-w&}Q)OXnRCrKyas&ea3uI+uY+-U?bZK^F00jX7ts#@n +)qreE>X2y^k8(W~9rIKz;itzCh0mxeNOd2nT9 +L349yXKr&sY-w&}Q)OXnRCsA*1OosIWMyM)VRB(~X?A4*1pxuVBMJ2TDGb!?hS4?jmbTrNwsBI9)_*>; +PXlMNnHxp{2xfI|XK7+=WdH>M0d)~d*A-s;(%@Iu7W%7*6Z_!y?t0-mQA1p*Ph+UT00IhgbaHiLbairN +WB>&L0lFe0BpVsjR%EDjMz&}PzMK%GtpWOEsvFV}w(K~B)(KW`X=GD$VRU5$0RR91 -----END STRICT TYPE LIB----- diff --git a/stl/RGBCommit@0.1.0.stl b/stl/RGBCommit@0.1.0.stl index 90b2fd6ff71b6042682d49ffd19a6ed26d22a80b..c03fb8df454923b781fb7c36fdb7e845a7dd8262 100644 GIT binary patch delta 403 zcmbOmza?bDToz_a28GG_{6NedGx<4J+GGRvq|LUR>8zVm`B$(i2!@u=NP7}0+A`ze zbfw94$`9s=v2LCi`cu27f{|V6s^DZ@(X$HAn9_6Wo)-sPO;z3V=j-)fz83XeC;stq z@HuXr`8i1M#$+ime*>HL6=CI)N%4m_J4=f!?RkF9^3N{*yB6!)+BKYfB9#popx{50 z-pnB$!mOb1x+2hZ&DVLtZjQ>O$K!rG`Q>?31#x_cEP8UJY<5%c)Cz1x>2zE(Z5-!ALRI@6R({JK5? zO`BEK)tMA}`Zcu`#a6QY>wN!ffjjThHNBIBR~_ql^(F9})6F@zZo=%Cyj}CR!dnp| z35mlRcP>=fcRrSwKf~mlNA2<)xf4v;9FGmFvSl}4(ozJu;frp+jATe>M^W^h-{rsF^`I#xfC5a`etc*Z!0|0Tbqxk>; delta 1104 zcmdlIGB`5CpwzO|#GKR=$C8r7llo&12$ZE_r65>X086|veA%a%!$cB1W>ynvH`^E#Hf zY=PPk3&T>AvDxgDlbM$i4D@nHMLu)?3;PPo)VLPaBEmV!UsurW(rty^t?4s+3uDtUioje$(0T{LnXCY=C3jm_I0w! zh#cr$c5ZS6kH+M6EJB-0x$9UJR9#E<9o(6(o^woBttX@6`fiTgeVeS`yxzI>`I44H zexD{!R8X7DFQG6wQm|b?c8WRAl(ljXJ~r+NU^sushwaKNC;6im8=l9cdc1D#jhiIo zU;pK0=KK#zo*USAmG)2mktT5cUugBsPc5GV?*2-e`TSxk0~Gv+(i{+fc!C_y&cNWH zz`zX=2`))2No8YV%1mKwDde53zOSB{D-oPtb5rw57+4t@2|0rgHJP(9v7}|@q%v}D zs~5WeI(sS?Yy8KOJ*%fht~TF)u*q@q!3+CV1jtHHU@1<_DPdsX;DKp(Ni0cZV`AOB zMc#u+;fDH6mBQm~LdJY5J8qT+xrLr8J1)3YV)Kg)zqh?fmzcU)MoFDX>r&&L>Q2=o zm8oK9OX4oSnANtvy>#6rkIj2nO6NRG?vX(Ad!LFlqk_t>yDPm5@B4FJY@GOstI?ob zR_UDbf#dTGJ}AwpxHGq7^GQ`jP*A+q=r{b278K_Hgswk~3oG2b*WW32_te)X+i&GJ zKG?%NapAAfd$X3ZOHMwoA ^ ..0xff TypedAssignsBlindSe @mnemonic(baker-size-sonar) data AssignmentsBlindSealTxid : {AssignmentType -> ^ ..0xff TypedAssignsBlindSealTxid} -@mnemonic(factor-hair-everest) -data AttachId : [Byte ^ 32] - -@mnemonic(harvard-burma-bicycle) -data AttachState : id AttachId, mediaType MediaType - @mnemonic(stadium-stadium-vacuum) data BaseCommitment : flags CommitVerify.ReservedBytes1 , schemaId SchemaId @@ -225,10 +197,6 @@ data InputMap : {Bitcoin.Vout -> ^ 1.. {OpId}} @mnemonic(taboo-lazarus-sushi) data Inputs : {Input ^ 1..} -@mnemonic(isabel-heaven-north) -data MediaType : any#255 | (|) - - @mnemonic(arena-janet-prepare) data MetaDetails : semId StrictTypes.SemId, name StrictTypes.FieldName @@ -263,14 +231,10 @@ data Opout : op OpId , ty AssignmentType , no U16 -@mnemonic(neutral-mixer-visual) +@mnemonic(sincere-teacher-stella) data OwnedStateSchema : declarative () | fungible FungibleType | structured StrictTypes.SemId - | attachment MediaType - -@mnemonic(simple-bombay-salute) -data RevealedAttach : file AttachState, salt U64 @mnemonic(sleep-source-figure) data RevealedData : value DataState, salt U128 @@ -330,17 +294,15 @@ data TransitionType : U16 data TypeCommitment : genesis BaseCommitment | transition (ContractId, TransitionType) -@mnemonic(alarm-genesis-mambo) +@mnemonic(ship-trilogy-clara) data TypedAssignsBlindSealTxPtr : declarative AssignVecAssignVoidStateBlindSealTxPtr | fungible AssignVecAssignRevealedValueBlindSealTxPtr | structured AssignVecAssignRevealedDataBlindSealTxPtr - | attachment#255 AssignVecAssignRevealedAttachBlindSealTxPtr -@mnemonic(initial-robot-archive) +@mnemonic(felix-compare-history) data TypedAssignsBlindSealTxid : declarative AssignVecAssignVoidStateBlindSealTxid | fungible AssignVecAssignRevealedValueBlindSealTxid | structured AssignVecAssignRevealedDataBlindSealTxid - | attachment#255 AssignVecAssignRevealedAttachBlindSealTxid @mnemonic(email-snow-safari) data VoidState : () diff --git a/stl/RGBLogic@0.1.0.sta b/stl/RGBLogic@0.1.0.sta index 8832e7a3..6241d851 100644 --- a/stl/RGBLogic@0.1.0.sta +++ b/stl/RGBLogic@0.1.0.sta @@ -1,14 +1,14 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:4r1e4Zge-R7BGePj-HvErZAg-kD4c5sB-Wv9QQD1-4aCroxM#postage-speed-vodka +Id: stl:o5J6JwXD-3EVitHi-mleEGlu-gsebHqL-SRCL!cb-9S1pGDc#tonight-clock-insect Name: RGBLogic Dependencies: BPCore#symbol-tropic-grand, - RGBCommit#media-norway-talent, + RGBCommit#ibiza-monica-quiz, Bitcoin#signal-color-cipher -Check-SHA256: 68307f6d798928fb76b489320492e0dde490af63d47a2b34a2f335d5da58c5f1 +Check-SHA256: 79acb7eceb3112ba1edbe87128f228e661dc110e5be08ba4adf4304ff520c2b0 -2vSEvOmAmtV*?>@tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPA_P(yEWWy~CBfdSUl1Lc>lwK7~E -dt#a^PvZ(sqJKk4%L!6PLPKwDZE1A%Y!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkk +2vSEvOmAmtV*?>@tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPA_P(yEWWu`c%P;Zj<^1fzEB_;eQ +MP=_ngsvCe1EvYIfdA7&w+T{5LPKwDZE1A%Y!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkk Z)t7=20~CnZ*pY?00DdlT>wB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 wjY>38tto&d&=eG4cRAF#( @@ -23,12 +23,12 @@ _r(NHa7knZ00=~4V^DH$Z)OAn0S0toaB^jI00jX8A#kgq^`I&ZzC?)!&R01Y?(H9FO$CR6P1%k7c67A- 54IneKN{_;j(f`H9IfkFzO$PG=uAF%>iaxCSnRl2&38AmXJiCw9urENI6IdKM{I9mVQf!wWCj8SZ*Wg?WC5$Mo0RIYfa$#@6CZU6=Z2X|?7Ze??G0gvlp0sK<6W+n*cBpJ9-*worFk3Ek7Mz>CQ0ZEXBf&z4T0?Zs|fdSUl1Lc>l -wK7~Edt#a^PvZ(sqJKk4%QR9Ct`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zc -aA{-$%p7Nd0oK(6<(ICtGF%^fVwx*Y;|flsdo1Vb4=*swmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`Zq +X>@6CZU6=Z2X|?7Ze??G0gvlp0sK<6W+n*cBpJ9-*worFk3Ek7Mz>CQ0ZEXBf&z4T0;V{pP;Zj<^1fzE +B_;eQMP=_ngsvCe1EvYIfdA7&w=_}@t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zc +aA{-$rZ}fiZ<6-%zGh1$CHyEwW$!_Rt{2?{rU|rw|IMg?00jX7T-**L6)$-r+lRyXoI{GIo*U3CNI7Emc=xo*$N+#60SRDb5bYX39002k -----END STRICT TYPE LIB----- diff --git a/stl/RGBLogic@0.1.0.stl b/stl/RGBLogic@0.1.0.stl index aeec522fac88c9b89705a0fe8f8d3bede3796656..4098bc96e60676557fb5f7b1e4549a7959f8bac2 100644 GIT binary patch delta 162 zcmeC@?&qFhsIbgpc|iW8Z=d$1d8?}a(Qr+D@7S_V{4Vn{&Mgi9FFSAF82E&lprXk= ZObU}rS@;PnT*5Miu%g{eijyl@#Q;s#OjZB@ delta 162 zcmeC@?&qFhsBlImy^- Date: Tue, 1 Apr 2025 16:46:16 +0200 Subject: [PATCH 48/70] chore: remove unused code --- src/operation/operations.rs | 88 ++--------------------------------- src/schema/mod.rs | 2 +- src/schema/operations.rs | 35 ++++---------- src/validation/consignment.rs | 17 +------ src/validation/validator.rs | 8 ++-- src/vm/contract.rs | 20 ++------ 6 files changed, 22 insertions(+), 148 deletions(-) diff --git a/src/operation/operations.rs b/src/operation/operations.rs index aa52c85b..6729170e 100644 --- a/src/operation/operations.rs +++ b/src/operation/operations.rs @@ -20,22 +20,19 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::cmp::Ordering; use std::collections::{btree_set, BTreeMap}; use std::iter; use std::num::ParseIntError; -use std::str::FromStr; use amplify::confinement::{Confined, NonEmptyOrdSet, TinyOrdSet, U16}; use amplify::{hex, Bytes64, Wrapper}; use commit_verify::{ - CommitEncode, CommitEngine, CommitId, Conceal, MerkleHash, MerkleLeaves, ReservedBytes, - StrictHash, + CommitEncode, CommitEngine, CommitId, MerkleHash, MerkleLeaves, ReservedBytes, StrictHash, }; use strict_encoding::stl::AsciiPrintable; use strict_encoding::{RString, StrictDeserialize, StrictEncode, StrictSerialize}; -use crate::schema::{OpFullType, OpType, SchemaId, TransitionType}; +use crate::schema::{OpFullType, SchemaId, TransitionType}; use crate::{ Assign, AssignmentIndex, AssignmentType, Assignments, AssignmentsRef, ChainNet, ContractId, DiscloseHash, ExposedState, Ffv, GenesisSeal, GlobalState, GraphSeal, Metadata, OpDisclose, @@ -78,22 +75,6 @@ pub enum OpoutParseError { WrongFormat(String), } -impl FromStr for Opout { - type Err = OpoutParseError; - - fn from_str(s: &str) -> Result { - let mut split = s.split('/'); - match (split.next(), split.next(), split.next(), split.next()) { - (Some(op), Some(ty), Some(no), None) => Ok(Opout { - op: op.parse()?, - ty: ty.parse().map_err(OpoutParseError::InvalidType)?, - no: no.parse().map_err(OpoutParseError::InvalidOutputNo)?, - }), - _ => Err(OpoutParseError::WrongFormat(s.to_owned())), - } - } -} - #[derive(Wrapper, WrapperMut, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From)] #[wrapper(Deref)] #[wrapper_mut(DerefMut)] @@ -152,12 +133,6 @@ impl Input { /// - Genesis ([`Genesis`]) /// - State transitions ([`Transitions`]) pub trait Operation { - /// Returns type of the operation (see [`OpType`]). Unfortunately, this - /// can't be just a const, since it will break our ability to convert - /// concrete `Node` types into `&dyn Node` (entities implementing traits - /// with const definitions can't be made into objects) - fn op_type(&self) -> OpType; - /// Returns full contract operation type information fn full_type(&self) -> OpFullType; @@ -171,10 +146,6 @@ pub trait Operation { /// Returns nonce used in consensus ordering of state transitions fn nonce(&self) -> u64; - /// Returns [`Option::Some`]`(`[`TransitionType`]`)` for transitions or - /// [`Option::None`] for genesis operation type - fn transition_type(&self) -> Option; - /// Returns metadata associated with the operation, if any. fn metadata(&self) -> &Metadata; @@ -264,11 +235,6 @@ impl From<&'static str> for Identity { fn from(s: &'static str) -> Self { Self(RString::from(s)) } } -impl Identity { - pub fn is_empty(&self) -> bool { self.is_anonymous() } - pub fn is_anonymous(&self) -> bool { self == &default!() } -} - #[derive(Clone, PartialEq, Eq, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB_COMMIT)] @@ -330,38 +296,6 @@ pub struct Transition { impl StrictSerialize for Transition {} impl StrictDeserialize for Transition {} -impl Ord for Transition { - fn cmp(&self, other: &Self) -> Ordering { self.id().cmp(&other.id()) } -} - -impl PartialOrd for Transition { - fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } -} - -impl Conceal for Genesis { - type Concealed = Self; - fn conceal(&self) -> Self::Concealed { - let mut concealed = self.clone(); - concealed - .assignments - .keyed_values_mut() - .for_each(|(_, a)| *a = a.conceal()); - concealed - } -} - -impl Conceal for Transition { - type Concealed = Self; - fn conceal(&self) -> Self::Concealed { - let mut concealed = self.clone(); - concealed - .assignments - .keyed_values_mut() - .for_each(|(_, a)| *a = a.conceal()); - concealed - } -} - impl CommitEncode for Genesis { type CommitmentId = OpId; fn commit_encode(&self, e: &mut CommitEngine) { e.commit_to_serialized(&self.commit()) } @@ -376,15 +310,10 @@ impl Transition { /// Returns reference to information about the owned rights in form of /// [`Inputs`] wrapper structure which this operation updates with /// state transition ("parent owned rights"). - pub fn prev_state(&self) -> &Inputs { &self.inputs } - - pub fn inputs(&self) -> Inputs { self.inputs.clone() } + pub fn inputs(&self) -> &Inputs { &self.inputs } } impl Operation for Genesis { - #[inline] - fn op_type(&self) -> OpType { OpType::Genesis } - #[inline] fn full_type(&self) -> OpFullType { OpFullType::Genesis } @@ -397,9 +326,6 @@ impl Operation for Genesis { #[inline] fn nonce(&self) -> u64 { u64::MAX } - #[inline] - fn transition_type(&self) -> Option { None } - #[inline] fn metadata(&self) -> &Metadata { &self.metadata } @@ -418,9 +344,6 @@ impl Operation for Genesis { } impl Operation for Transition { - #[inline] - fn op_type(&self) -> OpType { OpType::StateTransition } - #[inline] fn full_type(&self) -> OpFullType { OpFullType::StateTransition(self.transition_type) } @@ -433,9 +356,6 @@ impl Operation for Transition { #[inline] fn nonce(&self) -> u64 { self.nonce } - #[inline] - fn transition_type(&self) -> Option { Some(self.transition_type) } - #[inline] fn metadata(&self) -> &Metadata { &self.metadata } @@ -453,6 +373,8 @@ impl Operation for Transition { #[cfg(test)] mod test { + use std::str::FromStr; + use amplify::ByteArray; use baid64::DisplayBaid64; diff --git a/src/schema/mod.rs b/src/schema/mod.rs index ce9343a9..f6b436d0 100644 --- a/src/schema/mod.rs +++ b/src/schema/mod.rs @@ -29,7 +29,7 @@ mod occurrences; pub use occurrences::{Occurrences, OccurrencesMismatch}; pub use operations::{ AssignmentType, AssignmentsSchema, GenesisSchema, GlobalSchema, MetaSchema, OpFullType, - OpSchema, OpType, TransitionSchema, + OpSchema, TransitionSchema, }; pub use schema::{ AssignmentDetails, GlobalDetails, GlobalStateType, MetaDetails, MetaType, Schema, SchemaId, diff --git a/src/schema/operations.rs b/src/schema/operations.rs index 343b350d..3a38b457 100644 --- a/src/schema/operations.rs +++ b/src/schema/operations.rs @@ -50,27 +50,6 @@ pub type GlobalSchema = TinyOrdMap; pub type InputsSchema = TinyOrdMap; pub type AssignmentsSchema = TinyOrdMap; -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Display)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", rename_all = "camelCase") -)] -#[repr(u8)] -/// Node type: genesis and state transitions -pub enum OpType { - /// Genesis: single operation per contract, defining contract and - /// committing to a specific schema and underlying chain hash - #[display("genesis")] - Genesis = 0, - - /// State transition performing owned change to the state data and committing to (potentially - /// multiple) ancestors (i.e. genesis and/or other state transitions) via spending - /// corresponding transaction outputs assigned some state by ancestors - #[display("transition")] - StateTransition = 1, -} - /// Aggregated type used to supply full contract operation type and transition type information #[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display)] #[cfg_attr( @@ -80,11 +59,18 @@ pub enum OpType { )] pub enum OpFullType { /// Genesis operation (no subtypes) + /// + /// Genesis: single operation per contract, defining contract and + /// committing to a specific schema and underlying chain hash #[display("genesis")] Genesis, /// State transition contract operation, subtyped by transition type - #[display("state transition #{0}")] + /// + /// State transition performing owned change to the state data and committing to (potentially + /// multiple) ancestors (i.e. genesis and/or other state transitions) via spending + /// corresponding transaction outputs assigned some state by ancestors + #[display("transition #{0}")] StateTransition(TransitionType), } @@ -101,7 +87,6 @@ impl OpFullType { /// Trait defining common API for all operation type schemata pub trait OpSchema { - fn op_type(&self) -> OpType; fn metadata(&self) -> &MetaSchema; fn globals(&self) -> &GlobalSchema; fn inputs(&self) -> Option<&InputsSchema>; @@ -141,8 +126,6 @@ pub struct TransitionSchema { } impl OpSchema for GenesisSchema { - #[inline] - fn op_type(&self) -> OpType { OpType::Genesis } #[inline] fn metadata(&self) -> &MetaSchema { &self.metadata } #[inline] @@ -154,8 +137,6 @@ impl OpSchema for GenesisSchema { } impl OpSchema for TransitionSchema { - #[inline] - fn op_type(&self) -> OpType { OpType::StateTransition } #[inline] fn metadata(&self) -> &MetaSchema { &self.metadata } #[inline] diff --git a/src/validation/consignment.rs b/src/validation/consignment.rs index 7f4a543b..1f5cc8ce 100644 --- a/src/validation/consignment.rs +++ b/src/validation/consignment.rs @@ -31,8 +31,7 @@ use strict_types::TypeSystem; use super::EAnchor; use crate::{ AssignmentType, AssignmentsRef, BundleId, ContractId, Genesis, GlobalState, GraphSeal, - Metadata, OpFullType, OpId, OpType, Operation, Schema, Transition, TransitionBundle, - TransitionType, TypedAssigns, + Metadata, OpFullType, OpId, Operation, Schema, Transition, TransitionBundle, TypedAssigns, }; pub const CONSIGNMENT_MAX_LIBS: usize = 1024; @@ -48,13 +47,6 @@ pub enum OpRef<'op> { } impl<'op> Operation for OpRef<'op> { - fn op_type(&self) -> OpType { - match self { - Self::Genesis(op) => op.op_type(), - Self::Transition(op) => op.op_type(), - } - } - fn full_type(&self) -> OpFullType { match self { Self::Genesis(op) => op.full_type(), @@ -83,13 +75,6 @@ impl<'op> Operation for OpRef<'op> { } } - fn transition_type(&self) -> Option { - match self { - Self::Genesis(op) => op.transition_type(), - Self::Transition(op) => op.transition_type(), - } - } - fn metadata(&self) -> &Metadata { match self { Self::Genesis(op) => op.metadata(), diff --git a/src/validation/validator.rs b/src/validation/validator.rs index 82a3e204..5142cc93 100644 --- a/src/validation/validator.rs +++ b/src/validation/validator.rs @@ -36,8 +36,8 @@ use super::{CheckedConsignment, ConsignmentApi, DbcProof, EAnchor, Status, Valid use crate::operation::seal::ExposedSeal; use crate::vm::{ContractStateAccess, ContractStateEvolve, OrdOpRef, WitnessOrd}; use crate::{ - validation, BundleId, ChainNet, ContractId, OpId, OpType, Operation, Opout, OutputSeal, Schema, - SchemaId, TransitionBundle, + validation, BundleId, ChainNet, ContractId, OpFullType, OpId, Operation, Opout, OutputSeal, + Schema, SchemaId, TransitionBundle, }; #[derive(Clone, PartialEq, Eq, Debug, Display, Error, From)] @@ -338,7 +338,7 @@ impl< } if !self.validated_op_seals.borrow().contains(&opid) - && operation.op_type() == OpType::StateTransition + && matches!(operation.full_type(), OpFullType::StateTransition(_)) { self.status .borrow_mut() @@ -548,7 +548,7 @@ impl< continue; }; - let seal = if prev_op.op_type() == OpType::StateTransition { + let seal = if matches!(prev_op.full_type(), OpFullType::StateTransition(_)) { let Some(witness_id) = self.consignment.op_witness_id(op) else { self.status .borrow_mut() diff --git a/src/vm/contract.rs b/src/vm/contract.rs index 181e28fb..7073ba93 100644 --- a/src/vm/contract.rs +++ b/src/vm/contract.rs @@ -34,7 +34,7 @@ use strict_encoding::{StrictDecode, StrictDumb, StrictEncode}; use crate::{ AssignmentType, Assignments, AssignmentsRef, BundleId, ContractId, DataState, FungibleState, - Genesis, GlobalState, GlobalStateType, GraphSeal, Layer1, Metadata, OpFullType, OpId, OpType, + Genesis, GlobalState, GlobalStateType, GraphSeal, Layer1, Metadata, OpFullType, OpId, Operation, Transition, TransitionType, TypedAssigns, LIB_NAME_RGB_LOGIC, }; @@ -86,13 +86,6 @@ impl OrdOpRef<'_> { } impl<'op> Operation for OrdOpRef<'op> { - fn op_type(&self) -> OpType { - match self { - OrdOpRef::Genesis(op) => op.op_type(), - OrdOpRef::Transition(op, ..) => op.op_type(), - } - } - fn full_type(&self) -> OpFullType { match self { OrdOpRef::Genesis(op) => op.full_type(), @@ -121,13 +114,6 @@ impl<'op> Operation for OrdOpRef<'op> { } } - fn transition_type(&self) -> Option { - match self { - OrdOpRef::Genesis(op) => op.transition_type(), - OrdOpRef::Transition(op, ..) => op.transition_type(), - } - } - fn metadata(&self) -> &Metadata { match self { OrdOpRef::Genesis(op) => op.metadata(), @@ -144,8 +130,8 @@ impl<'op> Operation for OrdOpRef<'op> { fn assignments(&self) -> AssignmentsRef<'op> { match self { - OrdOpRef::Genesis(op) => (&op.assignments).into(), - OrdOpRef::Transition(op, ..) => (&op.assignments).into(), + OrdOpRef::Genesis(op) => op.assignments(), + OrdOpRef::Transition(op, ..) => op.assignments(), } } From 1d7d45ef05a10d4695e26fa581fd2cccff4477f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Mon, 7 Apr 2025 11:37:38 +0200 Subject: [PATCH 49/70] refactor: remove generic mpc_proof from anchor --- Cargo.lock | 8 +-- src/bin/rgbcore-stl.rs | 4 +- src/operation/assignments.rs | 28 +++++++++++ src/operation/bundle.rs | 35 +++++++++++++ src/operation/mod.rs | 2 +- src/stl.rs | 4 +- src/validation/commitments.rs | 4 +- src/validation/validator.rs | 23 ++------- stl/RGBCommit@0.1.0.sta | 46 +++++++++--------- stl/RGBCommit@0.1.0.stl | Bin 10804 -> 10804 bytes stl/RGBCommit@0.1.0.sty | 14 +++--- stl/RGBLogic@0.1.0.sta | 28 +++++------ stl/RGBLogic@0.1.0.stl | Bin 1423 -> 1423 bytes stl/RGBLogic@0.1.0.sty | 14 +++--- ...dBundle.vesper => TransitionBundle.vesper} | 2 +- 15 files changed, 129 insertions(+), 83 deletions(-) rename stl/{AnchoredBundle.vesper => TransitionBundle.vesper} (99%) diff --git a/Cargo.lock b/Cargo.lock index e6200df6..e03d82e3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -212,7 +212,7 @@ dependencies = [ [[package]] name = "bp-consensus" version = "0.11.1-alpha.1" -source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#2f0fd1f6c5cd81f748bacd8237993bdb7bdfe9d1" +source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#55e5cd9ba902c198ae4cfdcc241047a6190630cd" dependencies = [ "amplify", "chrono", @@ -226,7 +226,7 @@ dependencies = [ [[package]] name = "bp-core" version = "0.11.1-alpha.1" -source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#2f0fd1f6c5cd81f748bacd8237993bdb7bdfe9d1" +source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#55e5cd9ba902c198ae4cfdcc241047a6190630cd" dependencies = [ "amplify", "bp-consensus", @@ -244,7 +244,7 @@ dependencies = [ [[package]] name = "bp-dbc" version = "0.11.1-alpha.1" -source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#2f0fd1f6c5cd81f748bacd8237993bdb7bdfe9d1" +source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#55e5cd9ba902c198ae4cfdcc241047a6190630cd" dependencies = [ "amplify", "base85", @@ -258,7 +258,7 @@ dependencies = [ [[package]] name = "bp-seals" version = "0.11.1-alpha.1" -source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#2f0fd1f6c5cd81f748bacd8237993bdb7bdfe9d1" +source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#55e5cd9ba902c198ae4cfdcc241047a6190630cd" dependencies = [ "amplify", "baid64", diff --git a/src/bin/rgbcore-stl.rs b/src/bin/rgbcore-stl.rs index 45908e92..1101fe05 100644 --- a/src/bin/rgbcore-stl.rs +++ b/src/bin/rgbcore-stl.rs @@ -138,11 +138,11 @@ Transition vesper lexicon=types+commitments let tt = sys.type_tree("RGBCommit.Transition").unwrap(); writeln!(file, "{tt}").unwrap(); - let mut file = fs::File::create(format!("{dir}/AnchoredBundle.vesper")).unwrap(); + let mut file = fs::File::create(format!("{dir}/TransitionBundle.vesper")).unwrap(); writeln!( file, "{{- - Description: RGB Anchored Bundles + Description: RGB Transition Bundles Author: Dr Maxim Orlovsky Copyright (C) 2024 LNP/BP Standards Association. All rights reserved. License: Apache-2.0 diff --git a/src/operation/assignments.rs b/src/operation/assignments.rs index 1b6a237e..a2af2de4 100644 --- a/src/operation/assignments.rs +++ b/src/operation/assignments.rs @@ -392,6 +392,34 @@ impl TypedAssigns { }) } + pub fn reveal_seal(&mut self, seal: Seal) { + fn reveal( + vec: &mut NonEmptyVec, U16>, + revealed: Seal, + ) { + for assign in vec.iter_mut() { + match assign { + Assign::ConfidentialSeal { seal, state, lock } + if *seal == revealed.conceal() => + { + *assign = Assign::Revealed { + seal: revealed, + state: state.clone(), + lock: *lock, + } + } + _ => {} + } + } + } + + match self { + TypedAssigns::Declarative(v) => reveal(v, seal), + TypedAssigns::Fungible(v) => reveal(v, seal), + TypedAssigns::Structured(v) => reveal(v, seal), + } + } + pub fn to_confidential_seals(&self) -> Vec { match self { TypedAssigns::Declarative(s) => s diff --git a/src/operation/bundle.rs b/src/operation/bundle.rs index 9e586450..d51726c7 100644 --- a/src/operation/bundle.rs +++ b/src/operation/bundle.rs @@ -28,6 +28,8 @@ use bp::Vout; use commit_verify::{mpc, CommitEncode, CommitEngine, CommitId, CommitmentId, DigestExt, Sha256}; use strict_encoding::{StrictDumb, StrictEncode}; +use super::GraphSeal; +use crate::operation::operations::Operation; use crate::{OpId, Transition, LIB_NAME_RGB_COMMIT}; pub type Vin = Vout; @@ -101,6 +103,10 @@ impl<'a> IntoIterator for &'a InputMap { fn into_iter(self) -> Self::IntoIter { self.0.iter() } } +#[derive(Clone, Eq, PartialEq, Debug, Display, Error)] +#[display("state transition {0} is not a part of the bundle.")] +pub struct UnrelatedTransition(OpId, Transition); + #[derive(Clone, PartialEq, Eq, Debug, From)] #[derive(StrictType, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB_COMMIT)] @@ -131,4 +137,33 @@ impl StrictDumb for TransitionBundle { impl TransitionBundle { pub fn bundle_id(&self) -> BundleId { self.commit_id() } + + pub fn reveal_seal(&mut self, bundle_id: BundleId, seal: GraphSeal) -> bool { + if self.bundle_id() != bundle_id { + return false; + } + self.known_transitions + .values_mut() + .flat_map(|t| t.assignments.values_mut()) + .for_each(|a| a.reveal_seal(seal)); + + true + } + + pub fn reveal_transition( + &mut self, + transition: Transition, + ) -> Result { + let opid = transition.id(); + if self.input_map.values().all(|ids| !ids.contains(&opid)) { + return Err(UnrelatedTransition(opid, transition)); + } + if self.known_transitions.contains_key(&opid) { + return Ok(false); + } + self.known_transitions + .insert(opid, transition) + .expect("same size as input map"); + Ok(true) + } } diff --git a/src/operation/mod.rs b/src/operation/mod.rs index 4e016fb0..90db9b86 100644 --- a/src/operation/mod.rs +++ b/src/operation/mod.rs @@ -35,7 +35,7 @@ mod commit; pub use assignments::{ Assign, AssignData, AssignFungible, AssignRights, Assignments, AssignmentsRef, TypedAssigns, }; -pub use bundle::{BundleId, InputMap, TransitionBundle, Vin}; +pub use bundle::{BundleId, InputMap, TransitionBundle, UnrelatedTransition, Vin}; pub use commit::{ AssignmentCommitment, AssignmentIndex, BaseCommitment, BundleDisclosure, ContractId, DiscloseHash, GlobalCommitment, OpCommitment, OpDisclose, OpId, TypeCommitment, diff --git a/src/stl.rs b/src/stl.rs index 65e618f6..c1c7ae80 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -37,10 +37,10 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_COMMIT: &str = - "stl:pjinUG!S-9vK!Zks-lJfwoRW-XvQYSuF-90Dpgm0-gP$TQ7c#ibiza-monica-quiz"; + "stl:AGPeGYUo-lxaWEte-eXAkJZ7-EkGUAO5-uzhRKh1-lEWb$0o#fiber-young-pilot"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:o5J6JwXD-3EVitHi-mleEGlu-gsebHqL-SRCL!cb-9S1pGDc#tonight-clock-insect"; + "stl:XNNXe4c$-NCzocLO-pGXd41i-z82QU1a-RsJWJzl-bFjYuOE#level-puzzle-union"; fn _rgb_commit_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_COMMIT), tiny_bset! { diff --git a/src/validation/commitments.rs b/src/validation/commitments.rs index 6ca98014..c59b412e 100644 --- a/src/validation/commitments.rs +++ b/src/validation/commitments.rs @@ -25,7 +25,7 @@ use bp::dbc::tapret::TapretProof; use bp::dbc::Method; use bp::{dbc, Tx}; use commit_verify::mpc::Commitment; -use commit_verify::{mpc, ConvolveVerifyError, EmbedVerifyError}; +use commit_verify::{ConvolveVerifyError, EmbedVerifyError}; use strict_encoding::{StrictDeserialize, StrictDumb, StrictSerialize}; use crate::LIB_NAME_RGB_LOGIC; @@ -117,4 +117,4 @@ impl dbc::Proof for DbcProof { } /// Anchor which DBC proof is either Tapret or Opret. -pub type EAnchor

= dbc::Anchor; +pub type EAnchor = dbc::Anchor; diff --git a/src/validation/validator.rs b/src/validation/validator.rs index 5142cc93..3b392ae5 100644 --- a/src/validation/validator.rs +++ b/src/validation/validator.rs @@ -32,7 +32,7 @@ use commit_verify::mpc; use single_use_seals::SealWitness; use super::status::{Failure, Warning}; -use super::{CheckedConsignment, ConsignmentApi, DbcProof, EAnchor, Status, Validity}; +use super::{CheckedConsignment, ConsignmentApi, EAnchor, Status, Validity}; use crate::operation::seal::ExposedSeal; use crate::vm::{ContractStateAccess, ContractStateEvolve, OrdOpRef, WitnessOrd}; use crate::{ @@ -463,25 +463,8 @@ impl< } Ok(pub_witness) => { let seals = seals.as_ref(); - match anchor.clone() { - EAnchor { - mpc_proof, - dbc_proof: DbcProof::Tapret(tapret), - .. - } => { - let witness = Witness::with(pub_witness.clone(), tapret); - self.validate_seal_closing(seals, bundle_id, witness, mpc_proof) - } - EAnchor { - mpc_proof, - dbc_proof: DbcProof::Opret(opret), - .. - } => { - let witness = Witness::with(pub_witness.clone(), opret); - self.validate_seal_closing(seals, bundle_id, witness, mpc_proof) - } - } - + let witness = Witness::with(pub_witness.clone(), anchor.dbc_proof.clone()); + self.validate_seal_closing(seals, bundle_id, witness, anchor.mpc_proof.clone()); Some(pub_witness) } } diff --git a/stl/RGBCommit@0.1.0.sta b/stl/RGBCommit@0.1.0.sta index 8a779de7..4c1d24a3 100644 --- a/stl/RGBCommit@0.1.0.sta +++ b/stl/RGBCommit@0.1.0.sta @@ -1,18 +1,18 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:pjinUG!S-9vK!Zks-lJfwoRW-XvQYSuF-90Dpgm0-gP$TQ7c#ibiza-monica-quiz +Id: stl:AGPeGYUo-lxaWEte-eXAkJZ7-EkGUAO5-uzhRKh1-lEWb$0o#fiber-young-pilot Name: RGBCommit Dependencies: - BPCore#symbol-tropic-grand, StrictTypes#century-comrade-chess, AluVM#congo-archive-folio, + BPCore#alfonso-andrea-nitro, CommitVerify#miller-pancake-elastic, Std#ralph-blue-lucky, Bitcoin#signal-color-cipher -Check-SHA256: 55c75be3a790e121a64a50dea82730ccea21eb4fc1c7899b1c392826a65864fa +Check-SHA256: 3f121070329897b93c5a3db6eb6e0e06340aaf1693c94ce3a091ade9d93e5d60 -2~tNwLvL+uX>4E? +2~tNwLvL+uX>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI)Q*?4^V{}w`aAk91a5aA+<>R2X +hQO_4{AcS-HH^7AVzASV8M4NYxyCjHL2PwaO=-MC!n#D6Bwsd4E? M+l67UG^w8*<_XZ#%uyqCj(P-Wc6$lVk7oBr%DNv+($;q`HHK!gIHa)*%m(-e#9sm3I{@IbYpL6ZUzNG Y;{&m0sw9Ap(f$Hb>aU=OZ$bvG|>z)+>9PT;Au-7)~D;-++hbyX<}1pbY-V7RRS&fT*&Z=qeY@Wmfle* z!SF)@h8|JkU^FEQwjx4X<|ua20~CnZ*pY>04xKINJ~fc1UzTDb_LBRjrSXj?;k=^zm6d~Uh7!wPz^$C @@ -29,30 +29,30 @@ WRm@*ULd%lgGoFTxU-Vi}-aA;vuZDDL|OmAdib7%`wbaH89bX0k8Wpe`n8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!} 0yp?_2}WsUY-CPhZDmsy2!s^Lf^?|9I@Xg>Oi(W05|TJ%PM*ricn_PmXk-Xfd2nS;VQpn=1fvw5rj-B| XP@r^w5ufb=C_Ju$l1`nW&GEpSWb-vQ)O*QWH|sJL349yXKqquc4c8~Wn@HQbYVhlX>MdwWnpYocu;h5 -1OfmEa%Fa9VQgh&00sjDb7f&{0wHj#q4l6D4ZcK)2hLYH81C&KXiWu&flb+s{C0G-{HLh$xdReUg_1Rx +1OfmEa%Fa9VQgh&00sjDb7f&{0%^QM!n#D6BwsdfIfIJJaHJF7}X$37Y21E`BySDf%$MYb{T~|g0b97;JWdSuhh8FxqMGF>;)g%0j +Y-MCtVQh6}LTqVnWK(5fY*ctqbaDg&00?qrc4c8~Wn=&b0|awrVQd0vyhFmeM42RCHjlC4yY9{_<+2() +V(hUy9_7A3a`d66sPef35>JJaHJF7}X$37Y21E`BySDf%$MYb{T~|g0b97;JWdSuhh8FxqMGF>;)g%0j &kVcqmr((;)g%0j&kVcqmr((*O1aoC!Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEQdsjYvyJ^#nX; +WCQ{L2y$h1WnpY(WB>*O1aoC!YyxS#L&Ca5nIvB}kFnvq?#?UavKl;M?6Er@<-S02^r0*RjYvyJ^#nX; x^@N4Cyn`(=BbYXO50W~^?7W_p;3l@ykBm9id47>4{Q314kUM@UiqyMDEzyxe> V`~C>10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)y -umJ%95Mys{W@%()Zggp3Y*S@nYybuW1aoC!Yyu&0tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwESop +umJ%95Mys{W@%()Zggp3Y*S@nYybuW1aoC!YyxS#L&Ca5nIvB}kFnvq?#?UavKl;M?6Er@<-S02^r2`O >%7&o7^|1Fn59cLW!>7R25;!;B4{Q314kUM@Ui qyMDEzyxe>V`~C>10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^ ^xj-FXm+)yumJ%nL349yXKq$yV?lFsX=iRyWp-s@Y-MCbVRT_aY-w&}Q)OXnRCrKyas>eZ2mwiP2M#dZ @@ -64,17 +64,17 @@ R$**)WkPIeZe&wsVQf@*X=DWf00;qJNbG0cIzBFIR(d`#um0T+f+Ht6TBtC0P;Q%&@2p?}0000000030 {{R300000cL349yXKq$yV?lFsX=iR$Z)s#xbYXO5LTqVnWK(5fY*ctqbaDj&00;qZ5rO!{8)EH;S9MW+ MiYCt`=$1Ml8xm!DM3(T_tVn>0000000030{{R300000bL349yXKq$yV?lFsX=iR$Z)s#xbYXO5LTqVn WK(5fY*ct@WCZ~L2m!NB&vqal|NIC80+R(C@tCsLzU&b{L$ZMdwWnpYocu;h51OfmEa%Fa9VQgh&00sjDb7f&{0wHj#q4l6D4ZcK)2hLYH -81C&KXiWu&flb+s{C0G-{HLh$xdReUg_1Rxg;i+MdwWnpYocu;h51OfmEa%Fa9VQgh&00sjDb7f&{0%^QM!n#D6BwsdMdwWnpYo -cxhw=0sshdWp-s@Y-MBs1_K0hWnpXrA#kgq^`I&ZzC?)!&R01Y?(H9FO$CR6P1%k7c67A-ECY>5OGott +cxhw=0sshdWp-s@Y-MBs1_K0hWnpXrX}m+ix5OGott JZHLg1Ujv+c;>sahi1#@&^bY%f9vZekPz%WEGnBZKS8(M7E9_@AwVcyGtCevi|7U8=D Y;R+00(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCd;@jJLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQ -wWqKF0Ra$WZ*FF3WMyu2X<=+rWnpXp1_K0hWnpXrA#kgq^`I&ZzC?)!&R01Y?(H9FO$CR6P1%k7c67A- +wWqKF0Ra$WZ*FF3WMyu2X<=+rWnpXp1_K0hWnpXrX}m+ix4-_0}yX_Ze?UsbYXO5Q)6glZD9csRd<+X z`D`l)D}tCfm#{*R8=rEeO^)M}Caf4_sukxP!V2fJsZW;WBGTtpoN1fAxzm^k8+(zL aD6jWUR^vA!Y#PXs^Z5xoa(vXU)- z*qj2K^NUg^zZX}SsBJVkP(fki5@tD*IvDh<9wi3iSCIT-HkA81Vlhk;Gmjr?|WwEPA_P(yEWWu`c%P;Zj<^1fzEB_;eQ -MP=_ngsvCe1EvYIfdA7&w+T{5LPKwDZE1A%Y!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkk +2vSEvOmAmtV*>zV-Wi1`mll>1*PdJn31_h+89)x^?BPVHb(BS$|4Io`M?ynyZEb0EX}m+ixja}LTPkk Z)t7=20~CnZ*pY?00DdlT>wB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 wjY>38tto&d&=eG4cRAF#( @@ -19,16 +19,16 @@ V{&P5bg6}ecT=8d`>?<6$C@F;S3|*6`1-v+nBdcqJ?FPKcnV2wbY*gGVQf%qwlfK-7{9iX4Q|L-q$GzU Mp|h#f#{Gz8SzLEaTf~c{WkYggkPIjuQHS#3Ua|L6d7%qre2Ut&TYs@(?%#f7ArN-=Rj?7Ns(14peesZgXjLX>V>+d2nTU#Mns) Y&M6LqDeqU-jv95KHlThh+c{38p;h*Y8ns*OksItaxs<2=6W7=VqesjRYGc!>wZFzp>JB4@xD;^wu&SY -_r(NHa7knZ00=~4V^DH$Z)OAn0S0toaB^jI00jX8A#kgq^`I&ZzC?)!&R01Y?(H9FO$CR6P1%k7c67A- -54IneKN{_;j(f`H9IfkFzO$PG=uAF%>iaxCSnRl2&38AmXJiCw9urENI6IdKM{I9mVQf!wWCj8SZ*Wg?WC5=uAF%>iaxCSnRl2&38AmXJiCw9urENI6IdKM{I9mVQf!wWCj8SZ*Wg?WC5$Mo0RIYfa$#@6CZU6=Z2X|?7Ze??G0gvlp0sK<6W+n*cBpJ9-*worFk3Ek7Mz>CQ0ZEXBf&z4T0;V{pP;Zj<^1fzE -B_;eQMP=_ngsvCe1EvYIfdA7&w=_}@t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zc -aA{-$rZ}fiZ<6-%zGh1$CHyEwW$!_Rt{2?{rU|rw|I@6CZU6=Z2X|?7Ze??G0gvlp0sK<6W+n*cBpJ9-*worFk3Ek7Mz>CQ0ZEXBf&z4T0sv#)8HFg97M2p% +o?HnDXR#z1Kn~{Y;Y6r)ltr8WN;Fart`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zc +aA{-$0At=6g(#O6mJ-*VTnPzhu_PHl4(9CPM5uL?MVtRhmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`Zq Bog<<3Rh`#Ze??GPjX}g1ONqXX>Mg?00jX7T-**L6)$-r+lRyXoI{GIo*U3CNI7Emc=xo*$N+#60SRDb5bYX39002k -----END STRICT TYPE LIB----- diff --git a/stl/RGBLogic@0.1.0.stl b/stl/RGBLogic@0.1.0.stl index 4098bc96e60676557fb5f7b1e4549a7959f8bac2..0728e14732eab86d78c7fac5738148bdeb7c629a 100644 GIT binary patch delta 297 zcmeC@?&pr?2y%Dw$xqKrW@bpfC)uhoU2K}r^?5Ozoaq}?Bpvvky?N-eqI8Pu?EhYz zK$Xt|FALe60-W=UQa45) xWl|udcCrJrHep4+j0%%iGj}Nva^vJ4CWXnREc}EOE@7EMSkZ1K#mSYdVgTvvf#m=I delta 297 zcmeC@?&pr?2y%Dw$xqKrW>zd%z3}S-E#7@Do$TkrEhXN)mCx{HZEy6w+54xgWXm5m zrvT^tqSR#;%LDQ!efzX8&0AIVkA`dNd&ib_;&+*sac*h&f7y9EC(uCW{M_8kl8w Copyright (C) 2024 LNP/BP Standards Association. All rights reserved. License: Apache-2.0 From d9adbe9abaf121b488bdbc541f578ab7d7cb2f9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Wed, 16 Apr 2025 17:53:15 +0200 Subject: [PATCH 50/70] schema: remove timestamp and developer --- src/schema/schema.rs | 6 +-- src/stl.rs | 4 +- stl/RGBCommit@0.1.0.sta | 81 ++++++++++++++++++++-------------------- stl/RGBCommit@0.1.0.stl | Bin 10804 -> 10748 bytes stl/RGBCommit@0.1.0.sty | 6 +-- stl/RGBLogic@0.1.0.sta | 18 ++++----- stl/RGBLogic@0.1.0.stl | Bin 1423 -> 1423 bytes stl/RGBLogic@0.1.0.sty | 4 +- stl/Schema.vesper | 4 -- 9 files changed, 56 insertions(+), 67 deletions(-) diff --git a/src/schema/schema.rs b/src/schema/schema.rs index fe5479d6..b7b930c2 100644 --- a/src/schema/schema.rs +++ b/src/schema/schema.rs @@ -37,7 +37,7 @@ use strict_encoding::{ use strict_types::{FieldName, SemId}; use super::{AssignmentType, GenesisSchema, OwnedStateSchema, TransitionSchema}; -use crate::{impl_serde_baid64, Ffv, GlobalStateSchema, Identity, StateType, LIB_NAME_RGB_COMMIT}; +use crate::{impl_serde_baid64, Ffv, GlobalStateSchema, StateType, LIB_NAME_RGB_COMMIT}; #[derive(Wrapper, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From, Display)] #[wrapper(FromStr, LowerHex, UpperHex)] @@ -194,8 +194,6 @@ pub struct Schema { pub flags: ReservedBytes<1, 0>, pub name: TypeName, - pub timestamp: i64, - pub developer: Identity, pub meta_types: TinyOrdMap, pub global_types: TinyOrdMap, @@ -214,8 +212,6 @@ impl CommitEncode for Schema { e.commit_to_serialized(&self.flags); e.commit_to_serialized(&self.name); - e.commit_to_serialized(&self.timestamp); - e.commit_to_serialized(&self.developer); e.commit_to_map(&self.meta_types); e.commit_to_map(&self.global_types); diff --git a/src/stl.rs b/src/stl.rs index c1c7ae80..0bc4e2c7 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -37,10 +37,10 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_COMMIT: &str = - "stl:AGPeGYUo-lxaWEte-eXAkJZ7-EkGUAO5-uzhRKh1-lEWb$0o#fiber-young-pilot"; + "stl:VMoGHWGd-Bb0PUQt-oo48ZNg-bad21Fm-$MYF4xW-9gN8Fp4#oscar-cave-adam"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:XNNXe4c$-NCzocLO-pGXd41i-z82QU1a-RsJWJzl-bFjYuOE#level-puzzle-union"; + "stl:!sVZDHHT-bSxOrfy-FHVQlRp-PQTlIDy-iv5XAmW-mjh24WY#banana-left-wisdom"; fn _rgb_commit_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_COMMIT), tiny_bset! { diff --git a/stl/RGBCommit@0.1.0.sta b/stl/RGBCommit@0.1.0.sta index 4c1d24a3..a53665ba 100644 --- a/stl/RGBCommit@0.1.0.sta +++ b/stl/RGBCommit@0.1.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:AGPeGYUo-lxaWEte-eXAkJZ7-EkGUAO5-uzhRKh1-lEWb$0o#fiber-young-pilot +Id: stl:VMoGHWGd-Bb0PUQt-oo48ZNg-bad21Fm-$MYF4xW-9gN8Fp4#oscar-cave-adam Name: RGBCommit Dependencies: StrictTypes#century-comrade-chess, @@ -8,7 +8,7 @@ Dependencies: CommitVerify#miller-pancake-elastic, Std#ralph-blue-lucky, Bitcoin#signal-color-cipher -Check-SHA256: 3f121070329897b93c5a3db6eb6e0e06340aaf1693c94ce3a091ade9d93e5d60 +Check-SHA256: 557efc63b15ec279982b8d9dc560b69a463032dcf2fc95c2811dbf0fecc231f9 2~tNwLvL+uX>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI)Q*?4^V{}w`aAk91a5aA+<>R2X hQO_4{AcS-HH^7AVzASV8M4NYxyCjHL2PwaO=-MC!n#D6BwsdIJVg&1PPwC}G0t$0Lb#i5700jX8Me3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C `}q*rYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj3{quwWnpY(WJFEY++|}0(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCX@GIcyL4!ji%3ykIZ4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HJt76^nC$%1sK -zB<;EQA|)S-x88IWKN#S$#@T&w`gPubZKp6b97;CZ~y>E31nqvO>-_DBy8`Vb0jGrW9$=2qSMXvL3Hm|g$K5F!?HDuBcElf~?0000000000{{R30000002WMq&WpinB0ZwennxGPI(od8R -ooadlAElm^Clat;Ot{#TZWc0Cjtg{hVQzD2bZKvHa{vkfG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj? -7Ns(10jIWVom4HC=;Sf&(V=@3j=0mb^+R(Q4?4eR(6nw -`65I6*X)C9iYp+?yjr7~y;ZDn*} -WMOn+0rh%KI9Y!AFx9LCk8@hQXE7w+qW3^C%eTEp@#^?_H3w&GZ(?C=a{=BXk!z-`g4hv-$6z_YxoLZ_ -neUP>BpbEf7FA*KKfDHMZg6#Ua{-JTpQ=d>V!gG67g8znL|~8a@>)b41H3?r4>NPGDVYmlb8~5DZf#|5 -baMfWk0~o57O4jQiSPQLM-Anyjgk|p#*FIpQO-iyoZ8t5c42I3WMOn~asqk-9p7nv%krpqN@L7b8`ZE10COKearHw -cS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%Hb7^O8VRUtJ -WdH;M00eGtZe;)f009JZZ*64&1pxs>!tI8CO};e1CqOk74-_0uXd^VQzD2bZKvHQ)6glZD9ed -f2kfhA@=uGO=Jtx#~n~$5JW2|a}~7vfDWQsGAeQeZeeX@0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If -6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~au8HvO>-_DBy8`Vb0jGrW9$=2qSMXvL3HGEG -0000000000{{R300000025D|^b#!w83IT`y;$>KfZ0H=mhJ>?uVKf -Z0H=mhJ>?uVR2XhQO_4{AcS-HH^7A -VzASV8M4NYxyCka@1Z8)ymjIKNK5;L!8FkfGTe+FK;UUh9M-4n+}vRfRB~Z%b7^#GZ*Ek1aAgGn0006G -RC#b^LvL+uX>@I6Zgd0!00(DfZe??6a{vVa0kRZVdkxgXIndDSADQRhP(T)gL{x5+9gElmgZ0zBM*#|S -a$#@6CZU6-W0iOsgNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G66JF53UoI8eY9A{1GERg--Gi -I0S#x1is&)M%fmnGH4o9d2nT9L349yXKr&sY-w&}Q)OXnRCrKyas&ea3uI+uY+-U?bZK^F00jX7ts#@n -)qreE>X2y^k8(W~9rIKz;itzCh0mxeNOd2nT9 -L349yXKr&sY-w&}Q)OXnRCsA*1OosIWMyM)VRB(~X?A4*1pxuVBMJ2TDGb!?hS4?jmbTrNwsBI9)_*>; -PXlMNnHxp{2xfI|XK7+=WdH>M0d)~d*A-s;(%@Iu7W%7*6Z_!y?t0-mQA1p*Ph+UT00IhgbaHiLbairN -WB>&L0lFe0BpVsjR%EDjMz&}PzMK%GtpWOEsvFV}w(K~B)(KW`X=GD$VRU5$0RR91 +zB<;EQA|)S-x88IWKN#S$#@T&w`gPuZDn*}RC#b^a{vkfb>vO>-_DBy8`Vb0jGrW9$=2qSMXvL3Hm|g$K5F!?HDuBcElf~?0000000000{{R30000002WMq&WpinB0Zwen +nxGPI(od8RooadlAElm^Clat;Ot{#TZWc0Cjtg{hVQzD2bZKvHa{vkfG*S<)6P6lYy(#<=BR_>s@(?%# +f7ArN-=Rj?7Ns(10jIWVom4HC=;Sf&(V=@3j=0mb^+R( +Q4?4eR(6nw`65I6*X)C9iYp+?yj +r7~y;ZDn*}WMOn+0rh%KI9Y!AFx9LCk8@hQXE7w+qW3^C%eTEp@#^?_H3w&GZ(?C=a{=BXk!z-`g4hv- +$6z_YxoLZ_neUP>BpbEf7FA*KKfDHMZg6#Ua{-JTpQ=d>V!gG67g8znL|~8a@>)b41H3?r4>NPGDVYml +b8~5DZf#|5baMfWk0~o57O4jQiSPQLM-Anyjgk|p#*FIpQO-iyoZ8t5c42I3WMOn~asqk-9p7nv%krpq +N@L7b8`ZE +10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%H +b7^O8VRUtJWdH;M00eGtZe;)f009JZZ*64&1pxs>!tI8CO};e1CqOk74-_0uXd^VQzD2bZKvH +Q)6glZD9edf2kfhA@=uGO=Jtx#~n~$5JW2|a}~7vfDWQsGAeQeZeeX@0!8YhU)%QMkO4aJ;_ZeCe;xE! +X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~au8HvO>-_DBy8`Vb0jGrW9$=2qSMXvL3HGEG0000000000{{R300000025D|^b#!w83IT`y;$>KfZ0H=mhJ>?uVKfZ0H=mhJ>?uVR2XhQO_4 +{AcS-HH^7AVzASV8M4NYxyCka@1Z8)ymjIKNK5;L!8FkfGTe+FK;UUh9M-4n+}vRfRB~Z%b7^#GZ*Ek1 +aAgGn0006GRC#b^LvL+uX>@I6Zgd0!00(DfZe??6a{vVa0kRZVdkxgXIndDSADQRhP(T)gL{x5+9gElm +gZ0zBM*#|Sa$#@6CZU6-W0iOsgNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G66JF53UoI8eY9A +{1GERg--GiI0S#x1is&)M%fmnGH4o9d2nT9L349yXKr&sY-w&}Q)OXnRCrKyas&ea3uI+uY+-U?bZK^F +00jX7ts#@n)qreE>X2y^k8(W~9rIKz;itzCh0mxeNOd2nT9L349yXKr&sY-w&}Q)OXnRCsA*1OosIWMyM)VRB(~X?A4*1pxuVBMJ2TDGb!?hS4?jmbTrN +wsBI9)_*>;PXlMNnHxp{2xfI|XK7+=WdH>M0d)~d*A-s;(%@Iu7W%7*6Z_!y?t0-mQA1p*Ph+UT00Ihg +baHiLbairNWB>&L0lFe0BpVsjR%EDjMz&}PzMK%GtpWOEsvFV}w(K~B)(KW`X=GD$VRU5$0RR91 -----END STRICT TYPE LIB----- diff --git a/stl/RGBCommit@0.1.0.stl b/stl/RGBCommit@0.1.0.stl index 5ceeb901378ba37411034f8361d587dbe3fe20c4..22a9b6f7893dcc039b7eeaaafb4f2ee3290603c7 100644 GIT binary patch delta 22 dcmdlI@+WwMiUK3&WJ6`u$zBS5n*|hAI00UC2L1p5 delta 47 zcmewpyd`9ViUK3| ^ ..0xff MetaDetails} , globalTypes {GlobalStateType -> ^ ..0xff GlobalDetails} , ownedTypes {AssignmentType -> ^ ..0xff AssignmentDetails} diff --git a/stl/RGBLogic@0.1.0.sta b/stl/RGBLogic@0.1.0.sta index 1cc92052..35bbf8db 100644 --- a/stl/RGBLogic@0.1.0.sta +++ b/stl/RGBLogic@0.1.0.sta @@ -1,13 +1,13 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:XNNXe4c$-NCzocLO-pGXd41i-z82QU1a-RsJWJzl-bFjYuOE#level-puzzle-union +Id: stl:!sVZDHHT-bSxOrfy-FHVQlRp-PQTlIDy-iv5XAmW-mjh24WY#banana-left-wisdom Name: RGBLogic Dependencies: - RGBCommit#fiber-young-pilot, + RGBCommit#oscar-cave-adam, BPCore#alfonso-andrea-nitro, Bitcoin#signal-color-cipher -Check-SHA256: 1a3bfcbadbc2fc1986e35610ec8797ddc4824d18132ea4bbe42d936815ac3d01 +Check-SHA256: fe39a47c800ab0a98b0c5c5af3f8ec86dbc25b63d58c1902d275f1fa96745641 -2vSEvOmAmtV*>zV-Wi1`mll>1*PdJn31_h+89)x^?BPVHb(BS$|4Io`M?ynyZEb0EX}m+ixja}LTPkk Z)t7=20~CnZ*pY?00DdlT>wB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 wjY>38tto&d&=e=uAF%>iaxCSnRl2&38AmXJiCw9urENI6IdKM{I9mVQf!wWCj8SZ*Wg?WC5$Mo0RIYfa$#@6CZU6=Z2X|?7Ze??G0gvlp0sK<6W+n*cBpJ9-*worFk3Ek7Mz>CQ0ZEXBf&z4T0sv#)8HFg97M2p% -o?HnDXR#z1Kn~{Y;Y6r)ltr8WN;Fart`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zc -aA{-$0At=6g(#O6mJ-*VTnPzhu_PHl4(9CPM5uL?MVtRhmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`Zq +X>@6CZU6=Z2X|?7Ze??G0gvlp0sK<6W+n*cBpJ9-*worFk3Ek7Mz>CQ0ZEXBf&z4T0#wQd9bugXy$?|f +XrqrAHU`>vZAF{&7#ECI_5*wto-|Sqt`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zc +aA{-$RLTY&VVwoN4^azfqmLOj2HJORMVs>&7mQZ+1AG>qmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`Zq Bog<<3Rh`#Ze??GPjX}g1ONqXX>Mg?00jX7T-**L6)$-r+lRyXoI{GIo*U3CNI7Emc=xo*$N+#60SR&7mQZ+1AG>qdBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W) 00aqiX>Db5bYX39002k -----END STRICT TYPE LIB----- diff --git a/stl/RGBLogic@0.1.0.stl b/stl/RGBLogic@0.1.0.stl index 0728e14732eab86d78c7fac5738148bdeb7c629a..fa1cae6533efba03d157f16fc1604d035722779e 100644 GIT binary patch delta 170 zcmeC@?&sFx2y%Dw$xqKrW)3;UCYv~ybuWJ)cgEs=Ni()v<+-l2KTC-BgneVK5u3MB hi Date: Fri, 18 Apr 2025 17:58:55 +0200 Subject: [PATCH 51/70] schema/operation: drop ReservedBytes --- src/lib.rs | 1 - src/operation/assignments.rs | 56 ++----- src/operation/commit.rs | 15 +- src/operation/mod.rs | 2 +- src/operation/operations.rs | 48 ++---- src/schema/schema.rs | 10 +- src/stl.rs | 4 +- src/validation/logic.rs | 8 +- src/validation/validator.rs | 14 +- stl/RGBCommit@0.1.0.sta | 293 ++++++++++++++++------------------- stl/RGBCommit@0.1.0.stl | Bin 10748 -> 8986 bytes stl/RGBCommit@0.1.0.sty | 101 ++++-------- stl/RGBLogic@0.1.0.sta | 20 +-- stl/RGBLogic@0.1.0.stl | Bin 1423 -> 1423 bytes stl/RGBLogic@0.1.0.sty | 12 +- stl/Schema.vesper | 3 - stl/Transition.vesper | 21 +-- stl/TransitionBundle.vesper | 18 +-- 18 files changed, 228 insertions(+), 398 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 4ca1c337..f60b6271 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -45,7 +45,6 @@ pub mod stl; pub mod prelude { pub use bp::Txid; - pub use commit_verify::ReservedBytes; pub use operation::*; pub use schema::*; diff --git a/src/operation/assignments.rs b/src/operation/assignments.rs index a2af2de4..8a171e7a 100644 --- a/src/operation/assignments.rs +++ b/src/operation/assignments.rs @@ -26,7 +26,7 @@ use std::collections::{btree_map, BTreeSet}; use std::hash::Hash; use amplify::confinement::{Confined, NonEmptyVec, TinyOrdMap, U16}; -use commit_verify::{Conceal, ReservedBytes}; +use commit_verify::Conceal; use strict_encoding::{StrictDecode, StrictDumb, StrictEncode}; use super::ExposedState; @@ -81,7 +81,7 @@ pub type AssignData = Assign; #[strict_type( lib = LIB_NAME_RGB_COMMIT, tags = custom, - dumb = { Self::Revealed { seal: strict_dumb!(), state: strict_dumb!(), lock: default!() } } + dumb = { Self::Revealed { seal: strict_dumb!(), state: strict_dumb!() } } )] #[cfg_attr( feature = "serde", @@ -90,17 +90,9 @@ pub type AssignData = Assign; )] pub enum Assign { #[strict_type(tag = 0x00)] - Revealed { - seal: Seal, - state: State, - lock: ReservedBytes<2, 0>, - }, + Revealed { seal: Seal, state: State }, #[strict_type(tag = 0x01)] - ConfidentialSeal { - seal: SecretSeal, - state: State, - lock: ReservedBytes<2, 0>, - }, + ConfidentialSeal { seal: SecretSeal, state: State }, } // Consensus-critical! @@ -128,30 +120,16 @@ impl PartialEq for Assign { impl Eq for Assign {} impl Assign { - pub fn revealed(seal: Seal, state: State) -> Self { - Assign::Revealed { - seal, - state, - lock: default!(), - } - } + pub fn revealed(seal: Seal, state: State) -> Self { Assign::Revealed { seal, state } } pub fn with_seal_replaced(assignment: &Self, seal: Seal) -> Self { match assignment { - Assign::ConfidentialSeal { - seal: _, - state, - lock, + Assign::ConfidentialSeal { seal: _, state } | Assign::Revealed { seal: _, state } => { + Assign::Revealed { + seal, + state: state.clone(), + } } - | Assign::Revealed { - seal: _, - state, - lock, - } => Assign::Revealed { - seal, - state: state.clone(), - lock: *lock, - }, } } @@ -216,10 +194,9 @@ where Self: Clone fn conceal(&self) -> Self::Concealed { match self { - Assign::Revealed { seal, state, lock } => Self::ConfidentialSeal { + Assign::Revealed { seal, state } => Self::ConfidentialSeal { seal: seal.conceal(), state: state.clone(), - lock: *lock, }, Assign::ConfidentialSeal { .. } => self.clone(), } @@ -229,15 +206,13 @@ where Self: Clone impl Assign { pub fn transmutate_seals(&self) -> Assign { match self { - Assign::ConfidentialSeal { seal, state, lock } => Assign::ConfidentialSeal { + Assign::ConfidentialSeal { seal, state } => Assign::ConfidentialSeal { seal: *seal, state: state.clone(), - lock: *lock, }, - Assign::Revealed { seal, state, lock } => Assign::Revealed { + Assign::Revealed { seal, state } => Assign::Revealed { seal: seal.transmutate(), state: state.clone(), - lock: *lock, }, } } @@ -399,13 +374,10 @@ impl TypedAssigns { ) { for assign in vec.iter_mut() { match assign { - Assign::ConfidentialSeal { seal, state, lock } - if *seal == revealed.conceal() => - { + Assign::ConfidentialSeal { seal, state } if *seal == revealed.conceal() => { *assign = Assign::Revealed { seal: revealed, state: state.clone(), - lock: *lock, } } _ => {} diff --git a/src/operation/commit.rs b/src/operation/commit.rs index 7a16b000..91d87e4e 100644 --- a/src/operation/commit.rs +++ b/src/operation/commit.rs @@ -32,7 +32,7 @@ use amplify::{hex, ByteArray, Bytes32, FromSliceError, Wrapper}; use baid64::{Baid64ParseError, DisplayBaid64, FromBaid64Str}; use commit_verify::{ mpc, CommitEncode, CommitEngine, CommitId, CommitmentId, Conceal, DigestExt, MerkleHash, - MerkleLeaves, ReservedBytes, Sha256, StrictHash, + MerkleLeaves, Sha256, StrictHash, }; use strict_encoding::StrictDumb; @@ -230,7 +230,6 @@ impl TransitionBundle { #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB_COMMIT)] pub struct BaseCommitment { - pub flags: ReservedBytes<1, 0>, pub schema_id: SchemaId, pub timestamp: i64, pub issuer: StrictHash, @@ -261,14 +260,11 @@ pub struct OpCommitment { pub globals: MerkleHash, pub inputs: MerkleHash, pub assignments: MerkleHash, - pub witness: MerkleHash, - pub validator: StrictHash, } impl Genesis { pub fn commit(&self) -> OpCommitment { let base = BaseCommitment { - flags: self.flags, schema_id: self.schema_id, timestamp: self.timestamp, chain_net: self.chain_net, @@ -282,8 +278,6 @@ impl Genesis { globals: MerkleHash::merklize(&self.globals), inputs: MerkleHash::void(0, u256::ZERO), assignments: MerkleHash::merklize(&self.assignments), - witness: MerkleHash::void(0, u256::ZERO), - validator: self.validator.commit_id(), } } @@ -300,8 +294,6 @@ impl Transition { globals: MerkleHash::merklize(&self.globals), inputs: MerkleHash::merklize(&self.inputs), assignments: MerkleHash::merklize(&self.assignments), - witness: MerkleHash::void(0, u256::ZERO), - validator: self.validator.commit_id(), } } } @@ -321,7 +313,6 @@ pub struct AssignmentCommitment { pub ty: AssignmentType, pub state: RevealedState, pub seal: SecretSeal, - pub lock: ReservedBytes<2, 0>, } impl CommitEncode for AssignmentCommitment { @@ -331,21 +322,19 @@ impl CommitEncode for AssignmentCommitment { e.commit_to_serialized(&self.ty); self.state.commit_encode(e); e.commit_to_serialized(&self.seal); - e.commit_to_serialized(&self.lock); e.set_finished(); } } impl Assign { pub fn commitment(&self, ty: AssignmentType) -> AssignmentCommitment { - let Self::ConfidentialSeal { seal, state, lock } = self.conceal() else { + let Self::ConfidentialSeal { seal, state } = self.conceal() else { unreachable!(); }; AssignmentCommitment { ty, state: state.state_data(), seal, - lock, } } } diff --git a/src/operation/mod.rs b/src/operation/mod.rs index 90db9b86..723e2f17 100644 --- a/src/operation/mod.rs +++ b/src/operation/mod.rs @@ -46,7 +46,7 @@ pub use global::{GlobalState, GlobalValues}; pub use layer1::{ChainNet, Layer1}; pub use meta::{MetaValue, Metadata, MetadataError}; pub use operations::{ - Genesis, Identity, Input, Inputs, Operation, Opout, OpoutParseError, Signature, Transition, + Genesis, Identity, Inputs, Operation, Opout, OpoutParseError, Signature, Transition, }; pub use seal::{ExposedSeal, GenesisSeal, GraphSeal, OutputSeal, SecretSeal, TxoSeal}; pub use state::{ExposedState, RevealedState, StateType}; diff --git a/src/operation/operations.rs b/src/operation/operations.rs index 6729170e..b92b1e52 100644 --- a/src/operation/operations.rs +++ b/src/operation/operations.rs @@ -26,9 +26,7 @@ use std::num::ParseIntError; use amplify::confinement::{Confined, NonEmptyOrdSet, TinyOrdSet, U16}; use amplify::{hex, Bytes64, Wrapper}; -use commit_verify::{ - CommitEncode, CommitEngine, CommitId, MerkleHash, MerkleLeaves, ReservedBytes, StrictHash, -}; +use commit_verify::{CommitEncode, CommitEngine, CommitId, MerkleHash, MerkleLeaves, StrictHash}; use strict_encoding::stl::AsciiPrintable; use strict_encoding::{RString, StrictDeserialize, StrictEncode, StrictSerialize}; @@ -42,6 +40,8 @@ use crate::{ #[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB_COMMIT)] +#[derive(CommitEncode)] +#[commit_encode(strategy = strict, id = MerkleHash)] #[cfg_attr( feature = "serde", derive(Serialize, Deserialize), @@ -79,54 +79,28 @@ pub enum OpoutParseError { #[wrapper(Deref)] #[wrapper_mut(DerefMut)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT, dumb = Self(NonEmptyOrdSet::with(Input::strict_dumb())))] +#[strict_type(lib = LIB_NAME_RGB_COMMIT, dumb = Self(NonEmptyOrdSet::with(Opout::strict_dumb())))] #[cfg_attr( feature = "serde", derive(Serialize, Deserialize), serde(crate = "serde_crate", transparent) )] -pub struct Inputs(NonEmptyOrdSet); +pub struct Inputs(NonEmptyOrdSet); impl<'a> IntoIterator for &'a Inputs { - type Item = Input; - type IntoIter = iter::Copied>; + type Item = Opout; + type IntoIter = iter::Copied>; fn into_iter(self) -> Self::IntoIter { self.0.iter().copied() } } impl MerkleLeaves for Inputs { - type Leaf = Input; - type LeafIter<'tmp> = as MerkleLeaves>::LeafIter<'tmp>; + type Leaf = Opout; + type LeafIter<'tmp> = as MerkleLeaves>::LeafIter<'tmp>; fn merkle_leaves(&self) -> Self::LeafIter<'_> { self.0.merkle_leaves() } } -#[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT)] -#[derive(CommitEncode)] -#[commit_encode(strategy = strict, id = MerkleHash)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", rename_all = "camelCase") -)] -#[display("{prev_out}")] -pub struct Input { - pub prev_out: Opout, - #[cfg_attr(feature = "serde", serde(skip))] - reserved: ReservedBytes<2>, -} - -impl Input { - pub fn with(prev_out: Opout) -> Input { - Input { - prev_out, - reserved: default!(), - } - } -} - /// RGB contract operation API, defined as trait /// /// Implemented by all contract operation types (see [`OpType`]): @@ -246,14 +220,12 @@ impl From<&'static str> for Identity { pub struct Genesis { pub ffv: Ffv, pub schema_id: SchemaId, - pub flags: ReservedBytes<1, 0>, pub timestamp: i64, pub issuer: Identity, pub chain_net: ChainNet, pub metadata: Metadata, pub globals: GlobalState, pub assignments: Assignments, - pub validator: ReservedBytes<1, 0>, } impl StrictSerialize for Genesis {} @@ -288,8 +260,6 @@ pub struct Transition { pub globals: GlobalState, pub inputs: Inputs, pub assignments: Assignments, - pub validator: ReservedBytes<1, 0>, - pub witness: ReservedBytes<2, 0>, pub signature: Option, } diff --git a/src/schema/schema.rs b/src/schema/schema.rs index b7b930c2..4f3f1dc2 100644 --- a/src/schema/schema.rs +++ b/src/schema/schema.rs @@ -28,9 +28,7 @@ use aluvm::library::LibId; use amplify::confinement::TinyOrdMap; use amplify::{ByteArray, Bytes32}; use baid64::{Baid64ParseError, DisplayBaid64, FromBaid64Str}; -use commit_verify::{ - CommitEncode, CommitEngine, CommitId, CommitmentId, DigestExt, ReservedBytes, Sha256, -}; +use commit_verify::{CommitEncode, CommitEngine, CommitId, CommitmentId, DigestExt, Sha256}; use strict_encoding::{ StrictDecode, StrictDeserialize, StrictEncode, StrictSerialize, StrictType, TypeName, }; @@ -191,7 +189,6 @@ impl_serde_baid64!(SchemaId); )] pub struct Schema { pub ffv: Ffv, - pub flags: ReservedBytes<1, 0>, pub name: TypeName, @@ -200,8 +197,6 @@ pub struct Schema { pub owned_types: TinyOrdMap, pub genesis: GenesisSchema, pub transitions: TinyOrdMap, - - pub reserved: ReservedBytes<8, 0>, } impl CommitEncode for Schema { @@ -209,7 +204,6 @@ impl CommitEncode for Schema { fn commit_encode(&self, e: &mut CommitEngine) { e.commit_to_serialized(&self.ffv); - e.commit_to_serialized(&self.flags); e.commit_to_serialized(&self.name); @@ -218,8 +212,6 @@ impl CommitEncode for Schema { e.commit_to_map(&self.owned_types); e.commit_to_serialized(&self.genesis); e.commit_to_map(&self.transitions); - - e.commit_to_serialized(&self.reserved); } } diff --git a/src/stl.rs b/src/stl.rs index 0bc4e2c7..eabd70c8 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -37,10 +37,10 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_COMMIT: &str = - "stl:VMoGHWGd-Bb0PUQt-oo48ZNg-bad21Fm-$MYF4xW-9gN8Fp4#oscar-cave-adam"; + "stl:taGMXEjW-1FDlac4-c6kFcnK-6iv9IXB-G0Gjhdz-Stoexsk#film-extreme-koala"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:!sVZDHHT-bSxOrfy-FHVQlRp-PQTlIDy-iv5XAmW-mjh24WY#banana-left-wisdom"; + "stl:KcBYRebN-pYf7mdW-bcI7bKj-GCGO3Lc-sBgzDJi-DWTBahs#lady-stadium-invent"; fn _rgb_commit_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_COMMIT), tiny_bset! { diff --git a/src/validation/logic.rs b/src/validation/logic.rs index 6f75a8c2..c55d8d7d 100644 --- a/src/validation/logic.rs +++ b/src/validation/logic.rs @@ -391,7 +391,7 @@ fn extract_prev_state( ) -> Assignments { let mut assignments: BTreeMap> = bmap! {}; for input in inputs { - let Opout { op, ty, no } = input.prev_out; + let Opout { op, ty, no } = input; let prev_op = match consignment.operation(op) { None => { @@ -418,7 +418,7 @@ fn extract_prev_state( } } } else { - status.add_failure(validation::Failure::NoPrevOut(opid, input.prev_out)); + status.add_failure(validation::Failure::NoPrevOut(opid, input)); } } Some(TypedAssigns::Fungible(prev_assignments)) => { @@ -436,7 +436,7 @@ fn extract_prev_state( } } } else { - status.add_failure(validation::Failure::NoPrevOut(opid, input.prev_out)); + status.add_failure(validation::Failure::NoPrevOut(opid, input)); } } Some(TypedAssigns::Structured(prev_assignments)) => { @@ -454,7 +454,7 @@ fn extract_prev_state( } } } else { - status.add_failure(validation::Failure::NoPrevOut(opid, input.prev_out)); + status.add_failure(validation::Failure::NoPrevOut(opid, input)); } } None => { diff --git a/src/validation/validator.rs b/src/validation/validator.rs index 3b392ae5..2ea7c442 100644 --- a/src/validation/validator.rs +++ b/src/validation/validator.rs @@ -354,10 +354,10 @@ impl< } OrdOpRef::Transition(transition, ..) => { for input in &transition.inputs { - if self.consignment.operation(input.prev_out.op).is_none() { + if self.consignment.operation(input.op).is_none() { self.status .borrow_mut() - .add_failure(Failure::OperationAbsent(input.prev_out.op)); + .add_failure(Failure::OperationAbsent(input.op)); } } } @@ -491,11 +491,11 @@ impl< // Checking that witness transaction closes seals defined by transition previous // outputs. for input in &transition.inputs { - let Opout { op, ty, no } = input.prev_out; - if !self.input_assignments.borrow_mut().insert(input.prev_out) { + let Opout { op, ty, no } = input; + if !self.input_assignments.borrow_mut().insert(input) { self.status .borrow_mut() - .add_failure(Failure::DoubleSpend(input.prev_out)); + .add_failure(Failure::DoubleSpend(input)); } let Some(prev_op) = self.consignment.operation(op) else { @@ -519,7 +519,7 @@ impl< let Ok(seal) = variant.revealed_seal_at(no) else { self.status .borrow_mut() - .add_failure(Failure::NoPrevOut(opid, input.prev_out)); + .add_failure(Failure::NoPrevOut(opid, input)); continue; }; let Some(seal) = seal else { @@ -527,7 +527,7 @@ impl< // full verification and have to report the failure self.status .borrow_mut() - .add_failure(Failure::ConfidentialSeal(input.prev_out)); + .add_failure(Failure::ConfidentialSeal(input)); continue; }; diff --git a/stl/RGBCommit@0.1.0.sta b/stl/RGBCommit@0.1.0.sta index a53665ba..18ef4857 100644 --- a/stl/RGBCommit@0.1.0.sta +++ b/stl/RGBCommit@0.1.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:VMoGHWGd-Bb0PUQt-oo48ZNg-bad21Fm-$MYF4xW-9gN8Fp4#oscar-cave-adam +Id: stl:taGMXEjW-1FDlac4-c6kFcnK-6iv9IXB-G0Gjhdz-Stoexsk#film-extreme-koala Name: RGBCommit Dependencies: StrictTypes#century-comrade-chess, @@ -8,7 +8,7 @@ Dependencies: CommitVerify#miller-pancake-elastic, Std#ralph-blue-lucky, Bitcoin#signal-color-cipher -Check-SHA256: 557efc63b15ec279982b8d9dc560b69a463032dcf2fc95c2811dbf0fecc231f9 +Check-SHA256: 6637dfec4be81234ae6fcdf64c8984953f17ba1044d3a45958366c73d7db4e5a 2~tNwLvL+uX>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI)Q*?4^V{}w`aAk91a5aA+<>R2X hQO_4{AcS-HH^7AVzASV8M4NYxyCjHL2PwaO=-MC!n#D6Bwsd04xKINJ~fc1UzTDb_LBRjrSXj?;k=^zm6d~Uh7!wPz^$C X>MdwWnpYocxhy48SA{&vly$FvzVnzHf7z~rv`86=_Ka^V5yX|y#`JSQ)OdvWpqi7rMzqbp%##b#$YGLi5Yl -(a@n1+Ku60FILp}Zw|!7cE!MGSxid=WmW`Kcxhw|LvL+uX>?X)a%pCH1pqjnLxv|61vo|?X)a%pCH0suIkLxv|61vo|-Vi}-aA;vuZDDL|OmAdib7%`wbaH89bX0k8Wpe`n8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!} -0yp?_2}WsUY-CPhZDmsy2!s^Lf^?|9I@Xg>Oi(W05|TJ%PM*ricn_PmXk-Xfd2nS;VQpn=1fvw5rj-B| -XP@r^w5ufb=C_Ju$l1`nW&GEpSWb-vQ)O*QWH|sJL349yXKqquc4c8~Wn@HQbYVhlX>MdwWnpYocu;h5 -1OfmEa%Fa9VQgh&00sjDb7f&{0%^QM!n#D6BwsdfIfIJJaHJF7}X$37Y21E`BySDf%$MYb{T~|g0b97;JWdSuhh8FxqMGF>;)g%0j -&kVcqmr((;)g%0j&kVcqmr((*O1aoC!YyxS#L&Ca5nIvB}kFnvq?#?UavKl;M?6Er@<-S02^r0*RjYvyJ^#nX; -x^@N4Cyn`(=BbYXO50W~^?7W_p;3l@ykBm9id47>4{Q314kUM@UiqyMDEzyxe> -V`~C>10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)y -umJ%95Mys{W@%()Zggp3Y*S@nYybuW1aoC!YyxS#L&Ca5nIvB}kFnvq?#?UavKl;M?6Er@<-S02^r2`O ->%7&o7^|1Fn59cLW!>7R25;!;B4{Q314kUM@Ui -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 -bY)XxXk~3-0d|<Z4!V_T!KNI`QJ|h6;Zj -^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pWQHG -ZU6uP000000RI300000001-!QZ(?C=Q*>c;Wm98lWo=;w0tItrZAoMTMe3tp+xFv-0Xp&G?S=|}9rRae -U`~uMrbA>C`}q*rYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj2yJ0_Npxjxa{vGX4@YcoVqt7k -bYXO5RC#b^1pxp60t`oNZ(?C=R$**)Wpf1q00;pxo>ox?`Aroor<$W|05z3@o%ygg4E?M+l67UG^w8*<_XZ#%uyq -CrG{{7b@t4MVjY>G@u4Q3HlB(d+LiLJm-R=h;`?dxBvhE000000RImF0000000l{IaCLMB0taw%Wp+<> -bODnPynwMZT8l5kSW@l}O=!>^xB4~9n`Dx!RtcK)nwJQ2Wpib6c4cG&dIKHbX?@G`sCP;~6&DQwR5(-f -xrUo0ThRw7=FYk8VVufK10Q-T=FR=Q=>S+XYD&R000000RR600000000961000000RR600000000v2J -aCLNZ1pxpF0o9FP2n?Horiuqf0^m>2O`jNRziT$b7#=ya6uYYC;sF2v000000RR600000001HiJbYVng -bYW?1a|Qwhb7gHwWCBI%qhH(hioJpYH;+t0eX2 -w~A!Q+0eaZ{MVycPK^X^VQpmsMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r8?;yf@?frQ$owe+ -rTo-{AMw{vgzX#P!9p!}0yp?_2u)>lVN`i=Wd#8M00Ie3WprUyVQh6}1pxpE002M$0000000030{{R30 -00008O=WapWMOn+1pxpG0d?d}_}|Wp0vpvv$c&#PW69R$ltr%da5t5w^x+8!q5%{oJdRMsrjHBJ^EIe4 -enz&iEACnc`NWk%>en!wdoTb1000000093000000000Y5V`Fu4a%FB~Wpf4s18r$;00065ZDDu-00In8 -a6@lxZE19EWo~o^2?J(kb^+R(Q4?4eR(6nw`MZ*F5{000OEZ*Ww3 -aAg7TaJlIZe;lLwh&e1WN~xVDb>d|F)wKS0Bv(XzubJrxZDn*}WMOn+0(t`--)Viz@~C%8KNS}Z0aQ3s -^SOqbBwN-D{wl@OCT*{+#r3Bk2FRnL+RBXEn8vr=x`Tq%|A_kfK&ST81_x(sZ(?C=a{_t;9p7nv%krpq -NClv)aMjKgw -AH@`bu1x<7g|G$};xvA~n-$_S33g#@X=Gt^Z*l^910COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUEj -udT)PryvH%qoUf%jN6#Tx81sfg4O?s`uaep_R|IgPjE?O1pxpD002NB00mEQZ*_DA0|IYw0hP$+dLDIR -U(}XWLTZugenOC;Z(5k~zEJnJiX;;E#R7DB0f+wLWmt%8=p4R=gtK{LClh6Z#kObxUW*hKHnBv9xdLu) -0006IPj_x*WK(oubY)XxXk~3-1OosIWMyM)VRB(~X?A4*00039W_507X<}?;00jX7`Sh#^X0AbZX4L%* -5q$))*;M@wXI>IJVg&1PPwC}G0t$0Lb#i5700jX8Me3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C -`}q*rYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj3{quwWnpY(WJFEY++|}0(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCX@GIcyL4!ji%3ykIZ4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HJt76^nC$%1sK -zB<;EQA|)S-x88IWKN#S$#@T&w`gPuZDn*}RC#b^a{vkfb>vO>-_DBy8`Vb0jGrW9$=2qSMXvL3Hm|g$K5F!?HDuBcElf~?0000000000{{R30000002WMq&WpinB0Zwen -nxGPI(od8RooadlAElm^Clat;Ot{#TZWc0Cjtg{hVQzD2bZKvHa{vkfG*S<)6P6lYy(#<=BR_>s@(?%# -f7ArN-=Rj?7Ns(10jIWVom4HC=;Sf&(V=@3j=0mb^+R( -Q4?4eR(6nw`65I6*X)C9iYp+?yj -r7~y;ZDn*}WMOn+0rh%KI9Y!AFx9LCk8@hQXE7w+qW3^C%eTEp@#^?_H3w&GZ(?C=a{=BXk!z-`g4hv- -$6z_YxoLZ_neUP>BpbEf7FA*KKfDHMZg6#Ua{-JTpQ=d>V!gG67g8znL|~8a@>)b41H3?r4>NPGDVYml -b8~5DZf#|5baMfWk0~o57O4jQiSPQLM-Anyjgk|p#*FIpQO-iyoZ8t5c42I3WMOn~asqk-9p7nv%krpq -N@L7b8`ZE -10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%H -b7^O8VRUtJWdH;M00eGtZe;)f009JZZ*64&1pxs>!tI8CO};e1CqOk74-_0uXd^VQzD2bZKvH -Q)6glZD9edf2kfhA@=uGO=Jtx#~n~$5JW2|a}~7vfDWQsGAeQeZeeX@0!8YhU)%QMkO4aJ;_ZeCe;xE! -X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~au8HvO>-_DBy8`Vb0jGrW9$=2qSMXvL3HGEG0000000000{{R300000025D|^b#!w83IT`y;$>KfZ0H=mhJ>?uVKfZ0H=mhJ>?uVR2XhQO_4 -{AcS-HH^7AVzASV8M4NYxyCka@1Z8)ymjIKNK5;L!8FkfGTe+FK;UUh9M-4n+}vRfRB~Z%b7^#GZ*Ek1 -aAgGn0006GRC#b^LvL+uX>@I6Zgd0!00(DfZe??6a{vVa0kRZVdkxgXIndDSADQRhP(T)gL{x5+9gElm -gZ0zBM*#|Sa$#@6CZU6-W0iOsgNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G66JF53UoI8eY9A -{1GERg--GiI0S#x1is&)M%fmnGH4o9d2nT9L349yXKr&sY-w&}Q)OXnRCrKyas&ea3uI+uY+-U?bZK^F -00jX7ts#@n)qreE>X2y^k8(W~9rIKz;itzCh0mxeNOd2nT9L349yXKr&sY-w&}Q)OXnRCsA*1OosIWMyM)VRB(~X?A4*1pxuVBMJ2TDGb!?hS4?jmbTrN -wsBI9)_*>;PXlMNnHxp{2xfI|XK7+=WdH>M0d)~d*A-s;(%@Iu7W%7*6Z_!y?t0-mQA1p*Ph+UT00Ihg -baHiLbairNWB>&L0lFe0BpVsjR%EDjMz&}PzMK%GtpWOEsvFV}w(K~B)(KW`X=GD$VRU5$0RR91 +NMUnm151ioJpYH;+t0eX2w~A!Q ++0eaZ{MVycPK^aqWo=1hH~=6)b8~5DZc=4-WnpY(WJFOF|0}@Y#k~NrxRcQq+F$P2q2)nlU +E64L7%3W7R1#@&^bY%hmXk);5Qh;gshq!{{oTC#gIzF4hFN<*P1RquLWiVd>5Mys{W@%()Zggp3Y*S@n +YybuV1aoC!YyxS#L&Ca5nIvB}kFnvq?#?UavKl;M?6Er@<-S02^r2`O>%7&o7^|1Fn59cLW!>7R25;!; +B*N1aoC!YyxS#L&Ca5nIvB}kFnvq?#?UavKl;M?6Er@ +<-S02^r0*RjYvyJ^#nX;x^@N4Cyn`(=BbYXO50sm-Yz<5%CY59k^g5#W{6D&GD +o53%OaP0&iRq*N +1aoC!YyxS#L&Ca5nIvB}kFnvq?#?UavKl;M?6Er@<-S02^r5Gy^0@;NPlb{-n1xko1uZcKL=FhMw)iW@ +^B~GyS4IVMbYXO50W~^?7W_p;3l@ykBm9id47>4{Q314kUM@UiqyMDEzyT0rZ*FF3WMyu2X<=+rWnpXp +1_A_gWnpXrX}m+ixL349yXKqquc4c8~Wn@-i +Y;|QqY-w&}Q)OXnRCsA*1OfmEa%Fa9VQgh&00sgCb7f&{0%^QM!n#D6Bwsd;)g%0j&kVcq +mr((MdwWnpYocu;h51pxpE0Z&F| +u2S*zYux^HZt;0000000030{{R300000fL349yXKq$yV?lFsX=iRyWp-s@ +Y-MCtVQh6}LTqVnWK(5fY*ct@WCZ~L2mz5#SyS0x6M&IY?oK#GG2&fnZy0(Ot1-a&<@*Cf#+d;C00000 +0096000000001UIb8~5DZdPSuL349yXKq$+X=GD$VRU6eY-w&}Q)OXnRCrKyas>eZ2muyOO0=mQ@c;WkPIeZe&wsVQf@*P;_zx0sshdWp-s@Y-MBs1_A_gWnpXrX}m+ixOF|0}@Y#k~NrxRcQq+F$P2q2)nlUE64L7%3W7R1#@&^bY%f9vZekP +z%WEGnBZKS8(M7E9_@AwVcyGtCevi|7U8=A5Mys{W@%()Zggp3Y*S@nYybuV1aoC!YyxS#L&Ca5nIvB} +kFnvq?#?UavKl;M?6Er@<-S02^r2`O>%7&o7^|1Fn59cLW!>7R25;!;BwOY}Ov_b`4?P%YY`+Wb+o`yBtAtb7^O8R&Qx!Q*>c;WkPIeZe&wsVQf@*X=DTf00?qr +c4c8~Wn=&b0t9nqVQd0vyhFmeM42RCHjlC4yY9{_<+2()V(hUy9_7A3a`d4r1C2;aNA(0eXS#L;%_oib +8;tKCLQ=nuAv#{`SnN;*b97;JWdSa-rT!PdFhnqz;9Q#C`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!} +0yp?_5oBd%VRdYDRB~Z%b7^#GZ*BoJQV*^ZmKt8YDf|&5KZQ>65I6*X)C9iYp+?yjr7~y^L349yXKrm} +Zgf<6aAgGn0006RL349yXKrm}Zgg`(Y-w&}Q)OXnRCrKyas>eZ3IT`y;$>KfZ0H=mhJ>?uV_ +ZDC1d0hChH+XJhss8OG%_CC-Q>(otsF+cqN0Qy}ddQ=3E5D9c?ZDn(GVQp{#07wRDb8~fNasqk-9p7nv +%krpqNLwsbOQ$tVrg_^Z)t8#VQFq|Wpn@! +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 +-=Rj?7Ns(10jIWVom4HC=;Sf&(iKXk~3- +Nn`~900#g7Kp+4KQ)y>zVRUtJWd#8M2LJ#-KmZC@6CZUzYhW@dH)+M7`mSQb`xkca!3baG*1bV+0Zp9m~TI>-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b1#WL{ +V`TsU2o7{|VQzD2bZKvHRC#b^0W?w%t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXb5d(bYWy+bYTJY +dQCW4e)%xftOSp9TD)g5B;KO;Krzd=y+`rt_<1!4XKZg`VQg~&-XoD~rmTY45rxNKIl#GTd$5`Bk}o71 +wcZw0Vevn_25D|^b#!w9HU>+RS0N(YNTB*5$CKi-fs&scK+}^ccW#?^mGLTK3t@9}X=iS2Wo~qH0bmVn +$l$*x6B66mDW}5KPS{D@4$XhF!_BS0NXN*|r3rIsXKrD1b#i3@1OfmAZf|a7000011aog~WdH>M0Yt*> +hJQ`IG{7f7H5KG(disZqmDuLQhJzYc@z&fv%Mes@VQzD2bZKvHLUnFrY-I)l2x)F`b#zT(Z~<&%eWUHuhfW|3TYrJJ8wZFz +p>JB4@xD;^wu&SY_r(Fj9y4O^XM(LBm@KYXt@&9dp%va>O3u0(H0`W{Mmov?0000000030{{R300000H +RB~Z%b7^#GZ*D|obYW?1a|QwsbaG*Cb7^#GZ*Eg#Xk~3-0jz(i9yuZQ_f<_~3)9CPP+$;5D=2dnwEKV# +qFOR4as+N+ZDj&Q>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+p< +?Hl01LM?X!H~4Z8RB~Z%b7^#GZ*Eg#Xk~3-1_cOhWprU=VRT^t2?2HFP59r=ivkxis%Ku=2wF+7z(Wqt=tdZk`V^s(Ana000000093000000000JQZg6#Ua{vkf +hyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0pr +c>n+a000000RI300000001IJrb7^O8ZDnqBa{vkfhyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt +0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a000000RI3000000010+sY-wa+bZ>G11OfmA +Zf|a7000011aog~WdH>M0%CAAe<9`Lptgpr6F_xjAC6(~TLj#*ewiHf`^rCgHqw;r~cW`-Qb7^w` +1pxt?w~K;YdFT{L=yznB^ciRQ>1CJ5Gy~iYk;E(sUa7AE3UqQ|ZgXjLX>V=-1p)z|2rNlD$O59e#ogQs +B77jPl+h5j^*S;EG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(18dQ03Wn@8fb7^O8 +b3$xsZe&wsVQf@*P;_zx0{{zTWn*k%a$$67c4Yts0Rfg5{EB0fg;c|RERyKwyc?S`-(k#Jc79Ua6d|cN +Yh3{dW_507X<}?;00jX7hHs2g6I`NdK6~a+^3m|rY+QT7a1qih-UmB6w*6E%0t$0Lb#i5700jX7 +p;>G6UAe#_pNwEQii6sRo+|e#sb-x+l@dPbvD=&`8B}?2Wn@8fb7^O8b3$xsZe&wsVQf@*X=DTg01ISg +V{Bn^VRUJBWdH>M0ry;ESwv+3lBrcu^)moMuzDTL*_JDxK=Xf+&45B--vJ0_b#7;AVr*pq1pxuEII1nZ +BmK~_^_%5}z{g7v9iK_VMNAzF)YPFI_pt#23UhRFbz^jOa%E%y1pxv7D__xE2wfQ|ho;i`y(G!;YyVZK +;c;Wd#8M000 -----END STRICT TYPE LIB----- diff --git a/stl/RGBCommit@0.1.0.stl b/stl/RGBCommit@0.1.0.stl index 22a9b6f7893dcc039b7eeaaafb4f2ee3290603c7..9e48c1ad63602a805c065bd120e0488e18666b19 100644 GIT binary patch delta 1221 zcmewpJj-oE4ih8Old&d*EBOi9fv z$xO@%PEE{VU<0YhWt5-1fJJt42Acp>$9y(-JgOBZFXWV)Jd;-tZa!|+zLTvu6(%p> z)Q6j_K3SFvw_70Uy}9)j{N2)?^qf(Q((K@Uel|XN67S2M_L7&}7F_zzT9dc%s>bA5 z+;$4n4(Du;RxN$7_>RPu<(->blOH|&xL`J?k6hD?GlvbDJ176(c2M}M`2MJcF)z!y zjjV^UVRe%X3E!;SYQlRpQqnjFDnuQ1U+GWce^aKpr)cYYSGhL2*i@+GRo zRvRAp`Sdrl%dwf0xAWL2i1~SKSt;|$_1r?|+3){21xcU#^VDgQ!2473t7jF>yE$#L zFt4>j)Xa@47W~iW`4@gsS$ynfx6hWp?@h~PZta|Sm+$<9!*P@Icx~Vzr#|@yFTT(? zz^A|{Gx;Kq6iV!X?62@f|ccD%X$y_DXUyJw!wROgK<3^FY@uX()l zrW2bR`{qeP{tDiYS&P2OvWXoD{hF!ort^5;yc3JR|2web>i)llGJdu1C+7<(FtTjE zF0_o1kz;b5i2r0pVUfuiqN^1mRsO#&vfR{K$gyIg)rvJQKQB3zfq{c9zaXTtAeHe{c-<$Rss(eG zs?XbZUc;i(deUshEo&;CU7WZ3id`f(7e{VtNn%Q3N#bNjR>jHnatf1mW$$gCFV_k+ zaq~olw~UidC>bzvf-IOUr+mQIjLmy;xT4Y>j|IOJk57KIxpC5bS%=G$HOup6mrwnu zmBgJ`T%4JnmkZ1e#f%BOxhEd%R~Ht#eN%J!p{ss3Jn!(Gt>1k3?Aik!$4{JFI(fg! zCWXUt#!2tfo7T$B&{-F;_GhHpLeYB(Ugvg6nY>-o?Y}U`XI1fQ!=(rGZcT3Ae*gGfo*h+u zL8-;5MP;cePL(C8#fGPM=vqI^_zVx_Sf}GVt4CqP5REd<>y5?J`oh-EtrE#Qdk%!Ul38){EA79 zkHvKn^~q~lku=lK5&mq5P*9(I7TE`6J0h2qP{?Q3M+${E z?9>Pak{r;-p|9Xs$j)bQ*YlHhf_%mC-l}y6kI25RZ}(0TzZ`p&f7;s_lkalaDP(<3 z-KwUokgk1H@?oL-*(RM`XVkXmd!}AKyv}dto~^qkTXQ-noK(Afb#hw@hwbaX22b~o6}w)-s4UBJu5rC?64|3gZ2OJ@;51~TSl!gC=bY+ zJ?Z_Lgvq}+Z4~ka8-E;?PI}uOUK&{ICS1M!_tI~*lX{<8XgUTYeZPEpau}Dj!e+no zWeRft|8OufO=gw(IAhcGeQyNqoi|PV?3eq!pOWbvN?)` zQo79K0xp@!zqt9}5lx-^hT;l>`EBzL9$`j>XH4n2blV|ZM zu(7hHncvqzi6k{Ktjl2M!7DK4n+p8ew!@Cudw-%L@U@tQi9QrS8elVspE{O9wbzWOs8%pTvAk;TvA$;ngUXPL$r^(x00jy{3!vk(Rs?ma?M6ZCeKCzBvL*)-wJ| eStWf*VA~sumTR1RVfmRU!6k_$sjQ3)3=9BOWz^6B diff --git a/stl/RGBCommit@0.1.0.sty b/stl/RGBCommit@0.1.0.sty index 4a040c8f..027c045e 100644 --- a/stl/RGBCommit@0.1.0.sty +++ b/stl/RGBCommit@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:VMoGHWGd-Bb0PUQt-oo48ZNg-bad21Fm-$MYF4xW-9gN8Fp4#oscar-cave-adam + Id: stl:taGMXEjW-1FDlac4-c6kFcnK-6iv9IXB-G0Gjhdz-Stoexsk#film-extreme-koala Name: RGBCommit Version: 0.1.0 Description: Consensus commitment layer for RGB smart contracts @@ -29,9 +29,6 @@ import BPCore#alfonso-andrea-nitro import CommitVerify#miller-pancake-elastic use MerkleHash#horse-popcorn-bundle use StrictHash#pizza-sherman-sound - use ReservedBytes1#origin-roger-relax - use ReservedBytes2#florida-libra-circus - use ReservedBytes8#rudolf-tape-adrian import Std#ralph-blue-lucky use AsciiPrintable#ultra-sunset-format @@ -44,37 +41,21 @@ import Bitcoin#signal-color-cipher use Txid#shallow-light-reverse -@mnemonic(consul-touch-ambient) -data AssignRevealedDataBlindSealTxPtr : revealed (seal BPCore.BlindSealTxPtr - , state RevealedData - , lock CommitVerify.ReservedBytes2) - | confidentialSeal (seal BPCore.SecretSeal - , state RevealedData - , lock CommitVerify.ReservedBytes2) - -@mnemonic(nylon-royal-stop) -data AssignRevealedDataBlindSealTxid : revealed (seal BPCore.BlindSealTxid - , state RevealedData - , lock CommitVerify.ReservedBytes2) - | confidentialSeal (seal BPCore.SecretSeal - , state RevealedData - , lock CommitVerify.ReservedBytes2) - -@mnemonic(vitamin-perform-maze) -data AssignRevealedValueBlindSealTxPtr : revealed (seal BPCore.BlindSealTxPtr - , state RevealedFungible - , lock CommitVerify.ReservedBytes2) - | confidentialSeal (seal BPCore.SecretSeal - , state RevealedFungible - , lock CommitVerify.ReservedBytes2) - -@mnemonic(germany-quarter-atomic) -data AssignRevealedValueBlindSealTxid : revealed (seal BPCore.BlindSealTxid - , state RevealedFungible - , lock CommitVerify.ReservedBytes2) - | confidentialSeal (seal BPCore.SecretSeal - , state RevealedFungible - , lock CommitVerify.ReservedBytes2) +@mnemonic(control-basic-labor) +data AssignRevealedDataBlindSealTxPtr : revealed (seal BPCore.BlindSealTxPtr, state RevealedData) + | confidentialSeal (seal BPCore.SecretSeal, state RevealedData) + +@mnemonic(passage-circus-compact) +data AssignRevealedDataBlindSealTxid : revealed (seal BPCore.BlindSealTxid, state RevealedData) + | confidentialSeal (seal BPCore.SecretSeal, state RevealedData) + +@mnemonic(program-miguel-sultan) +data AssignRevealedValueBlindSealTxPtr : revealed (seal BPCore.BlindSealTxPtr, state RevealedFungible) + | confidentialSeal (seal BPCore.SecretSeal, state RevealedFungible) + +@mnemonic(basic-natural-friday) +data AssignRevealedValueBlindSealTxid : revealed (seal BPCore.BlindSealTxid, state RevealedFungible) + | confidentialSeal (seal BPCore.SecretSeal, state RevealedFungible) @mnemonic(critic-alcohol-actor) data AssignVecAssignRevealedDataBlindSealTxPtr : [AssignRevealedDataBlindSealTxPtr ^ 1..] @@ -94,21 +75,13 @@ data AssignVecAssignVoidStateBlindSealTxPtr : [AssignVoidStateBlindSealTxPtr ^ 1 @mnemonic(arena-neuron-cantina) data AssignVecAssignVoidStateBlindSealTxid : [AssignVoidStateBlindSealTxid ^ 1..] -@mnemonic(cannon-present-weekend) -data AssignVoidStateBlindSealTxPtr : revealed (seal BPCore.BlindSealTxPtr - , state VoidState - , lock CommitVerify.ReservedBytes2) - | confidentialSeal (seal BPCore.SecretSeal - , state VoidState - , lock CommitVerify.ReservedBytes2) - -@mnemonic(present-paris-lazarus) -data AssignVoidStateBlindSealTxid : revealed (seal BPCore.BlindSealTxid - , state VoidState - , lock CommitVerify.ReservedBytes2) - | confidentialSeal (seal BPCore.SecretSeal - , state VoidState - , lock CommitVerify.ReservedBytes2) +@mnemonic(magnum-tango-bronze) +data AssignVoidStateBlindSealTxPtr : revealed (seal BPCore.BlindSealTxPtr, state VoidState) + | confidentialSeal (seal BPCore.SecretSeal, state VoidState) + +@mnemonic(shelf-korea-begin) +data AssignVoidStateBlindSealTxid : revealed (seal BPCore.BlindSealTxid, state VoidState) + | confidentialSeal (seal BPCore.SecretSeal, state VoidState) @mnemonic(sabine-magic-deal) data AssignmentDetails : ownedStateSchema OwnedStateSchema @@ -124,9 +97,8 @@ data AssignmentsBlindSealTxPtr : {AssignmentType -> ^ ..0xff TypedAssignsBlindSe @mnemonic(baker-size-sonar) data AssignmentsBlindSealTxid : {AssignmentType -> ^ ..0xff TypedAssignsBlindSealTxid} -@mnemonic(stadium-stadium-vacuum) -data BaseCommitment : flags CommitVerify.ReservedBytes1 - , schemaId SchemaId +@mnemonic(manila-number-locate) +data BaseCommitment : schemaId SchemaId , timestamp I64 , issuer CommitVerify.StrictHash , chainNet ChainNet @@ -152,17 +124,15 @@ data FungibleState : bits64#8 U64 | (|) data FungibleType : unsigned64Bit#8 | (|) -@mnemonic(melody-granite-cave) +@mnemonic(july-angel-bombay) data Genesis : ffv Ffv , schemaId SchemaId - , flags CommitVerify.ReservedBytes1 , timestamp I64 , issuer Identity , chainNet ChainNet , metadata Metadata , globals GlobalState , assignments AssignmentsBlindSealTxid - , validator CommitVerify.ReservedBytes1 @mnemonic(strong-mister-version) data GenesisSchema : metadata {MetaType ^ ..0xff} @@ -188,14 +158,11 @@ data GlobalValues : [DataState ^ 1..] @mnemonic(smart-pioneer-nominal) data Identity : Std.AsciiPrintable, [Std.AsciiPrintable ^ ..0xfff] -@mnemonic(kevin-morgan-shrink) -data Input : prevOut Opout, reserved CommitVerify.ReservedBytes2 - @mnemonic(tourist-deal-mask) data InputMap : {Bitcoin.Vout -> ^ 1.. {OpId}} -@mnemonic(taboo-lazarus-sushi) -data Inputs : {Input ^ 1..} +@mnemonic(judo-invest-thermos) +data Inputs : {Opout ^ 1..} @mnemonic(arena-janet-prepare) data MetaDetails : semId StrictTypes.SemId, name StrictTypes.FieldName @@ -212,7 +179,7 @@ data Metadata : {MetaType -> ^ ..0xff MetaValue} @mnemonic(source-olga-mirage) data Occurrences : min U16, max U16 -@mnemonic(tactic-china-order) +@mnemonic(oregano-dexter-exact) data OpCommitment : ffv Ffv , nonce U64 , opType TypeCommitment @@ -220,8 +187,6 @@ data OpCommitment : ffv Ffv , globals CommitVerify.MerkleHash , inputs CommitVerify.MerkleHash , assignments CommitVerify.MerkleHash - , witness CommitVerify.MerkleHash - , validator CommitVerify.StrictHash @mnemonic(picnic-single-gloria) data OpId : [Byte ^ 32] @@ -242,16 +207,14 @@ data RevealedData : value DataState, salt U128 @mnemonic(escape-nylon-client) data RevealedFungible : value FungibleState -@mnemonic(orion-jacob-bagel) +@mnemonic(natural-decimal-hair) data Schema : ffv Ffv - , flags CommitVerify.ReservedBytes1 , name StrictTypes.TypeName , metaTypes {MetaType -> ^ ..0xff MetaDetails} , globalTypes {GlobalStateType -> ^ ..0xff GlobalDetails} , ownedTypes {AssignmentType -> ^ ..0xff AssignmentDetails} , genesis GenesisSchema , transitions {TransitionType -> ^ ..0xff TransitionDetails} - , reserved CommitVerify.ReservedBytes8 @mnemonic(ramirez-patron-simon) data SchemaId : [Byte ^ 32] @@ -259,7 +222,7 @@ data SchemaId : [Byte ^ 32] @mnemonic(ferrari-zebra-tempo) data Signature : [Byte ^ 64] -@mnemonic(extra-member-guide) +@mnemonic(remark-gravity-vitamin) data Transition : ffv Ffv , contractId ContractId , nonce U64 @@ -268,8 +231,6 @@ data Transition : ffv Ffv , globals GlobalState , inputs Inputs , assignments AssignmentsBlindSealTxPtr - , validator CommitVerify.ReservedBytes1 - , witness CommitVerify.ReservedBytes2 , signature Signature? @mnemonic(rider-serpent-algebra) diff --git a/stl/RGBLogic@0.1.0.sta b/stl/RGBLogic@0.1.0.sta index 35bbf8db..fbc3e890 100644 --- a/stl/RGBLogic@0.1.0.sta +++ b/stl/RGBLogic@0.1.0.sta @@ -1,14 +1,14 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:!sVZDHHT-bSxOrfy-FHVQlRp-PQTlIDy-iv5XAmW-mjh24WY#banana-left-wisdom +Id: stl:KcBYRebN-pYf7mdW-bcI7bKj-GCGO3Lc-sBgzDJi-DWTBahs#lady-stadium-invent Name: RGBLogic Dependencies: - RGBCommit#oscar-cave-adam, BPCore#alfonso-andrea-nitro, + RGBCommit#film-extreme-koala, Bitcoin#signal-color-cipher -Check-SHA256: fe39a47c800ab0a98b0c5c5af3f8ec86dbc25b63d58c1902d275f1fa96745641 +Check-SHA256: 8a29ff7fea3dc659fdb1914e086d4af972f31d7b4ebdb9128f9934946b363ba5 -2vSEvOmAmtV*^ym1|4CY1-%bZ3uvQ{88!ymcWp(R^B5P5R`vsY7M=-GM?ynyZEb0EX}m+ixja}LTPkk +2vSEvOmAmtV*_ctL&Ca5nIvB}kFnvq?#?UavKl;M?6Er@<-S02^q~eqP(yEWWwoJja}LTPkk Z)t7=20~CnZ*pY?00DdlT>wB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 wjY>38tto&d&=eG4cRAF#( @@ -23,12 +23,12 @@ _r(NHa7knZ00=~4V^DH$Z)OAn0S0toaB^jI00jX8X}m+ix=uAF%>iaxCSnRl2&38AmXJiCw9urENI6IdKM{I9mVQf!wWCj8SZ*Wg?WC5$Mo0RIYfa$#@6CZU6=Z2X|?7Ze??G0gvlp0sK<6W+n*cBpJ9-*worFk3Ek7Mz>CQ0ZEXBf&z4T0#wQd9bugXy$?|f -XrqrAHU`>vZAF{&7#ECI_5*wto-|Sqt`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zc -aA{-$RLTY&VVwoN4^azfqmLOj2HJORMVs>&7mQZ+1AG>qmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`Zq +X>@6CZU6=Z2X|?7Ze??G0gvlp0sK<6W+n*cBpJ9-*worFk3Ek7Mz>CQ0ZEXBf&z4T0=1!xTu9c`P~~aP +9O^+_oUWq3(ia46296hVO4=UA$uv?At`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zc +aA{-$wV{k$NY>O)OowbuA;xv7X)nvju&%E+8)NqmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`Zq Bog<<3Rh`#Ze??GPjX}g1ONqXX>Mg?00jX7T-**L6)$-r+lRyXoI{GIo*U3CNI7Emc=xo*$N+#60SR&7mQZ+1AG>qdBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W) +ZggREX?A4*00069X=iS4a%E%y0009BVRB<=X?A5~0000AS7~%^Wpi^-Z*v9%25ez@WpXhBwV{k$NY>O) +OowbuA;xv7X)nvju&%E+8)NqdBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W) 00aqiX>Db5bYX39002k -----END STRICT TYPE LIB----- diff --git a/stl/RGBLogic@0.1.0.stl b/stl/RGBLogic@0.1.0.stl index fa1cae6533efba03d157f16fc1604d035722779e..d06cf102de011dda56e57a10d6779536b10f9fe9 100644 GIT binary patch delta 192 zcmeC@?&s#>2y%Dw$xqKrW}d9TtYFCI6yTg+l)80cPmIU4D*;b4&&j-UjG41;(f&)~ zEV*ob;>BLK1nP3m&&|y&*%*C`S%Hx9$vsR8lS^6n2`gN}GKH|B-Asy;D_O+= DdJ$A$ delta 192 zcmeC@?&mh)2y%Dw$xqKrW)3;UCYv~ybuWJ)cgEs=Ni()v<+-l2KTC-BgneVK5u3*e zROy_bo10lOS%F!Boy{r0Ilm}%WArU%1wvXU_b@3;E@j~-tZ)g-6vB#jGbv84WEBGd D{oO Date: Wed, 23 Apr 2025 11:02:15 +0200 Subject: [PATCH 52/70] chore: remove TODOs --- Cargo.lock | 4 ++-- src/lib.rs | 3 --- src/stl.rs | 8 +++----- src/validation/logic.rs | 14 -------------- src/validation/validator.rs | 1 - 5 files changed, 5 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e03d82e3..bf30bf7d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -309,7 +309,7 @@ dependencies = [ [[package]] name = "commit_encoding_derive" version = "0.11.0" -source = "git+https://github.com/zoedberg/client_side_validation?branch=0.11.1-2#c6bdd35814dc2d316bc5d1f0f1d13293ca2ec64e" +source = "git+https://github.com/zoedberg/client_side_validation?branch=0.11.1-2#52a1d7fef821dbc833a483cc508b4cd12955e468" dependencies = [ "amplify", "amplify_syn", @@ -321,7 +321,7 @@ dependencies = [ [[package]] name = "commit_verify" version = "0.11.0" -source = "git+https://github.com/zoedberg/client_side_validation?branch=0.11.1-2#c6bdd35814dc2d316bc5d1f0f1d13293ca2ec64e" +source = "git+https://github.com/zoedberg/client_side_validation?branch=0.11.1-2#52a1d7fef821dbc833a483cc508b4cd12955e468" dependencies = [ "amplify", "commit_encoding_derive", diff --git a/src/lib.rs b/src/lib.rs index f60b6271..1945cdf0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -129,6 +129,3 @@ macro_rules! impl_serde_baid64 { } }; } - -// TODO: Validate strict type data -// TODO: Add parsed global and structured state to the ContractState diff --git a/src/stl.rs b/src/stl.rs index eabd70c8..bf05013b 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -69,11 +69,9 @@ fn _rgb_logic_stl() -> Result { aluvm_stl().to_dependency(), rgb_commit_stl().to_dependency() }) - .transpile::() - .transpile::() - // TODO: Commit to the RGB ISA once AluVM will support strict types - // .transpile::() - .compile() + .transpile::() + .transpile::() + .compile() } /// Generates strict type library providing data types for RGB consensus. diff --git a/src/validation/logic.rs b/src/validation/logic.rs index c55d8d7d..806afc17 100644 --- a/src/validation/logic.rs +++ b/src/validation/logic.rs @@ -106,8 +106,6 @@ impl Schema { } }; - // Validate type system - status += self.validate_type_system(); status += self.validate_metadata(opid, op.metadata(), metadata_schema, consignment.types()); status += self.validate_global_state(opid, op.globals(), global_schema, consignment.types()); @@ -164,18 +162,6 @@ impl Schema { status } - fn validate_type_system(&self) -> validation::Status { - validation::Status::new() - // TODO: Validate type system - // Currently, validation is performed at the level of state values, i.e. - // if the system is inconsistent (references semantic ids not - // present in it) this will be detected during state validation. - // We should not prohibit schema with inconsistent type system, instead - // we need just to issue warnings here if some of semantic ids are - // missed - and add information messages if some excessive semantic ids - // are present. - } - fn validate_metadata( &self, opid: OpId, diff --git a/src/validation/validator.rs b/src/validation/validator.rs index 2ea7c442..b99a42b2 100644 --- a/src/validation/validator.rs +++ b/src/validation/validator.rs @@ -59,7 +59,6 @@ pub enum WitnessResolverError { } pub trait ResolveWitness { - // TODO: Return with SPV proof data fn resolve_pub_witness(&self, witness_id: Txid) -> Result; fn resolve_pub_witness_ord(&self, witness_id: Txid) From b860598e8e291d4c22072ee9c01e4bf57c31d909 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Sat, 19 Apr 2025 13:01:07 +0200 Subject: [PATCH 53/70] fix: use correct stl lib name for Layer1 --- src/operation/layer1.rs | 4 ++-- src/stl.rs | 2 +- stl/RGBLogic@0.1.0.sta | 29 ++++++++++++++--------------- stl/RGBLogic@0.1.0.stl | Bin 1423 -> 1378 bytes stl/RGBLogic@0.1.0.sty | 11 +++++++---- 5 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/operation/layer1.rs b/src/operation/layer1.rs index 574ff1da..209207bc 100644 --- a/src/operation/layer1.rs +++ b/src/operation/layer1.rs @@ -25,12 +25,12 @@ use std::str::FromStr; use bp::BlockHash; use strict_encoding::{StrictDecode, StrictEncode, StrictType}; -use crate::LIB_NAME_RGB_COMMIT; +use crate::{LIB_NAME_RGB_COMMIT, LIB_NAME_RGB_LOGIC}; #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Display)] #[display(lowercase)] #[derive(StrictType, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT, tags = repr, into_u8, try_from_u8)] +#[strict_type(lib = LIB_NAME_RGB_LOGIC, tags = repr, into_u8, try_from_u8)] #[cfg_attr( feature = "serde", derive(Serialize, Deserialize), diff --git a/src/stl.rs b/src/stl.rs index bf05013b..25cdd7ce 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -40,7 +40,7 @@ pub const LIB_ID_RGB_COMMIT: &str = "stl:taGMXEjW-1FDlac4-c6kFcnK-6iv9IXB-G0Gjhdz-Stoexsk#film-extreme-koala"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:KcBYRebN-pYf7mdW-bcI7bKj-GCGO3Lc-sBgzDJi-DWTBahs#lady-stadium-invent"; + "stl:hrx4os5M-G1AhR3Z-8FlOSFa-VxScvGS-!jvqFk3-XBnsCa8#cable-pagoda-mayor"; fn _rgb_commit_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_COMMIT), tiny_bset! { diff --git a/stl/RGBLogic@0.1.0.sta b/stl/RGBLogic@0.1.0.sta index fbc3e890..1a1cf4d5 100644 --- a/stl/RGBLogic@0.1.0.sta +++ b/stl/RGBLogic@0.1.0.sta @@ -1,11 +1,11 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:KcBYRebN-pYf7mdW-bcI7bKj-GCGO3Lc-sBgzDJi-DWTBahs#lady-stadium-invent +Id: stl:hrx4os5M-G1AhR3Z-8FlOSFa-VxScvGS-!jvqFk3-XBnsCa8#cable-pagoda-mayor Name: RGBLogic Dependencies: BPCore#alfonso-andrea-nitro, RGBCommit#film-extreme-koala, Bitcoin#signal-color-cipher -Check-SHA256: 8a29ff7fea3dc659fdb1914e086d4af972f31d7b4ebdb9128f9934946b363ba5 +Check-SHA256: d02e22671b98720e20d2708cc8d1e3eb1f322cf03c68a1961eda50c20e78cf10 2vSEvOmAmtV*_ctL&Ca5nIvB}kFnvq?#?UavKl;M?6Er@<-S02^q~eqP(yEWWwoJja}LTPkk @@ -17,19 +17,18 @@ Wpq+$XJ~Xna$#;`Xh%-ZT+rxDK6vW;JU&?LxLM72H?wDC1Zo}=N}D)4mkLjCa%FT-a&K>D2SRCdV{d70 DJ{*3f84s>#k$1lf7uIEVQ@}wWMxQUb7)_z*=^-NPQ?`2v5jYd+6t@dEhY>7H!Y*UdZb-BpG^u(WnpGh V{&P5bg6}ecT=8d`>?<6$C@F;S3|*6`1-v+nBdcqJ?FPKcnV2wbY*gGVQf%qwlfK-7{9iX4Q|L-q$GzU Mp|h#f#{Gz8SzLEaTf~c{WkYggkPIjuQHS#3Ua|L6d7%qre2Ut&TYs@(?%#f7ArN-=Rj?7Ns(14peesZgXjLX>V>+d2nTU#Mns) -Y&M6LqDeqU-jv95KHlThh+c{38p;h*Y8ns*OksItaxs<2=6W7=VqesjRYGc!>wZFzp>JB4@xD;^wu&SY -_r(NHa7knZ00=~4V^DH$Z)OAn0S0toaB^jI00jX8X}m+ix=uAF%>iaxCSnRl2&38AmXJiCw9urENI6IdKM{I9mVQf!wWCj8SZ*Wg?WC5$Mo0RIYfa$#@6CZU6=Z2X|?7Ze??G0gvlp0sK<6W+n*cBpJ9-*worFk3Ek7Mz>CQ0ZEXBf&z4T0=1!xTu9c`P~~aP -9O^+_oUWq3(ia46296hVO4=UA$uv?At`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXa#O>ZewKt00;zc -aA{-$wV{k$NY>O)OowbuA;xv7X)nvju&%E+8)NqmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`Zq -Bog<<3Rh`#Ze??GPjX}g1ONqXX>Mg?00jX7T-**L6)$-r+lRyXoI{GIo*U3CNI7Emc=xo*$N+#60SRO) -OowbuA;xv7X)nvju&%E+8)NqdBoUB2y8Zom7+;NN8Xgkb3WeV)QDb*=NiflQ)(Iz254nzXJ~W) -00aqiX>Db5bYX39002k +2~tNwLvL+uX>s@(?%#f7ArN-=Rj?7Ns(14peesZgXjLX>V>+d2nTw$mV(; +bz)!CmQ_M(k?Vd!kfCo{nDM?)_qK{868FUfPjE?O1^@^|Vq;KpZ*OJ<0s#heVQ_L~bN~eb0%^QM!n#D6 +Bwsdag{2}f*iVqt7ga%2Vq1#fUqa%2Inp_$2edG9dLzy*OG4Oq4bRCJgzb0?22v{-Vn;AC_IX=Hc+00IU~ +VR>b8F#`ezVrg_^Z)t7-25f0@b!lV)1y68Ka%2Po00(DfZe??6a{vGU{|a<+VQzD2bZKvH00smHcWHEP +Wpi@@kLzIp{8F`MCJ5#v8Msl{)Y>tRJ&yoJw@!EgNsxtt0(5x-wV{k$NY>O)OowbuA;xv7X)nv +ju&%E+8)NqG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(11#WL{V`TsU2n26%X=DPmp^RKe*3?kt +Y0ez#L0p`!qQBA?1Z@V67jsJ59>&R)$mV(;bz)!CmQ_M(k?Vd!kfCo{nDM?)_qK{868FUlS7~%^Wpi^+ +a%2Pq00nJnZe?Tu1pxtE+zulZFL@%{hr{`tLyD)K8_+CBIb!yB_q58$0Duw!33O#{bYXO9c4Ytn00IYT +XKrtDWn=&V00RhNa${&|c4cG$000VCX>@L7b8}E{a|QzjY+-q2axnpU#Mns)Y&M6LqDeqU-jv95KHlTh +h+c{38p;h*Y8ns*Xk}? Date: Fri, 18 Apr 2025 18:44:06 +0200 Subject: [PATCH 54/70] update deps --- .github/workflows/test.yml | 2 +- Cargo.lock | 165 ++++++++++++++++++-------- Cargo.toml | 14 +-- src/bin/rgbcore-stl.rs | 5 +- src/stl.rs | 45 +++---- stl/RGBCommit@0.1.0.sta | 226 ++++++++++++++++++------------------ stl/RGBCommit@0.1.0.stl | Bin 8986 -> 9004 bytes stl/RGBCommit@0.1.0.sty | 29 ++--- stl/RGBLogic@0.1.0.sta | 28 ++--- stl/RGBLogic@0.1.0.stl | Bin 1378 -> 1378 bytes stl/RGBLogic@0.1.0.sty | 14 +-- stl/Schema.vesper | 162 +++++++++++++------------- stl/Transition.vesper | 172 +++++++++++++-------------- stl/TransitionBundle.vesper | 175 ++++++++++++++-------------- 14 files changed, 560 insertions(+), 477 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b6bd2c74..faf0d4ee 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -36,4 +36,4 @@ jobs: - name: Add wasm32 target run: rustup target add wasm32-unknown-unknown - name: Test in headless Chrome - run: wasm-pack test --headless --chrome + run: RUSTFLAGS='--cfg getrandom_backend="wasm_js"' wasm-pack test --headless --chrome diff --git a/Cargo.lock b/Cargo.lock index bf30bf7d..c3277393 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5,13 +5,13 @@ version = 3 [[package]] name = "aluvm" version = "0.11.0" -source = "git+https://github.com/zoedberg/rust-aluvm?branch=0.11.1-2#902d863c0969722aad07a3ec6288d0ff70697a1f" +source = "git+https://github.com/zoedberg/rust-aluvm?branch=0.11.1-2#4d2c1cf0eb0161035b5a1426e08a5623d7c329df" dependencies = [ "amplify", "ascii-armor", "baid64", "blake3", - "getrandom", + "getrandom 0.3.2", "half", "paste", "ripemd", @@ -24,16 +24,16 @@ dependencies = [ [[package]] name = "amplify" -version = "4.7.1" +version = "4.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2090b9b79b61d4047a307a46de043d0ee5ec406d99a7d652341b96d48ed5567" +checksum = "3a9d7cb29f1d4c6ec8650abbee35948b8bdefb7f0750a26445ff593eb9bf7fcf" dependencies = [ "amplify_apfloat", "amplify_derive", "amplify_num", "amplify_syn", "ascii", - "rand", + "rand 0.8.5", "serde", "stringly_conversions", "wasm-bindgen", @@ -121,9 +121,9 @@ dependencies = [ [[package]] name = "ascii-armor" -version = "0.7.2" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4966ac403dc4a666d8131dfe4df684f45acc68d4c7e768db89c463aa5617910" +checksum = "0269eb842ec952b027df0fc33184b6a0dea5ea473160b36992274eb53758461e" dependencies = [ "amplify", "baid64", @@ -140,9 +140,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "baid64" -version = "0.2.2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95dabc2759e01e2c382968639868a701f384a18890934f9e75d4feb4d6623794" +checksum = "6cb4a8b2f1afee4ef00a190b260ad871842b93206177b59631fecd325d48d538" dependencies = [ "amplify", "base64", @@ -189,9 +189,9 @@ checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" [[package]] name = "blake3" -version = "1.8.0" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34a796731680be7931955498a16a10b2270c7762963d5d570fdbfe02dcbf314f" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" dependencies = [ "arrayref", "arrayvec", @@ -212,7 +212,7 @@ dependencies = [ [[package]] name = "bp-consensus" version = "0.11.1-alpha.1" -source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#55e5cd9ba902c198ae4cfdcc241047a6190630cd" +source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#63b3e18acfa00fb8180bbc5cca5630c372860203" dependencies = [ "amplify", "chrono", @@ -226,14 +226,15 @@ dependencies = [ [[package]] name = "bp-core" version = "0.11.1-alpha.1" -source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#55e5cd9ba902c198ae4cfdcc241047a6190630cd" +source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#63b3e18acfa00fb8180bbc5cca5630c372860203" dependencies = [ "amplify", "bp-consensus", "bp-dbc", "bp-seals", "commit_verify", - "getrandom", + "getrandom 0.2.16", + "getrandom 0.3.2", "serde", "single_use_seals", "strict_encoding", @@ -244,7 +245,7 @@ dependencies = [ [[package]] name = "bp-dbc" version = "0.11.1-alpha.1" -source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#55e5cd9ba902c198ae4cfdcc241047a6190630cd" +source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#63b3e18acfa00fb8180bbc5cca5630c372860203" dependencies = [ "amplify", "base85", @@ -258,14 +259,14 @@ dependencies = [ [[package]] name = "bp-seals" version = "0.11.1-alpha.1" -source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#55e5cd9ba902c198ae4cfdcc241047a6190630cd" +source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#63b3e18acfa00fb8180bbc5cca5630c372860203" dependencies = [ "amplify", "baid64", "bp-consensus", "bp-dbc", "commit_verify", - "rand", + "rand 0.9.1", "serde", "single_use_seals", "strict_encoding", @@ -279,9 +280,9 @@ checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "cc" -version = "1.2.17" +version = "1.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" +checksum = "04da6a0d40b948dfc4fa8f5bbf402b0fc1a64a28dbf7d12ffd683550f2c1b63a" dependencies = [ "shlex", ] @@ -309,7 +310,7 @@ dependencies = [ [[package]] name = "commit_encoding_derive" version = "0.11.0" -source = "git+https://github.com/zoedberg/client_side_validation?branch=0.11.1-2#52a1d7fef821dbc833a483cc508b4cd12955e468" +source = "git+https://github.com/zoedberg/client_side_validation?branch=0.11.1-2#f8dd8410fbe4b841c40056822ba3756d2b8159bf" dependencies = [ "amplify", "amplify_syn", @@ -321,11 +322,11 @@ dependencies = [ [[package]] name = "commit_verify" version = "0.11.0" -source = "git+https://github.com/zoedberg/client_side_validation?branch=0.11.1-2#52a1d7fef821dbc833a483cc508b4cd12955e468" +source = "git+https://github.com/zoedberg/client_side_validation?branch=0.11.1-2#f8dd8410fbe4b841c40056822ba3756d2b8159bf" dependencies = [ "amplify", "commit_encoding_derive", - "rand", + "rand 0.9.1", "ripemd", "serde", "sha2", @@ -399,22 +400,36 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", "wasm-bindgen", ] [[package]] name = "half" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7db2ff139bba50379da6aa0766b52fdcb62cb5b263009b09ed58ba604e14bbd1" +checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" dependencies = [ "cfg-if", "crunchy", @@ -467,9 +482,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", "hashbrown", @@ -494,9 +509,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.171" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "log" @@ -564,9 +579,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] @@ -580,6 +595,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "rand" version = "0.8.5" @@ -587,8 +608,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", ] [[package]] @@ -598,7 +629,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", ] [[package]] @@ -607,7 +648,16 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.2", ] [[package]] @@ -620,9 +670,9 @@ dependencies = [ "bp-core", "chrono", "commit_verify", - "getrandom", + "getrandom 0.3.2", "mime", - "rand", + "rand 0.9.1", "secp256k1", "serde", "single_use_seals", @@ -669,7 +719,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" dependencies = [ "bitcoin_hashes", - "rand", + "rand 0.8.5", "secp256k1-sys", "serde", ] @@ -775,9 +825,9 @@ dependencies = [ [[package]] name = "strict_encoding" -version = "2.7.2" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e4b581b61221082818d58db91630aed6e4a3237afb775fc7e5e4e2eba50d5e" +checksum = "8553c0321466c11aa1e33f082c9190194f380efd8824bf5ce4fa56b64b875be9" dependencies = [ "amplify", "serde", @@ -800,14 +850,13 @@ dependencies = [ [[package]] name = "strict_types" -version = "2.7.2" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bae7475fc901144d8a35d25e36d76aa020b840f233d60532d6d52318718781b" +checksum = "07dd1bdf4bfce0a1ff3eec041e7d4d20b06d22ca2aaf71338726dd9609e57a5e" dependencies = [ "amplify", "ascii-armor", "baid64", - "half", "indexmap", "serde", "serde_json", @@ -931,9 +980,9 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "vesper-lang" -version = "0.1.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f72ebd3b32f16ee8ace2bd3058c2bfa0f4820992bd4ea86e73ba228bb13dd2b0" +checksum = "cd2b7e3e27aeb0524204e58042f6e4531a720745d1b1a3978d3a084f1885f63d" dependencies = [ "amplify", "strict_encoding", @@ -955,6 +1004,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" version = "0.2.100" @@ -1203,13 +1261,22 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.7.4" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36" +checksum = "6cb8234a863ea0e8cd7284fcdd4f145233eb00fee02bbdd9861aec44e6477bc5" dependencies = [ "memchr", ] +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] + [[package]] name = "zerocopy" version = "0.8.24" diff --git a/Cargo.toml b/Cargo.toml index 4f33d8a0..24206dce 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,12 +22,12 @@ name = "rgbcore-stl" required-features = ["stl"] [dependencies] -amplify = { version = "~4.7.0", features = ["rand"] } -baid64 = "~0.2.2" -strict_encoding = "~2.7.0" -strict_types = { version = "~2.7.2", features = ["armor"] } +amplify = { version = "~4.8.0", features = ["rand"] } +baid64 = "~0.4.1" +strict_encoding = "~2.8.2" +strict_types = { version = "~2.8.3", features = ["armor"] } aluvm = { version = "~0.11.0", features = ["std", "ascii-armor"] } -commit_verify = { version = "~0.11.0-beta.9", features = ["rand", "derive"] } +commit_verify = { version = "0.11.0", features = ["rand", "derive"] } single_use_seals = "~0.11.0-beta.9" bp-core = { version = "~0.11.1-alpha.1" } secp256k1 = { version = "0.30.0", features = ["global-context"] } @@ -52,8 +52,8 @@ serde = [ [target.'cfg(target_arch = "wasm32")'.dependencies] wasm-bindgen = "0.2" -rand = { version = "0.8.4", optional = true } -getrandom = { version = "0.2", features = ["js"] } +rand = { version = "0.9.1", optional = true } +getrandom = { version = "0.3", features = ["wasm_js"] } [target.'cfg(target_arch = "wasm32")'.dev-dependencies] wasm-bindgen-test = "0.3" diff --git a/src/bin/rgbcore-stl.rs b/src/bin/rgbcore-stl.rs index 1101fe05..9aac2db0 100644 --- a/src/bin/rgbcore-stl.rs +++ b/src/bin/rgbcore-stl.rs @@ -27,7 +27,7 @@ use aluvm::stl::aluvm_stl; use bp::stl::bp_core_stl; use commit_verify::stl::commit_verify_stl; use commit_verify::CommitmentLayout; -use rgbcore::stl::bp_tx_stl; +use rgbcore::stl::{bp_consensus_stl, bp_tx_stl}; use rgbcore::{Schema, Transition, TransitionBundle}; use strict_types::stl::{std_stl, strict_types_stl}; use strict_types::typelib::parse_args; @@ -70,6 +70,7 @@ fn main() { .expect("unable to write to the file"); let std = std_stl(); + let consensus = bp_consensus_stl(); let tx = bp_tx_stl(); let bp = bp_core_stl(); let cv = commit_verify_stl(); @@ -85,6 +86,8 @@ fn main() { .unwrap() .import(bp) .unwrap() + .import(consensus) + .unwrap() .import(tx) .unwrap() .import(cv) diff --git a/src/stl.rs b/src/stl.rs index 25cdd7ce..98dd5ac8 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -21,7 +21,7 @@ // limitations under the License. pub use aluvm::stl::aluvm_stl; -pub use bp::bc::stl::bp_tx_stl; +pub use bp::bc::stl::{bp_consensus_stl, bp_tx_stl}; pub use bp::stl::bp_core_stl; use bp::Txid; use commit_verify::stl::commit_verify_stl; @@ -32,43 +32,46 @@ use strict_types::{CompileError, TypeLib}; use crate::validation::DbcProof; use crate::vm::GlobalOrd; use crate::{ - Genesis, OpCommitment, Schema, TransitionBundle, LIB_NAME_RGB_COMMIT, LIB_NAME_RGB_LOGIC, + BundleId, Genesis, OpCommitment, Schema, TransitionBundle, LIB_NAME_RGB_COMMIT, + LIB_NAME_RGB_LOGIC, }; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_COMMIT: &str = - "stl:taGMXEjW-1FDlac4-c6kFcnK-6iv9IXB-G0Gjhdz-Stoexsk#film-extreme-koala"; + "stl:6fV506IQ-vMhzEMh-POJEglP-j8QFZYw-coxDSxG-nETVnig#teacher-puma-sound"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:hrx4os5M-G1AhR3Z-8FlOSFa-VxScvGS-!jvqFk3-XBnsCa8#cable-pagoda-mayor"; + "stl:JXHYYte5-zpKGnbK-BPX9gDq-fyR0RbB-F6U3Nxj-gDdt_3A#special-jungle-patient"; fn _rgb_commit_stl() -> Result { - LibBuilder::new(libname!(LIB_NAME_RGB_COMMIT), tiny_bset! { - std_stl().to_dependency(), - strict_types_stl().to_dependency(), - commit_verify_stl().to_dependency(), - bp_tx_stl().to_dependency(), - bp_core_stl().to_dependency(), - aluvm_stl().to_dependency() - }) + LibBuilder::with(libname!(LIB_NAME_RGB_COMMIT), [ + std_stl().to_dependency_types(), + strict_types_stl().to_dependency_types(), + commit_verify_stl().to_dependency_types(), + bp_tx_stl().to_dependency_types(), + bp_core_stl().to_dependency_types(), + aluvm_stl().to_dependency_types(), + ]) + .transpile::() .transpile::() .transpile::() .transpile::() .transpile::() + .transpile::() .transpile::() .compile() } fn _rgb_logic_stl() -> Result { - LibBuilder::new(libname!(LIB_NAME_RGB_LOGIC), tiny_bset! { - std_stl().to_dependency(), - strict_types_stl().to_dependency(), - commit_verify_stl().to_dependency(), - bp_tx_stl().to_dependency(), - bp_core_stl().to_dependency(), - aluvm_stl().to_dependency(), - rgb_commit_stl().to_dependency() - }) + LibBuilder::with(libname!(LIB_NAME_RGB_LOGIC), [ + std_stl().to_dependency_types(), + strict_types_stl().to_dependency_types(), + commit_verify_stl().to_dependency_types(), + bp_consensus_stl().to_dependency_types(), + bp_core_stl().to_dependency_types(), + aluvm_stl().to_dependency_types(), + rgb_commit_stl().to_dependency_types(), + ]) .transpile::() .transpile::() .compile() diff --git a/stl/RGBCommit@0.1.0.sta b/stl/RGBCommit@0.1.0.sta index 18ef4857..18467398 100644 --- a/stl/RGBCommit@0.1.0.sta +++ b/stl/RGBCommit@0.1.0.sta @@ -1,19 +1,19 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:taGMXEjW-1FDlac4-c6kFcnK-6iv9IXB-G0Gjhdz-Stoexsk#film-extreme-koala +Id: stl:6fV506IQ-vMhzEMh-POJEglP-j8QFZYw-coxDSxG-nETVnig#teacher-puma-sound Name: RGBCommit Dependencies: - StrictTypes#century-comrade-chess, - AluVM#congo-archive-folio, - BPCore#alfonso-andrea-nitro, - CommitVerify#miller-pancake-elastic, - Std#ralph-blue-lucky, + BPCore#juliet-super-dominic, + CommitVerify#violet-panther-herbert, + Std#delete-roman-hair, + AluVM#jargon-gorilla-poetic, + StrictTypes#henry-heart-survive, Bitcoin#signal-color-cipher -Check-SHA256: 6637dfec4be81234ae6fcdf64c8984953f17ba1044d3a45958366c73d7db4e5a +Check-SHA256: 0416600af9fb306b6ddcc1f634cbd479289ef05cc871aa7434f38cb1519fea17 -2~tNwLvL+uX>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI)Q*?4^V{}w`aAk91a5aA+<>R2X -hQO_4{AcS-HH^7AVzASV8M4NYxyCjHL2PwaO=-MC!n#D6Bwsd4E? -M+l67UG^w8*<_XZ#%uyqCj(P-Wc6$lVk7oBr%DNv+($;q`HHK!gIHa)*%m(-e#9sm3I{@IbYpL6ZUzNG +2~tNwLvL+uX>pKz(VCaX%3mIP&XB&sB3y@ML2MxM-cip;h4&;#rLQq3*a%D_q7H}ii_tAk8EiIL^ +F;WduOYhK!;vHZzZO$@xxWWuWZ*6U9bXH|@X=ZtXiR(=d3vg7gbV~*3!PlK51EySK%g?1}nECovJTYnm +Q*>mTDm~KXV7O_2K9yF<>+h;;t~i_0*|LWuHI04?{jxCyL2PwaP3fMJ=Q}``f02HLt~iCiD@{1Jw0_*8 +A_pi$)ov?1PzzIZa%p39RC#b^bMaU=OZ$bvG|>z)+>9PT;Au-7)~D;-++hbyX<}1pbY-V7RRS&fT*&Z=qeY@Wmfle* z!SF)@h8|JkU^FEQwjx4X<|ua20~CnZ*pY>04xKINJ~fc1UzTDb_LBRjrSXj?;k=^zm6d~Uh7!wPz^$C X>MdwWnpYocxhy48SA{&vly$FvzVnzHf7z~rv`86=_Ka^V5yX|y#`JSQ)OdvWpqioJpYH;+t0eX2w~A!Q -+0eaZ{MVycPK^aqWo=1hH~=6)b8~5DZc=4-WnpY(WJFOF|0}@Y#k~NrxRcQq+F$P2q2)nlU ++0eaZ{MVycPK^aqWo=1hIRGF*b8~5DZc=4-WnpY(WJFcz4~pa1P{=r>OF|0}@Y#k~NrxRcQq+F$P2q2)nlU E64L7%3W7R1#@&^bY%hmXk);5Qh;gshq!{{oTC#gIzF4hFN<*P1RquLWiVd>5Mys{W@%()Zggp3Y*S@n -YybuV1aoC!YyxS#L&Ca5nIvB}kFnvq?#?UavKl;M?6Er@<-S02^r2`O>%7&o7^|1Fn59cLW!>7R25;!; +YybuV1aoC!Yyv&&I}!?D=!eA%8DA7<8;7e4kWwcH4Z3)D-MVlN%7&o7^|1Fn59cLW!>7R25;!; B*N1aoC!YyxS#L&Ca5nIvB}kFnvq?#?UavKl;M?6Er@ -<-S02^r0*RjYvyJ^#nX;x^@N4Cyn`(=BbYXO50sm-Yz<5%CY59k^g5#W{6D&GD -o53%OaP0&iRq*N1aoC!Yyv&&I}!?D=!eA%8DA7<8;7e4kWwcH4Z3)D +-MVlN`(=BbYXO50sm-Yz<5%CY59k^g5#W{6D&GD +o53%OaP0&iRq +cz4~pa1P{=Xc_Cg)w39@m$R6qOEzWQ+NTC@=;*N -1aoC!YyxS#L&Ca5nIvB}kFnvq?#?UavKl;M?6Er@<-S02^r5Gy^0@;NPlb{-n1xko1uZcKL=FhMw)iW@ +1aoC!Yyv&&I}!?D=!eA%8DA7<8;7e4kWwcH4Z3)D-MVlN4{Q314kUM@UiqyMDEzyT0rZ*FF3WMyu2X<=+rWnpXp -1_A_gWnpXrX}m+ixcz4~pa1P{=Xc_Cg)w39@m$R6qOEzWQ+NTC@=;L349yXKqquc4c8~Wn@-i -Y;|QqY-w&}Q)OXnRCsA*1OfmEa%Fa9VQgh&00sgCb7f&{0%^QM!n#D6Bwsd;)g%0j&kVcq +Y;|QqY-w&}Q)OXnRCsA*1OfmEa%Fa9VQgh&00sgCb7f&{0zKhpP*aQYQxux_Ecp +x^NEUkt_p^NJ~fc1UzTDb_LBRjrSXj?;k=^zm6d~Uh7!wPz7^zVRU5yH9CeC{6$3z7L3&+{EW{GyYZJ% +0knKxE<9tS|D?sh0T5$vZf0p@Wo~q7VQf=nVQc^f0t9nqVQd0D>pKz(VCaX%3mIP&XB&sB3y@ML2MxM- +cip;h4&;$&8SA{&vly$FvzVnzHf7z~rv`86=_Ka^V5yX|y#`JNb97;JWdSuhh8FxqMGF>;)g%0j&kVcq mr((MdwWnpYocu;h51pxpE0Z&F| eZ2muyOO0=mQ@c;WkPIeZe&wsVQf@*P;_zx0sshdWp-s@Y-MBs1_A_gWnpXrX}m+ixOF|0}@Y#k~NrxRcQq+F$P2q2)nlUE64L7%3W7R1#@&^bY%f9vZekP -z%WEGnBZKS8(M7E9_@AwVcyGtCevi|7U8=A5Mys{W@%()Zggp3Y*S@nYybuV1aoC!YyxS#L&Ca5nIvB} -kFnvq?#?UavKl;M?6Er@<-S02^r2`O>%7&o7^|1Fn59cLW!>7R25;!;Bc;WkPIeZe&wsVQf@*P;_zx0sshdWp-s@Y-MBs1_A_gWnpXrJ?lFX3Sj7m#S0l< +6lWWUs|%1)CkG9>cz4~pa1P{=r>OF|0}@Y#k~NrxRcQq+F$P2q2)nlUE64L7%3W7R1#@&^bY%f9vZekP +z%WEGnBZKS8(M7E9_@AwVcyGtCevi|7U8=A5Mys{W@%()Zggp3Y*S@nYybuV1aoC!Yyv&&I}!?D=!eA% +8DA7<8;7e4kWwcH4Z3)D-MVlN%7&o7^|1Fn59cLW!>7R25;!;BwOY}Ov_b`4?P%YY`+Wb+o`yBtAtb7^O8R&Qx!Q*>c;WkPIeZe&wsVQf@*X=DTf00?qr -c4c8~Wn=&b0t9nqVQd0vyhFmeM42RCHjlC4yY9{_<+2()V(hUy9_7A3a`d4r1C2;aNA(0eXS#L;%_oib +c4c8~Wn=&b0t9nqVQd0D>pKz(VCaX%3mIP&XB&sB3y@ML2MxM-cip;h4&;$61C2;aNA(0eXS#L;%_oib 8;tKCLQ=nuAv#{`SnN;*b97;JWdSa-rT!PdFhnqz;9Q#hpP*aQYQxux_Ecpx^NEUk!Ts~yw$T9tCzEwrAszt -P)%HZ|LbH=L2A=l(W4CP6cyxVRU5yF0!Tm7r-z?Fqq(6n;Tke)*kJ44PoBPfF{#q^A_Q|5kYfvX=iS2 Wo~ptWprU_Y;y(!5N~&GWn@!yVRU6vV`ybC`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!} +VQpms>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj065I6*X)C9iYp+?yjr7~y^L349yXKrm} Zgf<6aAgGn0006RL349yXKrm}Zgg`(Y-w&}Q)OXnRCrKyas>eZ3IT`y;$>KfZ0H=mhJ>?uV_ -ZDC1d0hChH+XJhss8OG%_CC-Q>(otsF+cqN0Qy}ddQ=3E5D9c?ZDn(GVQp{#07wRDb8~fNasqk-9p7nv -%krpqNLwsbOQ$tVrg_^Z)t8#VQFq|Wpn@! -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 --=Rj?7Ns(10jIWVom4HC=;Sf&(iKXk~3- -Nn`~900#g7Kp+4KQ)y>zVRUtJWd#8M2LJ#-KmZC@6CZUzYhW@dH)+M7`mSQb`xkca!3baG*1bV+0Zp9m~TI>-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b1#WL{ -V`TsU2o7{|VQzD2bZKvHRC#b^0W?w%t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXb5d(bYWy+bYTJY -dQCW4e)%xftOSp9TD)g5B;KO;Krzd=y+`rt_<1!4XKZg`VQg~&-XoD~rmTY45rxNKIl#GTd$5`Bk}o71 -wcZw0Vevn_25D|^b#!w9HU>+RS0N(YNTB*5$CKi-fs&scK+}^ccW#?^mGLTK3t@9}X=iS2Wo~qH0bmVn -$l$*x6B66mDW}5KPS{D@4$XhF!_BS0NXN*|r3rIsXKrD1b#i3@1OfmAZf|a7000011aog~WdH>M0Yt*> -hJQ`IG{7f7H5KG(disZqmDuLQhJzYc@z&fv%Mes@VQzD2bZKvHLUnFrY-I)l2x)F`b#zT(Z~<&%eWUHuhfW|3TYrJJ8wZFz -p>JB4@xD;^wu&SY_r(Fj9y4O^XM(LBm@KYXt@&9dp%va>O3u0(H0`W{Mmov?0000000030{{R300000H -RB~Z%b7^#GZ*D|obYW?1a|QwsbaG*Cb7^#GZ*Eg#Xk~3-0jz(i9yuZQ_f<_~3)9CPP+$;5D=2dnwEKV# -qFOR4as+N+ZDj&Q>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+p< -?Hl01LM?X!H~4Z8RB~Z%b7^#GZ*Eg#Xk~3-1_cOhWprU=VRT^t2?2HFP59r=ivkxis%Ku=2wF+7z(Wqt=tdZk`V^s(Ana000000093000000000JQZg6#Ua{vkf -hyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0pr -c>n+a000000RI300000001IJrb7^O8ZDnqBa{vkfhyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt -0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a000000RI3000000010+sY-wa+bZ>G11OfmA -Zf|a7000011aog~WdH>M0%CAAe<9`Lptgpr6F_xjAC6(~TLj#*ewiHf`^rCgHqw;r~cW`-Qb7^w` -1pxt?w~K;YdFT{L=yznB^ciRQ>1CJ5Gy~iYk;E(sUa7AE3UqQ|ZgXjLX>V=-1p)z|2rNlD$O59e#ogQs -B77jPl+h5j^*S;EG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(18dQ03Wn@8fb7^O8 -b3$xsZe&wsVQf@*P;_zx0{{zTWn*k%a$$67c4Yts0Rfg5{EB0fg;c|RERyKwyc?S`-(k#Jc79Ua6d|cN -Yh3{dW_507X<}?;00jX7hHs2g6I`NdK6~a+^3m|rY+QT7a1qih-UmB6w*6E%0t$0Lb#i5700jX7 -p;>G6UAe#_pNwEQii6sRo+|e#sb-x+l@dPbvD=&`8B}?2Wn@8fb7^O8b3$xsZe&wsVQf@*X=DTg01ISg -V{Bn^VRUJBWdH>M0ry;ESwv+3lBrcu^)moMuzDTL*_JDxK=Xf+&45B--vJ0_b#7;AVr*pq1pxuEII1nZ -BmK~_^_%5}z{g7v9iK_VMNAzF)YPFI_pt#23UhRFbz^jOa%E%y1pxv7D__xE2wfQ|ho;i`y(G!;YyVZK -;c;Wd#8M000 +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 +ivkR6Lh9EroO>_;00000 +00030000000000BPh(?sa&l#EV`Xy&0t0PnZU6uR18re=0006EPjEwTZEb0EZDnqB1_uLXW_AJEn^6;3 +7FKqUhx?i3R+Mr!fY&(;2BFL(m@EZk_srD=Zf|a5WdHyO25)dwd2nR`%2$5!EP9}wr6-=g&nP&FJCd6L +w5)jM(Vn~1K3NM22yJC_VPs)+VFFBL7H}ii_tAk8EiIL^F;WduOYhK!;vHZzZO$@xxWa9(t;O}HAO^^z +qT0%g+nC0;-MWK<)&Ge4`aq}l(*_4;Y;R&=Y;yukWfpKF*Z0wZ5-ly2voTT)QcLg9hvFSzGHuQ>ceuhh +oM?JbaMhsWfpKF*Z0wZ5-ly2voTT)QcLg9hvFSz +GHuQ>ceuhhoClv)aMjKgwAH@`bu1x<7g|G$};xvA~n-$_S1W#~DWCZ~L2LJ#- +AOHnVaBp>V1_J_bZ~>Lb=6W7=VqesjRYGc!>wZFzp>JB4@xD;^wu&SY_r(Hqc>#z1;$>KfZ0H=mhJ>?u +VM0r~W-2xhK9cV^W63=w?&L0_mQT=Q}`` +f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1P-_IE6rQG)02XJT?*g=|B=zREie$*y(7k2+*P~cYjSNy{c4c8~ +Wn@HQbYTVp1$JRox?`Aroor<$W|05z3@o%yggKU%$CX5lEZwTb6rTk%m8U3Qf4cdUdGS4#Tk(yYN*ff#-&-~S000000003000000 +0000BXKZg`VQf@+aAk7<3IWybk`76TvuW{aQ_%-X`?VwZ$5L?~`!+pRSq0(b70Uq+w#z7JBTYQ(6wA15 +KJe33N=y1k%8ssy_EyFtI!|)|0000000030000000000AZ+C8GWK?-@Wpe-u0f+wLWmt%8=p4R=gtK{L +Clh6Z#kObxUW*hKHnBv9xdE$XcznDDD1^I$Y^N^U(vj;W#J@gj^sY5z(hn_6P=Wve000000093000000 +000MPWo~72X>$QiY|5IT5^vH^lnV=@2?J(k +b^+R(Q4?4eR(6nw`65I6*X)C9iY +p+?yjr7~y;ZDn*}WMOn+0rh%KI9Y!AFx9LCk8@hQXE7w+qW3^C%eTEp@#^?_H3w&GZ(?C=a{=BXk!z-` +g4hv-$6z_YxoLZ_neUP>BpbEf7FA*KKfDHMZg6#Ua{)F6OOsb2BHT!z`XR@Y;!tI8CO};e1CqOk74-_0uXd^VQzD2bZKvHQ)6glZD9edf2kfhA@=uG +O=Jtx#~n~$5JW2|a}~7vfDWQsGAeQeZeeX@0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1P#d&Z +0rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~au8HvO> +-_DBy8`Vb0jGrW9$=2qSMXvL3HGEG0000000000 +{{R300000025D|^b#!w83IT`y;$>KfZ0H=mhJ>?uVKfZ0H=mhJ>?u +V+h;;t~i_0*|LWuHI04? +{jxD_@1Z8)ymjIKNK5;L!8FkfGTe+FK;UUh9M-4n+}vRfRB~Z%b7^#GZ*Ek1aAgGn0006GRC#b^LvL+u +X>@I6Zgd0!00(DfZe??6a{vVa0h+gqf?Rp%6iMiJWSjIEXZh)6m&h~&+zye%ED2tzuK@~la$#@6C +ZU6-W0iOsgNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G66JF53UoI8eY9A{1GERg--GiI0S#x1is&) +M%fmnGH4o9d2nT9L349yXKr&sY-w&}Q)OXnRCrKyas&ea3uI+uY+-U?bZK^F00jX7mKXerW0Qqc!+k80 +=;yo}n=;>F%vyGSQrr|FsW@w00SIPwZf9v?Y-Ioi0Re_@j8YR^qG~>S=1}s{@YHNvd%|!L(k$KwJ36-g +R5$_(b98cbV{~|YxG^Yz#^ZFU^t3{+J~Mh_bI7nokNupKIyUBoF*Amd2nT9L349yXKr&s +Y-w&}Q)OXnRCsA*1OosIWMyM)VRB(~X?A4*1pxu~Tw_^8WdM??RZ;ab079^O9n9I5E1y8~f0E6BLSf$l +2xfI|XK7+=WdH>M0kJr$ExjZC(6aTL<%Yn=OAsBONy9}<9ShXdp&a+I0RjqhbaHiLbairNWB>&L0skvs +(Od{!87YUR()qn4$?-Gk>C)}1xhDjvv-9q%D8IX_fbYpf zHm3mR{GwE!RIvi(>)$Un3hC-j-E0`d8|3}|Li;1x1f$$@M&&yW@j#3VOD)Pwt8D6g z?aR+y5VF3+oAt%P>vNTvm&GKXKEE`5#?N12HilVY%)uoov$bq5Jxkb;S#LKr?BwhB zt8&&^%)WGUQ@e_3ZyopFO@^$FIi+E~FXv5qZtXC=eqvqgI*Zo*+P)Usx76KPq{Ob_ zay3ueCV)G*q$o4FB&4z+wRm!%sKUmt(#(vOlLcAK6$trkat2EhVMQBx)FNO6f+SF|2!sz$-WXCgd+;5P?tNgxHvOCFE=%>gh-PAV|1SA6<-!M3&oYg7KDzxFZh*=d=y;c~C!repm(kD0ML=9Gr{ zX6|u5w993tO1xSB#)rG#ozs50Ny;Ya%|>gvr~4d=zAR*O3JY+~FG{Uqmc5@@d-~Ig zaxZ&PabCs{i{Q^Y+h(goU*q|wb@Z|t55$FGsYRJ-m8W#%@|$PgHQ=$!pBJcq-JPSS zA@-Yw+0B%xKab@wg{U(Jm!xdGYR$}OF@7qXMDiHd%__dviH|FtY-oWIp+oP$p3pPo6AX zOIV?S$Rq_q$$RoCCIw{%4klvMO?DOiM2xKpYAkt)xv5Nqf^hR(F-xL?PeGGCJtsdY zF{hY`U|`!zXb_GOdkKZf%O!Y;Q}{*VC{ezi{8MrbVTA{o6*fPWvS1;oaja}LTPkk -Z)t7=20~CnZ*pY?00DdlT>wB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 +2vSEvOmAmtV*@?wI}!?D=!eA%8DA7<8;7e4kWwcH4Z3)D-MVlNNgzlT_m +3wFmfDB@ZlUF_{Gi(YuS4F^JLbYpL6Zt3-T)1nZ($a4_LPdJevl=%EWR#?HxF%2w6oJ7^0C<#(WLPKwD +ZE17^20~CnZ*pY?00DdlT>wB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 wjY>38tto&d&=eG4cRAF#( Wpq+$XJ~Xna$#;`Xh%-ZT+rxDK6vW;JU&?LxLM72H?wDC1Zo}=N}D)4mkLjCa%FT-a&K>D2SRCdV{d70 @@ -18,14 +18,14 @@ DJ{*3f84s>#k$1lf7uIEVQ@}wWMxQUb7)_z*=^-NPQ?`2v5jYd+6t@dEhY>7H!Y*UdZb-BpG^u(WnpGh V{&P5bg6}ecT=8d`>?<6$C@F;S3|*6`1-v+nBdcqJ?FPKcnV2wbY*gGVQf%qwlfK-7{9iX4Q|L-q$GzU Mp|h#f#{Gz8SzLEaTf~c{WkYggkPIjuQHS#3Ua|L6d7%qre2Ut&TYs@(?%#f7ArN-=Rj?7Ns(14peesZgXjLX>V>+d2nTw$mV(; -bz)!CmQ_M(k?Vd!kfCo{nDM?)_qK{868FUfPjE?O1^@^|Vq;KpZ*OJ<0s#heVQ_L~bN~eb0%^QM!n#D6 -BwsdhpP*aQYQxux_Ecpx^NEUkq@>Xm_HirtB!lh<{Yi-S-!KI0_27BH<@sVme~^s3<3pjaB^jI +00jX8J?lFX3Sj7m#S0l<6lWWUs|%1)CkG9>cz4~pa1P{=M^4XN(CAD)cag{2}f*iVqt7ga%2Vq1#fUqa%2Inp_$2edG9dLzy*OG4Oq4bRCJgzb0?22v{-Vn;AC_IX=Hc+00IU~ VR>b8F#`ezVrg_^Z)t7-25f0@b!lV)1y68Ka%2Po00(DfZe??6a{vGU{|a<+VQzD2bZKvH00smHcWHEP -Wpi@@kLzIp{8F`MCJ5#v8Msl{)Y>tRJ&yoJw@!EgNsxtt0(5x-wV{k$NY>O)OowbuA;xv7X)nv -ju&%E+8)NqG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(11#WL{V`TsU2n26%X=DPmp^RKe*3?kt -Y0ez#L0p`!qQBA?1Z@V67jsJ59>&R)$mV(;bz)!CmQ_M(k?Vd!kfCo{nDM?)_qK{868FUlS7~%^Wpi^+ +Wpi@@kLzIp{8F`MCJ5#v8Msl{)Y>tRJ&yoJw@!EgNsxtt0(5x->GgTjq7b~ua}dZ+IFTTf`20XtSi#CM +4J<~SMAe=sG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(11#WL{V`TsU2n26%X=DQF^?B2x5WL89 +5XetBksy@#{6JP%!OAfWEJmC})t)Go$mV(;bz)!CmQ_M(k?Vd!kfCo{nDM?)_qK{868FUlS7~%^Wpi^+ a%2Pq00nJnZe?Tu1pxtE+zulZFL@%{hr{`tLyD)K8_+CBIb!yB_q58$0Duw!33O#{bYXO9c4Ytn00IYT XKrtDWn=&V00RhNa${&|c4cG$000VCX>@L7b8}E{a|QzjY+-q2axnpU#Mns)Y&M6LqDeqU-jv95KHlTh h+c{38p;h*Y8ns*Xk}?bB9cFt$X&CM*?*j&b>K*;)u`xPcz mGIJADH`$j_VR8%e5(PpInB2ppFgb&TpRmH+K!w{`Rs#T(D}UDj delta 304 zcmaFF^@yvUBgoy!CqF$inK^Th^PycXGgacv`Zqq@{qCIh(@jz~NpCh<%RSxaQ1oRX zn^S;ueo^Yyg*`DI*RBLS%{(Xb$}winx<&ghiL>Og^@$gI-I6?P`sXh?CfJ7t!zBLEUN(&n2p5% diff --git a/stl/RGBLogic@0.1.0.sty b/stl/RGBLogic@0.1.0.sty index d4930ffa..1866585a 100644 --- a/stl/RGBLogic@0.1.0.sty +++ b/stl/RGBLogic@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:hrx4os5M-G1AhR3Z-8FlOSFa-VxScvGS-!jvqFk3-XBnsCa8#cable-pagoda-mayor + Id: stl:JXHYYte5-zpKGnbK-BPX9gDq-fyR0RbB-F6U3Nxj-gDdt_3A#special-jungle-patient Name: RGBLogic Version: 0.1.0 Description: Consensus logic layer for RGB smart contracts @@ -11,18 +11,14 @@ @context typelib RGBLogic -import BPCore#alfonso-andrea-nitro +import BPCore#juliet-super-dominic use TapretNodePartner#roger-member-educate use TapretProof#marco-border-sample use TapretPathProof#kiwi-mirror-paris use TapretRightBranch#miracle-patriot-touch use OpretProof#good-village-flex -import RGBCommit#film-extreme-koala - use TransitionType#picture-reflex-brigade - use OpId#picnic-single-gloria - -import Bitcoin#signal-color-cipher +import Bitcoin#quiz-patent-exit use ScriptBytes#equator-cockpit-gong use TapNodeHash#paprika-amanda-hunter use LeafScript#bison-doctor-oscar @@ -30,6 +26,10 @@ import Bitcoin#signal-color-cipher use LeafVer#benefit-carbon-africa use XOnlyPk#clever-swim-carpet +import RGBCommit#teacher-puma-sound + use TransitionType#picture-reflex-brigade + use OpId#picnic-single-gloria + @mnemonic(needle-change-forest) data DbcProof : tapret#1 BPCore.TapretProof diff --git a/stl/Schema.vesper b/stl/Schema.vesper index b23b88c8..31892396 100644 --- a/stl/Schema.vesper +++ b/stl/Schema.vesper @@ -7,86 +7,86 @@ Schema vesper lexicon=types+commitments -SchemaId commitment hasher=SHA256 tagged=urn:lnp-bp:rgb:schema#2024-02-03 - Ffv serialized - TypeName serialized - MetaDetails map len=0..MAX8 - MetaType mapKey - MetaDetails mapValue - GlobalDetails map len=0..MAX8 - GlobalStateType mapKey - GlobalDetails mapValue - AssignmentDetails map len=0..MAX8 - AssignmentType mapKey - AssignmentDetails mapValue - GenesisSchema serialized - TransitionDetails map len=0..MAX8 - TransitionType mapKey - TransitionDetails mapValue +commitment SchemaId, hasher SHA256, tagged urn:lnp-bp:rgb:schema#2024-02-03 + serialized Ffv + serialized TypeName + map MetaDetails, len 0..MAX8 + mapKey MetaType + mapValue MetaDetails + map GlobalDetails, len 0..MAX8 + mapKey GlobalStateType + mapValue GlobalDetails + map AssignmentDetails, len 0..MAX8 + mapKey AssignmentType + mapValue AssignmentDetails + serialized GenesisSchema + map TransitionDetails, len 0..MAX8 + mapKey TransitionType + mapValue TransitionDetails -Schema rec - ffv is U16 aka=Ffv - name ascii aka=TypeName first=AlphaCapsLodash rest=AlphaNumLodash len=1..100 - metaTypes map len=0..MAX8 - key is U16 aka=MetaType - value rec MetaDetails - semId bytes len=32 aka=SemId - name ascii aka=FieldName first=AlphaSmallLodash rest=AlphaNumLodash len=1..100 - globalTypes map len=0..MAX8 - key is U16 aka=GlobalStateType - value rec GlobalDetails - globalStateSchema rec GlobalStateSchema - semId bytes len=32 aka=SemId - maxItems is U24 - name ascii aka=FieldName first=AlphaSmallLodash rest=AlphaNumLodash len=1..100 - ownedTypes map len=0..MAX8 - key is U16 aka=AssignmentType - value rec AssignmentDetails - ownedStateSchema union OwnedStateSchema - declarative is Unit tag=0 - fungible enum FungibleType wrapped unsigned64Bit=8 tag=1 - structured bytes len=32 wrapped aka=SemId tag=2 - name ascii aka=FieldName first=AlphaSmallLodash rest=AlphaNumLodash len=1..100 - defaultTransition is U16 aka=TransitionType - genesis rec GenesisSchema - metadata set len=0..MAX8 - element is U16 aka=MetaType - globals map len=0..MAX8 - key is U16 aka=GlobalStateType - value rec Occurrences - min is U16 - max is U16 - assignments map len=0..MAX8 - key is U16 aka=AssignmentType - value rec Occurrences - min is U16 - max is U16 - some rec LibSite option wrapped tag=1 - lib bytes len=32 aka=LibId - pos is U16 - transitions map len=0..MAX8 - key is U16 aka=TransitionType - value rec TransitionDetails - transitionSchema rec TransitionSchema - metadata set len=0..MAX8 - element is U16 aka=MetaType - globals map len=0..MAX8 - key is U16 aka=GlobalStateType - value rec Occurrences - min is U16 - max is U16 - inputs map len=0..MAX8 - key is U16 aka=AssignmentType - value rec Occurrences - min is U16 - max is U16 - assignments map len=0..MAX8 - key is U16 aka=AssignmentType - value rec Occurrences - min is U16 - max is U16 - some rec LibSite option wrapped tag=1 - lib bytes len=32 aka=LibId - pos is U16 - name ascii aka=FieldName first=AlphaSmallLodash rest=AlphaNumLodash len=1..100 +rec Schema + is ffv, U16, aka Ffv + ascii name, aka TypeName, first AlphaCapsLodash, rest AlphaNumLodash, len 1..100 + map metaTypes, len 0..MAX8 + is key, U16, aka MetaType + rec value, MetaDetails + bytes semId, len 32, aka SemId + ascii name, aka FieldName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + map globalTypes, len 0..MAX8 + is key, U16, aka GlobalStateType + rec value, GlobalDetails + rec globalStateSchema, GlobalStateSchema + bytes semId, len 32, aka SemId + is maxItems, U24 + ascii name, aka FieldName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + map ownedTypes, len 0..MAX8 + is key, U16, aka AssignmentType + rec value, AssignmentDetails + union ownedStateSchema, OwnedStateSchema + is declarative, Unit, tag 0 + enum fungible, FungibleType, wrapped, unsigned64Bit 8, tag 1 + bytes structured, len 32, wrapped, aka SemId, tag 2 + ascii name, aka FieldName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is defaultTransition, U16, aka TransitionType + rec genesis, GenesisSchema + set metadata, len 0..MAX8 + is element, U16, aka MetaType + map globals, len 0..MAX8 + is key, U16, aka GlobalStateType + rec value, Occurrences + is min, U16 + is max, U16 + map assignments, len 0..MAX8 + is key, U16, aka AssignmentType + rec value, Occurrences + is min, U16 + is max, U16 + rec some, LibSite, option, wrapped, tag 1 + bytes lib, len 32, aka LibId + is pos, U16 + map transitions, len 0..MAX8 + is key, U16, aka TransitionType + rec value, TransitionDetails + rec transitionSchema, TransitionSchema + set metadata, len 0..MAX8 + is element, U16, aka MetaType + map globals, len 0..MAX8 + is key, U16, aka GlobalStateType + rec value, Occurrences + is min, U16 + is max, U16 + map inputs, len 0..MAX8 + is key, U16, aka AssignmentType + rec value, Occurrences + is min, U16 + is max, U16 + map assignments, len 0..MAX8 + is key, U16, aka AssignmentType + rec value, Occurrences + is min, U16 + is max, U16 + rec some, LibSite, option, wrapped, tag 1 + bytes lib, len 32, aka LibId + is pos, U16 + ascii name, aka FieldName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 diff --git a/stl/Transition.vesper b/stl/Transition.vesper index 209893d3..6f0a8163 100644 --- a/stl/Transition.vesper +++ b/stl/Transition.vesper @@ -7,92 +7,92 @@ Transition vesper lexicon=types+commitments -OpId commitment hasher=SHA256 tagged=urn:lnp-bp:rgb:operation#2024-02-03 - OpCommitment serialized +commitment OpId, hasher SHA256, tagged urn:lnp-bp:rgb:operation#2024-02-03 + serialized OpCommitment -OpCommitment rec - ffv is U16 aka=Ffv - nonce is U64 - opType union TypeCommitment - genesis rec BaseCommitment wrapped tag=0 - schemaId bytes len=32 aka=SchemaId - timestamp is I64 - issuer bytes len=32 aka=StrictHash - chainNet enum ChainNet bitcoinMainnet=0 bitcoinTestnet3=1 bitcoinTestnet4=2 bitcoinSignet=3 bitcoinRegtest=4 liquidMainnet=5 liquidTestnet=6 - transition tuple tag=1 - _ bytes len=32 aka=ContractId - _ is U16 aka=TransitionType - metadata bytes len=32 aka=StrictHash - globals bytes len=32 aka=MerkleHash - inputs bytes len=32 aka=MerkleHash - assignments bytes len=32 aka=MerkleHash +rec OpCommitment + is ffv, U16, aka Ffv + is nonce, U64 + union opType, TypeCommitment + rec genesis, BaseCommitment, wrapped, tag 0 + bytes schemaId, len 32, aka SchemaId + is timestamp, I64 + bytes issuer, len 32, aka StrictHash + enum chainNet, ChainNet, bitcoinMainnet 0, bitcoinTestnet3 1, bitcoinTestnet4 2, bitcoinSignet 3, bitcoinRegtest 4, liquidMainnet 5, liquidTestnet 6 + tuple transition, tag 1 + bytes _, len 32, aka ContractId + is _, U16, aka TransitionType + bytes metadata, len 32, aka StrictHash + bytes globals, len 32, aka MerkleHash + bytes inputs, len 32, aka MerkleHash + bytes assignments, len 32, aka MerkleHash -Transition rec - ffv is U16 aka=Ffv - contractId bytes len=32 aka=ContractId - nonce is U64 - transitionType is U16 aka=TransitionType - metadata map len=0..MAX8 aka=Metadata - key is U16 aka=MetaType - value bytes len=0..MAX16 aka=MetaValue - globals map len=0..MAX8 aka=GlobalState - key is U16 aka=GlobalStateType - value list len=1..MAX16 aka=GlobalValues - element bytes len=0..MAX16 aka=DataState - inputs set len=1..MAX16 aka=Inputs - Opout rec - op bytes len=32 aka=OpId - ty is U16 aka=AssignmentType - no is U16 - assignments map len=0..MAX8 aka=AssignmentsBlindSealTxPtr - key is U16 aka=AssignmentType - value union TypedAssignsBlindSealTxPtr - declarative list len=1..MAX16 wrapped aka=AssignVecAssignVoidStateBlindSealTxPtr tag=0 - AssignVoidStateBlindSealTxPtr union - revealed rec tag=0 - seal rec BlindSealTxPtr - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state is Unit aka=VoidState - confidentialSeal rec tag=1 - seal bytes len=32 aka=SecretSeal - state is Unit aka=VoidState - fungible list len=1..MAX16 wrapped aka=AssignVecAssignRevealedValueBlindSealTxPtr tag=1 - AssignRevealedValueBlindSealTxPtr union - revealed rec tag=0 - seal rec BlindSealTxPtr - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state rec RevealedFungible - value union FungibleState - bits64 is U64 wrapped tag=0 - confidentialSeal rec tag=1 - seal bytes len=32 aka=SecretSeal - state rec RevealedFungible - value union FungibleState - bits64 is U64 wrapped tag=0 - structured list len=1..MAX16 wrapped aka=AssignVecAssignRevealedDataBlindSealTxPtr tag=2 - AssignRevealedDataBlindSealTxPtr union - revealed rec tag=0 - seal rec BlindSealTxPtr - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state rec RevealedData - value bytes len=0..MAX16 aka=DataState - salt is U128 - confidentialSeal rec tag=1 - seal bytes len=32 aka=SecretSeal - state rec RevealedData - value bytes len=0..MAX16 aka=DataState - salt is U128 - some bytes len=64 option wrapped aka=Signature tag=1 +rec Transition + is ffv, U16, aka Ffv + bytes contractId, len 32, aka ContractId + is nonce, U64 + is transitionType, U16, aka TransitionType + map metadata, len 0..MAX8, aka Metadata + is key, U16, aka MetaType + bytes value, len 0..MAX16, aka MetaValue + map globals, len 0..MAX8, aka GlobalState + is key, U16, aka GlobalStateType + list value, len 1..MAX16, aka GlobalValues + bytes element, len 0..MAX16, aka DataState + set inputs, len 1..MAX16, aka Inputs + rec Opout + bytes op, len 32, aka OpId + is ty, U16, aka AssignmentType + is no, U16 + map assignments, len 0..MAX8, aka AssignmentsBlindSealTxPtr + is key, U16, aka AssignmentType + union value, TypedAssignsBlindSealTxPtr + list declarative, len 1..MAX16, wrapped, aka AssignVecAssignVoidStateBlindSealTxPtr, tag 0 + union AssignVoidStateBlindSealTxPtr + rec revealed, tag 0 + rec seal, BlindSealTxPtr + union txid, TxPtr + is witnessTx, Unit, tag 0 + bytes txid, len 32, wrapped, aka Txid, tag 1 + is vout, U32, aka Vout + is blinding, U64 + is state, Unit, aka VoidState + rec confidentialSeal, tag 1 + bytes seal, len 32, aka SecretSeal + is state, Unit, aka VoidState + list fungible, len 1..MAX16, wrapped, aka AssignVecAssignRevealedValueBlindSealTxPtr, tag 1 + union AssignRevealedValueBlindSealTxPtr + rec revealed, tag 0 + rec seal, BlindSealTxPtr + union txid, TxPtr + is witnessTx, Unit, tag 0 + bytes txid, len 32, wrapped, aka Txid, tag 1 + is vout, U32, aka Vout + is blinding, U64 + rec state, RevealedFungible + union value, FungibleState + is bits64, U64, wrapped, tag 0 + rec confidentialSeal, tag 1 + bytes seal, len 32, aka SecretSeal + rec state, RevealedFungible + union value, FungibleState + is bits64, U64, wrapped, tag 0 + list structured, len 1..MAX16, wrapped, aka AssignVecAssignRevealedDataBlindSealTxPtr, tag 2 + union AssignRevealedDataBlindSealTxPtr + rec revealed, tag 0 + rec seal, BlindSealTxPtr + union txid, TxPtr + is witnessTx, Unit, tag 0 + bytes txid, len 32, wrapped, aka Txid, tag 1 + is vout, U32, aka Vout + is blinding, U64 + rec state, RevealedData + bytes value, len 0..MAX16, aka DataState + is salt, U128 + rec confidentialSeal, tag 1 + bytes seal, len 32, aka SecretSeal + rec state, RevealedData + bytes value, len 0..MAX16, aka DataState + is salt, U128 + bytes some, len 64, option, wrapped, aka Signature, tag 1 diff --git a/stl/TransitionBundle.vesper b/stl/TransitionBundle.vesper index b926102b..44f83667 100644 --- a/stl/TransitionBundle.vesper +++ b/stl/TransitionBundle.vesper @@ -7,90 +7,97 @@ Bundles vesper lexicon=types+commitments -BundleId commitment hasher=SHA256 tagged=urn:lnp-bp:rgb:bundle#2024-02-03 - InputMap serialized +commitment BundleId, hasher SHA256, tagged urn:lnp-bp:rgb:bundle#2024-02-03 + serialized InputMap -DbcProof union - tapret rec TapretProof wrapped tag=0 - pathProof rec TapretPathProof - some union TapretNodePartner option wrapped tag=1 - rightBranch rec TapretRightBranch wrapped tag=2 - nonce is U8 - opret is Unit wrapped aka=OpretProof tag=1 +union DbcProof + rec tapret, TapretProof, wrapped, tag 0 + rec pathProof, TapretPathProof + union some, TapretNodePartner, option, wrapped, tag 1 + bytes leftNode, len 32, wrapped, aka TapNodeHash, tag 0 + rec rightLeaf, LeafScript, wrapped, tag 1 + is version, U8, aka LeafVer + bytes script, len 0..MAX32, aka ScriptBytes + rec rightBranch, TapretRightBranch, wrapped, tag 2 + bytes leftNodeHash, len 32, aka TapNodeHash + bytes rightNodeHash, len 32, aka TapNodeHash + is nonce, U8 + bytes internalPk, len 32, aka InternalPk, aka XOnlyPk + is opret, Unit, wrapped, aka OpretProof, tag 1 -TransitionBundle rec - inputMap map len=1..MAX16 aka=InputMap - key is U32 aka=Vout - value set len=0..MAX16 - element bytes len=32 aka=OpId - knownTransitions map len=1..MAX16 - key bytes len=32 aka=OpId - value rec Transition - ffv is U16 aka=Ffv - contractId bytes len=32 aka=ContractId - nonce is U64 - transitionType is U16 aka=TransitionType - metadata map len=0..MAX8 aka=Metadata - key is U16 aka=MetaType - value bytes len=0..MAX16 aka=MetaValue - globals map len=0..MAX8 aka=GlobalState - key is U16 aka=GlobalStateType - value list len=1..MAX16 aka=GlobalValues - element bytes len=0..MAX16 aka=DataState - inputs set len=1..MAX16 aka=Inputs - Opout rec - op bytes len=32 aka=OpId - ty is U16 aka=AssignmentType - no is U16 - assignments map len=0..MAX8 aka=AssignmentsBlindSealTxPtr - key is U16 aka=AssignmentType - value union TypedAssignsBlindSealTxPtr - declarative list len=1..MAX16 wrapped aka=AssignVecAssignVoidStateBlindSealTxPtr tag=0 - AssignVoidStateBlindSealTxPtr union - revealed rec tag=0 - seal rec BlindSealTxPtr - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state is Unit aka=VoidState - confidentialSeal rec tag=1 - seal bytes len=32 aka=SecretSeal - state is Unit aka=VoidState - fungible list len=1..MAX16 wrapped aka=AssignVecAssignRevealedValueBlindSealTxPtr tag=1 - AssignRevealedValueBlindSealTxPtr union - revealed rec tag=0 - seal rec BlindSealTxPtr - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state rec RevealedFungible - value union FungibleState - bits64 is U64 wrapped tag=0 - confidentialSeal rec tag=1 - seal bytes len=32 aka=SecretSeal - state rec RevealedFungible - value union FungibleState - bits64 is U64 wrapped tag=0 - structured list len=1..MAX16 wrapped aka=AssignVecAssignRevealedDataBlindSealTxPtr tag=2 - AssignRevealedDataBlindSealTxPtr union - revealed rec tag=0 - seal rec BlindSealTxPtr - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state rec RevealedData - value bytes len=0..MAX16 aka=DataState - salt is U128 - confidentialSeal rec tag=1 - seal bytes len=32 aka=SecretSeal - state rec RevealedData - value bytes len=0..MAX16 aka=DataState - salt is U128 - some bytes len=64 option wrapped aka=Signature tag=1 +rec TransitionBundle + map inputMap, len 1..MAX16, aka InputMap + is key, U32, aka Vout + set value, len 0..MAX16 + bytes element, len 32, aka OpId + map knownTransitions, len 1..MAX16 + bytes key, len 32, aka OpId + rec value, Transition + is ffv, U16, aka Ffv + bytes contractId, len 32, aka ContractId + is nonce, U64 + is transitionType, U16, aka TransitionType + map metadata, len 0..MAX8, aka Metadata + is key, U16, aka MetaType + bytes value, len 0..MAX16, aka MetaValue + map globals, len 0..MAX8, aka GlobalState + is key, U16, aka GlobalStateType + list value, len 1..MAX16, aka GlobalValues + bytes element, len 0..MAX16, aka DataState + set inputs, len 1..MAX16, aka Inputs + rec Opout + bytes op, len 32, aka OpId + is ty, U16, aka AssignmentType + is no, U16 + map assignments, len 0..MAX8, aka AssignmentsBlindSealTxPtr + is key, U16, aka AssignmentType + union value, TypedAssignsBlindSealTxPtr + list declarative, len 1..MAX16, wrapped, aka AssignVecAssignVoidStateBlindSealTxPtr, tag 0 + union AssignVoidStateBlindSealTxPtr + rec revealed, tag 0 + rec seal, BlindSealTxPtr + union txid, TxPtr + is witnessTx, Unit, tag 0 + bytes txid, len 32, wrapped, aka Txid, tag 1 + is vout, U32, aka Vout + is blinding, U64 + is state, Unit, aka VoidState + rec confidentialSeal, tag 1 + bytes seal, len 32, aka SecretSeal + is state, Unit, aka VoidState + list fungible, len 1..MAX16, wrapped, aka AssignVecAssignRevealedValueBlindSealTxPtr, tag 1 + union AssignRevealedValueBlindSealTxPtr + rec revealed, tag 0 + rec seal, BlindSealTxPtr + union txid, TxPtr + is witnessTx, Unit, tag 0 + bytes txid, len 32, wrapped, aka Txid, tag 1 + is vout, U32, aka Vout + is blinding, U64 + rec state, RevealedFungible + union value, FungibleState + is bits64, U64, wrapped, tag 0 + rec confidentialSeal, tag 1 + bytes seal, len 32, aka SecretSeal + rec state, RevealedFungible + union value, FungibleState + is bits64, U64, wrapped, tag 0 + list structured, len 1..MAX16, wrapped, aka AssignVecAssignRevealedDataBlindSealTxPtr, tag 2 + union AssignRevealedDataBlindSealTxPtr + rec revealed, tag 0 + rec seal, BlindSealTxPtr + union txid, TxPtr + is witnessTx, Unit, tag 0 + bytes txid, len 32, wrapped, aka Txid, tag 1 + is vout, U32, aka Vout + is blinding, U64 + rec state, RevealedData + bytes value, len 0..MAX16, aka DataState + is salt, U128 + rec confidentialSeal, tag 1 + bytes seal, len 32, aka SecretSeal + rec state, RevealedData + bytes value, len 0..MAX16, aka DataState + is salt, U128 + bytes some, len 64, option, wrapped, aka Signature, tag 1 From fcd206598f7dcd2d8a4b470a713fdb013a62f943 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Fri, 25 Apr 2025 16:21:46 +0200 Subject: [PATCH 55/70] schema: add optional default assignment --- src/schema/schema.rs | 4 +++ src/stl.rs | 4 +-- stl/RGBCommit@0.1.0.sta | 61 ++++++++++++++++++++-------------------- stl/RGBCommit@0.1.0.stl | Bin 9004 -> 9076 bytes stl/RGBCommit@0.1.0.sty | 5 ++-- stl/RGBLogic@0.1.0.sta | 14 ++++----- stl/RGBLogic@0.1.0.stl | Bin 1378 -> 1378 bytes stl/RGBLogic@0.1.0.sty | 4 +-- stl/Schema.vesper | 1 + 9 files changed, 50 insertions(+), 43 deletions(-) diff --git a/src/schema/schema.rs b/src/schema/schema.rs index 4f3f1dc2..22cb624e 100644 --- a/src/schema/schema.rs +++ b/src/schema/schema.rs @@ -197,6 +197,8 @@ pub struct Schema { pub owned_types: TinyOrdMap, pub genesis: GenesisSchema, pub transitions: TinyOrdMap, + + pub default_assignment: Option, } impl CommitEncode for Schema { @@ -212,6 +214,8 @@ impl CommitEncode for Schema { e.commit_to_map(&self.owned_types); e.commit_to_serialized(&self.genesis); e.commit_to_map(&self.transitions); + + e.commit_to_option(&self.default_assignment); } } diff --git a/src/stl.rs b/src/stl.rs index 98dd5ac8..3f175747 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -38,10 +38,10 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_COMMIT: &str = - "stl:6fV506IQ-vMhzEMh-POJEglP-j8QFZYw-coxDSxG-nETVnig#teacher-puma-sound"; + "stl:0f49mOgU-jvc2JeV-iX2M~IO-jYPrjwt-A8aSIrO-o0r81Es#patron-melody-jazz"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:JXHYYte5-zpKGnbK-BPX9gDq-fyR0RbB-F6U3Nxj-gDdt_3A#special-jungle-patient"; + "stl:qvGXFFoy-THfbkrM-_A5DrFb-5leOnhE-sa7Mpct-iuE6DVk#south-license-prepare"; fn _rgb_commit_stl() -> Result { LibBuilder::with(libname!(LIB_NAME_RGB_COMMIT), [ diff --git a/stl/RGBCommit@0.1.0.sta b/stl/RGBCommit@0.1.0.sta index 18467398..2f5cc028 100644 --- a/stl/RGBCommit@0.1.0.sta +++ b/stl/RGBCommit@0.1.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:6fV506IQ-vMhzEMh-POJEglP-j8QFZYw-coxDSxG-nETVnig#teacher-puma-sound +Id: stl:0f49mOgU-jvc2JeV-iX2M~IO-jYPrjwt-A8aSIrO-o0r81Es#patron-melody-jazz Name: RGBCommit Dependencies: BPCore#juliet-super-dominic, @@ -8,7 +8,7 @@ Dependencies: AluVM#jargon-gorilla-poetic, StrictTypes#henry-heart-survive, Bitcoin#signal-color-cipher -Check-SHA256: 0416600af9fb306b6ddcc1f634cbd479289ef05cc871aa7434f38cb1519fea17 +Check-SHA256: 1d9aaf3bb9eb425596ad43171e74c4e079b5022a40921407a3d06a8b50da54f8 2~tNwLvL+uX>pKz(VCaX%3mIP&XB&sB3y@ML2MxM-cip;h4&;#rLQq3*a%D_q7H}ii_tAk8EiIL^ F;WduOYhK!;vHZzZO$@xxWWuWZ*6U9bXH|@X=ZtXiR(=d3vg7gbV~*3!PlK51EySK%g?1}nECovJTYnm @@ -115,7 +115,7 @@ VM0r~W-2xhK9cV^W63=w?&L0_mQT=Q}`` f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1P-_IE6rQG)02XJT?*g=|B=zREie$*y(7k2+*P~cYjSNy{c4c8~ Wn@HQbYTVp1$JRox?`Aroor<$W|05z3@o%yggKU%$CX5lEZwTb6rTk%m8KU%$CX5lEZwTb6rTk%m8U3Qf4cdUdGS4#Tk(yYN*ff#-&-~S000000003000000 @@ -124,33 +124,34 @@ KJe33N=y1k%8ssy_EyFtI!|)|0000000030000000000AZ+C8GWK?-@Wpe-u0f+wLWmt%8=p4R=gtK{L Clh6Z#kObxUW*hKHnBv9xdE$XcznDDD1^I$Y^N^U(vj;W#J@gj^sY5z(hn_6P=Wve000000093000000 000MPWo~72X>$QiY|5IT5^vH^lnV=@2?J(k -b^+R(Q4?4eR(6nw`65I6*X)C9iY -p+?yjr7~y;ZDn*}WMOn+0rh%KI9Y!AFx9LCk8@hQXE7w+qW3^C%eTEp@#^?_H3w&GZ(?C=a{=BXk!z-` -g4hv-$6z_YxoLZ_neUP>BpbEf7FA*KKfDHMZg6#Ua{)F6OOsb2BHT!z`XR@Y;!tI8CO};e1CqOk74-_0uXd^VQzD2bZKvHQ)6glZD9edf2kfhA@=uG -O=Jtx#~n~$5JW2|a}~7vfDWQsGAeQeZeeX@0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1P#d&Z -0rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~au8HvO> --_DBy8`Vb0jGrW9$=2qSMXvL3HGEG0000000000 -{{R300000025D|^b#!w83IT`y;$>KfZ0H=mhJ>?uVKfZ0H=mhJ>?u -V+h;;t~i_0*|LWuHI04? -{jxD_@1Z8)ymjIKNK5;L!8FkfGTe+FK;UUh9M-4n+}vRfRB~Z%b7^#GZ*Ek1aAgGn0006GRC#b^LvL+u -X>@I6Zgd0!00(DfZe??6a{vVa0h+gqf?Rp%6iMiJWSjIEXZh)6m&h~&+zye%ED2tzuK@~la$#@6C -ZU6-W0iOsgNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G66JF53UoI8eY9A{1GERg--GiI0S#x1is&) -M%fmnGH4o9d2nT9L349yXKr&sY-w&}Q)OXnRCrKyas&ea3uI+uY+-U?bZK^F00jX7mKXerW0Qqc!+k80 -=;yo}n=;>F%vyGSQrr|FsW@w00SIPwZf9v?Y-Ioi0Re_@j8YR^qG~>S=1}s{@YHNvd%|!L(k$KwJ36-g -R5$_(b98cbV{~|YxG^Yz#^ZFU^t3{+J~Mh_bI7nokNupKIyUBoF*Amd2nT9L349yXKr&s -Y-w&}Q)OXnRCsA*1OosIWMyM)VRB(~X?A4*1pxu~Tw_^8WdM??RZ;ab079^O9n9I5E1y8~f0E6BLSf$l -2xfI|XK7+=WdH>M0kJr$ExjZC(6aTL<%Yn=OAsBONy9}<9ShXdp&a+I0RjqhbaHiLbairNWB>&L0skvs -(Od{!87YUR()qn4$?D&b8~5DZf#|5bN~bb00eGtZe;)f009JZZ*64&1pxtv{^Dg=h-~N_zJ`Re +d1EINWrM}GXaQb}6c#qIM2EQuQ)6glZDC1d1pxpD002NB00~oRXKrD1b#i3|0RRU806;(h3RH4oZgXjL +X>V=@2?J(kb^+R(Q4?4eR(6nw`6 +5I6*X)C9iYp+?yjr7~y;ZDn*}WMOn+0rh%KI9Y!AFx9LCk8@hQXE7w+qW3^C%eTEp@#^?_H3w&GZ(?C= +a{=BXk!z-`g4hv-$6z_YxoLZ_neUP>BpbEf7FA*KKfDHMZg6#Ua{)F6OOsb2BHT!z`XR@Y;!tI8CO};e1CqOk74-_0uXd^VQzD2bZKvHQ)6glZD9ed +f2kfhA@=uGO=Jtx#~n~$5JW2|a}~7vfDWQsGAeQeZeeX@0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$ +)ov?1P#d&Z0rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~au8HvO>-_DBy8`Vb0jGrW9$=2qSMXvL3HGEG +0000000000{{R300000025D|^b#!w83IT`y;$>KfZ0H=mhJ>?uVKf +Z0H=mhJ>?uV+h;;t~i_0 +*|LWuHI04?{jxD_@1Z8)ymjIKNK5;L!8FkfGTe+FK;UUh9M-4n+}vRfRB~Z%b7^#GZ*Ek1aAgGn0006G +RC#b^LvL+uX>@I6Zgd0!00(DfZe??6a{vVa0h+gqf?Rp%6iMiJWSjIEXZh)6m&h~&+zye%ED2tzuK@~l +a$#@6CZU6-W0iOsgNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G66JF53UoI8eY9A{1GERg--Gi +I0S#x1is&)M%fmnGH4o9d2nT9L349yXKr&sY-w&}Q)OXnRCrKyas&ea3uI+uY+-U?bZK^F00jX7mKXer +W0Qqc!+k80=;yo}n=;>F%vyGSQrr|FsW@w00SIPwZf9v?Y-Ioi0Re_@j8YR^qG~>S=1}s{@YHNvd%|!L +(k$KwJ36-gR5$_(b98cbV{~|YxG^Yz#^ZFU^t3{+J~Mh_bI7nokNupKIyUBoF*Amd2nT9 +L349yXKr&sY-w&}Q)OXnRCsA*1OosIWMyM)VRB(~X?A4*1pxu~Tw_^8WdM??RZ;ab079^O9n9I5E1y8~ +f0E6BLSf$l2xfI|XK7+=WdH>M0kJr$ExjZC(6aTL<%Yn=OAsBONy9}<9ShXdp&a+I0RjqhbaHiLbairN +WB>&L0skvs(Od{!87YUR()qn4$?Or4%E_ ^ ..0xff MetaDetails} @@ -218,6 +218,7 @@ data Schema : ffv Ffv , ownedTypes {AssignmentType -> ^ ..0xff AssignmentDetails} , genesis GenesisSchema , transitions {TransitionType -> ^ ..0xff TransitionDetails} + , defaultAssignment AssignmentType? @mnemonic(ramirez-patron-simon) data SchemaId : [Byte ^ 32] diff --git a/stl/RGBLogic@0.1.0.sta b/stl/RGBLogic@0.1.0.sta index 999f913e..82586584 100644 --- a/stl/RGBLogic@0.1.0.sta +++ b/stl/RGBLogic@0.1.0.sta @@ -1,14 +1,14 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:JXHYYte5-zpKGnbK-BPX9gDq-fyR0RbB-F6U3Nxj-gDdt_3A#special-jungle-patient +Id: stl:qvGXFFoy-THfbkrM-_A5DrFb-5leOnhE-sa7Mpct-iuE6DVk#south-license-prepare Name: RGBLogic Dependencies: BPCore#juliet-super-dominic, Bitcoin#quiz-patent-exit, - RGBCommit#teacher-puma-sound -Check-SHA256: 7534c86fa407eeb7ee78d8bfd88e58dabe30232f4cbdb8f0e48cb44c4ea9cda6 + RGBCommit#patron-melody-jazz +Check-SHA256: 4a00ee7b43bcc5c5a604fd9723bca4bbe9c20f30951dea6ae09489ef9dbdf835 2vSEvOmAmtV*@?wI}!?D=!eA%8DA7<8;7e4kWwcH4Z3)D-MVlNNgzlT_m -3wFmfDB@ZlUF_{Gi(YuS4F^JLbYpL6Zt3-T)1nZ($a4_LPdJevl=%EWR#?HxF%2w6oJ7^0C<#(WLPKwD +3wFmfDB@ZlUF_{Gi(YuS4F^JLbYpL6ZqfcdnCKLa_ckTvVqarFAn4dWxbUwB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 wjY>38tto&d&=eG4cRAF#( @@ -23,9 +23,9 @@ hs6sSUleB>hpP*aQYQxux_Ecpx^NEUkq@>Xm_HirtB!lh<{Yi-S-!KI0_27BH<@sVme~^s3<3pjaB^jI 00jX8J?lFX3Sj7m#S0l<6lWWUs|%1)CkG9>cz4~pa1P{=M^4XN(CAD)cag{2}f*iVqt7ga%2Vq1#fUqa%2Inp_$2edG9dLzy*OG4Oq4bRCJgzb0?22v{-Vn;AC_IX=Hc+00IU~ VR>b8F#`ezVrg_^Z)t7-25f0@b!lV)1y68Ka%2Po00(DfZe??6a{vGU{|a<+VQzD2bZKvH00smHcWHEP -Wpi@@kLzIp{8F`MCJ5#v8Msl{)Y>tRJ&yoJw@!EgNsxtt0(5x->GgTjq7b~ua}dZ+IFTTf`20XtSi#CM -4J<~SMAe=sG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(11#WL{V`TsU2n26%X=DQF^?B2x5WL89 -5XetBksy@#{6JP%!OAfWEJmC})t)Go$mV(;bz)!CmQ_M(k?Vd!kfCo{nDM?)_qK{868FUlS7~%^Wpi^+ +Wpi@@kLzIp{8F`MCJ5#v8Msl{)Y>tRJ&yoJw@!EgNsxtt0(5x-(f&P{=oF6kHYMd^Ut>QY=-58E@U#ya +NQ%y*O8nGIG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(11#WL{V`TsU2n26%X=DP?{ymuJ6pr^c +CFNpYV?QA1*gm-Mv=16ciq4}-{M1X8$mV(;bz)!CmQ_M(k?Vd!kfCo{nDM?)_qK{868FUlS7~%^Wpi^+ a%2Pq00nJnZe?Tu1pxtE+zulZFL@%{hr{`tLyD)K8_+CBIb!yB_q58$0Duw!33O#{bYXO9c4Ytn00IYT XKrtDWn=&V00RhNa${&|c4cG$000VCX>@L7b8}E{a|QzjY+-q2axnpU#Mns)Y&M6LqDeqU-jv95KHlTh h+c{38p;h*Y8ns*Xk}?^V^^aKhhWqQaCPe;mRh4xTdP)p48Sa&?}@#>(}~1Qkv0 TVN#f!!NN~i;clS9?JTPS=WIIT diff --git a/stl/RGBLogic@0.1.0.sty b/stl/RGBLogic@0.1.0.sty index 1866585a..626c7d12 100644 --- a/stl/RGBLogic@0.1.0.sty +++ b/stl/RGBLogic@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:JXHYYte5-zpKGnbK-BPX9gDq-fyR0RbB-F6U3Nxj-gDdt_3A#special-jungle-patient + Id: stl:qvGXFFoy-THfbkrM-_A5DrFb-5leOnhE-sa7Mpct-iuE6DVk#south-license-prepare Name: RGBLogic Version: 0.1.0 Description: Consensus logic layer for RGB smart contracts @@ -26,7 +26,7 @@ import Bitcoin#quiz-patent-exit use LeafVer#benefit-carbon-africa use XOnlyPk#clever-swim-carpet -import RGBCommit#teacher-puma-sound +import RGBCommit#patron-melody-jazz use TransitionType#picture-reflex-brigade use OpId#picnic-single-gloria diff --git a/stl/Schema.vesper b/stl/Schema.vesper index 31892396..c3edcd82 100644 --- a/stl/Schema.vesper +++ b/stl/Schema.vesper @@ -89,4 +89,5 @@ rec Schema bytes lib, len 32, aka LibId is pos, U16 ascii name, aka FieldName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is some, U16, option, wrapped, aka AssignmentType, tag 1 From c755508162d68ce37d203e2ac065565f43edbab5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Fri, 25 Apr 2025 18:24:59 +0200 Subject: [PATCH 56/70] operation: add seal_closing_strategy to Genesis --- src/operation/commit.rs | 6 +- src/operation/mod.rs | 3 +- src/operation/operations.rs | 18 ++++ src/stl.rs | 4 +- src/validation/logic.rs | 29 ++++-- src/validation/status.rs | 5 +- stl/RGBCommit@0.1.0.sta | 173 ++++++++++++++++++------------------ stl/RGBCommit@0.1.0.stl | Bin 9076 -> 9224 bytes stl/RGBCommit@0.1.0.sty | 12 ++- stl/RGBLogic@0.1.0.sta | 20 ++--- stl/RGBLogic@0.1.0.stl | Bin 1378 -> 1378 bytes stl/RGBLogic@0.1.0.sty | 10 +-- stl/Schema.vesper | 1 + stl/Transition.vesper | 1 + 14 files changed, 164 insertions(+), 118 deletions(-) diff --git a/src/operation/commit.rs b/src/operation/commit.rs index 91d87e4e..bc508be9 100644 --- a/src/operation/commit.rs +++ b/src/operation/commit.rs @@ -39,8 +39,8 @@ use strict_encoding::StrictDumb; use crate::{ impl_serde_baid64, Assign, AssignmentType, Assignments, BundleId, ChainNet, DataState, ExposedSeal, ExposedState, Ffv, Genesis, GlobalState, GlobalStateType, Operation, RevealedData, - RevealedState, RevealedValue, SchemaId, SecretSeal, Transition, TransitionBundle, - TransitionType, TypedAssigns, LIB_NAME_RGB_COMMIT, + RevealedState, RevealedValue, SchemaId, SealClosingStrategy, SecretSeal, Transition, + TransitionBundle, TransitionType, TypedAssigns, LIB_NAME_RGB_COMMIT, }; /// Unique contract identifier equivalent to the contract genesis commitment @@ -234,6 +234,7 @@ pub struct BaseCommitment { pub timestamp: i64, pub issuer: StrictHash, pub chain_net: ChainNet, + pub seal_closing_strategy: SealClosingStrategy, } #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] @@ -268,6 +269,7 @@ impl Genesis { schema_id: self.schema_id, timestamp: self.timestamp, chain_net: self.chain_net, + seal_closing_strategy: self.seal_closing_strategy, issuer: self.issuer.commit_id(), }; OpCommitment { diff --git a/src/operation/mod.rs b/src/operation/mod.rs index 723e2f17..a7fdf07f 100644 --- a/src/operation/mod.rs +++ b/src/operation/mod.rs @@ -46,7 +46,8 @@ pub use global::{GlobalState, GlobalValues}; pub use layer1::{ChainNet, Layer1}; pub use meta::{MetaValue, Metadata, MetadataError}; pub use operations::{ - Genesis, Identity, Inputs, Operation, Opout, OpoutParseError, Signature, Transition, + Genesis, Identity, Inputs, Operation, Opout, OpoutParseError, SealClosingStrategy, Signature, + Transition, }; pub use seal::{ExposedSeal, GenesisSeal, GraphSeal, OutputSeal, SecretSeal, TxoSeal}; pub use state::{ExposedState, RevealedState, StateType}; diff --git a/src/operation/operations.rs b/src/operation/operations.rs index b92b1e52..eca418f9 100644 --- a/src/operation/operations.rs +++ b/src/operation/operations.rs @@ -209,6 +209,23 @@ impl From<&'static str> for Identity { fn from(s: &'static str) -> Self { Self(RString::from(s)) } } +#[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display)] +#[display(inner)] +#[derive(StrictType, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_COMMIT, tags = repr, into_u8, try_from_u8)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", rename_all = "camelCase") +)] +#[repr(u8)] +#[derive(Default)] +#[non_exhaustive] +pub enum SealClosingStrategy { + #[default] + FirstOpretOrTapret = 0, +} + #[derive(Clone, PartialEq, Eq, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB_COMMIT)] @@ -223,6 +240,7 @@ pub struct Genesis { pub timestamp: i64, pub issuer: Identity, pub chain_net: ChainNet, + pub seal_closing_strategy: SealClosingStrategy, pub metadata: Metadata, pub globals: GlobalState, pub assignments: Assignments, diff --git a/src/stl.rs b/src/stl.rs index 3f175747..670695c4 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -38,10 +38,10 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_COMMIT: &str = - "stl:0f49mOgU-jvc2JeV-iX2M~IO-jYPrjwt-A8aSIrO-o0r81Es#patron-melody-jazz"; + "stl:RNm~87HP-0IyhQ0U-r9rKAGs-BkcPlgj-EXn99u1-mOj57KM#music-cool-tahiti"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:qvGXFFoy-THfbkrM-_A5DrFb-5leOnhE-sa7Mpct-iuE6DVk#south-license-prepare"; + "stl:fmJTDyEq-PeS5cae-Es8S~m7-knAjBaU-3j98Yj6-CYfzlKU#pump-modular-unit"; fn _rgb_commit_stl() -> Result { LibBuilder::with(libname!(LIB_NAME_RGB_COMMIT), [ diff --git a/src/validation/logic.rs b/src/validation/logic.rs index 806afc17..fc6111b0 100644 --- a/src/validation/logic.rs +++ b/src/validation/logic.rs @@ -40,7 +40,8 @@ use crate::vm::{ContractStateAccess, ContractStateEvolve, OpInfo, OrdOpRef, RgbI use crate::{ validation, Assign, AssignmentType, Assignments, AssignmentsRef, ExposedSeal, ExposedState, GlobalState, GlobalStateSchema, GlobalValues, GraphSeal, Inputs, MetaSchema, Metadata, OpId, - Operation, Opout, OwnedStateSchema, RevealedState, Schema, Transition, TypedAssigns, + Operation, Opout, OwnedStateSchema, RevealedState, Schema, SealClosingStrategy, Transition, + TypedAssigns, }; impl Schema { @@ -60,14 +61,24 @@ impl Schema { let empty_assign_schema = AssignmentsSchema::default(); let (metadata_schema, global_schema, owned_schema, assign_schema, validator, ty) = match op { - OrdOpRef::Genesis(_) => ( - &self.genesis.metadata, - &self.genesis.globals, - &empty_assign_schema, - &self.genesis.assignments, - self.genesis.validator, - None::, - ), + OrdOpRef::Genesis(genesis) => { + if genesis.seal_closing_strategy != SealClosingStrategy::FirstOpretOrTapret { + return validation::Status::with_failure( + validation::Failure::SchemaUnknownSealClosingStrategy( + opid, + genesis.seal_closing_strategy, + ), + ); + } + ( + &self.genesis.metadata, + &self.genesis.globals, + &empty_assign_schema, + &self.genesis.assignments, + self.genesis.validator, + None::, + ) + } OrdOpRef::Transition( Transition { transition_type, .. diff --git a/src/validation/status.rs b/src/validation/status.rs index 1b619685..015aab62 100644 --- a/src/validation/status.rs +++ b/src/validation/status.rs @@ -33,7 +33,8 @@ use strict_types::SemId; use crate::schema::{self, SchemaId}; use crate::validation::WitnessResolverError; use crate::{ - BundleId, ChainNet, ContractId, OccurrencesMismatch, OpFullType, OpId, Opout, StateType, Vin, + BundleId, ChainNet, ContractId, OccurrencesMismatch, OpFullType, OpId, Opout, + SealClosingStrategy, StateType, Vin, }; pub type UnsafeHistoryMap = HashMap>; @@ -210,6 +211,8 @@ pub enum Failure { SchemaUnknownGlobalStateType(OpId, schema::GlobalStateType), /// operation {0} uses invalid assignment type {1}. SchemaUnknownAssignmentType(OpId, schema::AssignmentType), + /// operation {0} uses invalid seal closing strategy {1}. + SchemaUnknownSealClosingStrategy(OpId, SealClosingStrategy), /// invalid number of global state entries of type {1} in operation {0} - /// {2} diff --git a/stl/RGBCommit@0.1.0.sta b/stl/RGBCommit@0.1.0.sta index 2f5cc028..7a3ebf72 100644 --- a/stl/RGBCommit@0.1.0.sta +++ b/stl/RGBCommit@0.1.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:0f49mOgU-jvc2JeV-iX2M~IO-jYPrjwt-A8aSIrO-o0r81Es#patron-melody-jazz +Id: stl:RNm~87HP-0IyhQ0U-r9rKAGs-BkcPlgj-EXn99u1-mOj57KM#music-cool-tahiti Name: RGBCommit Dependencies: BPCore#juliet-super-dominic, @@ -8,7 +8,7 @@ Dependencies: AluVM#jargon-gorilla-poetic, StrictTypes#henry-heart-survive, Bitcoin#signal-color-cipher -Check-SHA256: 1d9aaf3bb9eb425596ad43171e74c4e079b5022a40921407a3d06a8b50da54f8 +Check-SHA256: 100a9ba541b9b4beeb45f80048c06edfaaacc75182be7780ca65b51977750c2c 2~tNwLvL+uX>pKz(VCaX%3mIP&XB&sB3y@ML2MxM-cip;h4&;#rLQq3*a%D_q7H}ii_tAk8EiIL^ F;WduOYhK!;vHZzZO$@xxWWuWZ*6U9bXH|@X=ZtXiR(=d3vg7gbV~*3!PlK51EySK%g?1}nECovJTYnm @@ -26,7 +26,7 @@ NMUnm15ioJpYH;+t0eX2w~A!Q -+0eaZ{MVycPK^aqWo=1hIRGF*b8~5DZc=4-WnpY(WJFcz4~pa1P{=r>OF|0}@Y#k~NrxRcQq+F$P2q2)nlU E64L7%3W7R1#@&^bY%hmXk);5Qh;gshq!{{oTC#gIzF4hFN<*P1RquLWiVd>5Mys{W@%()Zggp3Y*S@n YybuV1aoC!Yyv&&I}!?D=!eA%8DA7<8;7e4kWwcH4Z3)D-MVlN%7&o7^|1Fn59cLW!>7R25;!; @@ -68,90 +68,93 @@ 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 -ivkR6Lh9EroO>_;00000 -00030000000000BPh(?sa&l#EV`Xy&0t0PnZU6uR18re=0006EPjEwTZEb0EZDnqB1_uLXW_AJEn^6;3 -7FKqUhx?i3R+Mr!fY&(;2BFL(m@EZk_srD=Zf|a5WdHyO25)dwd2nR`%2$5!EP9}wr6-=g&nP&FJCd6L -w5)jM(Vn~1K3NM22yJC_VPs)+VFFBL7H}ii_tAk8EiIL^F;WduOYhK!;vHZzZO$@xxWa9(t;O}HAO^^z -qT0%g+nC0;-MWK<)&Ge4`aq}l(*_4;Y;R&=Y;yukWfpKF*Z0wZ5-ly2voTT)QcLg9hvFSzGHuQ>ceuhh -oM?JbaMhsWfpKF*Z0wZ5-ly2voTT)QcLg9hvFSz -GHuQ>ceuhhoClv)aMjKgwAH@`bu1x<7g|G$};xvA~n-$_S1W#~DWCZ~L2LJ#- -AOHnVaBp>V1_J_bZ~>Lb=6W7=VqesjRYGc!>wZFzp>JB4@xD;^wu&SY_r(Hqc>#z1;$>KfZ0H=mhJ>?u -VM0r~W-2xhK9cV^W63=w?&L0_mQT=Q}`` -f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1P-_IE6rQG)02XJT?*g=|B=zREie$*y(7k2+*P~cYjSNy{c4c8~ -Wn@HQbYTVp1$JRox?`Aroor<$W|05z3@o%yggKU%$CX5lEZwTb6rTk%m8U3Qf4cdUdGS4#Tk(yYN*ff#-&-~S000000003000000 -0000BXKZg`VQf@+aAk7<3IWybk`76TvuW{aQ_%-X`?VwZ$5L?~`!+pRSq0(b70Uq+w#z7JBTYQ(6wA15 -KJe33N=y1k%8ssy_EyFtI!|)|0000000030000000000AZ+C8GWK?-@Wpe-u0f+wLWmt%8=p4R=gtK{L -Clh6Z#kObxUW*hKHnBv9xdE$XcznDDD1^I$Y^N^U(vj;W#J@gj^sY5z(hn_6P=Wve000000093000000 -000MPWo~72X>$QiY|5IT5^vH^lnD&b8~5DZf#|5bN~bb00eGtZe;)f009JZZ*64&1pxtv{^Dg=h-~N_zJ`Re -d1EINWrM}GXaQb}6c#qIM2EQuQ)6glZDC1d1pxpD002NB00~oRXKrD1b#i3|0RRU806;(h3RH4oZgXjL -X>V=@2?J(kb^+R(Q4?4eR(6nw`6 -5I6*X)C9iYp+?yjr7~y;ZDn*}WMOn+0rh%KI9Y!AFx9LCk8@hQXE7w+qW3^C%eTEp@#^?_H3w&GZ(?C= -a{=BXk!z-`g4hv-$6z_YxoLZ_neUP>BpbEf7FA*KKfDHMZg6#Ua{)F6OOsb2BHT!z`XR@Y;!tI8CO};e1CqOk74-_0uXd^VQzD2bZKvHQ)6glZD9ed -f2kfhA@=uGO=Jtx#~n~$5JW2|a}~7vfDWQsGAeQeZeeX@0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$ -)ov?1P#d&Z0rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~au8HvO>-_DBy8`Vb0jGrW9$=2qSMXvL3HGEG -0000000000{{R300000025D|^b#!w83IT`y;$>KfZ0H=mhJ>?uVKf -Z0H=mhJ>?uV+h;;t~i_0 -*|LWuHI04?{jxD_@1Z8)ymjIKNK5;L!8FkfGTe+FK;UUh9M-4n+}vRfRB~Z%b7^#GZ*Ek1aAgGn0006G -RC#b^LvL+uX>@I6Zgd0!00(DfZe??6a{vVa0h+gqf?Rp%6iMiJWSjIEXZh)6m&h~&+zye%ED2tzuK@~l -a$#@6CZU6-W0iOsgNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G66JF53UoI8eY9A{1GERg--Gi -I0S#x1is&)M%fmnGH4o9d2nT9L349yXKr&sY-w&}Q)OXnRCrKyas&ea3uI+uY+-U?bZK^F00jX7mKXer -W0Qqc!+k80=;yo}n=;>F%vyGSQrr|FsW@w00SIPwZf9v?Y-Ioi0Re_@j8YR^qG~>S=1}s{@YHNvd%|!L -(k$KwJ36-gR5$_(b98cbV{~|YxG^Yz#^ZFU^t3{+J~Mh_bI7nokNupKIyUBoF*Amd2nT9 -L349yXKr&sY-w&}Q)OXnRCsA*1OosIWMyM)VRB(~X?A4*1pxu~Tw_^8WdM??RZ;ab079^O9n9I5E1y8~ -f0E6BLSf$l2xfI|XK7+=WdH>M0kJr$ExjZC(6aTL<%Yn=OAsBONy9}<9ShXdp&a+I0RjqhbaHiLbairN -WB>&L0skvs(Od{!87YUR()qn4$??<6X>Ltn +X>M+1bN~-xX>?<6X>L?yb98QHbTa`DVrg_^Z)t8+Wpi|HWpp$G4Pt3@V{d70Q)y>zWpo1$Vrg_^Z)t8) +WoL9{b94j^Y-w?IX=F`dX>M+1bOjA;X>oOFWK?BybZ%vI1`0!OZgg^CV{}Pm1pxpD002NB00~54bYW9; +VRU5$0RRX906+i$0000000960000000009c;Wds2T24ZP+b2c;p1pxp6 +2n~Wpi|4 +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 +Lxv|61vo|+NwrBxfixd_%u|$Wt0&Z^r +00IzCcWz~5Q*>c;Wm98lWo=;u0{{zTWn*k%a$$67c4Ytn009VQb#7;AVr*pq1pxv1^sESGu0eNZ)cp(* +eFU-DRQ(QTUJ^TE1nY56>E%WO3UhRFbz^jOa%E%y1pxx-o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6 +D?CtZ1fvw5rj-B|XP@r^w5ufb=C_Ju$l1`nW&GEpSWb-$Qe}2!VQgh&L}7Gc1_A|kVQh6}0WzLeQ3m-< +6)UHjqig^*m4co5us7ukl*0UQzs7w8g#>e9Y;*ts5D-#jc4c8~Wn@NmZf9v?Y-I)k1$JRKwa1v8ba_B>T#2Nxy=Q)6glZD9ro17>D+0ot2U6Id2jc94hrndMfLayEe1ISdA& +%p{mB1!VWk)dX%~ZDj)Ko|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CtB76^nC$%1sKzB<;EQA|)S +-x88IWKN#S$#@T&w`gPuZDn*}RC#b^a{vkfb>vO>-_DBy8`Vb0jGrW9$=2qSMXvL3Hm|g$K5F!?HDuBcElf~?0000000000{{R30000002WMq&WpinB0ZwennxGPI(od8R +ooadlAElm^Clat;Ot{#TZWc0Cjtg{hVQzD2bZKvHa{vkfG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj? +7Ns(10jIWVom4HC=;Sf&(M0f+wLWmt%8=p4R=gtK{LClh6Z#kObxUW*hKHnBv9xd>BZ +Xk~3-Nn`~900#g7Kp+4UQ)OXnLu_wzX>MmzbaG*IWoLN<0TO0ua&vS~aB^jIPjXaYaB^jI00~oRXKrD1 +b#i3|0RRU806;(h3RH4oZgXjLX>V=@2?J(kb^+R(Q4?4eR(6nw`65I6*X)C9iYp+?yjr7~y;ZDn*}WMOn+0rh%KI9Y!AFx9LCk8@hQXE7w+ +qW3^C%eTEp@#^?_H3w&GZ(?C=a{=BXk!z-`g4hv-$6z_YxoLZ_neUP>BpbEf7FA*KKfDHMZg6#Ua{)F6 +OOsb2BHT!z`XR@Y;!tI8CO};e1CqOk74-_ +0uXd^VQzD2bZKvHQ)6glZD9edf2kfhA@=uGO=Jtx#~n~$5JW2|a}~7vfDWQsGAeQeZeeX@0_mQT=Q}`` +f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1P#d&Z0rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~au8HvO>-_DBy8`Vb0jGrW9$=2qSMXvL3HGEG0000000000{{R300000025D|^b#!w83IT`y;$>KfZ0H=mhJ>?uVKfZ0H=mhJ>?uV+h;;t~i_0*|LWuHI04?{jxD_@1Z8)ymjIKNK5;L!8FkfGTe+FK;UUh9M-4n+}vRf +RB~Z%b7^#GZ*Ek1aAgGn0006GRC#b^LvL+uX>@I6Zgd0!00(DfZe??6a{vVa0ka@6@^M6UrPd3M1KcD{ +b^0LK)?Oqt7J|f!mBl?;{{aega$#@6CZU6-W0iOsgNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6 +G66JF53UoI8eY9A{1GERg--GiI0S#x1is&)M%fmnGH4o9d2nT9L349yXKr&sY-w&}Q)OXnRCrKyas&ea +3uI+uY+-U?bZK^F00jX7mKXerW0Qqc!+k80=;yo}n=;>F%vyGSQrr|FsW@w00SIPwZf9v?Y-Ioi0Re_@ +j8YR^qG~>S=1}s{@YHNvd%|!L(k$KwJ36-gR5$_(b98cbV{~|YxG^Yz#^ZFU^t3{+J~Mh +_bI7nokNupKIyUBoF*Amd2nT9L349yXKr&sY-w&}Q)OXnRCsA*1OosIWMyM)VRB(~X?A4*1pxu~Tw_^8 +WdM??RZ;ab079^O9n9I5E1y8~f0E6BLSf$l2xfI|XK7+=WdH>M0kJr$ExjZC(6aTL<%Yn=OAsBONy9}< +9ShXdp&a+I0RjqhbaHiLbairNWB>&L0skvs(Od{!87YUR()qn4$?1fQ8X&vmnb#E=JbLyZKg{3Kyp)<~Zl%7iZ?B2bUBjmZYXvGS1Sya$x@h zt%&*J_t-an*=1(poM#}swZT~6^rp=|K_^#kPT}WgWaOM&C8aufra&iohD`344c=TT zXwIgP@6W#K#o_WR--T{Xn{@v8HSTrpDL+L|_XOok_h(bpXxe;6T#{8&I2hBV%#1>5 znMK7V{sl#;CH_Sri6DCO6PcYX3Y!%SKNY%^F1^Ox$9zY{xAd37jcai##$ruJx~Cqs MjrzZNui|z_02KXll>h($ delta 138 zcmV;50CoR}Nc2Xq5Cj1^vk?TT3IPO@&JaG6`3`HdnGX*E0SJ@e7bTO<5Q(#l5sC&W z%2$5!EP9}wr6-=g&nP&FJCd6Lw5)jM(Vn~1K3NM22yJC_VPs)+VUy4pA+ul@?*y}X s9k>J_nzxIBTzTjeN$7WEoAeoH`RQes$TS1o4w1wx30|qMvr!_q0U$~`-v9sr diff --git a/stl/RGBCommit@0.1.0.sty b/stl/RGBCommit@0.1.0.sty index 4fc92a79..1ce88009 100644 --- a/stl/RGBCommit@0.1.0.sty +++ b/stl/RGBCommit@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:0f49mOgU-jvc2JeV-iX2M~IO-jYPrjwt-A8aSIrO-o0r81Es#patron-melody-jazz + Id: stl:RNm~87HP-0IyhQ0U-r9rKAGs-BkcPlgj-EXn99u1-mOj57KM#music-cool-tahiti Name: RGBCommit Version: 0.1.0 Description: Consensus commitment layer for RGB smart contracts @@ -97,11 +97,12 @@ data AssignmentsBlindSealTxPtr : {AssignmentType -> ^ ..0xff TypedAssignsBlindSe @mnemonic(baker-size-sonar) data AssignmentsBlindSealTxid : {AssignmentType -> ^ ..0xff TypedAssignsBlindSealTxid} -@mnemonic(manila-number-locate) +@mnemonic(fiesta-gilbert-fiber) data BaseCommitment : schemaId SchemaId , timestamp I64 , issuer CommitVerify.StrictHash , chainNet ChainNet + , sealClosingStrategy SealClosingStrategy @mnemonic(carmen-farmer-diesel) data BundleId : [Byte ^ 32] @@ -127,12 +128,13 @@ data FungibleState : bits64#8 U64 | (|) data FungibleType : unsigned64Bit#8 | (|) -@mnemonic(july-angel-bombay) +@mnemonic(salami-water-climax) data Genesis : ffv Ffv , schemaId SchemaId , timestamp I64 , issuer Identity , chainNet ChainNet + , sealClosingStrategy SealClosingStrategy , metadata Metadata , globals GlobalState , assignments AssignmentsBlindSealTxid @@ -223,6 +225,10 @@ data Schema : ffv Ffv @mnemonic(ramirez-patron-simon) data SchemaId : [Byte ^ 32] +@mnemonic(exile-target-catalog) +data SealClosingStrategy : firstOpretOrTapret | (|) + + @mnemonic(ferrari-zebra-tempo) data Signature : [Byte ^ 64] diff --git a/stl/RGBLogic@0.1.0.sta b/stl/RGBLogic@0.1.0.sta index 82586584..168ebe50 100644 --- a/stl/RGBLogic@0.1.0.sta +++ b/stl/RGBLogic@0.1.0.sta @@ -1,15 +1,15 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:qvGXFFoy-THfbkrM-_A5DrFb-5leOnhE-sa7Mpct-iuE6DVk#south-license-prepare +Id: stl:fmJTDyEq-PeS5cae-Es8S~m7-knAjBaU-3j98Yj6-CYfzlKU#pump-modular-unit Name: RGBLogic Dependencies: BPCore#juliet-super-dominic, - Bitcoin#quiz-patent-exit, - RGBCommit#patron-melody-jazz -Check-SHA256: 4a00ee7b43bcc5c5a604fd9723bca4bbe9c20f30951dea6ae09489ef9dbdf835 + RGBCommit#music-cool-tahiti, + Bitcoin#quiz-patent-exit +Check-SHA256: 17db028688990250f05f107877b1fedfe9c5954dc252772b26a2aa5cb2e081b7 -2vSEvOmAmtV*@?wI}!?D=!eA%8DA7<8;7e4kWwcH4Z3)D-MVlNNgzlT_m -3wFmfDB@ZlUF_{Gi(YuS4F^JLbYpL6ZqfcdnCKLa_ckTvVqarFAn4dWxbUwB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 +2vSEvOmAmtV*@?wI}!?D=!eA%8DA7<8;7e4kWwcH4Z3)D-MVlNwB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 wjY>38tto&d&=eG4cRAF#( Wpq+$XJ~Xna$#;`Xh%-ZT+rxDK6vW;JU&?LxLM72H?wDC1Zo}=N}D)4mkLjCa%FT-a&K>D2SRCdV{d70 @@ -23,9 +23,9 @@ hs6sSUleB>hpP*aQYQxux_Ecpx^NEUkq@>Xm_HirtB!lh<{Yi-S-!KI0_27BH<@sVme~^s3<3pjaB^jI 00jX8J?lFX3Sj7m#S0l<6lWWUs|%1)CkG9>cz4~pa1P{=M^4XN(CAD)cag{2}f*iVqt7ga%2Vq1#fUqa%2Inp_$2edG9dLzy*OG4Oq4bRCJgzb0?22v{-Vn;AC_IX=Hc+00IU~ VR>b8F#`ezVrg_^Z)t7-25f0@b!lV)1y68Ka%2Po00(DfZe??6a{vGU{|a<+VQzD2bZKvH00smHcWHEP -Wpi@@kLzIp{8F`MCJ5#v8Msl{)Y>tRJ&yoJw@!EgNsxtt0(5x-(f&P{=oF6kHYMd^Ut>QY=-58E@U#ya -NQ%y*O8nGIG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(11#WL{V`TsU2n26%X=DP?{ymuJ6pr^c -CFNpYV?QA1*gm-Mv=16ciq4}-{M1X8$mV(;bz)!CmQ_M(k?Vd!kfCo{nDM?)_qK{868FUlS7~%^Wpi^+ +Wpi@@kLzIp{8F`MCJ5#v8Msl{)Y>tRJ&yoJw@!EgNsxtt0(5x-MA^UdvCq(qp+iM0_OgH)z+`awV2nlQ +_uI9Y==toUG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(11#WL{V`TsU2n26%X=DOK*}wC#&(Msa +Lq#k0vVa=EWN`Ulj78`7+qIbJ`Rt>W$mV(;bz)!CmQ_M(k?Vd!kfCo{nDM?)_qK{868FUlS7~%^Wpi^+ a%2Pq00nJnZe?Tu1pxtE+zulZFL@%{hr{`tLyD)K8_+CBIb!yB_q58$0Duw!33O#{bYXO9c4Ytn00IYT XKrtDWn=&V00RhNa${&|c4cG$000VCX>@L7b8}E{a|QzjY+-q2axnpU#Mns)Y&M6LqDeqU-jv95KHlTh h+c{38p;h*Y8ns*Xk}?zrA(Fi=S^6a|XFPIp^o* iW|mAe)Y#a(lv#n0j>$bt3X?Nf_z5fA4OF Date: Sun, 27 Apr 2025 17:00:45 +0200 Subject: [PATCH 57/70] operation: no empty set in input_map + Assignments tiny->small --- src/operation/assignments.rs | 4 +- src/operation/bundle.rs | 46 ++++--------- src/operation/mod.rs | 2 +- src/stl.rs | 4 +- src/validation/validator.rs | 8 +-- stl/RGBCommit@0.1.0.sta | 130 +++++++++++++++++------------------ stl/RGBCommit@0.1.0.stl | Bin 9224 -> 9226 bytes stl/RGBCommit@0.1.0.sty | 18 ++--- stl/RGBLogic@0.1.0.sta | 16 ++--- stl/RGBLogic@0.1.0.stl | Bin 1378 -> 1378 bytes stl/RGBLogic@0.1.0.sty | 10 +-- stl/Transition.vesper | 2 +- stl/TransitionBundle.vesper | 10 +-- 13 files changed, 118 insertions(+), 132 deletions(-) diff --git a/src/operation/assignments.rs b/src/operation/assignments.rs index 8a171e7a..d3f06de0 100644 --- a/src/operation/assignments.rs +++ b/src/operation/assignments.rs @@ -25,7 +25,7 @@ use core::fmt::Debug; use std::collections::{btree_map, BTreeSet}; use std::hash::Hash; -use amplify::confinement::{Confined, NonEmptyVec, TinyOrdMap, U16}; +use amplify::confinement::{Confined, NonEmptyVec, SmallOrdMap, U16}; use commit_verify::Conceal; use strict_encoding::{StrictDecode, StrictDumb, StrictEncode}; @@ -487,7 +487,7 @@ impl TypedAssigns { bound = "Seal: serde::Serialize + serde::de::DeserializeOwned" ) )] -pub struct Assignments(TinyOrdMap>) +pub struct Assignments(SmallOrdMap>) where Seal: ExposedSeal; impl Default for Assignments { diff --git a/src/operation/bundle.rs b/src/operation/bundle.rs index d51726c7..6f654a77 100644 --- a/src/operation/bundle.rs +++ b/src/operation/bundle.rs @@ -20,9 +20,10 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::collections::{btree_map, BTreeMap}; +use std::collections::btree_set; +use std::iter; -use amplify::confinement::{Confined, SmallOrdSet, U16 as U16MAX}; +use amplify::confinement::{NonEmptyOrdMap, NonEmptyOrdSet, U16 as U16MAX}; use amplify::{Bytes32, Wrapper}; use bp::Vout; use commit_verify::{mpc, CommitEncode, CommitEngine, CommitId, CommitmentId, DigestExt, Sha256}; @@ -70,37 +71,20 @@ impl From for BundleId { #[derive(Wrapper, WrapperMut, Clone, PartialEq, Eq, Hash, Debug, From)] #[wrapper(Deref)] #[wrapper_mut(DerefMut)] -#[derive(StrictType, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_RGB_COMMIT, dumb = Self(NonEmptyOrdSet::with(OpId::strict_dumb())))] #[cfg_attr( feature = "serde", derive(Serialize, Deserialize), serde(crate = "serde_crate", transparent) )] -pub struct InputMap(Confined>, 1, U16MAX>); - -impl StrictDumb for InputMap { - fn strict_dumb() -> Self { Self(Confined::with_key_value(strict_dumb!(), strict_dumb!())) } -} - -impl InputMap { - pub fn with(input: Vin, ids: SmallOrdSet) -> Self { - InputMap(Confined::with((input, ids))) - } -} - -impl IntoIterator for InputMap { - type Item = (Vin, SmallOrdSet); - type IntoIter = btree_map::IntoIter>; - - fn into_iter(self) -> Self::IntoIter { self.0.into_iter() } -} +pub struct InputOpids(NonEmptyOrdSet); -impl<'a> IntoIterator for &'a InputMap { - type Item = (&'a Vin, &'a SmallOrdSet); - type IntoIter = btree_map::Iter<'a, Vin, SmallOrdSet>; +impl<'a> IntoIterator for &'a InputOpids { + type Item = OpId; + type IntoIter = iter::Copied>; - fn into_iter(self) -> Self::IntoIter { self.0.iter() } + fn into_iter(self) -> Self::IntoIter { self.0.iter().copied() } } #[derive(Clone, Eq, PartialEq, Debug, Display, Error)] @@ -116,21 +100,21 @@ pub struct UnrelatedTransition(OpId, Transition); serde(crate = "serde_crate", rename_all = "camelCase") )] pub struct TransitionBundle { - pub input_map: InputMap, - pub known_transitions: Confined, 1, U16MAX>, + pub input_map: NonEmptyOrdMap, + pub known_transitions: NonEmptyOrdMap, } impl CommitEncode for TransitionBundle { type CommitmentId = BundleId; - fn commit_encode(&self, e: &mut CommitEngine) { e.commit_to_serialized(&self.input_map); } + fn commit_encode(&self, e: &mut CommitEngine) { e.commit_to_map(&self.input_map); } } impl StrictDumb for TransitionBundle { fn strict_dumb() -> Self { Self { - input_map: strict_dumb!(), - known_transitions: Confined::with_key_value(strict_dumb!(), strict_dumb!()), + input_map: NonEmptyOrdMap::with_key_value(strict_dumb!(), strict_dumb!()), + known_transitions: NonEmptyOrdMap::with_key_value(strict_dumb!(), strict_dumb!()), } } } diff --git a/src/operation/mod.rs b/src/operation/mod.rs index a7fdf07f..e8e1514c 100644 --- a/src/operation/mod.rs +++ b/src/operation/mod.rs @@ -35,7 +35,7 @@ mod commit; pub use assignments::{ Assign, AssignData, AssignFungible, AssignRights, Assignments, AssignmentsRef, TypedAssigns, }; -pub use bundle::{BundleId, InputMap, TransitionBundle, UnrelatedTransition, Vin}; +pub use bundle::{BundleId, InputOpids, TransitionBundle, UnrelatedTransition, Vin}; pub use commit::{ AssignmentCommitment, AssignmentIndex, BaseCommitment, BundleDisclosure, ContractId, DiscloseHash, GlobalCommitment, OpCommitment, OpDisclose, OpId, TypeCommitment, diff --git a/src/stl.rs b/src/stl.rs index 670695c4..2c7f45a7 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -38,10 +38,10 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_COMMIT: &str = - "stl:RNm~87HP-0IyhQ0U-r9rKAGs-BkcPlgj-EXn99u1-mOj57KM#music-cool-tahiti"; + "stl:IW263JVo-49naRhx-LV5qkTm-Jgko_2S-qtsQe2k-dB7CM24#neutral-doctor-fractal"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:fmJTDyEq-PeS5cae-Es8S~m7-knAjBaU-3j98Yj6-CYfzlKU#pump-modular-unit"; + "stl:zXAoLkjl-V_4TOCN-eza~dDW-KBZPXoZ-SJByF5s-JXRT5V8#italian-chariot-tribal"; fn _rgb_commit_stl() -> Result { LibBuilder::with(libname!(LIB_NAME_RGB_COMMIT), [ diff --git a/src/validation/validator.rs b/src/validation/validator.rs index b99a42b2..1dda75a6 100644 --- a/src/validation/validator.rs +++ b/src/validation/validator.rs @@ -408,23 +408,23 @@ impl< let witness_id = pub_witness.txid(); for (vin, opids) in &bundle.input_map { for opid in opids { - let Some(outpoints) = input_map.get(opid) else { + let Some(outpoints) = input_map.get(&opid) else { self.status .borrow_mut() - .add_failure(Failure::BundleExtraTransition(bundle_id, *opid)); + .add_failure(Failure::BundleExtraTransition(bundle_id, opid)); continue; }; let Some(input) = pub_witness.inputs.get(vin.to_usize()) else { self.status .borrow_mut() - .add_failure(Failure::BundleInvalidInput(bundle_id, *opid, witness_id)); + .add_failure(Failure::BundleInvalidInput(bundle_id, opid, witness_id)); continue; }; if !outpoints.contains(&input.prev_output) { self.status .borrow_mut() .add_failure(Failure::BundleInvalidCommitment( - bundle_id, *vin, witness_id, *opid, + bundle_id, *vin, witness_id, opid, )); } } diff --git a/stl/RGBCommit@0.1.0.sta b/stl/RGBCommit@0.1.0.sta index 7a3ebf72..d6134522 100644 --- a/stl/RGBCommit@0.1.0.sta +++ b/stl/RGBCommit@0.1.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:RNm~87HP-0IyhQ0U-r9rKAGs-BkcPlgj-EXn99u1-mOj57KM#music-cool-tahiti +Id: stl:IW263JVo-49naRhx-LV5qkTm-Jgko_2S-qtsQe2k-dB7CM24#neutral-doctor-fractal Name: RGBCommit Dependencies: BPCore#juliet-super-dominic, @@ -8,7 +8,7 @@ Dependencies: AluVM#jargon-gorilla-poetic, StrictTypes#henry-heart-survive, Bitcoin#signal-color-cipher -Check-SHA256: 100a9ba541b9b4beeb45f80048c06edfaaacc75182be7780ca65b51977750c2c +Check-SHA256: 8976386dff8fb4f735ea6f1fa0367d56e1caa6ec615e9ddff8eeec58155707aa 2~tNwLvL+uX>pKz(VCaX%3mIP&XB&sB3y@ML2MxM-cip;h4&;#rLQq3*a%D_q7H}ii_tAk8EiIL^ F;WduOYhK!;vHZzZO$@xxWWuWZ*6U9bXH|@X=ZtXiR(=d3vg7gbV~*3!PlK51EySK%g?1}nECovJTYnm @@ -66,9 +66,9 @@ Wo~ptWprU_Y;y(!5N~&GWn@!yVRU6vV`yb7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj065I6*X)C9iYp+?yjr7~y^L349yXKrm} Zgf<6aAgGn0006RL349yXKrm}Zgg`(Y-w&}Q)OXnRCrKyas>eZ3IT`y;$>KfZ0H=mhJ>?uV_ +1{TCs^=U6gEaSeO$fNiEz_``F{c#*leeVDO000000096000000000g`VRL0eZ*6U9bZupBbOr?ob7N>_ ZDC1d0hChH+XJhss8OG%_CC-Q>(otsF+cqN0Qy}ddQ=3E5D9c?ZDn(GVQp{#07wRDb8~fNaso_c7H}ii _tAk8EiIL^F;WduOYhK!;vHZzZO$@xxWa9(t;O}HAO^^zqT0%g+nC0;-MWK<)&Ge4`aq}l(*_7*Xklq? PGxiftsXy=AYX8dDQEQRO5D(yMKm~r|3!X*hx(?lDDx}U6LV!@Y(s2sb7^j8Q*?4+bY*9G0h%q;z`x)s @@ -81,8 +81,8 @@ VRU5$0RRX906+i$0000000960000000009c;Wds2T24ZP+b2c;p1pxp6 ZEyepNCs(hb9H5M0k-IXh8!q$B6|*YuiTY;OURW8#d%1{rxIXtTaY^?oCsrRVQFqoWpn|p9zT>IUvP{m XY}ey+|ZdtG&qC*MSg*Y`lhfb^DEX9b7f&{Lu_wzX>MmzbaG*IWoLN-nl048zu+oZpBLT-vGlq&G(&DM 6SaUd5X-W&Oj60I2yJC_VPs)+VFC4eO*mP8`7qV21dnrCyk{{a-lF$FG0V5TNAc?Tc{K-TY;R&=Y;ytL -Bav&Stb*7Pg~wnyz`1FAu$k|YFC-ha-WFA1@jtu^VRLh7XKrm}Zgg`2StS4KayhbvaR{i9LB&##=)P8| -F?%E9dvb>cPWeNU4M$~eWpinBQ)6glZD9rk2yJC_VPs)+VE_pMb>vO>-_DBy8`Vb0jGrW9$=2qSMXvL3 +Bav&Stb*7Pg~wnyz`1FAu$k|YFC-ha-WFA1@jtu^VRLh7XKrm}Zgg`2pY>IaWpMi~j7f^)gSnd`ACeoO +EBU{n0)B>G|Gk~b4M$~eWpinBQ)6glZD9rk2yJC_VPs)+VE_pMb>vO>-_DBy8`Vb0jGrW9$=2qSMXvL3 HGEG0000000000{{R30000003t@9}X=iS2Wo~qH 015$z{^Dg=h-~N_zJ`Red1EINWrM}GXaQb}6c#qIM2EQnHo-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF @@ -96,65 +96,65 @@ mw%Cdg|0Y-zbj2Rx3qrTq9O+ioJpYH;+t0eX2w~A!Q+0eaZ{MVycPK^j{VR%V& Wo>f+00R$4Y;R&=Y*Tb$bY)a|aAgGn0006EM{I9mVQf}mY;|RG1pxpE0WzLeQ3m-<6)UHjqig^*m4co5 us7ukl*0UQzs7w8g#iEn000000RR600000000>EBWo~q7ba@2<00ja9f{E)*4-0TquXIZV=)u>WBLk*f W6RH_XPEi=Ry;9kNWLQ%D(Hkon&*Qwpawq)`VKLB>Wd>h=Ype%b?27200;ttiR(=d3vg7gbV~*3!PlK5 -1EySK%g?1}nECovJTYoWz9SbZ=!8X@=Yuq$20sb<4l#S`iz7Vef}@Ca=a#qt00000000304*&oF00008 -Np5g;bWLG!1pxpG0`+VYVk7oBr%DNv+($;q`HHK!gIHa)*%m(-e#9sm3L)b@L&d6G@+l`%qd385?K@+f -P1(-9sgE>i7rMzqbpQzgmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog<<0000000000|Nj6000000 -0RR9100000|Nj600000021#ykb#!wD0RRaBlMuXsu{2tXFT+?;?hj39&>gq>HOrf1lB-q;n)I5N0RR91 -00000|Nj60000003r%HoVMJwgVQFl01_A|hWo=1h0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1 -P-_IE6rQG)02XJT?*g=|B=zREie$*y(7k2+*P~cYjRbCCZDj)Ko|5M~K$m}!eub_$g}*CJIJdNZ+@c}} -C`8q6D?Csev{(W1V6JV*{3!yZ{M3XW@z+pvO>-_DBy8`Vb0jGrW9$=2qSMXvL3Hj|@I6Zgd6*17>D+0ot2U6Id2jc94hrndMfLayEe1ISdA&%p{mB -1!VWk)dg;EZewKt00;(ea8!A4WdUzb2de19chvV1+Ln^f$JPt3M`ZaG%ZyTNmrn*ID1r!WWprU=VRT^v -Ol1~uBiHxQff6k(m9sHY4N^<*(1+q3U@~paGIzMbZLh7x^`{^P$fKg#%8c8X#<$(NgM!uni2C|Kr}onZ -2WM<=Vqt7^0!(EVa3k0E(SZ^zEtRt|QVmi|@6dsZfv!yd427@; -7veO2zMB=|GX`mHaCLNZ0!(EVa3k0E(SZ^zEtRt|QVmi|@6dsZ -fv!yd427@;7veO2zMB=|GYesJb7^O8ZDnqBa{^3d7H}ii_tAk8EiIL^F;WduOYhK!;vHZzZO$@xxWYJ| -Lxv|61vo|+NwrBxfixd_%u|$Wt0&Z^r -00IzCcWz~5Q*>c;Wm98lWo=;u0{{zTWn*k%a$$67c4Ytn009VQb#7;AVr*pq1pxv1^sESGu0eNZ)cp(* -eFU-DRQ(QTUJ^TE1nY56>E%WO3UhRFbz^jOa%E%y1pxx-o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6 -D?CtZ1fvw5rj-B|XP@r^w5ufb=C_Ju$l1`nW&GEpSWb-$Qe}2!VQgh&L}7Gc1_A|kVQh6}0WzLeQ3m-< -6)UHjqig^*m4co5us7ukl*0UQzs7w8g#>e9Y;*ts5D-#jc4c8~Wn@NmZf9v?Y-I)k1$JRKwa1v8ba_B>T#2Nxy=Q)6glZD9ro17>D+0ot2U6Id2jc94hrndMfLayEe1ISdA& -%p{mB1!VWk)dX%~ZDj)Ko|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CtB76^nC$%1sKzB<;EQA|)S --x88IWKN#S$#@T&w`gPuZDn*}RC#b^a{vkfb>vO>-_DBy8`Vb0jGrW9$=2qSMXvL3Hm|g$K5F!?HDuBcElf~?0000000000{{R30000002WMq&WpinB0ZwennxGPI(od8R -ooadlAElm^Clat;Ot{#TZWc0Cjtg{hVQzD2bZKvHa{vkfG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj? -7Ns(10jIWVom4HC=;Sf&(M0f+wLWmt%8=p4R=gtK{LClh6Z#kObxUW*hKHnBv9xd>BZ -Xk~3-Nn`~900#g7Kp+4UQ)OXnLu_wzX>MmzbaG*IWoLN<0TO0ua&vS~aB^jIPjXaYaB^jI00~oRXKrD1 -b#i3|0RRU806;(h3RH4oZgXjLX>V=@2?J(kb^+R(Q4?4eR(6nw`65I6*X)C9iYp+?yjr7~y;ZDn*}WMOn+0rh%KI9Y!AFx9LCk8@hQXE7w+ -qW3^C%eTEp@#^?_H3w&GZ(?C=a{=BXk!z-`g4hv-$6z_YxoLZ_neUP>BpbEf7FA*KKfDHMZg6#Ua{)F6 -OOsb2BHT!z`XR@Y;!tI8CO};e1CqOk74-_ -0uXd^VQzD2bZKvHQ)6glZD9edf2kfhA@=uGO=Jtx#~n~$5JW2|a}~7vfDWQsGAeQeZeeX@0_mQT=Q}`` -f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1P#d&Z0rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~au8HvO>-_DBy8`Vb0jGrW9$=2qSMXvL3HGEG0000000000{{R300000025D|^b#!w83IT`y;$>KfZ0H=mhJ>?uVKfZ0H=mhJ>?uV+h;;t~i_0*|LWuHI04?{jxD_@1Z8)ymjIKNK5;L!8FkfGTe+FK;UUh9M-4n+}vRf -RB~Z%b7^#GZ*Ek1aAgGn0006GRC#b^LvL+uX>@I6Zgd0!00(DfZe??6a{vVa0ka@6@^M6UrPd3M1KcD{ -b^0LK)?Oqt7J|f!mBl?;{{aega$#@6CZU6-W0iOsgNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6 -G66JF53UoI8eY9A{1GERg--GiI0S#x1is&)M%fmnGH4o9d2nT9L349yXKr&sY-w&}Q)OXnRCrKyas&ea -3uI+uY+-U?bZK^F00jX7mKXerW0Qqc!+k80=;yo}n=;>F%vyGSQrr|FsW@w00SIPwZf9v?Y-Ioi0Re_@ -j8YR^qG~>S=1}s{@YHNvd%|!L(k$KwJ36-gR5$_(b98cbV{~|YxG^Yz#^ZFU^t3{+J~Mh -_bI7nokNupKIyUBoF*Amd2nT9L349yXKr&sY-w&}Q)OXnRCsA*1OosIWMyM)VRB(~X?A4*1pxu~Tw_^8 -WdM??RZ;ab079^O9n9I5E1y8~f0E6BLSf$l2xfI|XK7+=WdH>M0kJr$ExjZC(6aTL<%Yn=OAsBONy9}< -9ShXdp&a+I0RjqhbaHiLbairNWB>&L0skvs(Od{!87YUR()qn4$?5%bR49t5yk`^qQ9e0000000030{{R300000BO=Wap +L}hegX>4-_0tItrZAoMT>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0mw%Cdg|0Y-zbj2Rx3qrTq9O+QGbYWy+bYTSn015$h4P{pQ?3(@m6 +s4{*=wy-PiS_k>Wl|t&*Fr0fZ0000000000{{R30000003r}NXb#iiLZewM01_A?ZX>I@j0t0PfcmMzb +3{P-FZ*6U9bZupBbOr|lW@dH)+M7`mSQb`xkca!3ceuiBudT)PryvH%qoUf%jN6#Tx81sfg4O?s`uaep_R|IjXKZg`VQg~(Ol1~uBiHxQ +ff6k(m9sHY4N^<*(1+q3U@~paGIzMbIG#g>Clv)aMjKgwAH@`bu1x<7g|G$};xvA~n-$_S25D|^b#!wA +Ol1~uBiHxQff6k(m9sHY4N^<*(1+q3U@~paGIzMbIG#g>Clv)aMjKgwAH@`bu1x<7g|G$};xvA~n-$_S +3t@9}X=iS2Wo~qH0!(EVa3k0E(SZ^zEtRt|QVmi|@6dsZfv!yd +427@;7veO2zMB=|GXzg?Nn`~900#g7Kp+4GPjGK_bOr+gZ*T#X$mV(;bz)!CmQ_M(k?Vd!kfCo{nDM?) +_qK{868FUdba?@X{^Dg=h-~N_zJ`Red1EINWrM}GXaQb}6c#qIM2EQoZf^hp0uWDkZe?UsbYXO5Q)6gl +ZD9lh01ISgV{Bn^VRUJBWdHyG0SIPwZf9v?Y-Ioi0Rj2+tO#bVL3d`<{R|O(1hLsv{SIed5<6l9>v2!% +mw%Cdg|0Y-zbj2Rx3qrTq9O+ioJpYH;+ +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 -----END STRICT TYPE LIB----- diff --git a/stl/RGBCommit@0.1.0.stl b/stl/RGBCommit@0.1.0.stl index ccc59032eda4c9766bcc1de9c129d7f65df7022c..cdbe3178f1728d2ecf7bf15395efcd3d7987ba95 100644 GIT binary patch delta 214 zcmeD1=@Jmgf=tta(U(zl$Q7xWTq6eGEU|dQ{L<#md&BCNZ9&}Q{;Uy>#8>`zH?e{ zwks}U*OU0L{n}0DYlYkkizlC!iDQJp%Wre$bc8BR2u|fYU%tyd?u2ys zkK@Pexzvw$mN7Cw!2kacda{SSslwUpzv=R2*O*Mz^tnnK<}R?Q_A+2tJ>_n>(*l3f NlqbJ8&y~++0RU#uR|^0D delta 213 zcmeD3=?i-+cJ&+5;ZPPn=sixk@fZkufK^b_s)<#0(EBSEdciRsY&| zJuhmGYWGv%jjnIpCOu`cm%ORMVL9WZ_vuY*G diff --git a/stl/RGBCommit@0.1.0.sty b/stl/RGBCommit@0.1.0.sty index 1ce88009..be725c2e 100644 --- a/stl/RGBCommit@0.1.0.sty +++ b/stl/RGBCommit@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:RNm~87HP-0IyhQ0U-r9rKAGs-BkcPlgj-EXn99u1-mOj57KM#music-cool-tahiti + Id: stl:IW263JVo-49naRhx-LV5qkTm-Jgko_2S-qtsQe2k-dB7CM24#neutral-doctor-fractal Name: RGBCommit Version: 0.1.0 Description: Consensus commitment layer for RGB smart contracts @@ -91,11 +91,11 @@ data AssignmentDetails : ownedStateSchema OwnedStateSchema @mnemonic(secret-penguin-limit) data AssignmentType : U16 -@mnemonic(target-valid-tiger) -data AssignmentsBlindSealTxPtr : {AssignmentType -> ^ ..0xff TypedAssignsBlindSealTxPtr} +@mnemonic(mercy-first-clone) +data AssignmentsBlindSealTxPtr : {AssignmentType -> TypedAssignsBlindSealTxPtr} -@mnemonic(baker-size-sonar) -data AssignmentsBlindSealTxid : {AssignmentType -> ^ ..0xff TypedAssignsBlindSealTxid} +@mnemonic(extra-signal-alaska) +data AssignmentsBlindSealTxid : {AssignmentType -> TypedAssignsBlindSealTxid} @mnemonic(fiesta-gilbert-fiber) data BaseCommitment : schemaId SchemaId @@ -163,8 +163,8 @@ data GlobalValues : [DataState ^ 1..] @mnemonic(smart-pioneer-nominal) data Identity : Std.AsciiPrintable, [Std.AsciiPrintable ^ ..0xfff] -@mnemonic(tourist-deal-mask) -data InputMap : {Bitcoin.Vout -> ^ 1.. {OpId}} +@mnemonic(legal-milk-gold) +data InputOpids : {OpId ^ 1..} @mnemonic(judo-invest-thermos) data Inputs : {Opout ^ 1..} @@ -243,8 +243,8 @@ data Transition : ffv Ffv , assignments AssignmentsBlindSealTxPtr , signature Signature? -@mnemonic(rider-serpent-algebra) -data TransitionBundle : inputMap InputMap, knownTransitions {OpId -> ^ 1.. Transition} +@mnemonic(isabel-duet-cover) +data TransitionBundle : inputMap {Bitcoin.Vout -> ^ 1.. InputOpids}, knownTransitions {OpId -> ^ 1.. Transition} @mnemonic(orbit-pattern-goblin) data TransitionDetails : transitionSchema TransitionSchema, name StrictTypes.FieldName diff --git a/stl/RGBLogic@0.1.0.sta b/stl/RGBLogic@0.1.0.sta index 168ebe50..485f491d 100644 --- a/stl/RGBLogic@0.1.0.sta +++ b/stl/RGBLogic@0.1.0.sta @@ -1,14 +1,14 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:fmJTDyEq-PeS5cae-Es8S~m7-knAjBaU-3j98Yj6-CYfzlKU#pump-modular-unit +Id: stl:zXAoLkjl-V_4TOCN-eza~dDW-KBZPXoZ-SJByF5s-JXRT5V8#italian-chariot-tribal Name: RGBLogic Dependencies: + RGBCommit#neutral-doctor-fractal, BPCore#juliet-super-dominic, - RGBCommit#music-cool-tahiti, Bitcoin#quiz-patent-exit -Check-SHA256: 17db028688990250f05f107877b1fedfe9c5954dc252772b26a2aa5cb2e081b7 +Check-SHA256: 66cc1fd61acc90b58e9ef11c3136dd26a169ed46ca6164a88a4642d91b8c5ef0 -2vSEvOmAmtV*@?wI}!?D=!eA%8DA7<8;7e4kWwcH4Z3)D-MVlN=y4;m$cz4~pa1P{=20~CnZ*pb9N5p0&jkfbCEsDQ~Sda^L$2BP8S|45P?JbL5c)1M+LTPkk Z)t7=20~CnZ*pY?00DdlT>wB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 wjY>38tto&d&=eG4cRAF#( @@ -23,9 +23,9 @@ hs6sSUleB>hpP*aQYQxux_Ecpx^NEUkq@>Xm_HirtB!lh<{Yi-S-!KI0_27BH<@sVme~^s3<3pjaB^jI 00jX8J?lFX3Sj7m#S0l<6lWWUs|%1)CkG9>cz4~pa1P{=M^4XN(CAD)cag{2}f*iVqt7ga%2Vq1#fUqa%2Inp_$2edG9dLzy*OG4Oq4bRCJgzb0?22v{-Vn;AC_IX=Hc+00IU~ VR>b8F#`ezVrg_^Z)t7-25f0@b!lV)1y68Ka%2Po00(DfZe??6a{vGU{|a<+VQzD2bZKvH00smHcWHEP -Wpi@@kLzIp{8F`MCJ5#v8Msl{)Y>tRJ&yoJw@!EgNsxtt0(5x-MA^UdvCq(qp+iM0_OgH)z+`awV2nlQ -_uI9Y==toUG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(11#WL{V`TsU2n26%X=DOK*}wC#&(Msa -Lq#k0vVa=EWN`Ulj78`7+qIbJ`Rt>W$mV(;bz)!CmQ_M(k?Vd!kfCo{nDM?)_qK{868FUlS7~%^Wpi^+ +Wpi@@kLzIp{8F`MCJ5#v8Msl{)Y>tRJ&yoJw@!EgNsxtt0(5x-A#J+cm1yJH+D05pSDK_wVqlVwwo0pP +LG7e;9>OzjG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(11#WL{V`TsU2n26%X=DN+ZMxi*Xye)1 +MjT65nxsx*V3LovN~>%^?WA-b!ZU7_$mV(;bz)!CmQ_M(k?Vd!kfCo{nDM?)_qK{868FUlS7~%^Wpi^+ a%2Pq00nJnZe?Tu1pxtE+zulZFL@%{hr{`tLyD)K8_+CBIb!yB_q58$0Duw!33O#{bYXO9c4Ytn00IYT XKrtDWn=&V00RhNa${&|c4cG$000VCX>@L7b8}E{a|QzjY+-q2axnpU#Mns)Y&M6LqDeqU-jv95KHlTh h+c{38p;h*Y8ns*Xk}?uk8j>`lkpCpwZtzeVN(A#uhlt@Z Date: Tue, 29 Apr 2025 21:57:54 +0200 Subject: [PATCH 58/70] chore: remove unnecessary layers --- src/operation/commit.rs | 6 +- src/operation/data.rs | 82 +++----------- src/operation/fungible.rs | 25 ++--- src/operation/global.rs | 16 +-- src/operation/mod.rs | 2 +- src/stl.rs | 4 +- src/validation/logic.rs | 6 +- src/vm/contract.rs | 12 +-- src/vm/op_contract.rs | 10 +- stl/RGBCommit@0.1.0.sta | 207 ++++++++++++++++++------------------ stl/RGBCommit@0.1.0.stl | Bin 9226 -> 9158 bytes stl/RGBCommit@0.1.0.sty | 29 +++-- stl/RGBLogic@0.1.0.sta | 16 +-- stl/RGBLogic@0.1.0.stl | Bin 1378 -> 1378 bytes stl/RGBLogic@0.1.0.sty | 10 +- stl/Transition.vesper | 20 ++-- stl/TransitionBundle.vesper | 20 ++-- 17 files changed, 194 insertions(+), 271 deletions(-) diff --git a/src/operation/commit.rs b/src/operation/commit.rs index bc508be9..6ee4f484 100644 --- a/src/operation/commit.rs +++ b/src/operation/commit.rs @@ -37,8 +37,8 @@ use commit_verify::{ use strict_encoding::StrictDumb; use crate::{ - impl_serde_baid64, Assign, AssignmentType, Assignments, BundleId, ChainNet, DataState, - ExposedSeal, ExposedState, Ffv, Genesis, GlobalState, GlobalStateType, Operation, RevealedData, + impl_serde_baid64, Assign, AssignmentType, Assignments, BundleId, ChainNet, ExposedSeal, + ExposedState, Ffv, Genesis, GlobalState, GlobalStateType, Operation, RevealedData, RevealedState, RevealedValue, SchemaId, SealClosingStrategy, SecretSeal, Transition, TransitionBundle, TransitionType, TypedAssigns, LIB_NAME_RGB_COMMIT, }; @@ -371,7 +371,7 @@ impl MerkleLeaves for Assignments { #[derive(Clone, Eq, PartialEq, Hash, Debug)] pub struct GlobalCommitment { pub ty: GlobalStateType, - pub state: DataState, + pub state: RevealedData, } impl CommitEncode for GlobalCommitment { diff --git a/src/operation/data.rs b/src/operation/data.rs index b841da22..12b2a684 100644 --- a/src/operation/data.rs +++ b/src/operation/data.rs @@ -20,13 +20,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -use core::fmt::{self, Debug, Formatter}; -use std::cmp::Ordering; - use amplify::confinement::SmallBlob; -use amplify::hex::ToHex; use amplify::Wrapper; -use bp::secp256k1::rand::{random, Rng, RngCore}; use strict_encoding::{StrictSerialize, StrictType}; use super::ExposedState; @@ -50,11 +45,18 @@ impl ExposedState for VoidState { #[wrapper(Deref, AsSlice, BorrowSlice, Hex)] #[derive(StrictType, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB_COMMIT)] -pub struct DataState(SmallBlob); -impl StrictSerialize for DataState {} +pub struct RevealedData(SmallBlob); + +impl StrictSerialize for RevealedData {} + +impl RevealedData { + /// Convenience constructor. + pub fn new(value: impl Into) -> Self { Self(value.into()) } +} -impl From for DataState { - fn from(data: RevealedData) -> Self { data.value } +impl ExposedState for RevealedData { + fn state_type(&self) -> StateType { StateType::Structured } + fn state_data(&self) -> RevealedState { RevealedState::Structured(self.clone()) } } #[cfg(feature = "serde")] @@ -65,14 +67,14 @@ mod _serde { use super::*; - impl Serialize for DataState { + impl Serialize for RevealedData { fn serialize(&self, serializer: S) -> Result where S: Serializer { serializer.serialize_str(&self.to_string()) } } - impl<'de> Deserialize<'de> for DataState { + impl<'de> Deserialize<'de> for RevealedData { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de> { let s = String::deserialize(deserializer)?; @@ -80,61 +82,3 @@ mod _serde { } } } - -#[derive(Clone, Eq, PartialEq, Hash)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT)] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(crate = "serde_crate"))] -pub struct RevealedData { - pub value: DataState, - pub salt: u128, -} - -impl RevealedData { - /// Constructs new state using the provided value using random blinding - /// factor. - pub fn new_random_salt(value: impl Into) -> Self { Self::with_salt(value, random()) } - - /// Constructs new state using the provided value and random generator for - /// creating blinding factor. - pub fn with_rng(value: impl Into, rng: &mut R) -> Self { - Self::with_salt(value, rng.gen()) - } - - /// Convenience constructor. - pub fn with_salt(value: impl Into, salt: u128) -> Self { - Self { - value: value.into(), - salt, - } - } -} - -impl ExposedState for RevealedData { - fn state_type(&self) -> StateType { StateType::Structured } - fn state_data(&self) -> RevealedState { RevealedState::Structured(self.clone()) } -} - -impl PartialOrd for RevealedData { - fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } -} - -impl Ord for RevealedData { - fn cmp(&self, other: &Self) -> Ordering { - match self.value.cmp(&other.value) { - Ordering::Equal => self.salt.cmp(&other.salt), - other => other, - } - } -} - -impl Debug for RevealedData { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - let val = String::from_utf8(self.value.to_vec()).unwrap_or_else(|_| self.value.to_hex()); - - f.debug_struct("RevealedData") - .field("value", &val) - .field("salt", &self.salt) - .finish() - } -} diff --git a/src/operation/fungible.rs b/src/operation/fungible.rs index 9e82758c..c28b55b4 100644 --- a/src/operation/fungible.rs +++ b/src/operation/fungible.rs @@ -62,10 +62,6 @@ impl Default for FungibleState { fn default() -> Self { FungibleState::Bits64(0) } } -impl From for FungibleState { - fn from(revealed: RevealedValue) -> Self { revealed.value } -} - impl FromStr for FungibleState { type Err = ParseIntError; fn from_str(s: &str) -> Result { s.parse().map(FungibleState::Bits64) } @@ -92,25 +88,24 @@ impl FungibleState { /// State item for a homomorphically-encryptable state. /// /// Consists of the 64-bit value and -#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, PartialOrd, Ord)] +#[derive(Wrapper, Clone, Copy, PartialEq, Eq, Hash, Debug, PartialOrd, Ord, From, Display)] +#[display(inner)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_COMMIT, rename = "RevealedFungible")] +#[wrapper(Deref)] +#[strict_type(lib = LIB_NAME_RGB_COMMIT)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(crate = "serde_crate"))] -pub struct RevealedValue { - /// Original value in smallest indivisible units - pub value: FungibleState, -} +pub struct RevealedValue(FungibleState); impl RevealedValue { /// Convenience constructor. - pub fn new(value: impl Into) -> Self { - Self { - value: value.into(), - } - } + pub fn new(value: impl Into) -> Self { Self(value.into()) } } impl ExposedState for RevealedValue { fn state_type(&self) -> StateType { StateType::Fungible } fn state_data(&self) -> RevealedState { RevealedState::Fungible(*self) } } + +impl From for RevealedValue { + fn from(value: u64) -> Self { Self(FungibleState::Bits64(value)) } +} diff --git a/src/operation/global.rs b/src/operation/global.rs index 25dadc12..a59c8f8c 100644 --- a/src/operation/global.rs +++ b/src/operation/global.rs @@ -27,7 +27,7 @@ use amplify::confinement::{Confined, TinyOrdMap, U16}; use amplify::{confinement, Wrapper}; use strict_encoding::StrictDumb; -use crate::{schema, DataState, LIB_NAME_RGB_COMMIT}; +use crate::{schema, RevealedData, LIB_NAME_RGB_COMMIT}; #[derive(Wrapper, WrapperMut, Clone, PartialEq, Eq, Hash, Debug, From)] #[wrapper(Deref)] @@ -39,19 +39,19 @@ use crate::{schema, DataState, LIB_NAME_RGB_COMMIT}; derive(Serialize, Deserialize), serde(crate = "serde_crate", transparent) )] -pub struct GlobalValues(Confined, 1, U16>); +pub struct GlobalValues(Confined, 1, U16>); impl StrictDumb for GlobalValues { - fn strict_dumb() -> Self { Self(Confined::with(DataState::strict_dumb())) } + fn strict_dumb() -> Self { Self(Confined::with(RevealedData::strict_dumb())) } } impl GlobalValues { - pub fn with(state: DataState) -> Self { GlobalValues(Confined::with(state)) } + pub fn with(state: RevealedData) -> Self { GlobalValues(Confined::with(state)) } } impl IntoIterator for GlobalValues { - type Item = DataState; - type IntoIter = vec::IntoIter; + type Item = RevealedData; + type IntoIter = vec::IntoIter; fn into_iter(self) -> Self::IntoIter { self.0.into_iter() } } @@ -72,7 +72,7 @@ impl GlobalState { pub fn add_state( &mut self, ty: schema::GlobalStateType, - state: DataState, + state: RevealedData, ) -> Result<(), confinement::Error> { match self.0.get_mut(&ty) { Some(vec) => vec.push(state), @@ -83,7 +83,7 @@ impl GlobalState { pub fn extend_state( &mut self, ty: schema::GlobalStateType, - iter: impl IntoIterator, + iter: impl IntoIterator, ) -> Result<(), confinement::Error> { match self.0.get_mut(&ty) { Some(vec) => vec.extend(iter), diff --git a/src/operation/mod.rs b/src/operation/mod.rs index e8e1514c..795b7dc7 100644 --- a/src/operation/mod.rs +++ b/src/operation/mod.rs @@ -40,7 +40,7 @@ pub use commit::{ AssignmentCommitment, AssignmentIndex, BaseCommitment, BundleDisclosure, ContractId, DiscloseHash, GlobalCommitment, OpCommitment, OpDisclose, OpId, TypeCommitment, }; -pub use data::{DataState, RevealedData, VoidState}; +pub use data::{RevealedData, VoidState}; pub use fungible::{FungibleState, RevealedValue}; pub use global::{GlobalState, GlobalValues}; pub use layer1::{ChainNet, Layer1}; diff --git a/src/stl.rs b/src/stl.rs index 2c7f45a7..3eb0326e 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -38,10 +38,10 @@ use crate::{ /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_COMMIT: &str = - "stl:IW263JVo-49naRhx-LV5qkTm-Jgko_2S-qtsQe2k-dB7CM24#neutral-doctor-fractal"; + "stl:XbiECcs9-xlyofco-wkXoupT-gJ61JJf-XWL0DWf-INKzIp0#support-iris-depend"; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB_LOGIC: &str = - "stl:zXAoLkjl-V_4TOCN-eza~dDW-KBZPXoZ-SJByF5s-JXRT5V8#italian-chariot-tribal"; + "stl:qolQpjNB-4ZkpJIo-U1tktjI-mwAYyEg-kOGQttY-ZoK3Loo#colombo-famous-erosion"; fn _rgb_commit_stl() -> Result { LibBuilder::with(libname!(LIB_NAME_RGB_COMMIT), [ diff --git a/src/validation/logic.rs b/src/validation/logic.rs index fc6111b0..0e69d806 100644 --- a/src/validation/logic.rs +++ b/src/validation/logic.rs @@ -480,19 +480,19 @@ impl OwnedStateSchema { match (self, state.state_data()) { (OwnedStateSchema::Declarative, RevealedState::Void) => {} (OwnedStateSchema::Fungible(schema), RevealedState::Fungible(v)) - if v.value.fungible_type() != *schema => + if v.as_inner().fungible_type() != *schema => { status.add_failure(validation::Failure::FungibleTypeMismatch { opid, state_type, expected: *schema, - found: v.value.fungible_type(), + found: v.as_inner().fungible_type(), }); } (OwnedStateSchema::Fungible(_), RevealedState::Fungible(_)) => {} (OwnedStateSchema::Structured(sem_id), RevealedState::Structured(data)) => { if type_system - .strict_deserialize_type(*sem_id, data.value.as_ref()) + .strict_deserialize_type(*sem_id, data.as_ref()) .is_err() { status.add_failure(validation::Failure::SchemaInvalidOwnedValue( diff --git a/src/vm/contract.rs b/src/vm/contract.rs index 7073ba93..b488a06d 100644 --- a/src/vm/contract.rs +++ b/src/vm/contract.rs @@ -33,9 +33,9 @@ use chrono::{MappedLocalTime, TimeZone, Utc}; use strict_encoding::{StrictDecode, StrictDumb, StrictEncode}; use crate::{ - AssignmentType, Assignments, AssignmentsRef, BundleId, ContractId, DataState, FungibleState, - Genesis, GlobalState, GlobalStateType, GraphSeal, Layer1, Metadata, OpFullType, OpId, - Operation, Transition, TransitionType, TypedAssigns, LIB_NAME_RGB_LOGIC, + AssignmentType, Assignments, AssignmentsRef, BundleId, ContractId, FungibleState, Genesis, + GlobalState, GlobalStateType, GraphSeal, Layer1, Metadata, OpFullType, OpId, Operation, + RevealedData, Transition, TransitionType, TypedAssigns, LIB_NAME_RGB_LOGIC, }; /// The type is used during validation and computing a contract state. It @@ -392,7 +392,7 @@ impl GlobalOrd { } pub trait GlobalStateIter { - type Data: Borrow; + type Data: Borrow; fn size(&mut self) -> u24; fn prev(&mut self) -> Option<(GlobalOrd, Self::Data)>; fn last(&mut self) -> Option<(GlobalOrd, Self::Data)>; @@ -453,7 +453,7 @@ impl GlobalContractState { /// Retrieves global state data located `depth` items back from the most /// recent global state value. Ensures that the global state ordering is /// consensus-based. - pub fn nth(&mut self, depth: u24) -> Option + '_> { + pub fn nth(&mut self, depth: u24) -> Option + '_> { if depth > self.iter.size() { return None; } @@ -506,7 +506,7 @@ pub trait ContractStateAccess: Debug { &self, outpoint: Outpoint, ty: AssignmentType, - ) -> impl DoubleEndedIterator>; + ) -> impl DoubleEndedIterator>; } pub trait ContractStateEvolve { diff --git a/src/vm/op_contract.rs b/src/vm/op_contract.rs index d26a33f4..34993bc5 100644 --- a/src/vm/op_contract.rs +++ b/src/vm/op_contract.rs @@ -273,7 +273,7 @@ impl InstructionSet for ContractOp { TypedAssigns::Fungible(state) => { let mut values = vec![]; for assign in state.iter().map(Assign::as_revealed_state) { - values.push(assign.value.as_u64()) + values.push(assign.as_inner().as_u64()) } values } @@ -290,7 +290,7 @@ impl InstructionSet for ContractOp { TypedAssigns::Fungible(state) => { let mut values = vec![]; for assign in state.iter().map(Assign::as_revealed_state) { - values.push(assign.value.as_u64()) + values.push(assign.as_inner().as_u64()) } values } @@ -355,7 +355,7 @@ impl InstructionSet for ContractOp { else { fail!() }; - let state = state.value.as_inner(); + let state = state.as_inner(); regs.set_s16(*reg, state); } ContractOp::LdS(state_type, reg_32, reg) => { @@ -372,7 +372,7 @@ impl InstructionSet for ContractOp { else { fail!() }; - let state = state.value.into_inner(); + let state = state.into_inner(); regs.set_s16(*reg, state); } ContractOp::LdF(state_type, reg_32, reg) => { @@ -389,7 +389,7 @@ impl InstructionSet for ContractOp { else { fail!() }; - regs.set_n(RegA::A64, *reg, state.value.as_u64()); + regs.set_n(RegA::A64, *reg, state.as_inner().as_u64()); } ContractOp::LdG(state_type, reg_8, reg_s) => { let Some(reg_32) = *regs.get_n(RegA::A8, *reg_8) else { diff --git a/stl/RGBCommit@0.1.0.sta b/stl/RGBCommit@0.1.0.sta index d6134522..44614e51 100644 --- a/stl/RGBCommit@0.1.0.sta +++ b/stl/RGBCommit@0.1.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:IW263JVo-49naRhx-LV5qkTm-Jgko_2S-qtsQe2k-dB7CM24#neutral-doctor-fractal +Id: stl:XbiECcs9-xlyofco-wkXoupT-gJ61JJf-XWL0DWf-INKzIp0#support-iris-depend Name: RGBCommit Dependencies: BPCore#juliet-super-dominic, @@ -8,7 +8,7 @@ Dependencies: AluVM#jargon-gorilla-poetic, StrictTypes#henry-heart-survive, Bitcoin#signal-color-cipher -Check-SHA256: 8976386dff8fb4f735ea6f1fa0367d56e1caa6ec615e9ddff8eeec58155707aa +Check-SHA256: d929bd2f8100135aeea673c5949e0a762b52943dd8ebe2c0156e02c453d4294f 2~tNwLvL+uX>pKz(VCaX%3mIP&XB&sB3y@ML2MxM-cip;h4&;#rLQq3*a%D_q7H}ii_tAk8EiIL^ F;WduOYhK!;vHZzZO$@xxWWuWZ*6U9bXH|@X=ZtXiR(=d3vg7gbV~*3!PlK51EySK%g?1}nECovJTYnm @@ -26,30 +26,30 @@ NMUnm15ioJpYH;+t0eX2w~A!Q -+0eaZ{MVycPK^aqWo=1hIshO+b8~5DZc=4-WnpY(WJFcz4~pa1P{=r>OF|0}@Y#k~NrxRcQq+F$P2q2)nlU -E64L7%3W7R1#@&^bY%hmXk);5Qh;gshq!{{oTC#gIzF4hFN<*P1RquLWiVd>5Mys{W@%()Zggp3Y*S@n +E64L7%3W7R1#@&^bY%e`@=#VHk7myNk^1UqykExfX%7&o7^|1Fn59cLW!>7R25;!; -BSw%P#_(xeJx6(SSwF1NH_CEIWgkIvb7^O8Qe}2!VQgh& L}7GcLTqVnWK(5fY*ct@WCQ{L2y$h1WnpY(WB>*N1aoC!Yyv&&I}!?D=!eA%8DA7<8;7e4kWwcH4Z3)D --MVlN`(=BbYXO50sm-Yz<5%CY59k^g5#W{6D&GD -o53%OaP0&iRq -cz4~pa1P{=Xc_Cg)w39@m$R6qOEzWQ+NTC@=;*N +-MVlN`(=BbYXO50U+{FRw9pP&is-3>Sw%P#_(xe +Jx6(SSwF1NH_CEIWdRUlZ*FF3WMyu2X<=+rWnpXp1_A_gWnpXrJ?lFX3Sj7m#S0l<6lWWUs|%1)CkG9> +cz4~pa1P{=Xc_Cg)w39@m$R6qOEzWQ+NTC@=;*N 1aoC!Yyv&&I}!?D=!eA%8DA7<8;7e4kWwcH4Z3)D-MVlN4{Q314kUM@UiqyMDEzyT0rZ*FF3WMyu2X<=+rWnpXp +^B~GyS4IVMbYXO50piA=U9}@hoVT73L6bj%{Ruz7i&d|nM{06d&@mN4{{awVZ*FF3WMyu2X<=+rWnpXp 1_A_gWnpXrJ?lFX3Sj7m#S0l<6lWWUs|%1)CkG9>cz4~pa1P{=Xc_Cg)w39@m$R6qOEzWQ+NTC@=;L349yXKqquc4c8~Wn@-i +17N9?v%LmR1#@&^bY%hJ#-ClaBTAgNo)AHkKZ5-UKfsGsub@Y2a#+wY6+-_YL349yXKqquc4c8~Wn@-i Y;|QqY-w&}Q)OXnRCsA*1OfmEa%Fa9VQgh&00sgCb7f&{0zKhpP*aQYQxux_Ecp -x^NEUkt_p^NJ~fc1UzTDb_LBRjrSXj?;k=^zm6d~Uh7!wPz7^zVRU5yH9CeC{6$3z7L3&+{EW{GyYZJ% -0knKxE<9tS|D?sh0T5$vZf0p@Wo~q7VQf=nVQc^f0t9nqVQd0D>pKz(VCaX%3mIP&XB&sB3y@ML2MxM- -cip;h4&;$&8SA{&vly$FvzVnzHf7z~rv`86=_Ka^V5yX|y#`JNb97;JWdSuhh8FxqMGF>;)g%0j&kVcq -mr((MdwWnpYocu;h51pxpE0Z&F| -u2S*zYux^HZt;0000000030{{R300000fL349yXKq$yV?lFsX=iRyWp-s@ -Y-MCtVQh6}LTqVnWK(5fY*ct@WCZ~L2mz5#SyS0x6M&IY?oK#GG2&fnZy0(Ot1-a&<@*Cf#+d;C00000 +x^NEUkt_p^NJ~fc1UzTDb_LBRjrSXj?;k=^zm6d~Uh7!wPz7^zVRU5y;>Mp{wIfQLx1JC|lRtv}2|vJ# +Rj;5&YI0c6F%?4p0T5$vZf0p@Wo~q7VQf=nVQc^f0t9nqVQd0D>pKz(VCaX%3mIP&XB&sB3y@ML2MxM- +cip;h4&;$&8SA{&vly$FvzVnzHf7z~rv`86=_Ka^V5yX|y#`JNb97;JWdY*GpIx;hN}RWz5J8hag8d0U +z>8I{phs$QSkN&QLjNg2b8~5DZdPSuL349yXKqquc4c8~Wn@HQbYVhlX>MdwWnpYocu;h51pxpE0SrRj +skq)xpV`Gw<@$3$0NV?f{JPT8u3(v#XUGyU%mDxZ000000RR600000004PCob7^O8R%K&Bb8~5DZc=4- +WnpY(WJFIGsVJuTN&(i?_00000 0096000000001UIb8~5DZdPSuL349yXKq$+X=GD$VRU6eY-w&}Q)OXnRCrKyas>eZ2muyOO0=mQ@7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj065I6*X)C9iYp+?yjr7~y^L349yXKrm} Zgf<6aAgGn0006RL349yXKrm}Zgg`(Y-w&}Q)OXnRCrKyas>eZ3IT`y;$>KfZ0H=mhJ>?uV_ +0bYv~7B;a&hq(b42Cl&=@6`g9Wa?J3e{lX~b9Iv}pr9zRHCiBkr{E?40000000030{{R300000OL349y +XKrm}Zgg`(Y-w&}Q)OXnRCsA*1pxpG0f+wLWmt%8=p4R=gtK{LClh6Z#kObxUW*hKHnBv9xdAtu^P0j` +PyFcKl0@oC_m?3Ve+y;&po9u3K1f-Y=ez&_000000096000000000g`VRL0eZ*6U9bZupBbOr?ob7N>_ ZDC1d0hChH+XJhss8OG%_CC-Q>(otsF+cqN0Qy}ddQ=3E5D9c?ZDn(GVQp{#07wRDb8~fNaso_c7H}ii _tAk8EiIL^F;WduOYhK!;vHZzZO$@xxWa9(t;O}HAO^^zqT0%g+nC0;-MWK<)&Ge4`aq}l(*_7*Xklq? PGxiftsXy=AYX8dDQEQRO5D(yMKm~r|3!X*hx(?lDDx}U6LV!@Y(s2sb7^j8Q*?4+bY*9G0h%q;z`x)s Sf3Z(2eI_JHZ((SFcY?<6X>Ltn X>M+1bN~-xX>?<6X>L?yb98QHbTa`DVrg_^Z)t8+Wpi|HWpp$G4Pt3@V{d70Q)y>zWpo1$Vrg_^Z)t8) -WoL9{b94j^Y-w?IX=F`dX>M+1bOjA;X>oOFWK?BybZ%vI1`0!OZgg^CV{}Pm1pxpD002NB00~54bYW9; -VRU5$0RRX906+i$0000000960000000009c;Wds2T24ZP+b2c;p1pxp6 -2n~Wpi|4 -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 -mw%Cdg|0Y-zbj2Rx3qrTq9O+ioJpYH;+ -t0eX2w~A!Q+0eaZ{MVycPK^vwWp-s@Y-MCbVRT^z0tI$qY;|P;GM-jZ2Kh}DE2o;HYydTtf}Q!WH{}bI -!u)W*#(e~Z1ao0*bN~Pl5K?7!WnpY(WJYyvXK7+=Wd;ESc42IFWdWv)Fp)<~$~wYgjK`HkjV#@&#T1_f -GnK3MJXK)_7bXT%V`ybmw%Cdg|0Y-zbj2Rx3qrTq9O+2!s^Lf^?|9I@Xg>Oi(W05|TJ%PM*ricn_PmXk-a( -WprUwd2nTO015$ht0000000000{{R30000003ukO^Vqt7ld2nTO015%s?vf5kh_h+&YE#h%O8d1V_{UOl -9{V;uR#^q%lDklY(DVQRZ2_xNXm|`iS|~;BRWrW0000000000{{R30000003U7CA -Wn@%&aAk7<3IT`y;$>KfZ0H=mhJ>?uVb7^w{PHf7Wpb~G=Pm~XxYI*`6rJj{160lxOxY(3# -7BW?i3v_Z}ZgXjLX>V?G015##QV*^ZmKt8YDf|&5KZQ>65I6*X)C9iYp+?yjr7~y%r?zUHR4te2+NwrBxfixd_%u|$Wt2vcKdWo=D+0ot2U6Id2jc94hrndMfLayEe1ISdA&%p{mB1!VWk)e2*8Zgg^CV{}Pm0iOsgNjk^^ -qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G6imLZewKt00<6ra$#@6CZd7@2WdSr&53UoI8eY9A{1GER -g--GiI0S#x1is&)M%fmnGH3{GWprU=VRT^u^?FS>S$_F2)vN@Mb6UJ-F(lri_dqerx4lR4>iBsz2WM<= -Vqt7^0p25#Yo@G%*b#-tU^&3KX?w7l?~*Sh8@1jRRblZzyas7*aCLNZ0X7CplUE@k+(@AMA;**Avw@PI -9YE8QDR*w0ca`xfVhdq&b7^O8ZDnqBa{;0gJIq2^-xfQ1?1W96h1rK8rUxz<@VD041J-d1p>qjyX=iR> -bairN00aU61a5C`WdHyG0R(ezZDjxj0Rcq9?S_9%zBIrmKs6QQX?psHjFs5t#D;?!SMk=|KFbhPa$#@6CZbEf#WNc*y0tjhtaCLM|VQ>Hn0`+VYVk7oBr%DNv+($;q`HHK!gIHa)*%m(-e#9sm3L)b@L&d6G -@+l`%qd385?K@+fP1(-9sgE>i7rMzqbpe9wZFzp>JB4@xD;^wu&SY_r(Ft -YyD>*cGdzlCNBzgfSsT`drB|>tCZb$LZDAIWaRq+0000000030{{R300000HRB~Z%b7^#GZ*D|obYW?1 -a|QwsbaG*Cb7^#GZ*Eg#Xk~3-0jz(i9yuZQ_f<_~3)9CPP+$;5D=2dnwEKV#qFOR4as+N+ZDj)Ko|5M~ -K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?Csev{(W1V6JV*{3!yZ{M3XW@z+pxis%Ku=2wF+7z(Wqt=tdZk`V^s(Ana000000093000000000JQZg6#Ua{vkfhyLPaScq)s9KMExvw34D -6J>+NwrBxfixd_%u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a000000RI3000000 -01IJrb7^O8ZDnqBa{vkfhyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0XD%jq57bK6Q|uUfIMEX -^1}Vv6tLB!)|10-o)0prc>n+a000000RI3000000010+sY-wa+bZ>G11OfmAZf|a7000011aog~WdH>M -0-Gv5(&k{eX@5SIR>|w{s%)+}o6^~`ha@$PehdAwF>UXmCgHqw;r~cW`-Qb7^w`1pxuGATjcBM0KUs3yuTa -Bu#btAlTMkBr_I*#EX^1JzD<(3UqQ|ZgXjLX>V=-1p)z|2rNlD$O59e#ogQsB77jPl+h5j -^*S;EG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(18dQ03Wn@8fb7^O8b3$xsZe&wsVQf@*P;_zx -0{{zTWn*k%a$$67c4Yts0Rfg5{EB0fg;c|RERyKwyc?S`-(k#Jc79Ua6d|cNYh3{dW_507X<}?;00jX7 -hHs2g6I`NdK6~a+^3m|rY+QT7a1qih-UmB6w*6E%0t$0Lb#i5700jX7p;>G6UAe#_pNwEQii6sR -o+|e#sb-x+l@dPbvD=&`8B}?2Wn@8fb7^O8b3$xsZe&wsVQf@*X=DTg01ISgV{Bn^VRUJBWdH>M0ry;E -Swv+3lBrcu^)moMuzDTL*_JDxK=Xf+&45B--vJ0_b#7;AVr*pq1pxuEII1nZBmK~_^_%5}z{g7v9iK_V -MNAzF)YPFI_pt#23UhRFbz^jOa%E%y1pxv7D__xE2wfQ|ho;i`y(G!;YyVZK;c;Wd#8M000 +WoL9{b94j^Y-w?IX=F`dX>M+1bOjA;X>oOFWK?BybZ%vI1`0!OZgg^CV{}Pm1pxpD002NB00Ty5b_D?d +00Iq0b#7;AVr*qobYXO51OW&JVrg`9HZ%YQ0RR993`TWsXK7+=WmI`^Wdi{Xb#8NMXKrO=HZ($MbO;AW +Wo~72X>$e%17>D+0ot2U6Id2jc94hrndMfLayEe1ISdA&%p{mB1!VWk)d+KAXk~3-Nn`<(Qq$W5tE;F{ +pQrXd&=l*`O?@#x{Qdy?T_k!`1dtF3bZKp6b97;CZ~y>E25ED1b!Bn^w&;L{94K`ndk%K5+?9Jv$dw7j +c}U5p5@2#$kUJ%u2xDkrX>LwsbOEg%Ka?O}aEvKu^y*67(3wRvID`L1eu0Pjrm!gUE7lWpWnpYXY;SXE +Zf8?;a$$63XL$jdE!4oj;3`<37v2Z4^tv`QLvAn=wSY4a%d)dfQpu?ZZDn*}WMOn+0rh%KI9Y!AFx9LC +k8@hQXE7w+qW3^C%eTEp@#^?_H3w&GZ(?C=a{;0=$>=Cf%ypRj207<6(8~ghODx=kkv^H(szyE})=~>$ +b8~5DZf#|5baMgBJ0NihtH%g9L?J?oYV5-8A$VUWu}%GxXkH{w0y&TkM`dnhb7^x^V`ybKfZ0H=mhJ>?uV+h;;t~i_0*|LWuHI04?{jxD_@1Z8)ymjIKNK5;L +!8FkfGTe+FK;UUh9M-4n+}vReM{I9mVQfTYbYW?1a|QwtXKZg`VQf=$VRU6vV`yb7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0xis%K=6-eWf1lXbfKaZ!f0AZ|T{?Qtye5DYBGCrj5p+UZwy5000000093000000000q3 +Y;R&=Y*Tb$bY)XxXk~3-1_A|hWo=1h0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1P-_IE6rQG) +02XJT?*g=|B=zREie$*y(7k2+*P~cYjRc;WmI`^Wd#8M00In0Y;R&= +Y*t}xb!Bq}0RRXAAo5UFB9CUy{E_rD>}a8$2!O9kk`*PSB+rd(so&!uOW`TABoF=|M@BNr;@ghiU?gEXK9KMDE{ +F?;HZBRuDVqlk6qmbd@_000000093F00000000U}Zg6#UPjG2ua|Hna2?3SJ=6W7=VqesjRYGc!>wZFz +p>JB4@xD;^wu&SY_r(DK000000096000000000I_Zg6#Ua|Hna2?3K3ynwMZT8l5kSW@l}O=!>^xB4~9 +n`Dx!RtcK)nwJ3p000000096000000000Y3WprUgWprU_Y;y(z1#@L>Nn`@)o|5M~K$m}!eub_$g}*CJ +IJdNZ+@c}}C`8q6D?CtZ1fvw5rj-B|XP@r^w5ufb=C_Ju$l1`nW&GEpSWb-uZeeX@0_mQT=Q}``f02HL +t~iCiD@{1Jw0_*8A_pi$)ov?1P#d&Z0rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~atKXjbYWC^aAgGn +0006BO=WapR$**)Wd#8M2mk;;0000000000|Nj60000002u)>lVPs)+VFdvI3ITQGP59r=ivkR6Lh9EroO>_;000000003000000 +0000BPh(?sa&l#EV`Xy&0t0PnZU6uR18re=0006EPjEwTZEb0EZDnqB1_uLXW_AJEn^6;37FKqUhx?i3 +R+Mr!fY&(;2BFL(m@EZk_srD=Zf|a5WdHyO25)dwd2nR`Z%+rR=)-r^_Y&HclF!H13$90G`4!8IQf!w` +1|=wh2yJC_VPs)+VFFBL7H}ii_tAk8EiIL^F;WduOYhK!;vHZzZO$@xxWa9(t;O}HAO^^zqT0%g+nC0; +-MWK<)&Ge4`aq}l(*_4;Y;R&=Y;yukWfpKF*Z0wZ5-ly2voTT)QcLg9hvFSzGHuQ>ceuhhoM?JbaMhsWfpKF*Z0wZ5-ly2voTT)QcLg9hvFSzGHuQ>ceuhh +oClv)aMjKgwAH@`bu1x<7g|G$};xvA~n-$_S1W#~DWCZ~L2LJ#-AOHnVaBp>V +1_J_bZ~>Lb=6W7=VqesjRYGc!>wZFzp>JB4@xD;^wu&SY_r(Hqc>#z1;$>KfZ0H=mhJ>?uVM +0r~W-2xhK9cV^W63=w?&L0_mQT=Q}``f02HLt~iCi +D@{1Jw0_*8A_pi$)ov?1P-_IE6rQG)02XJT?*g=|B=zREie$*y(7k2+*P~cYjSNy{c4c8~Wn@HQbYTSn +00;m8KmY&$000000RR600000001Z-Qc4c8~Wn@-iY;|P?0Rg6rFp)<~$~wYgjK`HkjV#@&#T1_fGnK3M +JXK)_7bXT%V`yb +mw%Cdg|0Y-zbj2Rx3qrTq9O+2!s^Lf^?|9I@Xg>Oi(W05|TJ%PM*ricn_PmXk-a(WprUw +d2nTO015$ht0000000000{{R30000003ukO^Vqt7ld2nTO015%s?vf5kh_h+&YE#h%O8d1V_{UOl9{V;u +R#^q%lDklY(DVQRZ2_xNXm|`iS|~;BRWrW0000000000{{R30000003U7CAWn@%& +aAk7<3IT`y;$>KfZ0H=mhJ>?uVb7^w{PHf7Wpb~G=Pm~XxYI*`6rJj{160lxOxY(3#7BW?i +3v_Z}ZgXjLX>V?G015##QV*^ZmKt8YDf|&5KZQ>65I6*X)C9iYp+?yjr7~y%r?zUHR4te2+NwrBxfixd_%u|$Wt2vcKdWo=D+0ot2U6Id2jc94hrndMfLayEe1ISdA&%p{mB1!VWk)e2*8Zgg^CV{}Pm0iOsgNjk^^qPoT1 ++zTRnAg`3vXv9d*8d@RXy~6c6G6imLZewKt00<6ra$#@6CZd7@2WdSr&53UoI8eY9A{1GERg--Gi +I0S#x1is&)M%fmnGH3{GWprU=VRT^u^?FS>S$_F2)vN@Mb6UJ-F(lri_dqerx4lR4>iBsz2WM<=Vqt7^ +0irX>=qOIib(s7HIp;Lc%L0r`EZl^VKAG97Mm{9gQU+;maCLNZ0X7CplUE@k+(@AMA;**Avw@PI9YE8Q +DR*w0ca`xfVhdq&b7^O8ZDnqBa{-I4R4RNCFj+|XM1C+DXk-poZ)C_D*YlJ+82MQED-Q{CX=iR>bairN +00aU61a5C`WdHyG0R(ezZDjxj0Rcq9?S_9%zBIrmKs6QQX?psHjFs5t#D;?!SMk=|KFbhPa$#@6C +ZbEf#WNc*y0tjhtaCLM|VQ>Hn0`+VYVk7oBr%DNv+($;q`HHK!gIHa)*%m(-e#9sm3L)b@L&d6G@+l`% +qd385?K@+fP1(-9sgE>i7rMzqbpe9wZFzp>JB4@xD;^wu&SY_r(E19cP`Q +rta`4SL+aF4>h_8B*ZM$_{DUqzm~P&L)y{-0000000030{{R300000HRB~Z%b7^#GZ*D|obYW?1a|Qws +baG*Cb7^#GZ*Eg#Xk~3-0jz(i9yuZQ_f<_~3)9CPP+$;5D=2dnwEKV#qFOR4as+N+ZDj)Ko|5M~K$m}! +eub_$g}*CJIJdNZ+@c}}C`8q6D?Csev{(W1V6JV*{3!yZ{M3XW@z+pxis%K +u=2wF+7z(Wqt=tdZk`V^s(Ana000000093000000000JQZg6#Ua{vkfhyLPaScq)s9KMExvw34D6J>+N +wrBxfixd_%u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a000000RI300000001IJr +b7^O8ZDnqBa{vkfhyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv +6tLB!)|10-o)0prc>n+a000000RI3000000010+sY-wa+bZ>G11OfmAZf|a7000011aog~WdH>M0-Gv5 +(&k{eX@5SIR>|w{s%)+}o6^~`ha@$PehdAwF>UXmCgHqw;r~cW`-Qb7^w`1pxuGATjcBM0KUs3yuTaBu#bt +AlTMkBr_I*#EX^1JzD<(3UqQ|ZgXjLX>V=-1p)z|2rNlD$O59e#ogQsB77jPl+h5j^*S;E +G*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(18dQ03Wn@8fb7^O8b3$xsZe&wsVQf@*P;_zx0{{zT +Wn*k%a$$67c4Yts0Rfg5{EB0fg;c|RERyKwyc?S`-(k#Jc79Ua6d|cNYh3{dW_507X<}?;00jX7t)le6 +tF1w|qkKKoQ8@+ft}Og`cxWD32N9OlJRp>80t$0Lb#i5700jX7w}_%X+LPM83Yle?T&{7IutOmr +M0ry;ESwv+3 +lBrcu^)moMuzDTL*_JDxK=Xf+&45B--vJ0_b#7;AVr*pq1pxt*I?dmD_aL)Lb)L?ZrQ2W!68hCK)<9B4 +o`z7Y8iKY03UhRFbz^jOa%E%y1pxs#vU_4@XKMa?TsAlK-}9~&K4&!}B_Q_~{-JMMpvoBuR&Qx!Q*>c; +Wd#8M000 -----END STRICT TYPE LIB----- diff --git a/stl/RGBCommit@0.1.0.stl b/stl/RGBCommit@0.1.0.stl index cdbe3178f1728d2ecf7bf15395efcd3d7987ba95..95b376c0411e532f58c98cf58e7b3d773c4de77f 100644 GIT binary patch delta 1015 zcmeD3IOe`VfQ8X=vLH*Hg2JbOFs1&qbAKlOdX>H>{@91i7+d$s;z;{77tK!8@aWk5*saQ5bGFYDaGY%4^q15AKzHc+1@2iz5f=f_K?;BmUUa>qUY`8SUSJpEPd$Z(r``k!5wF0D(LIW7H!kl~rhcRB3k zQ+)q;wqG-5J@absh5wF4JS>lF?PbHbF5WL!4}P*cWwJG=gTnW-_m96SEW6z9HFx&! zC2uvmZa%j>W4uVr%<9Qyd7CGklV@|^^j&0p@`Z-q znbH}5*esu$TsY0th2eP^HM zrYUaAdXFuLTQ=EWWFEnkvzb>^h;{NiF>wLjpwzO|#GKTWu*96wR942#nNo9@6$rU| zvZ|b^Lif55tr|gtNROW`bp}!yDSYAiDJP__f1YA3@iXFwHvi@-IaWpmC)xD5iwv;I}bn3;dM|9PFLUAn2Vs={~ie+%=Y7o3vh49m|<2`))20frL;0|Nj& CsL`ST delta 1089 zcmX@+-sQ1DfQ8X&vLH*H!vBoq0~J9HnLpciG(DcPSXjr(ZuUX_?t-^0@}VD74dN%S zXGtQg$dI*$up**N@@K14FtutE`{U}$E!J~Y`A^Szp4}g(2QqG{iPN)5Ui^Q_(F0&N z5mc1VUP~pD`Z)9z{N2)?^qf(Q((K@Uel|XN67S2M_L7&}7F_zzT9dc%s>bBI9QN{u zb2dn;mOfZ~M`FwJ&dsgKj~;$pFq_jyu4%@Z!v@WrldU-&6#go{KWbsj%d+mc{q!%j zw#(C)lvS=@w%*Qg;ZW4G;W$ z`kUG1*v!qpI0ac05*}_??09qgdnvsych5YVsm>c!7-U**Uh{b8O(!-t_RW*E`TP~U zAF~#HlVuY-68be$-%aQ7zIi7WfB$!2$JPCR3uXLj-*2A9H=mJ<(v)!7| z^lpLPS$C7lWKPjc$*i`GTVrfrbuRdoH(5_)o`TW5ut2t-zM|U8XD!ZQFrC^o_vZ%l zr`%Hx{VCXgtd^y9^BWN%RxdUt*0RK$(o{x5%2|pNb4nN(1O$Ro%Tg0_Qd8VY^U^bu za#GnCAtr2Am72q>K*+a~AIh34EE2Xp;}m&c%)07Li|?G)o9&9r*!3hnY`=Ds`C1|O z!s5+la;%IBXS4sN%a>haGF8*(Ds7m%z^2;EfMNBNyX8&`{7qAy{N5ZbpU528mfsU3 z9J46PuKHQPr;8u1Y)bDgIO*}dF&dybmqF!njdtuYp*-zUJ z9QPKGo$q=y4;m$cz4~pa1P{=20~CnZ*pb9N5p0&jkfbCEsDQ~Sda^L$2BP8S|45P?JbL5c)1M+LTPkk +2vSEvOmAmtV*@?wI}!?D=!eA%8DA7<8;7e4kWwcH4Z3)D-MVlNwB!7L}MA7sFvK#<=RP4S#T1Vv-hhTICs&5fM~jaB^jIPH$voP+@X(Ze?;0 wjY>38tto&d&=eG4cRAF#( @@ -23,9 +23,9 @@ hs6sSUleB>hpP*aQYQxux_Ecpx^NEUkq@>Xm_HirtB!lh<{Yi-S-!KI0_27BH<@sVme~^s3<3pjaB^jI 00jX8J?lFX3Sj7m#S0l<6lWWUs|%1)CkG9>cz4~pa1P{=M^4XN(CAD)cag{2}f*iVqt7ga%2Vq1#fUqa%2Inp_$2edG9dLzy*OG4Oq4bRCJgzb0?22v{-Vn;AC_IX=Hc+00IU~ VR>b8F#`ezVrg_^Z)t7-25f0@b!lV)1y68Ka%2Po00(DfZe??6a{vGU{|a<+VQzD2bZKvH00smHcWHEP -Wpi@@kLzIp{8F`MCJ5#v8Msl{)Y>tRJ&yoJw@!EgNsxtt0(5x-A#J+cm1yJH+D05pSDK_wVqlVwwo0pP -LG7e;9>OzjG*S<)6P6lYy(#<=BR_>s@(?%#f7ArN-=Rj?7Ns(11#WL{V`TsU2n26%X=DN+ZMxi*Xye)1 -MjT65nxsx*V3LovN~>%^?WA-b!ZU7_$mV(;bz)!CmQ_M(k?Vd!kfCo{nDM?)_qK{868FUlS7~%^Wpi^+ +Wpi@@kLzIp{8F`MCJ5#v8Msl{)Y>tRJ&yoJw@!EgNsxtt0(5x-UATk^%RRs@(?%#f7ArN-=Rj?7Ns(11#WL{V`TsU2n26%X=DOjxP%GIJ;q$9 +eabMAdM>3n3F}fxeRYe_HJ>2Tvm%|9$mV(;bz)!CmQ_M(k?Vd!kfCo{nDM?)_qK{868FUlS7~%^Wpi^+ a%2Pq00nJnZe?Tu1pxtE+zulZFL@%{hr{`tLyD)K8_+CBIb!yB_q58$0Duw!33O#{bYXO9c4Ytn00IYT XKrtDWn=&V00RhNa${&|c4cG$000VCX>@L7b8}E{a|QzjY+-q2axnpU#Mns)Y&M6LqDeqU-jv95KHlTh h+c{38p;h*Y8ns*Xk}?uk8j>`lkpCpwZtzeVN(A#uhlt@Z Date: Wed, 30 Apr 2025 15:10:24 +0200 Subject: [PATCH 59/70] chore: remove unnecessary StrictSerialize from RevealedData --- src/operation/data.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/operation/data.rs b/src/operation/data.rs index 12b2a684..d4129a45 100644 --- a/src/operation/data.rs +++ b/src/operation/data.rs @@ -22,7 +22,7 @@ use amplify::confinement::SmallBlob; use amplify::Wrapper; -use strict_encoding::{StrictSerialize, StrictType}; +use strict_encoding::StrictType; use super::ExposedState; use crate::{RevealedState, StateType, LIB_NAME_RGB_COMMIT}; @@ -47,8 +47,6 @@ impl ExposedState for VoidState { #[strict_type(lib = LIB_NAME_RGB_COMMIT)] pub struct RevealedData(SmallBlob); -impl StrictSerialize for RevealedData {} - impl RevealedData { /// Convenience constructor. pub fn new(value: impl Into) -> Self { Self(value.into()) } From 8b566c4c367bc0941e849337ebe4f348e1d38141 Mon Sep 17 00:00:00 2001 From: step Date: Wed, 16 Apr 2025 15:51:56 +0200 Subject: [PATCH 60/70] vm: allow no (in|out)puts in load_revealed_(in|out)puts --- src/vm/op_contract.rs | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/vm/op_contract.rs b/src/vm/op_contract.rs index 34993bc5..1636444a 100644 --- a/src/vm/op_contract.rs +++ b/src/vm/op_contract.rs @@ -266,34 +266,30 @@ impl InstructionSet for ContractOp { } macro_rules! load_revealed_inputs { ($state_type:ident) => {{ - let Some(prev_state) = context.op_info.prev_state.get($state_type) else { - fail!() - }; - match prev_state { - TypedAssigns::Fungible(state) => { + match context.op_info.prev_state.get($state_type) { + Some(TypedAssigns::Fungible(state)) => { let mut values = vec![]; for assign in state.iter().map(Assign::as_revealed_state) { values.push(assign.as_inner().as_u64()) } values } + None => vec![0], _ => fail!(), } }}; } macro_rules! load_revealed_outputs { ($state_type:ident) => {{ - let Some(new_state) = context.op_info.owned_state().get(*$state_type) else { - fail!() - }; - match new_state { - TypedAssigns::Fungible(state) => { + match context.op_info.owned_state().get(*$state_type) { + Some(TypedAssigns::Fungible(state)) => { let mut values = vec![]; for assign in state.iter().map(Assign::as_revealed_state) { values.push(assign.as_inner().as_u64()) } values } + None => vec![0], _ => fail!(), } }}; From a82a562e4c53d4d41f19bc944364951abc4a974b Mon Sep 17 00:00:00 2001 From: step Date: Wed, 16 Apr 2025 15:55:14 +0200 Subject: [PATCH 61/70] validation: add trusted_op_seals + move validated opids to status --- src/validation/status.rs | 4 +++- src/validation/validator.rs | 25 ++++++++++++++++++------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/validation/status.rs b/src/validation/status.rs index 015aab62..ec4a7e7d 100644 --- a/src/validation/status.rs +++ b/src/validation/status.rs @@ -21,7 +21,7 @@ // limitations under the License. use core::ops::AddAssign; -use std::collections::{HashMap, HashSet}; +use std::collections::{BTreeSet, HashMap, HashSet}; use std::fmt::{self, Display, Formatter}; use amplify::num::u24; @@ -62,6 +62,7 @@ pub struct Status { pub failures: Vec, pub warnings: Vec, pub info: Vec, + pub validated_opids: BTreeSet, } impl Display for Status { @@ -109,6 +110,7 @@ impl Status { failures: vec![v], warnings: vec![], info: vec![], + validated_opids: bset![], } } } diff --git a/src/validation/validator.rs b/src/validation/validator.rs index 1dda75a6..1d669bc8 100644 --- a/src/validation/validator.rs +++ b/src/validation/validator.rs @@ -134,9 +134,10 @@ pub struct Validator< chain_net: ChainNet, contract_state: Rc>, - validated_op_seals: RefCell>, input_assignments: RefCell>, + // Operations in this set will not be validated + trusted_op_seals: BTreeSet, resolver: CheckedWitnessResolver<&'resolver R>, safe_height: Option, } @@ -154,6 +155,7 @@ impl< resolver: &'resolver R, context: S::Context<'_>, safe_height: Option, + trusted_op_seals: BTreeSet, ) -> Self { // We use validation status object to store all detected failures and // warnings @@ -166,8 +168,6 @@ impl< let schema_id = genesis.schema_id; let chain_net = genesis.chain_net; - // Prevent repeated validation of single-use seals - let validated_op_seals = RefCell::new(BTreeSet::::new()); let input_transitions = RefCell::new(BTreeSet::::new()); Self { @@ -176,7 +176,7 @@ impl< schema_id, contract_id, chain_net, - validated_op_seals, + trusted_op_seals, input_assignments: input_transitions, resolver: CheckedWitnessResolver::from(resolver), contract_state: Rc::new(RefCell::new(S::init(context))), @@ -199,8 +199,10 @@ impl< chain_net: ChainNet, context: S::Context<'_>, safe_height: Option, + trusted_op_seals: BTreeSet, ) -> Status { - let mut validator = Self::init(consignment, resolver, context, safe_height); + let mut validator = + Self::init(consignment, resolver, context, safe_height, trusted_op_seals); // If the chain-network pair doesn't match there is no point in validating the contract // since all witness transactions will be missed. if validator.chain_net != chain_net { @@ -329,6 +331,9 @@ impl< fn validate_operation(&self, operation: OrdOpRef<'consignment>) { let schema = self.consignment.schema(); let opid = operation.id(); + if self.trusted_op_seals.contains(&opid) { + return; + } if operation.contract_id() != self.contract_id { self.status @@ -336,7 +341,7 @@ impl< .add_failure(Failure::ContractMismatch(opid, operation.contract_id())); } - if !self.validated_op_seals.borrow().contains(&opid) + if !self.status.borrow_mut().validated_opids.contains(&opid) && matches!(operation.full_type(), OpFullType::StateTransition(_)) { self.status @@ -408,6 +413,9 @@ impl< let witness_id = pub_witness.txid(); for (vin, opids) in &bundle.input_map { for opid in opids { + if self.trusted_op_seals.contains(&opid) { + continue; + } let Some(outpoints) = input_map.get(&opid) else { self.status .borrow_mut() @@ -479,9 +487,12 @@ impl< let mut input_map: BTreeMap> = bmap!(); let mut seals = vec![]; for (opid, transition) in &bundle.known_transitions { + if self.trusted_op_seals.contains(opid) { + continue; + } let opid = *opid; - if !self.validated_op_seals.borrow_mut().insert(opid) { + if !self.status.borrow_mut().validated_opids.insert(opid) { self.status .borrow_mut() .add_failure(Failure::CyclicGraph(opid)); From 8b948e6ad41819703c5f0f5b0d49820b12aebc34 Mon Sep 17 00:00:00 2001 From: step Date: Wed, 16 Apr 2025 15:55:59 +0200 Subject: [PATCH 62/70] schema: add utilities to recognize replace transitions and asset assignments --- src/schema/operations.rs | 3 +++ src/schema/schema.rs | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/src/schema/operations.rs b/src/schema/operations.rs index 3a38b457..d9c7e312 100644 --- a/src/schema/operations.rs +++ b/src/schema/operations.rs @@ -43,6 +43,9 @@ impl AssignmentType { pub const fn with(ty: u16) -> Self { Self(ty) } #[inline] pub fn to_le_bytes(&self) -> [u8; 2] { self.0.to_le_bytes() } + + pub const ASSET: Self = AssignmentType(4000); + pub fn is_asset(self) -> bool { self == Self::ASSET } } pub type MetaSchema = TinyOrdSet; diff --git a/src/schema/schema.rs b/src/schema/schema.rs index 22cb624e..69cf6796 100644 --- a/src/schema/schema.rs +++ b/src/schema/schema.rs @@ -135,6 +135,11 @@ pub struct TransitionDetails { pub name: FieldName, } +impl TransitionType { + pub const REPLACE: Self = TransitionType(8011); + pub fn is_replace(self) -> bool { self == Self::REPLACE } +} + /// Schema identifier. /// /// Schema identifier commits to all the schema data. From 7595406cbbad37dd832304dcc881bcfec370fc61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Fri, 18 Apr 2025 17:24:24 +0200 Subject: [PATCH 63/70] vm: remove consensus order check in prev_checked --- src/vm/contract.rs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/vm/contract.rs b/src/vm/contract.rs index b488a06d..ce51c6cc 100644 --- a/src/vm/contract.rs +++ b/src/vm/contract.rs @@ -436,15 +436,6 @@ impl GlobalContractState { fn prev_checked(&mut self) -> Option<(GlobalOrd, I::Data)> { let (ord, item) = self.iter.prev()?; - if self.last_ord.map(|last| ord <= last).unwrap_or_default() { - panic!( - "global contract state iterator has invalid implementation: it fails to order \ - global state according to the consensus ordering" - ); - } - if ord.op_ord.is_archived() { - panic!("invalid GlobalStateIter implementation returning WitnessOrd::Archived") - } self.checked_depth += u24::ONE; self.last_ord = Some(ord); Some((ord, item)) From 41f79ea893e045b36f0ed96fe56f117dd69175d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Tue, 29 Apr 2025 19:38:44 +0200 Subject: [PATCH 64/70] vm: prevent outputs with amount 0 --- src/vm/op_contract.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/vm/op_contract.rs b/src/vm/op_contract.rs index 1636444a..a1c58b0d 100644 --- a/src/vm/op_contract.rs +++ b/src/vm/op_contract.rs @@ -274,7 +274,7 @@ impl InstructionSet for ContractOp { } values } - None => vec![0], + None => vec![], _ => fail!(), } }}; @@ -289,7 +289,7 @@ impl InstructionSet for ContractOp { } values } - None => vec![0], + None => vec![], _ => fail!(), } }}; @@ -450,9 +450,11 @@ impl InstructionSet for ContractOp { }; let sum = u64::from(sum); - let Some(output_amt) = load_revealed_outputs!(owned_state) - .iter() - .try_fold(0u64, |acc, &x| acc.checked_add(x)) + let outputs = load_revealed_outputs!(owned_state); + if outputs.contains(&0) { + fail!() + } + let Some(output_amt) = outputs.iter().try_fold(0u64, |acc, &x| acc.checked_add(x)) else { fail!() }; From c89bb85e9fdaa29d5999600a1d50b3a3b15afefa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Thu, 1 May 2025 18:46:02 +0200 Subject: [PATCH 65/70] chore: bump version to 0.11.1-alpha.2+unreviewed --- Cargo.lock | 104 ++++++++++++++++++++++++++++++----------------------- Cargo.toml | 16 +++------ 2 files changed, 64 insertions(+), 56 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c3277393..708ac71e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,8 +4,9 @@ version = 3 [[package]] name = "aluvm" -version = "0.11.0" -source = "git+https://github.com/zoedberg/rust-aluvm?branch=0.11.1-2#4d2c1cf0eb0161035b5a1426e08a5623d7c329df" +version = "0.11.1-alpha.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6035110db4d2f0a0e6df87e7b61f1c397828ed127ed97d46896371a258888403" dependencies = [ "amplify", "ascii-armor", @@ -211,8 +212,9 @@ dependencies = [ [[package]] name = "bp-consensus" -version = "0.11.1-alpha.1" -source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#63b3e18acfa00fb8180bbc5cca5630c372860203" +version = "0.11.1-alpha.2+unreviewed" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d473a0cea358746ab5ef820b62f2530ce6516cb59226c9a3736a8e60c4943d9" dependencies = [ "amplify", "chrono", @@ -225,8 +227,9 @@ dependencies = [ [[package]] name = "bp-core" -version = "0.11.1-alpha.1" -source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#63b3e18acfa00fb8180bbc5cca5630c372860203" +version = "0.11.1-alpha.2+unreviewed" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d248df4e1ab41de97556bb092891c8c5208604f471a20c4129dc357fd9eade39" dependencies = [ "amplify", "bp-consensus", @@ -244,8 +247,9 @@ dependencies = [ [[package]] name = "bp-dbc" -version = "0.11.1-alpha.1" -source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#63b3e18acfa00fb8180bbc5cca5630c372860203" +version = "0.11.1-alpha.2+unreviewed" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2670bd384743ba75ca6d8cf821bcdcb74bfd5715e8798e545331dc00652f612c" dependencies = [ "amplify", "base85", @@ -258,8 +262,9 @@ dependencies = [ [[package]] name = "bp-seals" -version = "0.11.1-alpha.1" -source = "git+https://github.com/zoedberg/bp-core?branch=0.11.1-2#63b3e18acfa00fb8180bbc5cca5630c372860203" +version = "0.11.1-alpha.2+unreviewed" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3aab0c94862b08721f7a60eb0d13502605147ebc2fc3cfe0ceacdb6d58aeb43c" dependencies = [ "amplify", "baid64", @@ -295,9 +300,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.40" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" dependencies = [ "android-tzdata", "iana-time-zone", @@ -309,8 +314,9 @@ dependencies = [ [[package]] name = "commit_encoding_derive" -version = "0.11.0" -source = "git+https://github.com/zoedberg/client_side_validation?branch=0.11.1-2#f8dd8410fbe4b841c40056822ba3756d2b8159bf" +version = "0.11.1-alpha.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d12f2e05ae7d81bc49d9f0856ff97968da750bf09f145043155e9c7f13ce4ace" dependencies = [ "amplify", "amplify_syn", @@ -321,8 +327,9 @@ dependencies = [ [[package]] name = "commit_verify" -version = "0.11.0" -source = "git+https://github.com/zoedberg/client_side_validation?branch=0.11.1-2#f8dd8410fbe4b841c40056822ba3756d2b8159bf" +version = "0.11.1-alpha.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "171940b95b456f7c8906c78cd548c1dcf30310c4dc2e2a5ba352ac183bf163b3" dependencies = [ "amplify", "commit_encoding_derive", @@ -437,9 +444,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" [[package]] name = "heck" @@ -662,7 +669,7 @@ dependencies = [ [[package]] name = "rgb-core" -version = "0.11.1-alpha.1" +version = "0.11.1-alpha.2+unreviewed" dependencies = [ "aluvm", "amplify", @@ -750,7 +757,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -799,9 +806,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -816,9 +823,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "single_use_seals" -version = "0.11.0" +version = "0.11.1-alpha.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b01aad2d785dc858c4f652d1e18d0c815cd10aa8f15ac7accd2b12b894d7c367" +checksum = "8c36139c6f642d05f2d74501a8f84ccfb5833caeb7c8cde1e6b811261cd526bd" dependencies = [ "amplify_derive", ] @@ -891,9 +898,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.100" +version = "2.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" dependencies = [ "proc-macro2", "quote", @@ -917,14 +924,14 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] name = "toml" -version = "0.8.20" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" dependencies = [ "serde", "serde_spanned", @@ -934,26 +941,33 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.22.24" +version = "0.22.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", + "toml_write", "winnow", ] +[[package]] +name = "toml_write" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" + [[package]] name = "typenum" version = "1.18.0" @@ -1035,7 +1049,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "wasm-bindgen-shared", ] @@ -1070,7 +1084,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1105,7 +1119,7 @@ checksum = "17d5042cc5fa009658f9a7333ef24291b1291a25b6382dd68862a7f3b969f69b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1148,7 +1162,7 @@ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1159,7 +1173,7 @@ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1261,9 +1275,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cb8234a863ea0e8cd7284fcdd4f145233eb00fee02bbdd9861aec44e6477bc5" +checksum = "9e27d6ad3dac991091e4d35de9ba2d2d00647c5d0fc26c5496dee55984ae111b" dependencies = [ "memchr", ] @@ -1279,20 +1293,20 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.24" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.24" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] diff --git a/Cargo.toml b/Cargo.toml index 24206dce..de82e618 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rgb-core" -version = "0.11.1-alpha.1" +version = "0.11.1-alpha.2+unreviewed" authors = ["Dr Maxim Orlovsky "] description = "RGB Core Library: confidential & scalable smart contracts on Bitcoin & Lightning (consensus layer)" repository = "https://github.com/RGB-WG/rgb-core" @@ -26,10 +26,10 @@ amplify = { version = "~4.8.0", features = ["rand"] } baid64 = "~0.4.1" strict_encoding = "~2.8.2" strict_types = { version = "~2.8.3", features = ["armor"] } -aluvm = { version = "~0.11.0", features = ["std", "ascii-armor"] } -commit_verify = { version = "0.11.0", features = ["rand", "derive"] } -single_use_seals = "~0.11.0-beta.9" -bp-core = { version = "~0.11.1-alpha.1" } +aluvm = { version = "~0.11.1-alpha.2", features = ["std", "ascii-armor"] } +commit_verify = { version = "0.11.1-alpha.2", features = ["rand", "derive"] } +single_use_seals = "~0.11.1-alpha.2" +bp-core = { version = "~0.11.1-alpha.2+unreviewed" } secp256k1 = { version = "0.30.0", features = ["global-context"] } mime = "~0.3.17" serde_crate = { package = "serde", version = "1", features = ["derive"], optional = true } @@ -60,9 +60,3 @@ wasm-bindgen-test = "0.3" [package.metadata.docs.rs] features = ["all"] - -[patch.crates-io] -aluvm = { git = "https://github.com/zoedberg/rust-aluvm", branch = "0.11.1-2" } -commit_verify = { git = "https://github.com/zoedberg/client_side_validation", branch = "0.11.1-2" } -bp-consensus = { git = "https://github.com/zoedberg/bp-core", branch = "0.11.1-2" } -bp-core = { git = "https://github.com/zoedberg/bp-core", branch = "0.11.1-2" } From 926791346fdb4beb2b4416f7c74e095b3ac02526 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 11 May 2025 16:23:46 +0200 Subject: [PATCH 66/70] ci: fix github actions --- .github/workflows/build.yml | 4 ++-- .github/workflows/codecov.yml | 4 ++-- .github/workflows/lint.yml | 2 +- .github/workflows/test.yml | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 07aeb3c3..d4f59b61 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,12 +5,12 @@ on: branches: - master tags: - - 'v\d+\.*' + - 'v[0-9]+.*' pull_request: branches: - master - develop - - 'v\d+(\.\d+)*' + - 'v[0-9]+.?*' env: CARGO_TERM_COLOR: always diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml index 8624aba9..9ba863f5 100644 --- a/.github/workflows/codecov.yml +++ b/.github/workflows/codecov.yml @@ -5,12 +5,12 @@ on: branches: - master tags: - - 'v\d+\.*' + - 'v[0-9]+.*' pull_request: branches: - master - develop - - 'v\d+(\.\d+)*' + - 'v[0-9]+.?*' env: CARGO_TERM_COLOR: always diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 29e0ebc0..91f36b69 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -5,7 +5,7 @@ on: branches: - master - develop - - 'v\d+(\.\d+)*' + - 'v[0-9]+.?*' env: CARGO_TERM_COLOR: always diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index faf0d4ee..a0982385 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -5,12 +5,12 @@ on: branches: - master tags: - - 'v\d+\.*' + - 'v[0-9]+.*' pull_request: branches: - master - develop - - 'v\d+(\.\d+)*' + - 'v[0-9]+.?*' env: CARGO_TERM_COLOR: always From 44df908a38d164664696df2d64dd44e5bed4df1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Wed, 14 May 2025 17:12:19 +0200 Subject: [PATCH 67/70] validation: add Warning::UnsafeHistory only if map is not empty --- src/validation/validator.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/validation/validator.rs b/src/validation/validator.rs index 1d669bc8..4f4a5dfb 100644 --- a/src/validation/validator.rs +++ b/src/validation/validator.rs @@ -315,7 +315,7 @@ impl< ops.insert(OrdOpRef::Transition(op, witness_id, witness_ord, bundle_id)); } } - if self.safe_height.is_some() { + if self.safe_height.is_some() && !unsafe_history_map.is_empty() { self.status .borrow_mut() .add_warning(Warning::UnsafeHistory(unsafe_history_map)); From 7ca176f9cd79c22a350463a534d6c084914c5437 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Thu, 15 May 2025 12:50:57 +0200 Subject: [PATCH 68/70] operation: remove Assign custom Eq implementation --- src/operation/assignments.rs | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/operation/assignments.rs b/src/operation/assignments.rs index d3f06de0..b7e55034 100644 --- a/src/operation/assignments.rs +++ b/src/operation/assignments.rs @@ -76,7 +76,7 @@ pub type AssignData = Assign; /// State data are assigned to a seal definition, which means that they are /// owned by a person controlling spending of the seal UTXO, unless the seal /// is closed, indicating that a transfer of ownership had taken place -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq, Eq)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type( lib = LIB_NAME_RGB_COMMIT, @@ -110,15 +110,6 @@ impl Ord for Assign { } } -impl PartialEq for Assign { - fn eq(&self, other: &Self) -> bool { - self.to_confidential_seal() == other.to_confidential_seal() - && self.as_revealed_state() == other.as_revealed_state() - } -} - -impl Eq for Assign {} - impl Assign { pub fn revealed(seal: Seal, state: State) -> Self { Assign::Revealed { seal, state } } From e536532fbbd90057c5ae85804908c321355cd3b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Tue, 20 May 2025 17:52:02 +0200 Subject: [PATCH 69/70] chore: lint code with rust 1.87.0 --- src/operation/bundle.rs | 4 ++-- src/stl.rs | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/operation/bundle.rs b/src/operation/bundle.rs index 6f654a77..10412bc7 100644 --- a/src/operation/bundle.rs +++ b/src/operation/bundle.rs @@ -89,7 +89,7 @@ impl<'a> IntoIterator for &'a InputOpids { #[derive(Clone, Eq, PartialEq, Debug, Display, Error)] #[display("state transition {0} is not a part of the bundle.")] -pub struct UnrelatedTransition(OpId, Transition); +pub struct UnrelatedTransition(OpId); #[derive(Clone, PartialEq, Eq, Debug, From)] #[derive(StrictType, StrictEncode, StrictDecode)] @@ -140,7 +140,7 @@ impl TransitionBundle { ) -> Result { let opid = transition.id(); if self.input_map.values().all(|ids| !ids.contains(&opid)) { - return Err(UnrelatedTransition(opid, transition)); + return Err(UnrelatedTransition(opid)); } if self.known_transitions.contains_key(&opid) { return Ok(false); diff --git a/src/stl.rs b/src/stl.rs index 3eb0326e..c8ba2a06 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -43,8 +43,8 @@ pub const LIB_ID_RGB_COMMIT: &str = pub const LIB_ID_RGB_LOGIC: &str = "stl:qolQpjNB-4ZkpJIo-U1tktjI-mwAYyEg-kOGQttY-ZoK3Loo#colombo-famous-erosion"; -fn _rgb_commit_stl() -> Result { - LibBuilder::with(libname!(LIB_NAME_RGB_COMMIT), [ +fn _rgb_commit_stl() -> Result> { + Ok(LibBuilder::with(libname!(LIB_NAME_RGB_COMMIT), [ std_stl().to_dependency_types(), strict_types_stl().to_dependency_types(), commit_verify_stl().to_dependency_types(), @@ -59,11 +59,11 @@ fn _rgb_commit_stl() -> Result { .transpile::() .transpile::() .transpile::() - .compile() + .compile()?) } -fn _rgb_logic_stl() -> Result { - LibBuilder::with(libname!(LIB_NAME_RGB_LOGIC), [ +fn _rgb_logic_stl() -> Result> { + Ok(LibBuilder::with(libname!(LIB_NAME_RGB_LOGIC), [ std_stl().to_dependency_types(), strict_types_stl().to_dependency_types(), commit_verify_stl().to_dependency_types(), @@ -74,7 +74,7 @@ fn _rgb_logic_stl() -> Result { ]) .transpile::() .transpile::() - .compile() + .compile()?) } /// Generates strict type library providing data types for RGB consensus. From cc6f14508816c1fd610932733478feb19f2befc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zoe=20Faltib=C3=A0?= Date: Thu, 22 May 2025 17:51:19 +0200 Subject: [PATCH 70/70] chore: bump version to 0.11.1-alpha.3+unreviewed --- Cargo.lock | 2 +- Cargo.toml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 708ac71e..1af4d602 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -669,7 +669,7 @@ dependencies = [ [[package]] name = "rgb-core" -version = "0.11.1-alpha.2+unreviewed" +version = "0.11.1-alpha.3+unreviewed" dependencies = [ "aluvm", "amplify", diff --git a/Cargo.toml b/Cargo.toml index de82e618..1128950c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rgb-core" -version = "0.11.1-alpha.2+unreviewed" +version = "0.11.1-alpha.3+unreviewed" authors = ["Dr Maxim Orlovsky "] description = "RGB Core Library: confidential & scalable smart contracts on Bitcoin & Lightning (consensus layer)" repository = "https://github.com/RGB-WG/rgb-core" @@ -29,7 +29,7 @@ strict_types = { version = "~2.8.3", features = ["armor"] } aluvm = { version = "~0.11.1-alpha.2", features = ["std", "ascii-armor"] } commit_verify = { version = "0.11.1-alpha.2", features = ["rand", "derive"] } single_use_seals = "~0.11.1-alpha.2" -bp-core = { version = "~0.11.1-alpha.2+unreviewed" } +bp-core = { version = "~0.11.1-alpha.2" } secp256k1 = { version = "0.30.0", features = ["global-context"] } mime = "~0.3.17" serde_crate = { package = "serde", version = "1", features = ["derive"], optional = true }