Skip to content

Commit fc4db8b

Browse files
committed
perf(linear-vesting): drop redundant credential tag checks
Remove constructor tag verification from getScriptHashFromAddress and getPubKeyHashFromAddress. The ledger guarantees the correct credential type in both cases: the validated input is always a script address, and the beneficiary hash is checked against txInfoSignatories. Saves ~360K CPU / ~1.9K MEM.
1 parent 19eb906 commit fc4db8b

File tree

4 files changed

+97
-228
lines changed

4 files changed

+97
-228
lines changed

plutus-benchmark/linear-vesting/src/LinearVesting/Validator.hs

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -174,29 +174,19 @@ valueOf valueData cs tn =
174174
then BI.unsafeDataAsI (BI.snd pair)
175175
else findToken (BI.tail pairs)
176176

177+
-- No credential tag check needed: called on the input being validated,
178+
-- so the ledger guarantees it's a ScriptCredential.
177179
{-# INLINE getScriptHashFromAddress #-}
178180
getScriptHashFromAddress :: BI.BuiltinData -> BI.BuiltinByteString
179181
getScriptHashFromAddress addr =
180-
let addrFields = BI.snd (BI.unsafeDataAsConstr addr)
181-
cred = BI.head addrFields
182-
!credCon = BI.unsafeDataAsConstr cred
183-
credTag = BI.fst credCon
184-
credFields = BI.snd credCon
185-
in if BI.equalsInteger credTag 1
186-
then BI.unsafeDataAsB (BI.head credFields)
187-
else traceError "Expected ScriptCredential"
182+
BI.unsafeDataAsB (BI.head (BI.snd (BI.unsafeDataAsConstr (BI.head (BI.snd (BI.unsafeDataAsConstr addr))))))
188183

184+
-- No credential tag check needed: the extracted hash is verified
185+
-- against txInfoSignatories, which the ledger validates.
189186
{-# INLINE getPubKeyHashFromAddress #-}
190187
getPubKeyHashFromAddress :: BI.BuiltinData -> BI.BuiltinByteString
191188
getPubKeyHashFromAddress addr =
192-
let addrFields = BI.snd (BI.unsafeDataAsConstr addr)
193-
cred = BI.head addrFields
194-
!credCon = BI.unsafeDataAsConstr cred
195-
credTag = BI.fst credCon
196-
credFields = BI.snd credCon
197-
in if BI.equalsInteger credTag 0
198-
then BI.unsafeDataAsB (BI.head credFields)
199-
else traceError "Expected PubKeyCredential"
189+
BI.unsafeDataAsB (BI.head (BI.snd (BI.unsafeDataAsConstr (BI.head (BI.snd (BI.unsafeDataAsConstr addr))))))
200190

201191
{-# INLINE getSpendingInfo #-}
202192
getSpendingInfo :: BI.BuiltinData -> BI.BuiltinPair BI.BuiltinData BI.BuiltinData
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
CPU: 11_396_980
2-
Memory: 47_729
3-
AST Size: 1_491
4-
Flat Size: 2_350
1+
CPU: 11_040_647
2+
Memory: 45_828
3+
AST Size: 1_407
4+
Flat Size: 2_191
55

66
(con unit ())

plutus-benchmark/linear-vesting/test/9.6/main.golden.pir

Lines changed: 44 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -472,40 +472,21 @@
472472
in
473473
let
474474
!beneficiaryHash : bytestring
475-
= let
476-
!credCon : pair integer (list data)
477-
= unConstrData
478-
(headList
479-
{data}
480-
(case
481-
(list data)
482-
(unConstrData (headList {data} vdFields))
483-
[(\(l : integer) (r : list data) -> r)]))
484-
!credTag : integer
485-
= case
486-
integer
487-
credCon
488-
[(\(l : integer) (r : list data) -> l)]
489-
!credFields : list data
490-
= case
491-
(list data)
492-
credCon
493-
[(\(l : integer) (r : list data) -> r)]
494-
in
495-
case
496-
(all dead. bytestring)
497-
(equalsInteger 0 credTag)
498-
[ (/\dead ->
499-
let
500-
!x : Unit
501-
= trace
502-
{Unit}
503-
"Expected PubKeyCredential"
504-
Unit
505-
in
506-
error {bytestring})
507-
, (/\dead -> unBData (headList {data} credFields)) ]
508-
{all dead. dead}
475+
= unBData
476+
(headList
477+
{data}
478+
(case
479+
(list data)
480+
(unConstrData
481+
(headList
482+
{data}
483+
(case
484+
(list data)
485+
(unConstrData
486+
(headList {data} vdFields))
487+
[ (\(l : integer) (r : list data) ->
488+
r) ])))
489+
[(\(l : integer) (r : list data) -> r)]))
509490
!signed : bool = txSignedBy' txSignatories beneficiaryHash
510491
!resolvedFields : list data
511492
= case
@@ -524,40 +505,20 @@
524505
[(\(l : integer) (r : list data) -> r)]
525506
!inputAddress : data = headList {data} resolvedFields
526507
!scriptHash : bytestring
527-
= let
528-
!credCon : pair integer (list data)
529-
= unConstrData
530-
(headList
531-
{data}
532-
(case
533-
(list data)
534-
(unConstrData inputAddress)
535-
[(\(l : integer) (r : list data) -> r)]))
536-
!credTag : integer
537-
= case
538-
integer
539-
credCon
540-
[(\(l : integer) (r : list data) -> l)]
541-
!credFields : list data
542-
= case
543-
(list data)
544-
credCon
545-
[(\(l : integer) (r : list data) -> r)]
546-
in
547-
case
548-
(all dead. bytestring)
549-
(equalsInteger 1 credTag)
550-
[ (/\dead ->
551-
let
552-
!x : Unit
553-
= trace
554-
{Unit}
555-
"Expected ScriptCredential"
556-
Unit
557-
in
558-
error {bytestring})
559-
, (/\dead -> unBData (headList {data} credFields)) ]
560-
{all dead. dead}
508+
= unBData
509+
(headList
510+
{data}
511+
(case
512+
(list data)
513+
(unConstrData
514+
(headList
515+
{data}
516+
(case
517+
(list data)
518+
(unConstrData inputAddress)
519+
[ (\(l : integer) (r : list data) ->
520+
r) ])))
521+
[(\(l : integer) (r : list data) -> r)]))
561522
!ownOutputFields : list data
562523
= case
563524
(list data)
@@ -789,40 +750,21 @@
789750
{data}
790751
(tailList {data} vdFields)))))
791752
!beneficiaryHash : bytestring
792-
= let
793-
!credCon : pair integer (list data)
794-
= unConstrData
795-
(headList
796-
{data}
797-
(case
798-
(list data)
799-
(unConstrData (headList {data} vdFields))
800-
[(\(l : integer) (r : list data) -> r)]))
801-
!credTag : integer
802-
= case
803-
integer
804-
credCon
805-
[(\(l : integer) (r : list data) -> l)]
806-
!credFields : list data
807-
= case
808-
(list data)
809-
credCon
810-
[(\(l : integer) (r : list data) -> r)]
811-
in
812-
case
813-
(all dead. bytestring)
814-
(equalsInteger 0 credTag)
815-
[ (/\dead ->
816-
let
817-
!x : Unit
818-
= trace
819-
{Unit}
820-
"Expected PubKeyCredential"
821-
Unit
822-
in
823-
error {bytestring})
824-
, (/\dead -> unBData (headList {data} credFields)) ]
825-
{all dead. dead}
753+
= unBData
754+
(headList
755+
{data}
756+
(case
757+
(list data)
758+
(unConstrData
759+
(headList
760+
{data}
761+
(case
762+
(list data)
763+
(unConstrData
764+
(headList {data} vdFields))
765+
[ (\(l : integer) (r : list data) ->
766+
r) ])))
767+
[(\(l : integer) (r : list data) -> r)]))
826768
in
827769
case
828770
(all dead. bool)

0 commit comments

Comments
 (0)