Skip to content

Commit 043fa6e

Browse files
authored
Merge pull request #3393 from IntersectMBO/plutus_builtin_cost_models
refactor(plutus): refactor bitwise and batch6 script data definitions
2 parents b56c14b + 52c4714 commit 043fa6e

File tree

2 files changed

+122
-153
lines changed

2 files changed

+122
-153
lines changed

cardano_node_tests/tests/plutus_common.py

Lines changed: 107 additions & 153 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ class PlutusScriptData:
278278
}
279279

280280

281-
# ----- Succeeding bitwise tests ----- #
281+
# ----- Bitwise tests ----- #
282282

283283
# These are used to fill in the execution costs of scripts where we don't yet
284284
# know what the cost is. We're not currently checking the costs (and it seems
@@ -293,113 +293,30 @@ class PlutusScriptData:
293293
)
294294

295295

296-
MINTING_ANDBYTESTRING_PLUTUS_V3 = SCRIPTS_V3_DIR / "succeedingAndByteStringPolicyScriptV3.plutus"
297-
MINTING_ANDBYTESTRING_V3 = PlutusScriptData(
298-
script_file=MINTING_ANDBYTESTRING_PLUTUS_V3,
299-
script_type=clusterlib.ScriptTypes.PLUTUS_V3,
300-
execution_cost=ExecutionCost(
301-
per_time=19269680, per_space=102266, fixed_cost=UNKNOWN_FIXED_COST
302-
),
303-
)
304-
305-
MINTING_ORBYTESTRING_PLUTUS_V3 = SCRIPTS_V3_DIR / "succeedingOrByteStringPolicyScriptV3.plutus"
306-
MINTING_ORBYTESTRING_V3 = PlutusScriptData(
307-
script_file=MINTING_ORBYTESTRING_PLUTUS_V3,
308-
script_type=clusterlib.ScriptTypes.PLUTUS_V3,
309-
execution_cost=ExecutionCost(
310-
per_time=19269680, per_space=102266, fixed_cost=UNKNOWN_FIXED_COST
311-
),
312-
)
313-
314-
MINTING_XORBYTESTRING_PLUTUS_V3 = SCRIPTS_V3_DIR / "succeedingXorByteStringPolicyScriptV3.plutus"
315-
MINTING_XORBYTESTRING_V3 = PlutusScriptData(
316-
script_file=MINTING_XORBYTESTRING_PLUTUS_V3,
317-
script_type=clusterlib.ScriptTypes.PLUTUS_V3,
318-
execution_cost=ExecutionCost(
319-
per_time=19269680, per_space=102266, fixed_cost=UNKNOWN_FIXED_COST
320-
),
321-
)
322-
323-
MINTING_COMPLEMENTBYTESTRING_PLUTUS_V3 = (
324-
SCRIPTS_V3_DIR / "succeedingComplementByteStringPolicyScriptV3.plutus"
325-
)
326-
MINTING_COMPLEMENTBYTESTRING_V3 = PlutusScriptData(
327-
script_file=MINTING_COMPLEMENTBYTESTRING_PLUTUS_V3,
328-
script_type=clusterlib.ScriptTypes.PLUTUS_V3,
329-
execution_cost=ExecutionCost(per_time=5863431, per_space=30027, fixed_cost=UNKNOWN_FIXED_COST),
330-
)
331-
332-
MINTING_COUNTSETBITS_PLUTUS_V3 = SCRIPTS_V3_DIR / "succeedingCountSetBitsPolicyScriptV3.plutus"
333-
MINTING_COUNTSETBITS_V3 = PlutusScriptData(
334-
script_file=MINTING_COUNTSETBITS_PLUTUS_V3,
335-
script_type=clusterlib.ScriptTypes.PLUTUS_V3,
336-
execution_cost=ExecutionCost(per_time=9211420, per_space=45324, fixed_cost=UNKNOWN_FIXED_COST),
337-
)
338-
339-
MINTING_FINDFIRSTSET_PLUTUS_V3 = SCRIPTS_V3_DIR / "succeedingFindFirstSetBitPolicyScriptV3.plutus"
340-
MINTING_FINDFIRSTSET_V3 = PlutusScriptData(
341-
script_file=MINTING_FINDFIRSTSET_PLUTUS_V3,
342-
script_type=clusterlib.ScriptTypes.PLUTUS_V3,
343-
execution_cost=ExecutionCost(per_time=8071583, per_space=40221, fixed_cost=UNKNOWN_FIXED_COST),
344-
)
345-
346-
MINTING_READBIT_PLUTUS_V3 = SCRIPTS_V3_DIR / "succeedingReadBitPolicyScriptV3.plutus"
347-
MINTING_READBIT_V3 = PlutusScriptData(
348-
script_file=MINTING_READBIT_PLUTUS_V3,
349-
script_type=clusterlib.ScriptTypes.PLUTUS_V3,
350-
execution_cost=ExecutionCost(per_time=15272720, per_space=82724, fixed_cost=UNKNOWN_FIXED_COST),
351-
)
352-
353-
MINTING_REPLICATEBYTE_PLUTUS_V3 = SCRIPTS_V3_DIR / "succeedingReplicateBytePolicyScriptV3.plutus"
354-
MINTING_REPLICATEBYTE_V3 = PlutusScriptData(
355-
script_file=MINTING_REPLICATEBYTE_PLUTUS_V3,
356-
script_type=clusterlib.ScriptTypes.PLUTUS_V3,
357-
execution_cost=ExecutionCost(per_time=4549650, per_space=22946, fixed_cost=UNKNOWN_FIXED_COST),
358-
)
359-
360-
MINTING_ROTATEBYTESTRING_PLUTUS_V3 = (
361-
SCRIPTS_V3_DIR / "succeedingRotateByteStringPolicyScriptV3.plutus"
362-
)
363-
MINTING_ROTATEBYTESTRING_V3 = PlutusScriptData(
364-
script_file=MINTING_ROTATEBYTESTRING_PLUTUS_V3,
365-
script_type=clusterlib.ScriptTypes.PLUTUS_V3,
366-
execution_cost=ExecutionCost(
367-
per_time=22778618, per_space=109004, fixed_cost=UNKNOWN_FIXED_COST
368-
),
369-
)
370-
371-
MINTING_SHIFTBYTESTRING_PLUTUS_V3 = (
372-
SCRIPTS_V3_DIR / "succeedingShiftByteStringPolicyScriptV3.plutus"
373-
)
374-
MINTING_SHIFTBYTESTRING_V3 = PlutusScriptData(
375-
script_file=MINTING_SHIFTBYTESTRING_PLUTUS_V3,
376-
script_type=clusterlib.ScriptTypes.PLUTUS_V3,
377-
execution_cost=ExecutionCost(per_time=17922844, per_space=85787, fixed_cost=UNKNOWN_FIXED_COST),
378-
)
379-
380-
MINTING_WRITEBITS_PLUTUS_V3 = SCRIPTS_V3_DIR / "succeedingWriteBitsPolicyScriptV3.plutus"
381-
MINTING_WRITEBITS_V3 = PlutusScriptData(
382-
script_file=MINTING_WRITEBITS_PLUTUS_V3,
383-
script_type=clusterlib.ScriptTypes.PLUTUS_V3,
384-
execution_cost=ExecutionCost(
385-
per_time=90646820, per_space=462457, fixed_cost=UNKNOWN_FIXED_COST
386-
),
387-
)
388-
389296
# ----- All succeeding bitwise tests ----- #
390297

