package Ġnet . cord a . core . transactions Ċ Ċ import Ġnet . cord a . core . C ord a Exception Ċ import Ġnet . cord a . core . Keep For DJ VM Ċ import Ġnet . cord a . core . contracts .* Ċ import Ġnet . cord a . core . contracts . Component Group Enum .* Ċ import Ġnet . cord a . core . crypto .* Ċ import Ġnet . cord a . core . identity . Party Ċ import Ġnet . cord a . core . internal . de serial ise Commands Ċ import Ġnet . cord a . core . internal . de serial ise Component Group Ċ import Ġnet . cord a . core . serialization . C ord a Serializable Ċ import Ġnet . cord a . core . serialization . Serialized Bytes Ċ import Ġnet . cord a . core . serialization . deserialize Ċ import Ġnet . cord a . core . utilities . Opaque Bytes Ċ import Ġjava . security . PublicKey Ċ import Ġjava . util . function . Predicate Ċ Ċ /** Ċ Ġ* ĠImplemented Ġby Ġ[ Wire Transaction ] Ġand Ġ[ Filtered Transaction ]. ĠA ĠTra versable Transaction Ġallows Ġyou Ġto Ġiterate Ċ Ġ* Ġover Ġthe Ġflatten ed Ġcomponents Ġof Ġthe Ġunderlying Ġtransaction Ġstructure , Ġtaking Ġinto Ġaccount Ġthat Ġsome Ċ Ġ* Ġmay Ġbe Ġmissing Ġin Ġthe Ġcase Ġof Ġthis Ġrepresenting Ġa Ġ" t orn " Ġtransaction . ĠPlease Ġsee Ġthe Ġuser Ġguide Ġsection Ċ Ġ* Ġ" Transaction Ġtear - offs " Ġto Ġlearn Ġmore Ġabout Ġthis Ġfeature . Ċ Ġ*/ Ċ abstract Ġclass ĠTra versable Transaction ( open Ġval Ġcomponent Groups : ĠList < Component Group >) Ġ: ĠCore Transaction () Ġ{ ĊĠĠĠ Ġ/** ĠHas hes Ġof Ġthe ĠZIP / JAR Ġfiles Ġthat Ġare Ġneeded Ġto Ġinterpret Ġthe Ġcontents Ġof Ġthis Ġwire Ġtransaction . Ġ*/ ĊĠĠĠ Ġval Ġattachments : ĠList < Secure Hash > Ġ= Ġde serial ise Component Group ( component Groups , ĠSecure Hash :: class , ĠATT ACH MENTS _ GROUP ) ĊĊĠĠĠ Ġ/** ĠPointer s Ġto Ġthe Ġinput Ġstates Ġon Ġthe Ġledger , Ġidentified Ġby Ġ( tx Ġidentity Ġhash , Ġoutput Ġindex ). Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġinputs : ĠList < State Ref > Ġ= Ġde serial ise Component Group ( component Groups , ĠState Ref :: class , ĠINPUT S _ GROUP ) ĊĊĠĠĠ Ġ/** ĠPointer s Ġto Ġreference Ġstates , Ġidentified Ġby Ġ( tx Ġidentity Ġhash , Ġoutput Ġindex ). Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġreferences : ĠList < State Ref > Ġ= Ġde serial ise Component Group ( component Groups , ĠState Ref :: class , ĠREFERENCES _ GROUP ) ĊĊĠĠĠ Ġoverride Ġval Ġoutputs : ĠList < Transaction State < Contract State >> Ġ= Ġde serial ise Component Group ( component Groups , ĠTransaction State :: class , ĠOUTPUT S _ GROUP ) ĊĊĠĠĠ Ġ/** ĠOrdered Ġlist Ġof Ġ([ Command Data ], Ġ[ PublicKey ]) Ġpairs Ġthat Ġinstruct Ġthe Ġcontracts Ġwhat Ġto Ġdo . Ġ*/ ĊĠĠĠ Ġval Ġcommands : ĠList < Command <* >> Ġ= Ġde serial ise Commands ( component Groups ) ĊĊĠĠĠ Ġoverride Ġval Ġnot ary : ĠParty ? Ġ= Ġlet Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnot aries : ĠList < Party > Ġ= Ġde serial ise Component Group ( component Groups , ĠParty :: class , ĠNOT ARY _ GROUP ) ĊĠĠĠĠĠĠĠ Ġcheck ( not aries . size Ġ<= Ġ 1 ) Ġ{ Ġ" Invalid ĠTransaction . ĠMore Ġthan Ġ 1 Ġnot ary Ġparty Ġdetected ." Ġ} ĊĠĠĠĠĠĠĠ Ġnot aries . first OrNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtime Window : ĠTime Window ? Ġ= Ġlet Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Windows : ĠList < Time Window > Ġ= Ġde serial ise Component Group ( component Groups , ĠTime Window :: class , ĠTIME WINDOW _ GROUP ) ĊĠĠĠĠĠĠĠ Ġcheck ( time Windows . size Ġ<= Ġ 1 ) Ġ{ Ġ" Invalid ĠTransaction . ĠMore Ġthan Ġ 1 Ġtime - window Ġdetected ." Ġ} ĊĠĠĠĠĠĠĠ Ġtime Windows . first OrNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġlist Ġof Ġall Ġthe Ġcomponent Ġgroups Ġthat Ġare Ġpresent Ġin Ġthe Ġtransaction , Ġexcluding Ġthe Ġprivacy Salt , ĊĠĠĠĠ Ġ* Ġin Ġthe Ġfollowing Ġorder Ġ( which Ġis Ġthe Ġsame Ġwith Ġthe Ġorder Ġin Ġ[ Component Group Enum ]: ĊĠĠĠĠ Ġ* Ġ- Ġlist Ġof Ġeach Ġinput Ġthat Ġis Ġpresent ĊĠĠĠĠ Ġ* Ġ- Ġlist Ġof Ġeach Ġoutput Ġthat Ġis Ġpresent ĊĠĠĠĠ Ġ* Ġ- Ġlist Ġof Ġeach Ġcommand Ġthat Ġis Ġpresent ĊĠĠĠĠ Ġ* Ġ- Ġlist Ġof Ġeach Ġattachment Ġthat Ġis Ġpresent ĊĠĠĠĠ Ġ* Ġ- ĠThe Ġnot ary Ġ[ Party ], Ġif Ġpresent Ġ( list Ġwith Ġone Ġelement ) ĊĠĠĠĠ Ġ* Ġ- ĠThe Ġtime - window Ġof Ġthe Ġtransaction , Ġif Ġpresent Ġ( list Ġwith Ġone Ġelement ) ĊĠĠĠĠ Ġ* Ġ- Ġlist Ġof Ġeach Ġreference Ġinput Ġthat Ġis Ġpresent ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġavailable Component Groups : ĠList < List < Any >> ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf ( inputs , Ġoutputs , Ġcommands , Ġattachments , Ġreferences ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot ary ?. let Ġ{ Ġresult Ġ+= ĠlistOf ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Window ?. let Ġ{ Ġresult Ġ+= ĠlistOf ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠClass Ġrepresenting Ġmer kle ized Ġfiltered Ġtransaction . Ċ Ġ* Ġ@ param Ġid ĠMer kle Ġtree Ġroot Ġhash . Ċ Ġ* Ġ@ param Ġfiltered Component Groups Ġlist Ġof Ġtransaction Ġcomponents Ġgroups Ġremain ed Ġafter Ġfilters Ġare Ġapplied Ġto Ġ[ Wire Transaction ]. Ċ Ġ* Ġ@ param Ġgroup Hashes Ġthe Ġroots Ġof Ġthe Ġtransaction Ġcomponent Ġgroups . Ċ Ġ*/ Ċ @ Keep For DJ VM Ċ @ C ord a Serializable Ċ class ĠFilter ed Transaction Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġid : ĠSecure Hash , ĊĠĠĠĠĠĠĠ Ġval Ġfiltered Component Groups : ĠList < Filtered Component Group >, ĊĠĠĠĠĠĠĠ Ġval Ġgroup Hashes : ĠList < Secure Hash > Ċ ) Ġ: ĠTra versable Transaction ( filtered Component Groups ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCon struction Ġof Ġfiltered Ġtransaction Ġwith Ġpartial ĠMer kle Ġtree . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġw tx ĠWire Transaction Ġto Ġbe Ġfiltered . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġfiltering Ġfiltering Ġover Ġthe Ġwhole ĠWire Transaction . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġbuild Filtered Transaction ( w tx : ĠWire Transaction , Ġfiltering : ĠPredicate < Any >): ĠFilter ed Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiltered Component Groups Ġ= Ġfilter With Fun ( w tx , Ġfiltering ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFilter ed Transaction ( w tx . id , Ġfiltered Component Groups , Ġw tx . group Hashes ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCon struction Ġof Ġpartial Ġtransaction Ġfrom Ġ[ Wire Transaction ] Ġbased Ġon Ġfiltering . ĊĠĠĠĠĠĠĠĠ Ġ* ĠNote Ġthat Ġlist Ġof Ġnon ces Ġto Ġbe Ġsent Ġis Ġupdated Ġon Ġthe Ġfly , Ġbased Ġon Ġthe Ġindex Ġof Ġthe Ġfiltered Ġtx Ġcomponent . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġfiltering Ġfiltering Ġover Ġthe Ġwhole ĠWire Transaction . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġa Ġlist Ġof Ġ[ Filtered Component Group ] Ġused Ġin ĠPartial Mer kle Tree Ġcalculation Ġand Ġverification . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfilter With Fun ( w tx : ĠWire Transaction , Ġfiltering : ĠPredicate < Any >): ĠList < Filtered Component Group > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiltered Serial ised Components : ĠMutable Map < Int , ĠMutable List < Opaque Bytes >> Ġ= Ġhash Map Of () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiltered Component Non ces : ĠMutable Map < Int , ĠMutable List < Secure Hash >> Ġ= Ġhash Map Of () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiltered Component Hashes : ĠMutable Map < Int , ĠMutable List < Secure Hash >> Ġ= Ġhash Map Of () Ġ// ĠRequired Ġfor Ġpartial ĠMer kle Ġtree Ġgeneration . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsign ers Included Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġfilter ( t : ĠT , Ġcomponent Group Index : ĠInt , Ġinternal Index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! filtering . test ( t )) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup Ġ= Ġfiltered Serial ised Components [ component Group Index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBecause Ġthe Ġfilter Ġpassed , Ġwe Ġknow Ġthere Ġis Ġa Ġmatch . ĠWe Ġalso Ġuse Ġfirst ĠVs Ġsingle Ġas Ġthe Ġinit Ġfunction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġof ĠWire Transaction Ġensures Ġthere Ġare Ġno Ġduplicated Ġgroups . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserial ised Component Ġ= Ġw tx . component Groups . first Ġ{ Ġit . group Index Ġ== Ġcomponent Group Index Ġ}. components [ internal Index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( group Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAs Ġall Ġof Ġthe Ġhelper ĠMap Ġstructures , Ġlike Ġavailable Component Non ces , Ġavailable Component Hashes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġand Ġgroups Mer kle Roots , Ġare Ġcomputed Ġl az ily Ġvia Ġcomponent Groups . forEach , Ġthere Ġshould Ġalways Ġbe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġa Ġmatch Ġon ĠMap . get Ġensuring Ġit Ġwill Ġnever Ġreturn Ġnull . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Serial ised Components [ component Group Index ] Ġ= Ġmutable ListOf ( serial ised Component ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Component Non ces [ component Group Index ] Ġ= Ġmutable ListOf ( w tx . available Component Non ces [ component Group Index ] ! ![ internal Index ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Component Hashes [ component Group Index ] Ġ= Ġmutable ListOf ( w tx . available Component Hashes [ component Group Index ] ! ![ internal Index ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup . add ( serial ised Component ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġgroup [ component Group Index ] Ġexisted , Ġthen Ġwe Ġguarantee Ġthat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfiltered Component Non ces [ component Group Index ] Ġand Ġfiltered Component Hashes [ component Group Index ] Ġare Ġnot Ġnull . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Component Non ces [ component Group Index ] !!. add ( w tx . available Component Non ces [ component Group Index ] ! ![ internal Index ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Component Hashes [ component Group Index ] !!. add ( w tx . available Component Hashes [ component Group Index ] ! ![ internal Index ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġat Ġleast Ġone Ġcommand Ġis Ġvisible , Ġthen Ġall Ġcommand - sign ers Ġshould Ġbe Ġvisible Ġas Ġwell . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġrequired Ġfor Ġvisibility Ġpurposes , Ġsee ĠFilter ed Transaction . check All Commands Visible () Ġfor Ġmore Ġdetails . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( component Group Index Ġ== ĠCOMMAND S _ GROUP . ordinal Ġ&& Ġ! sign ers Included ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsign ers Included Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsign ers Group Index Ġ= ĠSIGN ERS _ GROUP . ordinal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThere Ġexist Ġcommands , Ġthus Ġthe Ġsign ers Ġgroup Ġis Ġnot Ġempty . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsign ers Group Components Ġ= Ġw tx . component Groups . first Ġ{ Ġit . group Index Ġ== Ġsign ers Group Index Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Serial ised Components [ sign ers Group Index ] Ġ= Ġsign ers Group Components . components . to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Component Non ces [ sign ers Group Index ] Ġ= Ġw tx . available Component Non ces [ sign ers Group Index ] !!. to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Component Hashes [ sign ers Group Index ] Ġ= Ġw tx . available Component Hashes [ sign ers Group Index ] !!. to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġupdate Filtered Components () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw tx . inputs . forEach Indexed Ġ{ Ġinternal Index , Ġit Ġ-> Ġfilter ( it , ĠINPUT S _ GROUP . ordinal , Ġinternal Index ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw tx . outputs . forEach Indexed Ġ{ Ġinternal Index , Ġit Ġ-> Ġfilter ( it , ĠOUTPUT S _ GROUP . ordinal , Ġinternal Index ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw tx . commands . forEach Indexed Ġ{ Ġinternal Index , Ġit Ġ-> Ġfilter ( it , ĠCOMMAND S _ GROUP . ordinal , Ġinternal Index ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw tx . attachments . forEach Indexed Ġ{ Ġinternal Index , Ġit Ġ-> Ġfilter ( it , ĠATT ACH MENTS _ GROUP . ordinal , Ġinternal Index ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( w tx . not ary Ġ!= Ġnull ) Ġfilter ( w tx . not ary , ĠNOT ARY _ GROUP . ordinal , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( w tx . time Window Ġ!= Ġnull ) Ġfilter ( w tx . time Window , ĠTIME WINDOW _ GROUP . ordinal , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNote Ġthat Ġbecause Ġ[ inputs ] Ġand Ġ[ references ] Ġshare Ġthe Ġsame Ġtype Ġ[ State Ref ], Ġwe Ġuse Ġa Ġwrapper Ġfor Ġreferences Ġ[ Reference State Ref ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhen Ġfiltering . ĠThus , Ġto Ġfilter - in Ġall Ġ[ references ] Ġbased Ġon Ġtype , Ġone Ġshould Ġuse Ġthe Ġwrapper Ġtype Ġ[ Reference State Ref ] Ġand Ġnot Ġ[ State Ref ]. ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw tx . references . forEach Indexed Ġ{ Ġinternal Index , Ġit Ġ-> Ġfilter ( Reference State Ref ( it ), ĠREFERENCES _ GROUP . ordinal , Ġinternal Index ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt Ġis Ġhighlighted Ġthat Ġbecause Ġthere Ġis Ġno Ġa Ġsign ers Ġproperty Ġin ĠTra versable Transaction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġone Ġcannot Ġspecifically Ġfilter Ġthem Ġin Ġor Ġout . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġabove Ġis Ġvery Ġimportant Ġto Ġensure Ġsomeone Ġwon 't Ġfilter Ġout Ġthe Ġsign ers Ġcomponent Ġgroup Ġif Ġat Ġleast Ġone ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcommand Ġis Ġincluded Ġin Ġa ĠFilter ed Transaction . ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt 's Ġsometimes Ġpossible Ġthat Ġwhen Ġwe Ġreceive Ġa ĠWire Transaction Ġfor Ġwhich Ġthere Ġis Ġa Ġnew Ġor Ġmore Ġunknown Ġcomponent Ġgroups , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġdecide Ġto Ġfilter Ġand Ġattach Ġthis Ġfield Ġto Ġa ĠFilter ed Transaction . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAn Ġexample Ġwould Ġbe Ġto Ġred act Ġcertain Ġcontract Ġstate Ġtypes , Ġbut Ġotherwise Ġleave Ġa Ġtransaction Ġalone , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġincluding Ġthe Ġunknown Ġnew Ġcomponents . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw tx . component Groups ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . group Index Ġ>= Ġvalues (). size Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġcomponent Group Ġ-> Ġcomponent Group . components . forEach Indexed Ġ{ Ġinternal Index , Ġcomponent Ġ-> Ġfilter ( component , Ġcomponent Group . group Index , Ġinternal Index ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġcreate Partial Mer kle Tree ( component Group Index : ĠInt ): ĠPartial Mer kle Tree Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPartial Mer kle Tree . build ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMer kle Tree . get Mer kle Tree ( w tx . available Component Hashes [ component Group Index ] !! ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Component Hashes [ component Group Index ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġcreate Filtered Component Groups (): ĠList < Filtered Component Group > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Filtered Components () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiltered Component Groups : ĠMutable List < Filtered Component Group > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Serial ised Components . forEach Ġ{ Ġ( group Index , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Component Groups . add ( Filtered Component Group ( group Index , Ġvalue , Ġfiltered Component Non ces [ group Index ] !! , Ġcreate Partial Mer kle Tree ( group Index ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfiltered Component Groups ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcreate Filtered Component Groups () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRuns Ġverification Ġof Ġpartial ĠMer kle Ġbranch Ġagainst Ġ[ id ]. ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġempty Ġfiltered Ġtransactions Ġ( with Ġno Ġcomponent Ġgroups ) Ġare Ġaccepted Ġas Ġwell , ĊĠĠĠĠ Ġ* Ġe . g . Ġfor ĠTimestamp ĠAuthor ities Ġto Ġblind ly Ġsign Ġor Ġany Ġother Ġsimilar Ġcase Ġin Ġthe Ġfuture ĊĠĠĠĠ Ġ* Ġthat Ġrequires Ġa Ġblind Ġsignature Ġover Ġa Ġtransaction 's Ġ[ id ]. ĊĠĠĠĠ Ġ* Ġ@ throws ĠFilter ed Transaction Verification Exception Ġif Ġverification Ġfails . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( Filtered Transaction Verification Exception :: class ) ĊĠĠĠ Ġfun Ġverify () Ġ{ ĊĠĠĠĠĠĠĠ Ġverification Check ( group Hashes . isNotEmpty ()) Ġ{ Ġ" At Ġleast Ġone Ġcomponent Ġgroup Ġhash Ġis Ġrequired " Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠVerify Ġthe Ġtop Ġlevel ĠMer kle Ġtree Ġ( group Ġhashes Ġare Ġits Ġleaves , Ġincluding Ġall On es Hash Ġfor Ġempty Ġlist Ġor Ġnull ĊĠĠĠĠĠĠĠ Ġ// Ġcomponents Ġin ĠWire Transaction ). ĊĠĠĠĠĠĠĠ Ġverification Check ( Mer kle Tree . get Mer kle Tree ( group Hashes ). hash Ġ== Ġid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Top Ġlevel ĠMer kle Ġtree Ġcannot Ġbe Ġverified Ġagainst Ġtransaction 's Ġid " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠFor Ġcompletely Ġblind Ġverification Ġ( no Ġcomponents Ġare Ġincluded ). ĊĠĠĠĠĠĠĠ Ġif Ġ( filtered Component Groups . isEmpty ()) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġ// ĠCompute Ġpartial ĠMer kle Ġroots Ġfor Ġeach Ġfiltered Ġcomponent Ġand Ġverify Ġeach Ġof Ġthe Ġpartial ĠMer kle Ġtrees . ĊĠĠĠĠĠĠĠ Ġfiltered Component Groups . forEach Ġ{ Ġ( group Index , Ġcomponents , Ġnon ces , Ġgroup Partial Tree ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverification Check ( group Index Ġ< Ġgroup Hashes . size ) Ġ{ Ġ" There Ġis Ġno Ġmatching Ġcomponent Ġgroup Ġhash Ġfor Ġgroup Ġ$ group Index " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup Mer kle Root Ġ= Ġgroup Hashes [ group Index ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverification Check ( group Mer kle Root Ġ== ĠPartial Mer kle Tree . root And Used Hashes ( group Partial Tree . root , Ġmutable ListOf ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Partial ĠMer kle Ġtree Ġroot Ġand Ġadvert ised Ġfull ĠMer kle Ġtree Ġroot Ġfor Ġcomponent Ġgroup Ġ$ group Index Ġdo Ġnot Ġmatch " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverification Check ( group Partial Tree . verify ( group Mer kle Root , Ġcomponents . map Indexed Ġ{ Ġindex , Ġcomponent Ġ-> Ġcomponent Hash ( non ces [ index ], Ġcomponent ) Ġ})) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Visible Ġcomponents Ġin Ġgroup Ġ$ group Index Ġcannot Ġbe Ġverified Ġagainst Ġtheir Ġpartial ĠMer kle Ġtree " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFunction Ġthat Ġchecks Ġthe Ġwhole Ġfiltered Ġstructure . ĊĠĠĠĠ Ġ* ĠForce Ġtype Ġchecking Ġon Ġa Ġstructure Ġthat Ġwe Ġobtained , Ġso Ġwe Ġdon 't Ġsign Ġmore Ġthan Ġexpected . ĊĠĠĠĠ Ġ* ĠExample : ĠOracle Ġis Ġimplemented Ġto Ġcheck Ġonly Ġfor Ġcommands , Ġif Ġit Ġgets Ġan Ġattachment Ġand Ġdoesn 't Ġexpect Ġit Ġ- Ġit Ġcan Ġsign ĊĠĠĠĠ Ġ* Ġover Ġa Ġtransaction Ġwith Ġthe Ġattachment Ġthat Ġwasn 't Ġverified . ĠOf Ġcourse Ġit Ġdepends Ġon Ġhow Ġyou Ġimplement Ġit , Ġbut Ġelse Ġ-> Ġfalse ĊĠĠĠĠ Ġ* Ġshould Ġsolve Ġa Ġproblem Ġwith Ġpossible Ġlater Ġextensions Ġto ĠWire Transaction . ĊĠĠĠĠ Ġ* Ġ@ param Ġchecking Fun Ġfunction Ġthat Ġperforms Ġtype Ġchecking Ġon Ġthe Ġstructure Ġfields Ġand Ġprovides Ġverification Ġlogic Ġaccordingly . ĊĠĠĠĠ Ġ* Ġ@ return Ġfalse Ġif Ġno Ġelements Ġwere Ġmatched Ġon Ġa Ġstructure Ġor Ġchecking Fun Ġreturned Ġfalse . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcheck With Fun ( checking Fun : Ġ( Any ) Ġ-> ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcheck List Ġ= Ġavailable Component Groups . flatten (). map Ġ{ Ġchecking Fun ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ(! check List . isEmpty ()) Ġ&& Ġcheck List . all Ġ{ Ġit Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFunction Ġthat Ġchecks Ġif Ġall Ġof Ġthe Ġcomponents Ġin Ġa Ġparticular Ġgroup Ġare Ġvisible . ĊĠĠĠĠ Ġ* ĠThis Ġfunctionality Ġis Ġrequired Ġon Ġnon - Valid ating ĠNot aries Ġto Ġcheck Ġthat Ġall Ġinputs Ġare Ġvisible . ĊĠĠĠĠ Ġ* ĠIt Ġmight Ġalso Ġbe Ġapplied Ġin ĠOr acles Ġor Ġany Ġother Ġentity Ġrequiring Ġ[ Command ] Ġvisibility , Ġbut Ġbecause Ġthis Ġmethod ĊĠĠĠĠ Ġ* Ġcannot Ġdistinguish Ġbetween Ġrelated Ġand Ġunrelated Ġto Ġthe Ġsigner Ġ[ Command ] s , Ġone Ġshould Ġuse Ġthe ĊĠĠĠĠ Ġ* Ġ[ check Command Visibility ] Ġmethod , Ġwhich Ġis Ġspecifically Ġdesigned Ġfor Ġ[ Command ] Ġvisibility Ġpurposes . ĊĠĠĠĠ Ġ* ĠThe Ġlogic Ġbehind Ġthis Ġalgorithm Ġis Ġthat Ġwe Ġcheck Ġthat Ġthe Ġroot Ġof Ġthe Ġprovided Ġgroup Ġpartial Mer kle Tree Ġmatches Ġwith Ġthe ĊĠĠĠĠ Ġ* Ġroot Ġof Ġa Ġfull Mer kle Tree Ġif Ġcomputed Ġusing Ġall Ġvisible Ġcomponents . ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġthis Ġmethod Ġis Ġusually Ġcalled Ġafter Ġor Ġbefore Ġ[ verify ], Ġto Ġalso Ġensure Ġthat Ġthe Ġprovided Ġpartial ĠMer kle ĊĠĠĠĠ Ġ* Ġtree Ġcorresponds Ġto Ġthe Ġcorrect Ġleaf Ġin Ġthe Ġtop ĠMer kle Ġtree . ĊĠĠĠĠ Ġ* Ġ@ param Ġcomponent Group Enum Ġthe Ġ[ Component Group Enum ] Ġthat Ġcorresponds Ġto Ġthe Ġcomponent Group Ġfor Ġwhich Ġwe Ġrequire Ġfull Ġcomponent Ġvisibility . ĊĠĠĠĠ Ġ* Ġ@ throws ĠComponent Visibility Exception Ġif Ġnot Ġall Ġof Ġthe Ġcomponents Ġare Ġvisible Ġor Ġif Ġthe Ġcomponent Ġgroup Ġis Ġnot Ġpresent Ġin Ġthe Ġ[ Filtered Transaction ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( Component Visibility Exception :: class ) ĊĠĠĠ Ġfun Ġcheck All Components Visible ( component Group Enum : ĠComponent Group Enum ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgroup Ġ= Ġfiltered Component Groups . first OrNull Ġ{ Ġit . group Index Ġ== Ġcomponent Group Enum . ordinal Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( group Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġdon 't Ġreceive Ġelements Ġof Ġa Ġparticular Ġcomponent , Ġcheck Ġif Ġits Ġordinal Ġis Ġbigger Ġthat Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġgroup Hashes . size Ġor Ġif Ġthe Ġgroup Ġhash Ġis Ġall On es Hash , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġensure Ġthere Ġwere Ġindeed Ġno Ġelements Ġin Ġthe Ġoriginal Ġwire Ġtransaction . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Check ( component Group Enum . ordinal Ġ>= Ġgroup Hashes . size Ġ|| Ġgroup Hashes [ component Group Enum . ordinal ] Ġ== ĠSecure Hash . all On es Hash ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Did Ġnot Ġreceive Ġcomponents Ġfor Ġgroup Ġ${ component Group Enum . ordinal } Ġand Ġcannot Ġverify Ġthey Ġdidn 't Ġexist Ġin Ġthe Ġoriginal Ġwire Ġtransaction " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Check ( group . group Index Ġ< Ġgroup Hashes . size ) Ġ{ Ġ" There Ġis Ġno Ġmatching Ġcomponent Ġgroup Ġhash Ġfor Ġgroup Ġ${ group . group Index }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup Partial Root Ġ= Ġgroup Hashes [ group . group Index ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup Full Root Ġ= ĠMer kle Tree . get Mer kle Tree ( group . components . map Indexed Ġ{ Ġindex , Ġcomponent Ġ-> Ġcomponent Hash ( group . non ces [ index ], Ġcomponent ) Ġ}). hash ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Check ( group Partial Root Ġ== Ġgroup Full Root ) Ġ{ Ġ" Some Ġcomponents Ġfor Ġgroup Ġ${ group . group Index } Ġare Ġnot Ġvisible " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠVerify Ġthe Ġtop Ġlevel ĠMer kle Ġtree Ġfrom Ġgroup Hashes . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Check ( Mer kle Tree . get Mer kle Tree ( group Hashes ). hash Ġ== Ġid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Transaction Ġis Ġmalformed . ĠTop Ġlevel ĠMer kle Ġtree Ġcannot Ġbe Ġverified Ġagainst Ġtransaction 's Ġid " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFunction Ġthat Ġchecks Ġif Ġall Ġof Ġthe Ġcommands Ġthat Ġshould Ġbe Ġsigned Ġby Ġthe Ġinput Ġpublic Ġkey Ġare Ġvisible . ĊĠĠĠĠ Ġ* ĠThis Ġfunctionality Ġis Ġrequired Ġfrom ĠOr acles Ġto Ġcheck Ġthat Ġall Ġof Ġthe Ġcommands Ġthey Ġshould Ġsign Ġare Ġvisible . ĊĠĠĠĠ Ġ* ĠThis Ġalgorithm Ġuses Ġthe Ġ[ Component Group Enum . SIGN ERS _ GROUP ] Ġto Ġcount Ġhow Ġmany Ġcommands Ġshould Ġbe Ġsigned Ġby Ġthe ĊĠĠĠĠ Ġ* Ġinput Ġ[ PublicKey ] Ġand Ġit Ġthen Ġmatches Ġit Ġwith Ġthe Ġsize Ġof Ġreceived Ġ[ commands ]. ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġthis Ġmethod Ġdoes Ġnot Ġthrow Ġif Ġthere Ġare Ġno Ġcommands Ġfor Ġthis Ġkey Ġto Ġsign Ġin Ġthe Ġoriginal Ġ[ Wire Transaction ]. ĊĠĠĠĠ Ġ* Ġ@ param ĠpublicKey Ġsigner 's Ġ[ PublicKey ] ĊĠĠĠĠ Ġ* Ġ@ throws ĠComponent Visibility Exception Ġif Ġnot Ġall Ġof Ġthe Ġrelated Ġcommands Ġare Ġvisible . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( Component Visibility Exception :: class ) ĊĠĠĠ Ġfun Ġcheck Command Visibility ( publicKey : ĠPublicKey ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcommand Sign ers Ġ= Ġcomponent Groups . first OrNull Ġ{ Ġit . group Index Ġ== ĠSIGN ERS _ GROUP . ordinal Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġexpected Num Of Commands Ġ= Ġexpected Num Of Commands ( publicKey , Ġcommand Sign ers ) ĊĠĠĠĠĠĠĠ Ġval Ġreceived For This Key Num Of Commands Ġ= Ġcommands . filter Ġ{ ĠpublicKey Ġin Ġit . sign ers Ġ}. size ĊĠĠĠĠĠĠĠ Ġvisibility Check ( expected Num Of Commands Ġ== Ġreceived For This Key Num Of Commands ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ expected Num Of Commands Ġcommands Ġwere Ġexpected , Ġbut Ġreceived Ġ$ received For This Key Num Of Commands " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠFunction Ġto Ġreturn Ġnumber Ġof Ġexpected Ġcommands Ġto Ġsign . ĊĠĠĠ Ġprivate Ġfun Ġexpected Num Of Commands ( publicKey : ĠPublicKey , Ġcommand Sign ers : ĠComponent Group ?): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck All Components Visible ( SIGN ERS _ GROUP ) ĊĠĠĠĠĠĠĠ Ġif Ġ( command Sign ers Ġ== Ġnull ) Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠ Ġfun Ġsign ers Keys ( internal Index : ĠInt , Ġopaque Bytes : ĠO pa que Bytes ): ĠList < PublicKey > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSerialized Bytes < List < PublicKey >>( opaque Bytes . bytes ). deserialize () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Malformed Ġtransaction , Ġsign ers Ġat Ġindex Ġ$ internal Index Ġcannot Ġbe Ġde serial ised ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcommand Sign ers . components ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Indexed Ġ{ Ġinternal Index , Ġopaque Bytes Ġ-> Ġsign ers Keys ( internal Index , Ġopaque Bytes ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġsign ers Ġ-> ĠpublicKey Ġin Ġsign ers Ġ}. size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġverification Check ( value : ĠBoolean , Ġlazy Message : Ġ() Ġ-> ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġlazy Message () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFilter ed Transaction Verification Exception ( id , Ġmessage . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġvisibility Check ( value : ĠBoolean , Ġlazy Message : Ġ() Ġ-> ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġlazy Message () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠComponent Visibility Exception ( id , Ġmessage . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠA ĠFilter ed Component Group Ġis Ġused Ġto Ġstore Ġthe Ġfiltered Ġlist Ġof Ġtransaction Ġcomponents Ġof Ġthe Ġsame Ġtype Ġin Ġserial ised Ġform . Ċ Ġ* ĠThis Ġis Ġsimilar Ġto Ġ[ Component Group ], Ġbut Ġit Ġalso Ġincludes Ġthe Ġcorresponding Ġnonce Ġper Ġcomponent . Ċ Ġ*/ Ċ @ Keep For DJ VM Ċ @ C ord a Serializable Ċ data Ġclass ĠFilter ed Component Group ( override Ġval Ġgroup Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġcomponents : ĠList < Opaque Bytes >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnon ces : ĠList < Secure Hash >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpartial Mer kle Tree : ĠPartial Mer kle Tree ) Ġ: ĠComponent Group ( group Index , Ġcomponents ) Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( components . size Ġ== Ġnon ces . size ) Ġ{ Ġ" Size Ġof Ġtransaction Ġcomponents Ġand Ġnon ces Ġdo Ġnot Ġmatch " Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** ĠThrow n Ġwhen Ġchecking Ġfor Ġvisibility Ġof Ġall - components Ġin Ġa Ġgroup Ġin Ġ[ Filtered Transaction . check All Components Visible ]. Ċ Ġ* Ġ@ param Ġid Ġtransaction 's Ġid . Ċ Ġ* Ġ@ param Ġreason Ġinformation Ġabout Ġthe Ġexception . Ċ Ġ*/ Ċ @ Keep For DJ VM Ċ @ C ord a Serializable Ċ class ĠComponent Visibility Exception ( val Ġid : ĠSecure Hash , Ġval Ġreason : ĠString ) Ġ: ĠC ord a Exception (" Component Ġvisibility Ġerror Ġfor Ġtransaction Ġwith Ġid :$ id . ĠReason : Ġ$ reason ") Ċ Ċ /** ĠThrow n Ġwhen Ġ[ Filtered Transaction . verify ] Ġfails . Ċ Ġ* Ġ@ param Ġid Ġtransaction 's Ġid . Ċ Ġ* Ġ@ param Ġreason Ġinformation Ġabout Ġthe Ġexception . Ċ Ġ*/ Ċ @ Keep For DJ VM Ċ @ C ord a Serializable Ċ class ĠFilter ed Transaction Verification Exception ( val Ġid : ĠSecure Hash , Ġval Ġreason : ĠString ) Ġ: ĠC ord a Exception (" Transaction Ġwith Ġid :$ id Ġcannot Ġbe Ġverified . ĠReason : Ġ$ reason ") Ċ Ċ /** ĠWrapper Ġover Ġ[ State Ref ] Ġto Ġbe Ġused Ġwhen Ġfiltering Ġreference Ġstates . Ġ*/ Ċ @ Keep For DJ VM Ċ @ C ord a Serializable Ċ data Ġclass ĠReference State Ref ( val Ġstate Ref : ĠState Ref ) Ċ