From 0de9e703fec79b5d5434b04274d272d4b79ac942 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 01/11] 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 cf409211698a1c0461d2408964d008cb9c3fd9b9 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 02/11] 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< -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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*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 03/11] 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 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 +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 +00030000000000BPh(?sa&l#EV`Xy&0t0PnZU6uR18re=0006EPjEwTZEb0EZDnqB1`7jbW_AJEn^6;3 +7FKqUhx?i3R+Mr!fY&(;2BFL(m@EZk_srD=Zf|a5WdHyO25)dwd2nR`JfH~4J1RFM{f83T#AUKa?sM?JbaMiF10COKearHwcS=7M7YzYaI8*bvhMOc? +)(rkC#nUD@oClv)aMjKgwAH@`bu1x<7g|G$};xvA~n-$_S2y$g)Wo2z;WCD5v +9p7nv%krpqNv2!%ioJpYH;+t0eX2w~A!Q+0eaZ{MVycPK^T!VRUq1V`yzR +000000RI300000001i@Rc4c8~Wn@8gbYWv?1_A_TX>4Ty3ATR{-|K6Y3I$*BbiAvUS*tg{!Gb}P!O*^_ +P#qhP1ao0*bN~Pd3{quwWnpY(WJFD+0ot2U6Id2jc94hrndMfLayEe1ISdA&%p{mB1!VWk +)dgm3VP|s!dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThOi(W0 +5|TJ%PM*ricn_PmXk-a=X>Db5bYX39002k{WMy_`Y;SO7asjsJfQB3>bs~EXcCXx(drQcb3B`Fx$)^%v +a$Ar)C7cOuWprUwd2nTO015$hC`}q*rYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj0000000000{{R30 +000003ukO^Vqt7ld2nTO015%s?vf5kh_h+&YE#h%O8d1V_{UOl9{V;uR#^q%KfZ0H=mhJ>?u +V9R0ZFSEMRj;Km4qfBYZ5UUs>0bg9bqiCNA7000000003000000 +00007XJu|>b7^w{7)aIA#9XnshcC})U)TI#r3b0kyqD7}ejM+$yUGm(3T1e7Wo~n6Z*Fq{3ISww9zv-V +p*%wog4O?q)g04AaHEjnO6;Ie%sNwVNZtVhXadZr-SPY!h`6Z9%SYt5l1;p3@00000000300000000008a%FR6a&~280(t`--)Viz@~C%8 +KNS}Z0aQ3s^SOqbBwN-D{wl@OCjNpJN#A(BKKz&v`r;e6DUv<<*U}cD+0ot2U6Id2jc94hrndMfLayEe1ISdA&%p{mB1!VWk)e2*8Zgg^C +V{}Pm0iOsgNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G6imLZewKt00<6ra$#@6CZd7@2WdSr& +53UoI8eY9A{1GERg--GiI0S#x1is&)M%fmnGH3{GWprU=VRT^u^?FS>S$_F2)vN@Mb6UJ-F(lri_dqer +x4lR4>iBsz2WM<=Vqt7^0p25#Yo@G%*b#-tU^&3KX?w7l?~*Sh8@1jRRblZzyas7*aCLNZ0jZ*TSChz_ +$|Xx}eRkFNAr%^eLl(1e@}~9=0-ijXfD2)Bb7^O8ZDnqBa{Pr5ftu@@z<*O39}j`u&O7io3b$Is?RA$O$l~kY-wa+bZ>G3dIKHb +X?@G`sCP;~6&DQwR5(-fxrUo0Thj-IXaCLM|VQ>KznP+6nwW~k}RP!NmuV?G015$>$mV(;bz)!CmQ_M(k?Vd!kfCo{nDM?)_qK{8 +68FUcsd14z$ccn4QkxzW#v4fLTrRR{*NmO(sgGOx3k`)>0RR9100000|Nj60000005L9wuZgXjLX>V>* +V`ybM?JbaMa-0f+wLWmt%8=p4R=gtK{LClh6Z#kObx +UW*hKHnBv9xdAr8G@<&SffJ|QFn~N>u=2wF+7z(Wqt=tdZk`V^s(Ana000000093000000000YNb8~5D +Zf#|5baMa-0f+wLWmt%8=p4R=gtK{LClh6Z#kObxUW*hKHnBv9xdAr8G@<&SffJ|QFn~N>u=2wF+7z(W +qt=tdZk`V^s(Ana000000093000000000SgVQgh?V`*h`00{v`?dHP>9R0ZFSEMRj;Km4qfBYZ5UUs>0 +bg9bqiCNA700000000300000000009c42I3WMOn~asUJZ00eGtZe;)f009JZZ*64&1pxwLa5aA+<>R2X +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{vVa0UA?@e7ux=p=Eeh0Ty-sZ{ycFkm@6CZU6-W0iOsgNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G66JF53UoI +8eY9A{1GERg--GiI0S#x1is&)M%fmnGH3z`Wq5RDZgXjGZU6-W0iOsgNjk^^qPoT1+zTRnAg`3vXv9d* +8d@RXy~6c6G67_D9zv-Vp*%wog4O?q)g04AaHEjnO6;Ie%sNwVNZuM$d2nT9L349yXKr&sY-w&}Q)OXn +RCrKyas&hb3uI+uY+-U?bZK^F00jX62mw{x*tXpDo;l5DLes-C{(xD7d6!~!$BzIRP#fdy`l0{;00000 +009600000000039W_507X<}?;00jX62m$%Kmqg}+8>6_C3ydr-&>2bZComFE6{qRYCW1JpdL;k=00000 +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 04/11] 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 6cd46ebcc96e9205240564a8977f5003ae2e9aff 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 05/11] 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 acb131d9e15f332772d468768cd9fe399272d601 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 06/11] address review: 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!@{ +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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 +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 07/11] 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 d647635a978b1f74da70d11d15c668d9254324b1 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 08/11] 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 09/11] 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 10/11] 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 -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{*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 -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`2S!nL7q2Ov9&rw<1inBEia8GNLssNy*7JJa +HJF7}X$37Y21E`BySDf%$MYb{T~|g0b97;JWdSuhh8FxqMGF>;)g%0j&kVcqmr((%7&o7^|1Fn59cLW!>7R25;!;B+kk4W|0D0)10COKearHwcS=7M7YzYaI8*bv +hMOc?)(rkC#nUFsxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%95o2#|W@%()Zggp3Y*Tb$bY%br +0|awrVQc~+aI2y9pehZ%M2QE^S2-B&?H_1O1&4u6*^T^mbhP{|1C2;aNA(0eXS#L;%_oib8;tKCLQ=nu +Av#{`SnN;*b97;JWdWb2;)g%0j&kVcqmr((;)g%0j&kVcqmr((OF|0}@Y#k~NrxRcQq+F$P2q2)nlUE64L7%3W7R1#@&^ +bY%f9vZekPz%WEGnBZKS8(M7E9_@AwVcyGtCevi|7U8=DY;R+00(t`--)Viz@~C%8KNS}Z0aQ3s^SOqb +BwN-D{wl@OCd;@jJLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF0Rj+XZ*FF3WMyu2X<=+rWnpXp1_K0h +WnpXrA#kgq^`I&ZzC?)!&R01Y?(H9FO$CR6P1%k7c67A-Xc_Cg)w39@m$R6qOEzWQ+NTC@=;OF|0}@Y#k~NrxRcQq+F$P2q2)nlUE64L7 +%3W7R1#@&^bY%f9vZekPz%WEGnBZKS8(M7E9_@AwVcyGtCevi|7U8=DY;R+00(t`--)Viz@~C%8KNS}Z +0aQ3s^SOqbBwN-D{wl@OCd;@jJLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF0USYdb7^O8R&Qx!Q*>c; +WkPIeZe&wsVQf@*X=DTh01RVqZf0p@Wo~q7VQc^f0|awrVQc~+aI2y9pehZ%M2QE^S2-B&?H_1O1&4u6 +*^T^mbhP|v8SA{&vly$FvzVnzHf7z~rv`86=_Ka^V5yX|y#`JNb97;JWdSa-rT!PdFhnqz;9Q#5OGottJZHLg1Ujv+c;>sahi1#@&^bY%f9vZekPz%WEG +nBZKS8(M7E9_@AwVcyGtCevi|7U8=DY;R+00(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OCd;@j +JLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF0Rj+XZ*FF3WMyu2X<=+rWnpXp1_K0hWnpXrA#kgq^`I&Z +zC?)!&R01Y?(H9FO$CR6P1%k7c67A-Xc_Cg)w39@m$R6qOEzWQ+NTC@=;5OGottJZHLg1Ujv+c;>sahi1#@&^bY%f9 +vZekPz%WEGnBZKS8(M7E9_@AwVcyGtCevi|7U8=DY;R+00(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D +{wl@OCd;@jJLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF0S-ZPb7^O8ZDnqBRC#b^1pxp60vSPbb7^O8 +ZDnqBb3$xsZe&wsVQf@*P;_zy0RRdChyLPaScq)s9KMExvw34D6J>+NwrBxfixd_%u|$Wt0Swd4UcIF} +!D=gP*{lG^S_lNT7e3^i+oSY<(XJZneEFcgmDd% +EKc;pw+KsVi?D}qDSkO*B!5Mb*xG|_(S5o&32kL$X<<}(aAg5PFkyv=$keM8CP2si$rmim(Ekws4U>QX +M0|*v-OPCoLSb`dLvL+uX>@I6Zgd6)1!invXLAC210COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUE} +_h5K%L=laq&yA1JoJ^{7>oKLkF4~iax8KK|47hp-b7N>_ZDC1d0hChH+XJhss8OG%_CC-Q>(otsF+cqN +0Qy}ddQ=3E5D9c?ZDn(GVQp{#07wRDb8~fNasqk-9p7nv%krpqNb8F#&nR*hvU%Hiwm>NkB*5l*n^F-s9AWUWw-# +$_-O$8W0C`Wpi|HWpo0{EFN!zncXl9K5w2;FV{y1jDTJCC^p$-mHEbO0#qkqh9c2>uJC38-{*D7fZ(%h +Zo23R4S;p`Q9JBQllDyyLvLn+a3PW#hbaG*1bV+0d0RRU806-uB2}EIZVN-NrbY%qr00;m8KmY&$000000RR6000000 +00~8SbY*UHX>V=@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{*as?yI5TY8=l| +S=)-UH4bo3Ym}-0prjaef_E>x{+|ePWn^V#ZDnKu-_NO$^@rt6M7IGITmUKjm1~>v&8b0-V>p(oz$%02 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 -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 11/11] 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