Skip to content

Commit

Permalink
Rename and rewrite "Upgrading to Vasil and Plutus script addresses" (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
zliu41 authored Oct 8, 2024
1 parent d224cbf commit 2a29fbe
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 62 deletions.
5 changes: 1 addition & 4 deletions README.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@
:toc: left
:reproducible:

image:https://img.shields.io/matrix/plutus-core%3Amatrix.org[link=https://matrix.to/#/#plutus-core:matrix.org]

== Introduction

Plutus Core is the scripting language embedded in the Cardano ledger and forms the basis of the Plutus Platform, an application development platform for developing distributed applications using the Cardano blockchain.
Expand Down Expand Up @@ -70,7 +68,6 @@ The documentation for the metatheory can be found https://plutus.cardano.interse

== Licensing

You are free to copy, modify, and distribute this software under the terms of the Apache 2.0 license.
You are free to copy, modify, and distribute this software under the terms of the Apache 2.0 license.

See the link:./LICENSE[LICENSE] and link:./NOTICE[NOTICE] files for details.

57 changes: 28 additions & 29 deletions doc/docusaurus/docs/delve-deeper/common-weaknesses.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
sidebar_position: 20
sidebar_position: 30
---

# Common weaknesses
Expand All @@ -12,77 +12,77 @@ Suppose we have a validator V that implements a typical "atomic swap" or "escrow

> This output can only be spent if, in the same transaction, there is an output sending the agreed-upon payment (encoded in the output's datum) to A.
Now suppose that A and B have two swaps in progress, one for a token T1 at the price of 10 Ada, and one for a token T2 at the same price.
Now suppose that A and B have two swaps in progress, one for a token T1 at the price of 10 Ada, and one for a token T2 at the same price.
That means that there will exist two outputs, both locked by V.

Now B constructs a transaction which spends both outputs, and creates one output addressed to A with 10 Ada (taking T1 and T2 for himself).

![Double satisfaction](../../static/img/double-satisfaction.png)
_A diagram showing the transaction setup for the double satisfaction of two swaps._

A naive implementation of V will just check that the transaction has *an* output to A with 10 Ada in it, and then be satisfied.
But this allows B to "double satisfy" the two validators, because they will both see the same output and be satisfied.
A naive implementation of V will just check that the transaction has *an* output to A with 10 Ada in it, and then be satisfied.
But this allows B to "double satisfy" the two validators, because they will both see the same output and be satisfied.
The end result is that B can get away with paying only 10 Ada to A, even though B's true liability to A is 20 Ada.

### What is going wrong here?

It is difficult to say exactly what is going wrong here.
It is difficult to say exactly what is going wrong here.
Neither validator's expectations are explicitly being violated.

One way of looking at it is that this is a consequence of the fact that validators only *validate*, rather than *doing* things.
In a model like Ethereum's, where smart contracts *make transfers*, then two smart contracts would simply make two transfers, and there would be no problem.
One way of looking at it is that this is a consequence of the fact that validators only *validate*, rather than *doing* things.
In a model like Ethereum's, where smart contracts *make transfers*, then two smart contracts would simply make two transfers, and there would be no problem.
But in the EUTXO model all a validator can do is try to ascertain whether its wishes have been carried out, which in this case is ambiguous.

Following this metaphor, we can see how the same problem could arise in the real world.
Following this metaphor, we can see how the same problem could arise in the real world.
Suppose that two tax auditors from two different departments come to visit you in turn to see if you've paid your taxes.
You come up with a clever scheme to confuse them.
Your tax liability to both departments is $10, so you make a single payment to the tax office's bank account for $10.
When the auditors arrive, you show them your books, containing the payment to the tax office.
You come up with a clever scheme to confuse them.
Your tax liability to both departments is $10, so you make a single payment to the tax office's bank account for $10.
When the auditors arrive, you show them your books, containing the payment to the tax office.
They both leave satisfied.

How do we solve this problem in the real world?
Well, the two tax offices might have different bank accounts, but more likely they would simply require you to use two different payment references.
That way, the payment that each auditor expect to see is unique, so they know it's for them.
We can do something similar in the EUTXO model.
How do we solve this problem in the real world?
Well, the two tax offices might have different bank accounts, but more likely they would simply require you to use two different payment references.
That way, the payment that each auditor expect to see is unique, so they know it's for them.
We can do something similar in the EUTXO model.
See the section on [Unique outputs](#unique-outputs) below.

### Risks

This is a serious problem for many kinds of application.
This is a serious problem for many kinds of application.
Any application that makes payments to specific parties needs to ensure that those payments are correctly identified and don't overlap with other payments.

### Solutions

It's possible that a solution will be developed that makes this weakness easier to avoid.
It's possible that a solution will be developed that makes this weakness easier to avoid.
In the meantime, there are workarounds that developers can use.

#### **Unique outputs**

The simplest workaround is to ensure that the outputs which your scripts care about are unique.
The simplest workaround is to ensure that the outputs which your scripts care about are unique.
This prevents them being confused with other outputs.

In the swap example, if A had used a different key hashes as their payment addresses in each, then one output could not have satisfied both validators, since each one would want an output addressed to a different key hash.

It is not too difficult to use unique outputs.
For payments to users, wallets typically already generate unique key hashes for every payment received.
It is not too difficult to use unique outputs.
For payments to users, wallets typically already generate unique key hashes for every payment received.
For payments to script addresses it is a bit more complicated, and applications may wish to include the equivalent of a "payment reference" in the datum to keep things unique.

#### **Ban other scripts**

A more draconian workaround is for your script to insist that it runs in a transaction which is running no other scripts, so there is no risk of confusion.
A more draconian workaround is for your script to insist that it runs in a transaction which is running no other scripts, so there is no risk of confusion.
Note that it is not enough to consider just validator scripts, minting and reward scripts must also be banned.

However, this prevents even benign usage of multiple scripts in one transaction, which stops people from designing interesting interactions, and may force users to break up transactions unnecessarily.

## Hard limits

Many resources on Cardano are limited in some fashion.
Many resources on Cardano are limited in some fashion.
At a high level, limits can be enforced in two ways:

- *Hard limits*: these are limits which cannot be breached. Typically, these are implemented with specific thresholds, where exceeding the threshold causes a hard failure.
- *Soft limits*: these are limits which *can* be breached, but where there is a significant disincentive to do so. One way of implementing a soft limit is to have sharply increasing costs to using the resource beyond the soft limit.

Hard limits are clear, easy to specify, and provide hard guarantees for the protocol, but they have the disadvantage that there is no way to evade the limit.
Hard limits are clear, easy to specify, and provide hard guarantees for the protocol, but they have the disadvantage that there is no way to evade the limit.
This means that there is a discontinuity at the limit: beforehand you can always do more by paying more, but after the limit there is nothing you can do.

Currently, these resources on Cardano have hard limits:
Expand All @@ -92,7 +92,7 @@ Currently, these resources on Cardano have hard limits:
- UTXO size
- Script execution units

If an application *requires* a transaction that exceeds one of these limits, then the application will be stuck unless the limit is increased or removed.
If an application *requires* a transaction that exceeds one of these limits, then the application will be stuck unless the limit is increased or removed.
This is most common when scripts are involved, since a script can require a very particular shape of transaction, regardless of whether this exceeds limits.

Examples:
Expand All @@ -103,7 +103,7 @@ Examples:

### Risks

This is typically an issue for applications that work with user-supplied data, or data that can grow in an unbounded way over time.
This is typically an issue for applications that work with user-supplied data, or data that can grow in an unbounded way over time.
This can result in data which itself becomes large, or which requires a large amount of resources to process.

For example:
Expand All @@ -121,18 +121,18 @@ In the meantime, there are some approaches that developers can use to reduce the

- **Careful testing**

It is important to test as many of the execution paths of your application as possible.
It is important to test as many of the execution paths of your application as possible.
This is important for correctness, but also to ensure that there are no unexpected cases where script resource usage spikes.

- **Bounding data usage**

Carefully consider whether your application may rely on unbounded data, and try to avoid that.
Carefully consider whether your application may rely on unbounded data, and try to avoid that.
For example, if your application needs to manage a large quantity of assets, try to split them across multiple UTXOs instead of relying on a single UTXO to hold them all.

- **Providing datums when creating outputs**

Datum size issues are most likely to be discovered when an output is spent, because the datum is provided only as a hash on the output.
Insisting that the datum is provided in the transaction that creates the output can reveal that it is too big earlier in the process, allowing another path to be taken.
Insisting that the datum is provided in the transaction that creates the output can reveal that it is too big earlier in the process, allowing another path to be taken.
Depending on the application, this may still prevent it from progressing, if there is only one way to move forwards.

If [CIP-32](https://cips.cardano.org/cips/cip32/) is implemented, this can be done conveniently by using inline datums, although that also risks hitting the output size limit.
Expand All @@ -142,4 +142,3 @@ If [CIP-32](https://cips.cardano.org/cips/cip32/) is implemented, this can be do
If [CIP-33](https://cips.cardano.org/cips/cip33/) is implemented, then the contribution of scripts to transaction size can be massively reduced by using a reference script instead of including the entire script.

<!-- Verify that CIP-32 and CIP-33 have already been implemented, and update statements above as appropriate. -->

27 changes: 27 additions & 0 deletions doc/docusaurus/docs/delve-deeper/understanding-script-hashes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
---
sidebar_position: 20
---

# Understanding Script Hashes

Script hashes are a core concept and play a vital role on Cardano.
Performing an action on Cardano that involves scripts, such as spending a script UTXO or minting tokens, requires the script with a specific hash to be executed and satisfied.
The cryptographic security of script hashes makes it effectively impossible to manufacture a script that matches a given hash, ensuring the integrity of the blockchain.
A solid understanding of script hashes is essential for DApp development.

## Changing ledger language versions leads to changed script hashes

The ledger language version of a script is part of its hash, so the exact same UPLC program will have different hashes when used as a Plutus V1, V2 or V3 script.
This means, for example, you can't supply a Plutus V3 script when performing an action that requires a Plutus V1 or V2 script, as the hash won't match.

## Changing Plutus Tx compiler versions may lead to changed script hashes

Different Plutus Tx compiler versions may compile and optimize the same Plutus Tx code differently, leading to different UPLC programs and, therefore, different script hashes.

Additionally, the version of GHC can affect the resulting UPLC program and script hashes.
While the Plutus Tx compiler currently supports only one major GHC version, different minor GHC versions may lead to slightly different UPLC programs.

If you plan to use your script in the future, the best approach is to save the compiled script in a blueprint file.
For further information, refer to [Producing a Plutus contract blueprint](../working-with-scripts/producing-a-blueprint.md).

If you wish to compile your Plutus Tx code again in the future while ensuring the script hash remains unchanged, consider using Nix to lock the versions of all dependencies by pinning to a specific version of nixpkgs.

This file was deleted.

1 comment on commit 2a29fbe

@github-actions
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Performance Alert ⚠️

Possible performance regression was detected for benchmark 'Plutus Benchmarks'.
Benchmark result of this commit is worse than the previous benchmark result exceeding threshold 1.05.

Benchmark suite Current: 2a29fbe Previous: d224cbf Ratio
validation-auction_1-2 909.5 μs 646.6 μs 1.41
validation-auction_1-3 899.5 μs 634.6 μs 1.42
validation-auction_1-4 326.5 μs 233.1 μs 1.40
validation-game-sm-success_2-2 258.7 μs 227 μs 1.14
validation-game-sm-success_2-3 907.2 μs 833.7 μs 1.09
validation-game-sm-success_2-4 328.6 μs 281.3 μs 1.17
validation-game-sm-success_2-5 907.8 μs 679.1 μs 1.34
validation-game-sm-success_2-6 284.8 μs 231.8 μs 1.23
validation-multisig-sm-2 498.2 μs 384.8 μs 1.29
validation-multisig-sm-4 415.5 μs 395.1 μs 1.05
validation-multisig-sm-5 657.1 μs 559.4 μs 1.17
validation-multisig-sm-6 431.3 μs 398.2 μs 1.08
validation-multisig-sm-7 536.4 μs 386.4 μs 1.39
validation-decode-auction_2-1 273.4 μs 207.5 μs 1.32
validation-decode-auction_2-2 707.8 μs 512.8 μs 1.38
validation-decode-auction_2-3 757.5 μs 529.9 μs 1.43
validation-decode-auction_2-4 747.7 μs 528.4 μs 1.42
validation-decode-auction_2-5 270.6 μs 188.7 μs 1.43
validation-decode-crowdfunding-success-1 331.4 μs 233.3 μs 1.42
validation-decode-crowdfunding-success-2 331 μs 227.6 μs 1.45
validation-decode-crowdfunding-success-3 330.1 μs 229.6 μs 1.44
validation-decode-currency-1 334.2 μs 232.1 μs 1.44
validation-decode-escrow-redeem_1-1 443.8 μs 306.4 μs 1.45
validation-decode-escrow-redeem_1-2 440.9 μs 415.1 μs 1.06
validation-decode-game-sm-success_2-3 741 μs 691.5 μs 1.07
validation-decode-game-sm-success_2-4 229.8 μs 156.6 μs 1.47
validation-decode-game-sm-success_2-5 742 μs 514.1 μs 1.44
validation-decode-game-sm-success_2-6 229.8 μs 169.6 μs 1.35
validation-decode-multisig-sm-1 813.8 μs 768.8 μs 1.06
validation-decode-uniswap-5 1036 μs 781.4 μs 1.33
validation-decode-uniswap-6 233.8 μs 177.4 μs 1.32
marlowe-semantics/0000020002010200020101020201000100010001020101020201010000020102 455.4 μs 361.4 μs 1.26
marlowe-semantics/0101080808040600020306010000000302050807010208060100070207080202 1083 μs 764.5 μs 1.42
marlowe-semantics/0104010200020000040103020102020004040300030304040400010301040303 1105 μs 780.9 μs 1.42
marlowe-semantics/0543a00ba1f63076c1db6bf94c6ff13ae7d266dd7544678743890b0e8e1add63 1477 μs 1206 μs 1.22
marlowe-semantics/0705030002040601010206030604080208020207000101060706050502040301 1430 μs 1008.9999999999999 μs 1.42
marlowe-semantics/07070c070510030509010e050d00040907050e0a0d06030f1006030701020607 1451 μs 1020.9999999999999 μs 1.42
marlowe-semantics/0bcfd9487614104ec48de2ea0b2c0979866a95115748c026f9ec129384c262c4 1604 μs 1133 μs 1.42
marlowe-semantics/0be82588e4e4bf2ef428d2f44b7687bbb703031d8de696d90ec789e70d6bc1d8 1935 μs 1359 μs 1.42
marlowe-semantics/0f1d0110001b121d051e15140c0c05141d151c1f1d201c040f10091b020a0e1a 677.6 μs 477.8 μs 1.42
marlowe-semantics/119fbea4164e2bf21d2b53aa6c2c4e79414fe55e4096f5ce2e804735a7fbaf91 1087 μs 764.9 μs 1.42
marlowe-semantics/12910f24d994d451ff379b12c9d1ecdb9239c9b87e5d7bea570087ec506935d5 706.8 μs 498.4 μs 1.42
marlowe-semantics/18cefc240debc0fcab14efdd451adfd02793093efe7bc76d6322aed6ddb582ad 1070 μs 750.7 μs 1.43
marlowe-semantics/1a2f2540121f09321216090b2b1f211e3f020c2c133a1a3c3f3c232a26153a04 431.9 μs 305.4 μs 1.41
marlowe-semantics/1a573aed5c46d637919ccb5548dfc22a55c9fc38298d567d15ee9f2eea69d89e 1280 μs 901.8 μs 1.42
marlowe-semantics/1d56060c3b271226064c672a282663643b1b0823471c67737f0b076870331260 1103 μs 781.4 μs 1.41
marlowe-semantics/1d6e3c137149a440f35e0efc685b16bfb8052ebcf66ec4ad77e51c11501381c7 432.8 μs 305.8 μs 1.42
marlowe-semantics/1f0f02191604101e1f201016171604060d010d1d1c150e110a110e1006160a0d 1402 μs 992.4 μs 1.41
marlowe-semantics/202d273721330b31193405101e0637202e2a0f1140211c3e3f171e26312b0220 8042 μs 6578 μs 1.22
marlowe-semantics/238b21364ab5bdae3ddb514d7001c8feba128b4ddcf426852b441f9a9d02c882 426.1 μs 388.8 μs 1.10
marlowe-semantics/26e24ee631a6d927ea4fb4fac530cfd82ff7636986014de2d2aaa460ddde0bc3 798 μs 566.3 μs 1.41
marlowe-semantics/2797d7ac77c1b6aff8e42cf9a47fa86b1e60f22719a996871ad412cbe4de78b5 2536 μs 1816 μs 1.40
marlowe-semantics/28fdce478e179db0e38fb5f3f4105e940ece450b9ce8a0f42a6e313b752e6f2c 1319 μs 930.8 μs 1.42
marlowe-semantics/2cb21612178a2d9336b59d06cbf80488577463d209a453048a66c6eee624a695 1119 μs 788.8 μs 1.42
marlowe-semantics/2f58c9d884813042bce9cf7c66048767dff166785e8b5183c8139db2aa7312d1 1085 μs 766.1 μs 1.42
marlowe-semantics/30aa34dfbe89e0c43f569929a96c0d2b74c321d13fec0375606325eee9a34a6a 1630 μs 1157 μs 1.41
marlowe-semantics/322acde099bc34a929182d5b894214fc87ec88446e2d10625119a9d17fa3ec3d 433 μs 305.4 μs 1.42
marlowe-semantics/331e4a1bb30f28d7073c54f9a13c10ae19e2e396c299a0ce101ee6bf4b2020db 664.1 μs 466.1 μs 1.42
marlowe-semantics/33c3efd79d9234a78262b52bc6bbf8124cb321a467dedb278328215167eca455 891.4 μs 630.3 μs 1.41
marlowe-semantics/383683bfcecdab0f4df507f59631c702bd11a81ca3841f47f37633e8aacbb5de 1076 μs 765.1 μs 1.41
marlowe-semantics/3bb75b2e53eb13f718eacd3263ab4535f9137fabffc9de499a0de7cabb335479 426.2 μs 302 μs 1.41
marlowe-semantics/3db496e6cd39a8b888a89d0de07dace4397878958cab3b9d9353978b08c36d8a 1182 μs 947 μs 1.25
marlowe-semantics/44a9e339fa25948b48637fe7e10dcfc6d1256319a7b5ce4202cb54dfef8e37e7 424.2 μs 301.6 μs 1.41
marlowe-semantics/4c3efd13b6c69112a8a888372d56c86e60c232125976f29b1c3e21d9f537845c 1458 μs 1093 μs 1.33
marlowe-semantics/75a8bb183688bce447e00f435a144c835435e40a5defc6f3b9be68b70b4a3db6 988.4 μs 700 μs 1.41
marlowe-semantics/7a758e17486d1a30462c32a5d5309bd1e98322a9dcbe277c143ed3aede9d265f 729.3 μs 516.7 μs 1.41
marlowe-semantics/7cbc5644b745f4ea635aca42cce5e4a4b9d2e61afdb3ac18128e1688c07071ba 669.3 μs 473.9 μs 1.41
marlowe-semantics/82213dfdb6a812b40446438767c61a388d2c0cfd0cbf7fd4a372b0dc59fa17e1 1821 μs 1287 μs 1.41
marlowe-semantics/8c7fdc3da6822b5112074380003524f50fb3a1ce6db4e501df1086773c6c0201 1633 μs 1160 μs 1.41
marlowe-semantics/8d9ae67656a2911ab15a8e5301c960c69aa2517055197aff6b60a87ff718d66c 512.4 μs 360.4 μs 1.42
marlowe-semantics/96e1a2fa3ceb9a402f2a5841a0b645f87b4e8e75beb636692478ec39f74ee221 431.2 μs 304.7 μs 1.42
marlowe-semantics/9fabc4fc3440cdb776b28c9bb1dd49c9a5b1605fe1490aa3f4f64a3fa8881b25 1485 μs 1050 μs 1.41
marlowe-semantics/a85173a832db3ea944fafc406dfe3fa3235254897d6d1d0e21bc380147687bd5 525.1 μs 372.1 μs 1.41
marlowe-semantics/a9a853b6d083551f4ed2995551af287880ef42aee239a2d9bc5314d127cce592 729.8 μs 516 μs 1.41
marlowe-semantics/acb9c83c2b78dabef8674319ad69ba54912cd9997bdf2d8b2998c6bfeef3b122 921.9 μs 655.4 μs 1.41
marlowe-semantics/acce04815e8fd51be93322888250060da173eccf3df3a605bd6bc6a456cde871 399.8 μs 284 μs 1.41
marlowe-semantics/ad6db94ed69b7161c7604568f44358e1cc11e81fea90e41afebd669e51bb60c8 831.1 μs 591.2 μs 1.41
marlowe-semantics/b21a4df3b0266ad3481a26d3e3d848aad2fcde89510b29cccce81971e38e0835 1904 μs 1359 μs 1.40
marlowe-semantics/b50170cea48ee84b80558c02b15c6df52faf884e504d2c410ad63ba46d8ca35c 1079 μs 763.5 μs 1.41
marlowe-semantics/bb5345bfbbc460af84e784b900ec270df1948bb1d1e29eacecd022eeb168b315 1294 μs 916.5 μs 1.41
marlowe-semantics/c4bb185380df6e9b66fc1ee0564f09a8d1253a51a0c0c7890f2214df9ac19274 1046 μs 742.2 μs 1.41
marlowe-semantics/c9efcb705ee057791f7c18a1de79c49f6e40ba143ce0579f1602fd780cabf153 1156 μs 820.8 μs 1.41
marlowe-semantics/ccab11ce1a8774135d0e3c9e635631b68af9e276b5dabc66ff669d5650d0be1c 1399 μs 988.4 μs 1.42
marlowe-semantics/cdb9d5c233b288a5a9dcfbd8d5c1831a0bb46eec7a26fa31b80ae69d44805efc 1247 μs 883.2 μs 1.41
marlowe-semantics/ced1ea04649e093a501e43f8568ac3e6b37cd3eccec8cac9c70a4857b88a5eb8 1186 μs 841 μs 1.41
marlowe-semantics/cf542b7df466b228ca2197c2aaa89238a8122f3330fe5b77b3222f570395d9f5 700.4 μs 498 μs 1.41
marlowe-semantics/d1ab832dfab25688f8845bec9387e46ee3f00ba5822197ade7dd540489ec5e95 48030 μs 36180 μs 1.33
marlowe-semantics/d1c03759810747b7cab38c4296593b38567e11195d161b5bb0a2b58f89b2c65a 1452 μs 1025 μs 1.42
marlowe-semantics/d64607eb8a1448595081547ea8780886fcbd9e06036460eea3705c88ea867e33 425.7 μs 300.6 μs 1.42
marlowe-semantics/dc241ac6ad1e04fb056d555d6a4f2d08a45d054c6f7f34355fcfeefebef479f3 664.4 μs 469.2 μs 1.42
marlowe-semantics/dd11ae574eaeab0e9925319768989313a93913fdc347c704ddaa27042757d990 1073 μs 776 μs 1.38
marlowe-role-payout/0004000402010401030101030100040000010104020201030001000204020401 259.9 μs 218.3 μs 1.19
marlowe-role-payout/0100000100010000000001000100010101000101000001000000010000010000 365.8 μs 257.5 μs 1.42
marlowe-role-payout/0101000100000101010000010101000100010101000001000001000000010101 275.3 μs 194.3 μs 1.42
marlowe-role-payout/01dcc372ea619cb9f23c45b17b9a0a8a16b7ca0e04093ef8ecce291667a99a4c 228.6 μs 161.1 μs 1.42
marlowe-role-payout/0201020201020000020000010201020001020200000002010200000101010100 253.1 μs 183.3 μs 1.38
marlowe-role-payout/0303020000020001010201060303040208070100050401080304020801030001 239.5 μs 168.2 μs 1.42
marlowe-role-payout/031d56d71454e2c4216ffaa275c4a8b3eb631109559d0e56f44ea8489f57ba97 293.7 μs 207 μs 1.42
marlowe-role-payout/03d730a62332c51c7b70c16c64da72dd1c3ea36c26b41cd1a1e00d39fda3d6cc 272.6 μs 192.4 μs 1.42
marlowe-role-payout/0403020000030204010000030001000202010101000304030001040404030100 254.3 μs 179.3 μs 1.42
marlowe-role-payout/0405010105020401010304080005050800040301010800080207080704020206 277.9 μs 196 μs 1.42
marlowe-role-payout/041a2c3b111139201a3a2c173c392b170e16370d300f2d28342d0f2f0e182e01 279 μs 196.7 μs 1.42
marlowe-role-payout/04f592afc6e57c633b9c55246e7c82e87258f04e2fb910c37d8e2417e9db46e5 327.3 μs 230.8 μs 1.42
marlowe-role-payout/057ebc80922f16a5f4bf13e985bf586b8cff37a2f6fe0f3ce842178c16981027 233.5 μs 165.4 μs 1.41
marlowe-role-payout/06317060a8e488b1219c9dae427f9ce27918a9e09ee8ac424afa33ca923f7954 253.6 μs 178.8 μs 1.42
marlowe-role-payout/07658a6c898ad6d624c37df1e49e909c2e9349ba7f4c0a6be5f166fe239bfcae 228.1 μs 160.8 μs 1.42
marlowe-role-payout/0c9d3634aeae7038f839a1262d1a8bc724dc77af9426459417a56ec73240f0e0 249 μs 198.8 μs 1.25
marlowe-role-payout/0d0f01050a0a0a0b0b050d0404090e0d0506000d0a041003040e0f100e0a0408 246.4 μs 173.5 μs 1.42
marlowe-role-payout/0dbb692d2bf22d25eeceac461cfebf616f54003077a8473abc0457f18e025960 280 μs 198 μs 1.41
marlowe-role-payout/0e00171d0f1e1f14070d0a00091f07101808021d081e1b120219081312081e15 242.7 μs 170.9 μs 1.42
marlowe-role-payout/0e72f62b0f922e31a2340baccc768104025400cf7fdd7dae62fbba5fc770936d 267.9 μs 189 μs 1.42
marlowe-role-payout/0e97c9d9417354d9460f2eb35018d3904b7b035af16ab299258adab93be0911a 259.5 μs 183.8 μs 1.41
marlowe-role-payout/0f010d040810040b10020e040f0e030b0a0d100f0c080c0c05000d04100c100f 276.5 μs 194.8 μs 1.42
marlowe-role-payout/1138a04a83edc0579053f9ffa9394b41df38230121fbecebee8c039776a88c0c 239.3 μs 169.3 μs 1.41
marlowe-role-payout/121a0a1b12030616111f02121a0e070716090a0e031c071419121f141409031d 232.5 μs 164 μs 1.42
marlowe-role-payout/159e5a1bf16fe984b5569be7011b61b5e98f5d2839ca7e1b34c7f2afc7ffb58e 241.5 μs 170.6 μs 1.42
marlowe-role-payout/195f522b596360690d04586a2563470f2214163435331a6622311f7323433f1c 234.6 μs 166 μs 1.41
marlowe-role-payout/1a20b465d48a585ffd622bd8dc26a498a3c12f930ab4feab3a5064cfb3bc536a 261 μs 184.4 μs 1.42
marlowe-role-payout/211e1b6c10260c4620074d2e372c260d38643a3d605f63772524034f0a4a7632 251 μs 177.2 μs 1.42
marlowe-role-payout/21a1426fb3fb3019d5dc93f210152e90b0a6e740ef509b1cdd423395f010e0ca 264.1 μs 186.6 μs 1.42
marlowe-role-payout/224ce46046fab9a17be4197622825f45cc0c59a6bd1604405148e43768c487ef 239.8 μs 169.5 μs 1.41
marlowe-role-payout/332c2b1c11383d1b373e1315201f1128010e0e1518332f273f141b23243f2a07 197.1 μs 161.6 μs 1.22
marlowe-role-payout/3897ef714bba3e6821495b706c75f8d64264c3fdaa58a3826c808b5a768c303d 246.1 μs 173.6 μs 1.42
marlowe-role-payout/4121d88f14387d33ac5e1329618068e3848445cdd66b29e5ba382be2e02a174a 280.1 μs 197.6 μs 1.42
marlowe-role-payout/4299c7fcf093a5dbfe114c188e32ca199b571a7c25cb7f766bf49f12dab308be 259.4 μs 183.2 μs 1.42
marlowe-role-payout/452e17d16222a427707fa83f63ffb79f606cc25c755a18b1e3274c964ed5ec99 289.1 μs 204.2 μs 1.42
marlowe-role-payout/46f8d00030436e4da490a86b331fa6c3251425fb8c19556080e124d75bad7bd6 236.5 μs 166.7 μs 1.42
marlowe-role-payout/47364cfaf2c00f7d633283dce6cf84e4fd4e8228c0a0aa50e7c55f35c3ecaa1c 237.3 μs 167.2 μs 1.42
marlowe-role-payout/49b8275d0cb817be40865694ab05e3cfe5fc35fb43b78e7de68c1f3519b536bd 245.6 μs 208.4 μs 1.18

This comment was automatically generated by workflow using github-action-benchmark.

CC: @IntersectMBO/plutus-core

Please sign in to comment.