391-
SUCCEEDING_MINTING_BITWISE_SCRIPTS_V3 = (
392-
MINTING_ANDBYTESTRING_V3,
393-
MINTING_ORBYTESTRING_V3,
394-
MINTING_XORBYTESTRING_V3,
395-
MINTING_COMPLEMENTBYTESTRING_V3,
396-
MINTING_COUNTSETBITS_V3,
397-
MINTING_FINDFIRSTSET_V3,
398-
MINTING_READBIT_V3,
399-
MINTING_REPLICATEBYTE_V3,
400-
MINTING_ROTATEBYTESTRING_V3,
401-
MINTING_SHIFTBYTESTRING_V3,
402-
MINTING_WRITEBITS_V3,
298+
# Tuples of (script_name, per_time, per_space, fixed_cost) for each succeeding bitwise script.
299+
SUCCEEDING_BITWISE_SCRIPTS_V3 = (
300+
("succeedingAndByteStringPolicyScriptV3.plutus", 19269680, 102266, UNKNOWN_FIXED_COST),
301+
("succeedingOrByteStringPolicyScriptV3.plutus", 19269680, 102266, UNKNOWN_FIXED_COST),
302+
("succeedingXorByteStringPolicyScriptV3.plutus", 19269680, 102266, UNKNOWN_FIXED_COST),
303+
("succeedingComplementByteStringPolicyScriptV3.plutus", 5863431, 30027, UNKNOWN_FIXED_COST),
304+
("succeedingCountSetBitsPolicyScriptV3.plutus", 9211420, 45324, UNKNOWN_FIXED_COST),
305+
("succeedingFindFirstSetBitPolicyScriptV3.plutus", 8071583, 40221, UNKNOWN_FIXED_COST),
306+
("succeedingReadBitPolicyScriptV3.plutus", 15272720, 82724, UNKNOWN_FIXED_COST),
307+
("succeedingReplicateBytePolicyScriptV3.plutus", 4549650, 22946, UNKNOWN_FIXED_COST),
308+
("succeedingRotateByteStringPolicyScriptV3.plutus", 22778618, 109004, UNKNOWN_FIXED_COST),
309+
("succeedingShiftByteStringPolicyScriptV3.plutus", 17922844, 85787, UNKNOWN_FIXED_COST),
310+
("succeedingWriteBitsPolicyScriptV3.plutus", 90646820, 462457, UNKNOWN_FIXED_COST),
311+
)
312+
313+
SUCCEEDING_MINTING_BITWISE_SCRIPTS_V3 = tuple(
314+
PlutusScriptData(
315+
script_file=SCRIPTS_V3_DIR / script_name,
316+
script_type=clusterlib.ScriptTypes.PLUTUS_V3,
317+
execution_cost=ExecutionCost(per_time=per_time, per_space=per_space, fixed_cost=fixed_cost),
318+
)
319+
for script_name, per_time, per_space, fixed_cost in SUCCEEDING_BITWISE_SCRIPTS_V3
403320
)
404321

405322

@@ -470,19 +387,20 @@ class PlutusScriptData:
470387
#
471388
# Includes tests for casing on constants, which will be released together with batch 6 in PV 11
472389

473-
SUCCEEDING_BATCH6_SCRIPT_FILES_V3 = (
474-
"caseBoolHappy_V3_110.plutus",
475-
"caseIntegerHappy_V3_110.plutus",
476-
"caseListHappy_V3_110.plutus",
477-
"casePairHappy_V3_110.plutus",
478-
"caseUnitHappy_V3_110.plutus",
479-
"succeedingDropListPolicyScript_V3_110.plutus",
480-
"succeedingExpModIntegerExponentOnePolicyScript_V3_110.plutus",
481-
"succeedingExpModIntegerInversePolicyScript_V3_110.plutus",
482-
"succeedingExpModIntegerPolicyScript_V3_110.plutus",
483-
"succeedingIndexArrayPolicyScript_V3_110.plutus",
484-
"succeedingLengthOfArrayPolicyScript_V3_110.plutus",
485-
"succeedingListToArrayPolicyScript_V3_110.plutus",
390+
# Tuples of (script_name, per_time, per_space, fixed_cost) for each succeeding batch6 script.
391+
SUCCEEDING_BATCH6_SCRIPTS_V3 = (
392+
("caseBoolHappy_V3_110.plutus", 208100, 1400, 96),
393+
("caseIntegerHappy_V3_110.plutus", 208100, 1400, 96),
394+
("caseListHappy_V3_110.plutus", 1484744, 6638, 491),
395+
("casePairHappy_V3_110.plutus", 848864, 3804, 281),
396+
("caseUnitHappy_V3_110.plutus", 96100, 700, 48),
397+
("succeedingDropListPolicyScript_V3_110.plutus", 65064783, 258749, 19621),
398+
("succeedingExpModIntegerExponentOnePolicyScript_V3_110.plutus", 14492504, 30930, 2830),
399+
("succeedingExpModIntegerInversePolicyScript_V3_110.plutus", 35417284, 55402, 5751),
400+
("succeedingExpModIntegerPolicyScript_V3_110.plutus", 346637025, 174626, 35069),
401+
("succeedingIndexArrayPolicyScript_V3_110.plutus", 2831492, 12706, 938),
402+
("succeedingLengthOfArrayPolicyScript_V3_110.plutus", 2060965, 9018, 669),
403+
("succeedingListToArrayPolicyScript_V3_110.plutus", 3918949, 15619, 1184),
486404
)
487405

488406
FAILING_BATCH6_SCRIPT_FILES_V3 = (
@@ -527,33 +445,68 @@ class PlutusScriptData:
527445
)
528446

529447
if VERSIONS.node >= version.parse("10.7.0"):
530-
SUCCEEDING_BATCH6_SCRIPT_FILES_V3 = ( # type: ignore[assignment]
531-
*SUCCEEDING_BATCH6_SCRIPT_FILES_V3,
532-
"succeedingG1MultiScalarMulPolicyScript1_V3_110.plutus",
533-
"succeedingG1MultiScalarMulPolicyScript2_V3_110.plutus",
534-
"succeedingG2MultiScalarMulPolicyScript1_V3_110.plutus",
535-
"succeedingG2MultiScalarMulPolicyScript2_V3_110.plutus",
536-
"succeedingDeleteExistingCoinPolicyScript_V3_110.plutus",
537-
"succeedingDeleteMissingCoinPolicyScript_V3_110.plutus",
538-
"succeedingInsertExistingCoinPolicyScript_V3_110.plutus",
539-
"succeedingInsertNewCoinPolicyScript_V3_110.plutus",
540-
"succeedingLookupMissingCoinPolicyScript_V3_110.plutus",
541-
"succeedingScaleValueNegativePolicyScript_V3_110.plutus",
542-
"succeedingScaleValuePositivePolicyScript_V3_110.plutus",
543-
"succeedingScaleValueZeroPolicyScript_V3_110.plutus",
544-
"succeedingUnionValueAssociativePolicyScript_V3_110.plutus",
545-
"succeedingUnionValueAssociativeSingleCoinPolicyScript_V3_110.plutus",
546-
"succeedingUnionValueCommutativePolicyScript_V3_110.plutus",
547-
"succeedingUnionValueCommutativeSingleCoinPolicyScript_V3_110.plutus",
548-
"succeedingUnionValueEmptyIdentityPolicyScript_V3_110.plutus",
549-
"succeedingUnionValueInversablePolicyScript_V3_110.plutus",
550-
"succeedingValueContainsDisjointPolicyScript_V3_110.plutus",
551-
"succeedingValueContainsEmptyPolicyScript_V3_110.plutus",
552-
"succeedingValueContainsIsSubValuePolicyScript_V3_110.plutus",
553-
"succeedingValueContainsReflexivePolicyScript_V3_110.plutus",
554-
"succeedingValueContainsRightExtraKeyPolicyScript_V3_110.plutus",
555-
"succeedingValueContainsRightHigherAmountPolicyScript_V3_110.plutus",
556-
"succeedingValueDataRoundTripPolicyScript_V3_110.plutus",
448+
SUCCEEDING_BATCH6_SCRIPTS_V3 = ( # type: ignore[assignment]
449+
*SUCCEEDING_BATCH6_SCRIPTS_V3,
450+
("succeedingG1MultiScalarMulPolicyScript1_V3_110.plutus", 9183574944, 437274, 687367),
451+
("succeedingG1MultiScalarMulPolicyScript2_V3_110.plutus", 9915620336, 477870, 742490),
452+
(
453+
"succeedingG2MultiScalarMulPolicyScript1_V3_110.plutus",
454+
UNKNOWN_PER_TIME,
455+
UNKNOWN_PER_SPACE,
456+
UNKNOWN_FIXED_COST,
457+
),
458+
(
459+
"succeedingG2MultiScalarMulPolicyScript2_V3_110.plutus",
460+
UNKNOWN_PER_TIME,
461+
UNKNOWN_PER_SPACE,
462+
UNKNOWN_FIXED_COST,
463+
),
464+
("succeedingDeleteExistingCoinPolicyScript_V3_110.plutus", 2176287, 5979, 502),
465+
("succeedingDeleteMissingCoinPolicyScript_V3_110.plutus", 2195175, 5979, 504),
466+
(
467+
"succeedingInsertExistingCoinPolicyScript_V3_110.plutus",
468+
UNKNOWN_PER_TIME,
469+
UNKNOWN_PER_SPACE,
470+
UNKNOWN_FIXED_COST,
471+
),
472+
("succeedingInsertNewCoinPolicyScript_V3_110.plutus", 1673425, 5092, 415),
473+
("succeedingLookupMissingCoinPolicyScript_V3_110.plutus", 1169613, 4247, 330),
474+
(
475+
"succeedingScaleValueNegativePolicyScript_V3_110.plutus",
476+
UNKNOWN_PER_TIME,
477+
UNKNOWN_PER_SPACE,
478+
UNKNOWN_FIXED_COST,
479+
),
480+
("succeedingScaleValuePositivePolicyScript_V3_110.plutus", 3839117, 7971, 737),
481+
("succeedingScaleValueZeroPolicyScript_V3_110.plutus", 3245681, 6826, 628),
482+
("succeedingUnionValueAssociativePolicyScript_V3_110.plutus", 6282854, 11189, 1099),
483+
(
484+
"succeedingUnionValueAssociativeSingleCoinPolicyScript_V3_110.plutus",
485+
5806552,
486+
11147,
487+
1062,
488+
),
489+
(
490+
"succeedingUnionValueCommutativePolicyScript_V3_110.plutus",
491+
UNKNOWN_PER_TIME,
492+
UNKNOWN_PER_SPACE,
493+
UNKNOWN_FIXED_COST,
494+
),
495+
(
496+
"succeedingUnionValueCommutativeSingleCoinPolicyScript_V3_110.plutus",
497+
UNKNOWN_PER_TIME,
498+
UNKNOWN_PER_SPACE,
499+
UNKNOWN_FIXED_COST,
500+
),
501+
("succeedingUnionValueEmptyIdentityPolicyScript_V3_110.plutus", 5410294, 10487, 996),
502+
("succeedingUnionValueInversablePolicyScript_V3_110.plutus", 3856300, 8004, 740),
503+
("succeedingValueContainsDisjointPolicyScript_V3_110.plutus", 2515834, 5936, 524),
504+
("succeedingValueContainsEmptyPolicyScript_V3_110.plutus", 3426852, 7280, 668),
505+
("succeedingValueContainsIsSubValuePolicyScript_V3_110.plutus", 2991582, 6523, 593),
506+
("succeedingValueContainsReflexivePolicyScript_V3_110.plutus", 1982910, 4791, 420),
507+
("succeedingValueContainsRightExtraKeyPolicyScript_V3_110.plutus", 3541590, 7410, 683),
508+
("succeedingValueContainsRightHigherAmountPolicyScript_V3_110.plutus", 2467834, 5636, 504),
509+
("succeedingValueDataRoundTripPolicyScript_V3_110.plutus", 3547465, 6873, 653),
557510
)
558511
FAILING_BATCH6_SCRIPT_FILES_V3 = ( # type: ignore[assignment]
559512
*FAILING_BATCH6_SCRIPT_FILES_V3,
@@ -572,11 +525,11 @@ class PlutusScriptData:
572525

573526
SUCCEEDING_MINTING_BATCH6_SCRIPTS_V3 = tuple(
574527
PlutusScriptData(
575-
script_file=SCRIPTS_V3_BATCH6_110_DIR / n,
528+
script_file=SCRIPTS_V3_BATCH6_110_DIR / script_name,
576529
script_type=clusterlib.ScriptTypes.PLUTUS_V3,
577-
execution_cost=UNDETERMINED_COST,
530+
execution_cost=ExecutionCost(per_time=per_time, per_space=per_space, fixed_cost=fixed_cost),
578531
)
579-
for n in SUCCEEDING_BATCH6_SCRIPT_FILES_V3
532+
for script_name, per_time, per_space, fixed_cost in SUCCEEDING_BATCH6_SCRIPTS_V3
580533
)
581534

582535
FAILING_MINTING_BATCH6_SCRIPTS_V3 = tuple(
@@ -631,9 +584,9 @@ def check_plutus_costs(
631584
# Sort records by total cost
632585
sorted_plutus = sorted(
633586
plutus_costs,
634-
key=lambda x: x["executionUnits"]["memory"]
635-
+ x["executionUnits"]["steps"]
636-
+ x["lovelaceCost"],
587+
key=lambda x: (
588+
x["executionUnits"]["memory"] + x["executionUnits"]["steps"] + x["lovelaceCost"]
589+
),
637590
)
638591
sorted_expected = sorted(expected_costs, key=lambda x: x.per_space + x.per_time + x.fixed_cost)
639592

@@ -678,7 +631,8 @@ def compute_cost(
678631

679632
collateral_fraction = protocol_params["collateralPercentage"] / 100
680633
min_collateral = int(fee_redeem * collateral_fraction * collateral_fraction_offset)
681-
collateral_amount = max(min_collateral, 2000000)
634+
# Eventual return collateral UTxO value must be bigger than min UTxO value
635+
collateral_amount = max(min_collateral + 1_000_000, 2_000_000)
682636

683637
return ScriptCost(fee=fee_redeem, collateral=collateral_amount, min_collateral=min_collateral)
684638

cardano_node_tests/tests/tests_plutus_v3/test_mint_build.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,21 @@ def run_scenario(
172172
*mint_txouts,
173173
]
174174

175+
def _dump_cost() -> None:
176+
try: # noqa: SIM105
177+
cluster_obj.g_transaction.calculate_plutus_script_cost(
178+
src_address=payment_addr.address,
179+
tx_name=plutus_v_record.script_file.name,
180+
tx_files=tx_files_step2,
181+
txins=mint_utxos,
182+
txouts=txouts_step2,
183+
mint=plutus_mint_data,
184+
)
185+
except clusterlib.CLIError:
186+
pass
187+
188+
_dump_cost()
189+
175190
try:
176191
tx_output_step2 = clusterlib_utils.build_and_submit_tx(
177192
cluster_obj=cluster_obj,

0 commit comments

Comments
 (0)