Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rethinking Blockchain Contract Development

Rethinking Blockchain Contract Development

VIDEO: https://www.youtube.com/watch?v=RGJ4FvsUQzo (Lambda Days 2019)

Presented at
* Lambda Days 2019: http://www.lambdadays.org/lambdadays2019
* Amsterdam Cardano Meetup (March 2019): https://www.meetup.com/Cardano-Blockchain-Netherlands/events/257986674/

With the proliferation of blockchain designs, we see a proliferation of proposals for languages and systems to script the rules governing transactions on these blockchains, generally known as smart contract languages. Despite the name, these languages are usually fairly conventional programming languages used to impose constraints on the transactions permitted to transfer assets and manipulate data stored on the blockchain.

Given the high financial stakes and widely publicised exploits on first generation (Bitcoin) and second generation (Ethereum) blockchains, the third-generation Cardano blockchain places a strong emphasis on functional programming and formal methods. This includes a new approach to contract languages based on state-of-the art research in programming languages and the increased safety provided by functional programming. The benefits of functional programming go even further: instead of having to invent yet another custom language, we simply use Haskell for the job, we design a superior blockchain architecture, and we seamlessly combine on-chain and off-chain computations.

In this talk, I will outline how IOHK’s Plutus team combines programming language theory, functional programming in Haskell, and theorem-proving in Agda to develop a radically new approach to blockchain contract development. This work has resulted in the Plutus Platform, which uses meta-programming in Haskell for distributed contract applications operating on the Cardano blockchain.

Manuel Chakravarty

February 22, 2019
Tweet

More Decks by Manuel Chakravarty

Other Decks in Technology

Transcript

  1. Blockchain: Concurrency & Distribution Alice Bob Charlie Alice ₳100 Bob

    ₳10 Charlie ₳52 Central Authority (Ledger)
  2. Blockchain: Concurrency & Distribution Alice Bob Charlie Alice ₳100 Bob

    ₳10 Charlie ₳52 Central Authority (Ledger) ₳42 to Bob
  3. Blockchain: Concurrency & Distribution Alice Bob Charlie Alice ₳58 Bob

    ₳52 Charlie ₳52 Central Authority (Ledger)
  4. Blockchain: Concurrency & Distribution Alice Bob Charlie Alice ₳58 Bob

    ₳52 Charlie ₳52 Central Authority (Ledger) ₳20 to Charlie
  5. Blockchain: Concurrency & Distribution Alice Bob Charlie Alice ₳58 Bob

    ₳32 Charlie ₳72 Central Authority (Ledger)
  6. Blockchain: Concurrency & Distribution Alice Bob Charlie Alice ₳58 Bob

    ₳32 Charlie ₳72 Central Authority (Ledger) Ordering?
  7. Blockchain: Concurrency & Distribution Alice Bob Charlie Alice ₳100 Bob

    ₳10 Charlie ₳52 Central Authority (Ledger)
  8. Blockchain: Concurrency & Distribution Alice Bob Charlie Alice ₳100 Bob

    ₳10 Charlie ₳52 Central Authority (Ledger) ₳20 to Charlie
  9. Blockchain: Concurrency & Distribution Alice Bob Charlie Alice ₳100 Bob

    ₳10 Charlie ₳52 Central Authority (Ledger) ₳20 to Charlie Invalid!
  10. Blockchain: Concurrency & Distribution Alice Bob Charlie Alice ₳100 Bob

    ₳10 Charlie ₳52 Authority (Ledger) Trust in ledger?
  11. Blockchain: Concurrency & Distribution Alice Bob Charlie Alice ₳0 Bob

    ₳0 Charlie ₳162 Authority (Ledger) Trust in ledger?
  12. Blockchain: Concurrency & Distribution Alice Bob Charlie Alice ₳100 Bob

    ₳10 Charlie ₳52 Cryptographic Ledger (Consensus)
  13. Blockchain: Concurrency & Distribution Alice Bob Charlie Alice ₳100 Bob

    ₳10 Charlie ₳52 Cryptographic Ledger (Consensus) ₳42 to Bob
  14. Blockchain: Concurrency & Distribution Alice Bob Charlie Alice ₳100 Bob

    ₳10 Charlie ₳52 A㱺B ₳42 Cryptographic Ledger (Consensus)
  15. Blockchain: Concurrency & Distribution Alice Bob Charlie Alice ₳100 Bob

    ₳10 Charlie ₳52 A㱺B ₳42 Cryptographic Ledger (Consensus) Transaction
  16. Blockchain: Concurrency & Distribution Alice Bob Charlie Alice ₳100 Bob

    ₳10 Charlie ₳52 A㱺B ₳42 Cryptographic Ledger (Consensus) ₳20 to Charlie Transaction
  17. Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B ₳42 B㱺C ₳20

    Cryptographic Ledger (Consensus) Blockchain: Concurrency & Distribution Alice Bob Charlie Transaction
  18. Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B ₳42 B㱺C ₳20

    Cryptographic Ledger (Consensus) Blockchain: Concurrency & Distribution Alice Bob Charlie Immutable, verifiable log Transaction
  19. Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B ₳42 B㱺C ₳20

    Cryptographic Ledger (Consensus) Blockchain: Concurrency & Distribution Alice Bob Charlie How about other information? Transaction
  20. Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B ₳42 B㱺C ₳20

    Cryptographic Ledger (Consensus) Blockchain: Distributed Data Store Alice Bob Charlie
  21. Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B ₳42 Meal B㱺C

    ₳20 Drinks Cryptographic Ledger (Consensus) Blockchain: Distributed Data Store Alice Bob Charlie
  22. Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B ₳0,1 Timber Shipment

    B㱺C ₳0,1 Door Frame Cryptographic Ledger (Consensus) Blockchain: Distributed Data Store Alice Bob Charlie
  23. Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B ₳0,1 Timber Shipment

    B㱺C ₳0,1 Door Frame Cryptographic Ledger (Consensus) Blockchain: Consistent Distributed Store
  24. Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B ₳0,1 Timber Shipment

    B㱺C ₳0,1 Door Frame Cryptographic Ledger (Consensus) Blockchain: Consistent Distributed Store Timber Shipment; Source: …; DNA Fingerprint: …; Volume: …
  25. Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B ₳0,1 Timber Shipment

    B㱺C ₳0,1 Door Frame Cryptographic Ledger (Consensus) Blockchain: Consistent Distributed Store Timber Shipment; Source: …; DNA Fingerprint: …; Volume: … Door Frame; Timber Supply: ; Type: ecologically sourced
  26. Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B ₳0,1 Timber Shipment

    B㱺C ₳0,1 Door Frame Cryptographic Ledger (Consensus) Blockchain: Consistent Distributed Store Timber Shipment; Source: …; DNA Fingerprint: …; Volume: … Door Frame; Timber Supply: ; Type: ecologically sourced On-chain: validation
  27. Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B ₳0,1 Timber Shipment

    B㱺C ₳0,1 Door Frame Cryptographic Ledger (Consensus) Blockchain: Consistent Distributed Store Timber Shipment; Source: …; DNA Fingerprint: …; Volume: … Door Frame; Timber Supply: ; Type: ecologically sourced On-chain: validation Off-chain: coordination, processing & validation
  28. Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B ₳0,1 Timber Shipment

    B㱺C ₳0,1 Door Frame Cryptographic Ledger (Consensus) Blockchain: Consistent Distributed Store Timber Shipment; Source: …; DNA Fingerprint: …; Volume: … Door Frame; Timber Supply: ; Type: ecologically sourced On-chain: validation Off-chain: coordination, processing & validation Now we need a programming language!
  29. Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B ₳0,1 Timber Shipment

    B㱺C ₳0,1 Door Frame Cryptographic Ledger (Consensus) On-chain: validation scripts Off-chain: coordination code Data Structure Programming Language Distribution
  30. Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B ₳0,1 Timber Shipment

    B㱺C ₳0,1 Door Frame Cryptographic Ledger (Consensus) On-chain: validation scripts Off-chain: coordination code Data Structure Programming Language Distribution Server Client
  31. Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B ₳0,1 Timber Shipment

    B㱺C ₳0,1 Door Frame Cryptographic Ledger (Consensus) On-chain: validation scripts Off-chain: coordination code Data Structure Programming Language Distribution Server Client Server
  32. Distribution Server Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B ₳0,1

    Timber Shipment B㱺C ₳0,1 Door Frame Cryptographic Ledger (Consensus)
  33. Distribution Server Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B ₳0,1

    Timber Shipment B㱺C ₳0,1 Door Frame Cryptographic Ledger (Consensus)
  34. Distribution Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B ₳0,1 Timber

    Shipment B㱺C ₳0,1 Door Frame Cryptographic Ledger (Consensus)
  35. Consensus & Trust Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B

    ₳0,1 Timber Shipment B㱺C ₳0,1 Door Frame Cryptographic Ledger How do we prevent cheating?
  36. Consensus & Trust Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B

    ₳0,1 Timber Shipment B㱺C ₳0,1 Door Frame Cryptographic Ledger Cryptographic Proof
  37. Consensus & Trust Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B

    ₳0,1 Timber Shipment B㱺C ₳0,1 Door Frame Cryptographic Ledger Cryptographic Proof
  38. Consensus & Trust Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B

    ₳0,1 Timber Shipment B㱺C ₳0,1 Door Frame Cryptographic Ledger Cryptographic Proof Two Forms of Proof of Work (PoW) Proof of Stake (PoS)
  39. Consensus & Trust Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B

    ₳0,1 Timber Shipment B㱺C ₳0,1 Door Frame Cryptographic Ledger Cryptographic Proof Two Forms of Proof of Work (PoW) Proof of Stake (PoS) Cryptographic puzzle
  40. Consensus & Trust Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B

    ₳0,1 Timber Shipment B㱺C ₳0,1 Door Frame Cryptographic Ledger Cryptographic Proof Two Forms of Proof of Work (PoW) Proof of Stake (PoS) Cryptographic puzzle Investment in the system
  41. Consensus & Trust Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B

    ₳0,1 Timber Shipment B㱺C ₳0,1 Door Frame Cryptographic Ledger Cryptographic Proof Is it all secure?
  42. Consensus & Trust Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B

    ₳0,1 Timber Shipment B㱺C ₳0,1 Door Frame Cryptographic Ledger Cryptographic Proof Is it all secure? Cryptography?
  43. Consensus & Trust Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B

    ₳0,1 Timber Shipment B㱺C ₳0,1 Door Frame Cryptographic Ledger Cryptographic Proof Is it all secure? Cryptography? Protocols?
  44. Consensus & Trust Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B

    ₳0,1 Timber Shipment B㱺C ₳0,1 Door Frame Cryptographic Ledger Cryptographic Proof Is it all secure? Cryptography? Protocols? Implementation?
  45. Consensus & Trust Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B

    ₳0,1 Timber Shipment B㱺C ₳0,1 Door Frame Cryptographic Ledger Cryptographic Proof Formal methods, high-assurance methods, … Cryptography? Protocols? Implementation?
  46. Cryptographic ledger Distributed, immutable, verifiable log data structure On-chain &

    off-chain contract code On-chain transaction validation & off-chain coordination
  47. Cryptographic ledger Distributed, immutable, verifiable log data structure On-chain &

    off-chain contract code On-chain transaction validation & off-chain coordination Proof of Stake (PoS) Environmentally friendly, low-energy cryptographic proofs
  48. Cryptographic ledger Distributed, immutable, verifiable log data structure On-chain &

    off-chain contract code On-chain transaction validation & off-chain coordination Proof of Stake (PoS) Environmentally friendly, low-energy cryptographic proofs High assurance development Formal methods, types, validation
  49. Ouroboros: A Provably Secure Proof-of-Stake Blockchain Protocol Aggelos Kiayias Alexander

    Russell† Bernardo David‡ Roman Oliynykov§ August 21, 2017 Abstract We present “Ouroboros”, the first blockchain protocol based on proof of stake with rig- orous security guarantees. We establish security properties for the protocol comparable to those achieved by the bitcoin blockchain protocol. As the protocol provides a “proof of stake” blockchain discipline, it o ers qualitative e ciency advantages over blockchains based on proof of physical resources (e.g., proof of work). We also present a novel reward mechanism for in- centivizing Proof of Stake protocols and we prove that, given this mechanism, honest behavior is an approximate Nash equilibrium, thus neutralizing attacks such as selfish mining. We also present initial evidence of the practicality of our protocol in real world settings by providing experimental results on transaction confirmation and processing. 1 Introduction A primary consideration regarding the operation of blockchain protocols based on proof of work (PoW)—such as bitcoin [30]—is the energy required for their execution. At the time of this writ- ing, generating a single block on the bitcoin blockchain requires a number of hashing operations exceeding 260, which results in striking energy demands. Indeed, early calculations indicated that the energy requirements of the protocol were comparable to that of a small country [32]. This state of a airs has motivated the investigation of alternative blockchain protocols that would obviate the need for proof of work by substituting it with another, more energy e cient, mechanism that can provide similar guarantees. It is important to point out that the proof of work mechanism of bitcoin facilitates a type of randomized “leader election” process that elects one of the miners to issue the next block. Furthermore, provided that all miners follow the protocol, this selection is performed in a randomized fashion proportionally to the computational power of each miner. (Deviations from the protocol may distort this proportionality as exemplified by “selfish mining” strategies [21, 38].) A natural alternative mechanism relies on the notion of “proof of stake” (PoS). Rather than miners investing computational resources in order to participate in the leader election process, they instead run a process that randomly selects one of them proportionally to the stake that each possesses according to the current blockchain ledger. University of Edinburgh and IOHK. [email protected]. Work partly performed while at the National and Kapodistrian University of Athens, supported by ERC project CODAMODA #259152. Work partly supported by H2020 Project #653497, PANORAMIX. † University of Connecticut. [email protected]. ‡ Aarhus University and IOHK, [email protected]. Work partly supported by European Research Council Starting Grant 279447. § IOHK, [email protected]. 1
  50. Ouroboros: A Provably Secure Proof-of-Stake Blockchain Protocol Aggelos Kiayias Alexander

    Russell† Bernardo David‡ Roman Oliynykov§ August 21, 2017 Abstract We present “Ouroboros”, the first blockchain protocol based on proof of stake with rig- orous security guarantees. We establish security properties for the protocol comparable to those achieved by the bitcoin blockchain protocol. As the protocol provides a “proof of stake” blockchain discipline, it o ers qualitative e ciency advantages over blockchains based on proof of physical resources (e.g., proof of work). We also present a novel reward mechanism for in- centivizing Proof of Stake protocols and we prove that, given this mechanism, honest behavior is an approximate Nash equilibrium, thus neutralizing attacks such as selfish mining. We also present initial evidence of the practicality of our protocol in real world settings by providing experimental results on transaction confirmation and processing. 1 Introduction A primary consideration regarding the operation of blockchain protocols based on proof of work (PoW)—such as bitcoin [30]—is the energy required for their execution. At the time of this writ- ing, generating a single block on the bitcoin blockchain requires a number of hashing operations exceeding 260, which results in striking energy demands. Indeed, early calculations indicated that the energy requirements of the protocol were comparable to that of a small country [32]. This state of a airs has motivated the investigation of alternative blockchain protocols that would obviate the need for proof of work by substituting it with another, more energy e cient, mechanism that can provide similar guarantees. It is important to point out that the proof of work mechanism of bitcoin facilitates a type of randomized “leader election” process that elects one of the miners to issue the next block. Furthermore, provided that all miners follow the protocol, this selection is performed in a randomized fashion proportionally to the computational power of each miner. (Deviations from the protocol may distort this proportionality as exemplified by “selfish mining” strategies [21, 38].) A natural alternative mechanism relies on the notion of “proof of stake” (PoS). Rather than miners investing computational resources in order to participate in the leader election process, they instead run a process that randomly selects one of them proportionally to the stake that each possesses according to the current blockchain ledger. University of Edinburgh and IOHK. [email protected]. Work partly performed while at the National and Kapodistrian University of Athens, supported by ERC project CODAMODA #259152. Work partly supported by H2020 Project #653497, PANORAMIX. † University of Connecticut. [email protected]. ‡ Aarhus University and IOHK, [email protected]. Work partly supported by European Research Council Starting Grant 279447. § IOHK, [email protected]. 1 Proof-of-Stake Sidechains Peter Gaˇ zi1, Aggelos Kiayias1,2, and Dionysis Zindros1,3 1 IOHK 2 University of Edinburgh 3 National and Kapodistrian University of Athens December 18, 2018 Abstract. Sidechains have long been heralded as the key enabler of blockchain scalability and inter- operability. However, no modeling of the concept or a provably secure construction has so far been attempted. We provide the first formal definition of what a sidechain system is and how assets can be moved between sidechains securely. We put forth a security definition that augments the known transaction ledger properties of persistence and liveness to hold across multiple ledgers and enhance them with a new “firewall” security property which safeguards each blockchain from its sidechains, limiting the impact of an otherwise catastrophic sidechain failure. We then provide a sidechain construction that is suitable for proof-of-stake (PoS) sidechain systems. As an exemplary concrete instantiation we present our construction for an epoch-based PoS system consistent with Ouroboros (Crypto 2017), the PoS blockchain protocol used in Cardano which is one of the largest pure PoS systems by market capitalisation, and we also comment how the construction can be adapted for other protocols such as Ouroboros Praos (Eurocrypt 2018), Ouroboros Genesis (CCS 2018), Snow White and Algorand. An important feature of our construction is merged-staking that prevents “goldfinger” attacks against a sidechain that is only carrying a small amount of stake. An important technique for pegging chains that we use in our construction is cross-chain certification which is facilitated by a novel cryptographic primitive we introduce called ad-hoc threshold multisignatures (ATMS) which may be of independent interest. We show how ATMS can be securely instantiated by regular and aggregate digital signatures as well as succinct arguments of knowledge such as STARKs and bulletproofs with varying degrees of storage e ciency. 1 Introduction Blockchain protocols and their most prominent application so far, cryptocurrencies like Bitcoin [27], have been gaining increasing popularity and acceptance by a wider community. While enjoying wide adoption, there are several fundamental open questions remaining to be resolved that include (i) Interoperability: How can di↵erent blockchains interoperate and exchange assets or other data? (ii) Scalability: How can blockchain protocols scale, especially proportionally to the number of participating nodes? (iii) Upgradability: How can a deployed blockchain protocol codebase evolve to support a new functionality, or correct an implementation problem? The main function of a blockchain protocol is to organise application data into blocks so that a set of nodes that evolves over time can arrive eventually to consensus about the sequence of events that took place. The consensus component can be achieved in a number of ways, the most popular is using proof-of-work [16] (cf. [27,17]), while a promising alternative is to use proof-of-stake (cf. [26,20,5,13]). Application data typically consists of transactions indicating some transfer of value as in the case of Bitcoin [27]. The transfer of value can be conditioned on arbitrary predicates called smart contracts such as, for example, in Ethereum [11,31]. The conditions used to validate transactions depend on local blockchain events according to the view of each node and they typically cannot be dependent on other blockchain sessions. Being able to perform operations across blockchains, for instance from a main blockchain such as Bitcoin to a “sidechain” that has some enhanced functionality, has been frequently considered a fundamental technology enabler in the blockchain space.4 4 See e.g., https://blockstream.com/technology/ and [1].
  51. Ouroboros: A Provably Secure Proof-of-Stake Blockchain Protocol Aggelos Kiayias Alexander

    Russell† Bernardo David‡ Roman Oliynykov§ August 21, 2017 Abstract We present “Ouroboros”, the first blockchain protocol based on proof of stake with rig- orous security guarantees. We establish security properties for the protocol comparable to those achieved by the bitcoin blockchain protocol. As the protocol provides a “proof of stake” blockchain discipline, it o ers qualitative e ciency advantages over blockchains based on proof of physical resources (e.g., proof of work). We also present a novel reward mechanism for in- centivizing Proof of Stake protocols and we prove that, given this mechanism, honest behavior is an approximate Nash equilibrium, thus neutralizing attacks such as selfish mining. We also present initial evidence of the practicality of our protocol in real world settings by providing experimental results on transaction confirmation and processing. 1 Introduction A primary consideration regarding the operation of blockchain protocols based on proof of work (PoW)—such as bitcoin [30]—is the energy required for their execution. At the time of this writ- ing, generating a single block on the bitcoin blockchain requires a number of hashing operations exceeding 260, which results in striking energy demands. Indeed, early calculations indicated that the energy requirements of the protocol were comparable to that of a small country [32]. This state of a airs has motivated the investigation of alternative blockchain protocols that would obviate the need for proof of work by substituting it with another, more energy e cient, mechanism that can provide similar guarantees. It is important to point out that the proof of work mechanism of bitcoin facilitates a type of randomized “leader election” process that elects one of the miners to issue the next block. Furthermore, provided that all miners follow the protocol, this selection is performed in a randomized fashion proportionally to the computational power of each miner. (Deviations from the protocol may distort this proportionality as exemplified by “selfish mining” strategies [21, 38].) A natural alternative mechanism relies on the notion of “proof of stake” (PoS). Rather than miners investing computational resources in order to participate in the leader election process, they instead run a process that randomly selects one of them proportionally to the stake that each possesses according to the current blockchain ledger. University of Edinburgh and IOHK. [email protected]. Work partly performed while at the National and Kapodistrian University of Athens, supported by ERC project CODAMODA #259152. Work partly supported by H2020 Project #653497, PANORAMIX. † University of Connecticut. [email protected]. ‡ Aarhus University and IOHK, [email protected]. Work partly supported by European Research Council Starting Grant 279447. § IOHK, [email protected]. 1 Proof-of-Stake Sidechains Peter Gaˇ zi1, Aggelos Kiayias1,2, and Dionysis Zindros1,3 1 IOHK 2 University of Edinburgh 3 National and Kapodistrian University of Athens December 18, 2018 Abstract. Sidechains have long been heralded as the key enabler of blockchain scalability and inter- operability. However, no modeling of the concept or a provably secure construction has so far been attempted. We provide the first formal definition of what a sidechain system is and how assets can be moved between sidechains securely. We put forth a security definition that augments the known transaction ledger properties of persistence and liveness to hold across multiple ledgers and enhance them with a new “firewall” security property which safeguards each blockchain from its sidechains, limiting the impact of an otherwise catastrophic sidechain failure. We then provide a sidechain construction that is suitable for proof-of-stake (PoS) sidechain systems. As an exemplary concrete instantiation we present our construction for an epoch-based PoS system consistent with Ouroboros (Crypto 2017), the PoS blockchain protocol used in Cardano which is one of the largest pure PoS systems by market capitalisation, and we also comment how the construction can be adapted for other protocols such as Ouroboros Praos (Eurocrypt 2018), Ouroboros Genesis (CCS 2018), Snow White and Algorand. An important feature of our construction is merged-staking that prevents “goldfinger” attacks against a sidechain that is only carrying a small amount of stake. An important technique for pegging chains that we use in our construction is cross-chain certification which is facilitated by a novel cryptographic primitive we introduce called ad-hoc threshold multisignatures (ATMS) which may be of independent interest. We show how ATMS can be securely instantiated by regular and aggregate digital signatures as well as succinct arguments of knowledge such as STARKs and bulletproofs with varying degrees of storage e ciency. 1 Introduction Blockchain protocols and their most prominent application so far, cryptocurrencies like Bitcoin [27], have been gaining increasing popularity and acceptance by a wider community. While enjoying wide adoption, there are several fundamental open questions remaining to be resolved that include (i) Interoperability: How can di↵erent blockchains interoperate and exchange assets or other data? (ii) Scalability: How can blockchain protocols scale, especially proportionally to the number of participating nodes? (iii) Upgradability: How can a deployed blockchain protocol codebase evolve to support a new functionality, or correct an implementation problem? The main function of a blockchain protocol is to organise application data into blocks so that a set of nodes that evolves over time can arrive eventually to consensus about the sequence of events that took place. The consensus component can be achieved in a number of ways, the most popular is using proof-of-work [16] (cf. [27,17]), while a promising alternative is to use proof-of-stake (cf. [26,20,5,13]). Application data typically consists of transactions indicating some transfer of value as in the case of Bitcoin [27]. The transfer of value can be conditioned on arbitrary predicates called smart contracts such as, for example, in Ethereum [11,31]. The conditions used to validate transactions depend on local blockchain events according to the view of each node and they typically cannot be dependent on other blockchain sessions. Being able to perform operations across blockchains, for instance from a main blockchain such as Bitcoin to a “sidechain” that has some enhanced functionality, has been frequently considered a fundamental technology enabler in the blockchain space.4 4 See e.g., https://blockstream.com/technology/ and [1]. Marlowe: financial contracts on blockchain? Pablo Lamela Seijas[0000 0002 1730 1219] and Simon Thompson[0000 0002 2350 301X] School of Computing, University of Kent, Canterbury, UK 1 Introduction This paper explores the design of a domain specific language, Marlowe,12 targeted at the execution of financial contracts in the style of Peyton Jones, Eber and Seward [16] on blockchains. In doing this, we are required to refine the model of contracts in a number of ways in order to fit with a radically di↵erent context. Consider the following example of an “escrow” contract so that we can explain the motivation more concretely. The aim of this contract, written in functional pseudocode in the style of [16] involves three participants: alice, bob and carol. alice is to pay an amount of money to bob on receipt of goods from her. alice pays the money into escrow controlled by carol. There are two options for the money: if two out of the three participants agree to pay it to bob, that goes ahead; if, on the other hand, two of the participants opt to refund the money to alice, that is done instead. The outer primitive When waits until the condition – its first argument – becomes true; in this case, the condition is that either two participants choose refund or two participants choose pay. The second argument of the When is itself another Contract, which is performed after the condition of the When has been met, and it makes the payment if two participants chose pay, otherwise it redeems previous money commitments. (When (Or (two_chose alice bob carol refund) (two_chose alice bob carol pay)) (Choice (two_chose alice bob carol pay) (Pay alice bob AvailableMoney) redeem_original)) We discuss this particular example in more detail in Marlowe in Section 3 below; but it already gives us an example of how traditional contracts are fundamentally di↵erent from contracts that are meant to be run on top of the blockchain. In the traditional model, enforcement of the contract is the responsibility of the legal system. If alice does not pay the money into escrow, or carol chooses to keep it for herself, then they can be sued for the money ? This work is part of the Cardano project and is supported by IOHK, https://iohk.io 1 Named after Christopher Marlowe, the Elizabethan poet, dramatist and spy, who was born and educated in Canterbury, en.wikipedia.org/wiki/Christopher_Marlowe 2 Marlowe is available from https://github.com/input-output-hk/scdsl l IOHK Research Papers https://iohk.io/research/library/
  52. λ τ Series of refinements (incremental, rollback, etc) Persistence, networking,

    frontend interaction Test against executable spec using property-based testing
  53. Ledger Representation Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B ₳42

    B㱺C ₳50 Alice ₳58 Bob ₳30 Charlie ₳72 Accounts
  54. Ledger Representation Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B ₳42

    B㱺C ₳50 Alice ₳58 Bob ₳30 Charlie ₳72 Accounts ₳100 Alice ₳10 Bob ₳52 Charlie
  55. Ledger Representation Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B ₳42

    B㱺C ₳50 Alice ₳58 Bob ₳30 Charlie ₳72 Accounts ₳58 ₳42 ₳100 Alice ₳10 Bob ₳52 Charlie
  56. Ledger Representation Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B ₳42

    B㱺C ₳50 Alice ₳58 Bob ₳30 Charlie ₳72 Accounts ₳58 ₳42 ₳10 ₳50 ₳2 ₳100 Alice ₳10 Bob ₳52 Charlie
  57. Ledger Representation Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B ₳42

    B㱺C ₳50 Alice ₳58 Bob ₳30 Charlie ₳72 Accounts ₳58 ₳42 ₳10 ₳50 ₳2 ₳100 Alice ₳10 Bob ₳52 Charlie Dataflow Graph Charlie Charlie Bob Alice
  58. Ledger Representation Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B ₳42

    B㱺C ₳50 Alice ₳58 Bob ₳30 Charlie ₳72 Accounts ₳58 ₳42 ₳10 ₳50 ₳2 ₳100 Alice ₳10 Bob ₳52 Charlie Dataflow Graph Charlie Charlie Bob Alice ₳52
  59. Ledger Representation Alice ₳100 Bob ₳10 Charlie ₳52 A㱺B ₳42

    B㱺C ₳50 Alice ₳58 Bob ₳30 Charlie ₳72 Accounts ₳58 ₳42 ₳10 ₳50 ₳2 ₳100 Alice ₳10 Bob ₳52 Charlie Dataflow Graph Unspent Transaction Output (UTxO) Charlie Charlie Bob Alice ₳52
  60. Philip Wadler Vanessa McHale Kenneth MacKenzie Roman Kireev Jann Müller

    Michael Peyton Jones James Chapman Yours Truly The Plutus Team Rebecca Valentine (Former Member)
  61. input output typed function safe usage :: ⍺ :: β

    local reasoning type-directed design
  62. input output typed function safe usage :: ⍺ :: β

    local reasoning type-directed design advanced testing & verification
  63. core Plutus Core not a bytecode not a classic virtual

    machine typed FP calculus abstract machine interpreter
  64. core Plutus Core small, powerful & based on peer-reviewed science

    not a bytecode not a classic virtual machine typed FP calculus abstract machine interpreter System F⍵ μ
  65. Input Output ν: Validator x: Value ρ: Redeemer ν(ρ) ≟

    True ν: Validator x: Value ρ: Redeemer core core core core
  66. Input Output ν: Validator x: Value ρ: Redeemer ν(ρ) ≟

    True ν: Validator x: Value ρ: Redeemer δ: Data core core core core core
  67. Input Output ν: Validator x: Value ρ: Redeemer ν(ρ) ≟

    True ν: Validator x: Value ρ: Redeemer δ: Data σ: State core core core core core
  68. Input Output ν: Validator x: Value ρ: Redeemer ν(ρ) ≟

    True ν: Validator x: Value ρ: Redeemer ν(ρ, δ, σ, x) ≟ True δ: Data σ: State core core core core core
  69. ν: Validator x: Value ρ: Redeemer ν(ρ, δ, σ, x)

    ≟ True δ: Data σ: State Extended UTxO core core core
  70. ν: Validator x: Value ρ: Redeemer ν(ρ, δ, σ, x)

    ≟ True δ: Data σ: State Extended UTxO Preserves the functional structure of UTxO ledgers core core core
  71. ν: Validator x: Value ρ: Redeemer ν(ρ, δ, σ, x)

    ≟ True δ: Data σ: State Extended UTxO Preserves the functional structure of UTxO ledgers Greatly increases the expressive power of scripts core core core
  72. Extended UTxO Preserves the functional structure of UTxO ledgers Greatly

    increases the expressive power of scripts data flows with value
  73. Extended UTxO Preserves the functional structure of UTxO ledgers Greatly

    increases the expressive power of scripts data flows with value scripts have an identity
  74. Extended UTxO Preserves the functional structure of UTxO ledgers Greatly

    increases the expressive power of scripts data flows with value scripts have an identity invariants across transaction chains
  75. Simple crowdfunding 1. Payment into campaign until a payment deadline

    2. If funding goal reached, campaign owner can collect funds
  76. Simple crowdfunding 1. Payment into campaign until a payment deadline

    2. If funding goal reached, campaign owner can collect funds 3. If funding goal not reached, refunds can be obtained by contributors
  77. Simple crowdfunding 1. Payment into campaign until a payment deadline

    2. If funding goal reached, campaign owner can collect funds 3. If funding goal not reached, refunds can be obtained by contributors 4. If campaign owner does not collect by collection deadline, contributors can also obtain refunds
  78. 1. Payment into campaign until a payment deadline 2. If

    funding goal reached, campaign owner can collect funds 3. If funding goal not reached, refunds can be obtained by contributors 4. If campaign owner does not collect by collection deadline, contributors can also obtain refunds
  79. 1. Payment into campaign until a payment deadline 2. If

    funding goal reached, campaign owner can collect funds 3. If funding goal not reached, refunds can be obtained by contributors 4. If campaign owner does not collect by collection deadline, contributors can also obtain refunds pragma solidity ^0.4.6; contract WinnerTakesAll { uint minimumEntryFee; uint public deadlineProjects; uint public deadlineCampaign; uint public winningFunds; address public winningAddress; struct Project { address addr; string name; string url; uint funds; bool initialized; } … Solidity (on-chain)
  80. pragma solidity ^0.4.6; contract WinnerTakesAll { uint minimumEntryFee; uint public

    deadlineProjects; uint public deadlineCampaign; uint public winningFunds; address public winningAddress; struct Project { address addr; string name; string url; uint funds; bool initialized; } … Solidity (on-chain) var Web3 = require('web3'); var web3 = new Web3(); web3.setProvider(new web3.providers.HttpProvider(”http:… var accounts = web3.eth.accounts; accounts.forEach(function(v) { $(”#supportFrom”).append(”<opt… $(”#projectAddr”).append(”<opt… }); var compiled = web3.eth.compile.so… var code = compiled.code; var abi = compiled.info.abiDefinit… var contract = web3.eth.contract(a… … JavaScript (off-chain) +
  81. pragma solidity ^0.4.6; contract WinnerTakesAll { uint minimumEntryFee; uint public

    deadlineProjects; uint public deadlineCampaign; uint public winningFunds; address public winningAddress; struct Project { address addr; string name; string url; uint funds; bool initialized; } … Solidity var Web3 = require('web3'); var web3 = new Web3(); web3.setProvider(new web3.providers.HttpProvider(”http:… var accounts = web3.eth.accounts; accounts.forEach(function(v) { $(”#supportFrom”).append(”<opt… $(”#projectAddr”).append(”<opt… }); var compiled = web3.eth.compile.so… var code = compiled.code; var abi = compiled.info.abiDefinit… var contract = web3.eth.contract(a… … JavaScript
  82. pragma solidity ^0.4.6; contract WinnerTakesAll { uint minimumEntryFee; uint public

    deadlineProjects; uint public deadlineCampaign; uint public winningFunds; address public winningAddress; struct Project { address addr; string name; string url; uint funds; bool initialized; } … Solidity var Web3 = require('web3'); var web3 = new Web3(); web3.setProvider(new web3.providers.HttpProvider(”http:… var accounts = web3.eth.accounts; accounts.forEach(function(v) { $(”#supportFrom”).append(”<opt… $(”#projectAddr”).append(”<opt… }); var compiled = web3.eth.compile.so… var code = compiled.code; var abi = compiled.info.abiDefinit… var contract = web3.eth.contract(a… … JavaScript off-chain (wallet) on-chain (transaction)
  83. pragma solidity ^0.4.6; contract WinnerTakesAll { uint minimumEntryFee; uint public

    deadlineProjects; uint public deadlineCampaign; uint public winningFunds; address public winningAddress; struct Project { address addr; string name; string url; uint funds; bool initialized; } … Solidity var Web3 = require('web3'); var web3 = new Web3(); web3.setProvider(new web3.providers.HttpProvider(”http:… var accounts = web3.eth.accounts; accounts.forEach(function(v) { $(”#supportFrom”).append(”<opt… $(”#projectAddr”).append(”<opt… }); var compiled = web3.eth.compile.so… var code = compiled.code; var abi = compiled.info.abiDefinit… var contract = web3.eth.contract(a… … JavaScript off-chain (wallet) on-chain (transaction) two-level (staged) programming model JavaScript Solidity
  84. Haskell (Plutus Tx) Haskell off-chain (wallet) on-chain (transaction) two-level (staged)

    programming model meta programming integrated compact robust
  85. contribute :: Campaign -> Value -> MockWallet () contribute campaign

    value = do when (value <= 0) $ throwOtherError "Must contribute a positive value" Haskell
  86. contribute :: Campaign -> Value -> MockWallet () contribute campaign

    value = do when (value <= 0) $ throwOtherError "Must contribute a positive value" ownPK <- ownPubKey Haskell
  87. contribute :: Campaign -> Value -> MockWallet () contribute campaign

    value = do when (value <= 0) $ throwOtherError "Must contribute a positive value" ownPK <- ownPubKey tx <- payToScript Haskell
  88. contribute :: Campaign -> Value -> MockWallet () contribute campaign

    value = do when (value <= 0) $ throwOtherError "Must contribute a positive value" ownPK <- ownPubKey tx <- payToScript (Ledger.scriptAddress (contributionScript campaign)) Haskell
  89. contribute :: Campaign -> Value -> MockWallet () contribute campaign

    value = do when (value <= 0) $ throwOtherError "Must contribute a positive value" ownPK <- ownPubKey tx <- payToScript (Ledger.scriptAddress (contributionScript campaign)) value Haskell
  90. contribute :: Campaign -> Value -> MockWallet () contribute campaign

    value = do when (value <= 0) $ throwOtherError "Must contribute a positive value" ownPK <- ownPubKey tx <- payToScript (Ledger.scriptAddress (contributionScript campaign)) value DataScript (Ledger.lifted ownPK) Haskell
  91. contribute :: Campaign -> Value -> MockWallet () contribute campaign

    value = do when (value <= 0) $ throwOtherError "Must contribute a positive value" ownPK <- ownPubKey tx <- payToScript (Ledger.scriptAddress (contributionScript campaign)) value DataScript (Ledger.lifted ownPK) register (refundTrigger campaign) (refundHandler (Ledger.hashTx tx) campaign) contributionScript :: Campaign -> ValidatorScript Haskell
  92. contributionScript :: Campaign -> ValidatorScript contributionScript campaign = ValidatorScript (validator

    `apply` campaign) where validator = Ledger.fromCompiledCode $$(PlutusTx.compile [|| (\Campaign{..} action contrib tx -> Plutus Tx Haskell
  93. contributionScript :: Campaign -> ValidatorScript contributionScript campaign = ValidatorScript (validator

    `apply` campaign) where validator = Ledger.fromCompiledCode $$(PlutusTx.compile [|| (\Campaign{..} action contrib tx -> let PendingTx ps outs _ _ (Height h) _ _ = tx Plutus Tx Haskell
  94. contributionScript :: Campaign -> ValidatorScript contributionScript campaign = ValidatorScript (validator

    `apply` campaign) where validator = Ledger.fromCompiledCode $$(PlutusTx.compile [|| (\Campaign{..} action contrib tx -> let PendingTx ps outs _ _ (Height h) _ _ = tx isValid = case action of Plutus Tx Haskell
  95. contributionScript :: Campaign -> ValidatorScript contributionScript campaign = ValidatorScript (validator

    `apply` campaign) where validator = Ledger.fromCompiledCode $$(PlutusTx.compile [|| (\Campaign{..} action contrib tx -> let PendingTx ps outs _ _ (Height h) _ _ = tx isValid = case action of Refund -> h > collectionDeadline && Plutus Tx Haskell
  96. contributionScript :: Campaign -> ValidatorScript contributionScript campaign = ValidatorScript (validator

    `apply` campaign) where validator = Ledger.fromCompiledCode $$(PlutusTx.compile [|| (\Campaign{..} action contrib tx -> let PendingTx ps outs _ _ (Height h) _ _ = tx isValid = case action of Refund -> h > collectionDeadline && contributorOnly outs && Plutus Tx Haskell
  97. contributionScript :: Campaign -> ValidatorScript contributionScript campaign = ValidatorScript (validator

    `apply` campaign) where validator = Ledger.fromCompiledCode $$(PlutusTx.compile [|| (\Campaign{..} action contrib tx -> let PendingTx ps outs _ _ (Height h) _ _ = tx isValid = case action of Refund -> h > collectionDeadline && contributorOnly outs && $$(txSignedBy) tx contrib Plutus Tx Haskell
  98. contributionScript :: Campaign -> ValidatorScript contributionScript campaign = ValidatorScript (validator

    `apply` campaign) where validator = Ledger.fromCompiledCode $$(PlutusTx.compile [|| (\Campaign{..} action contrib tx -> let PendingTx ps outs _ _ (Height h) _ _ = tx isValid = case action of Refund -> h > collectionDeadline && contributorOnly outs && $$(txSignedBy) tx contrib Collect -> h > deadline && Plutus Tx Haskell
  99. contributionScript :: Campaign -> ValidatorScript contributionScript campaign = ValidatorScript (validator

    `apply` campaign) where validator = Ledger.fromCompiledCode $$(PlutusTx.compile [|| (\Campaign{..} action contrib tx -> let PendingTx ps outs _ _ (Height h) _ _ = tx isValid = case action of Refund -> h > collectionDeadline && contributorOnly outs && $$(txSignedBy) tx contrib Collect -> h > deadline && h <= collectionDeadline && Plutus Tx Haskell
  100. contributionScript :: Campaign -> ValidatorScript contributionScript campaign = ValidatorScript (validator

    `apply` campaign) where validator = Ledger.fromCompiledCode $$(PlutusTx.compile [|| (\Campaign{..} action contrib tx -> let PendingTx ps outs _ _ (Height h) _ _ = tx isValid = case action of Refund -> h > collectionDeadline && contributorOnly outs && $$(txSignedBy) tx contrib Collect -> h > deadline && h <= collectionDeadline && totalInputs >= target && Plutus Tx Haskell
  101. contributionScript :: Campaign -> ValidatorScript contributionScript campaign = ValidatorScript (validator

    `apply` campaign) where validator = Ledger.fromCompiledCode $$(PlutusTx.compile [|| (\Campaign{..} action contrib tx -> let PendingTx ps outs _ _ (Height h) _ _ = tx isValid = case action of Refund -> h > collectionDeadline && contributorOnly outs && $$(txSignedBy) tx contrib Collect -> h > deadline && h <= collectionDeadline && totalInputs >= target && $$(txSignedBy) p campaignOwner Plutus Tx Haskell
  102. contributionScript :: Campaign -> ValidatorScript contributionScript campaign = ValidatorScript (validator

    `apply` campaign) where validator = Ledger.fromCompiledCode $$(PlutusTx.compile [|| (\Campaign{..} action contrib tx -> let PendingTx ps outs _ _ (Height h) _ _ = tx isValid = case action of Refund -> h > collectionDeadline && contributorOnly outs && $$(txSignedBy) tx contrib Collect -> h > deadline && h <= collectionDeadline && totalInputs >= target && $$(txSignedBy) p campaignOwner in $$(P.errorIfNot) isValid ||]) Plutus Tx Haskell
  103. contribute :: Campaign -> Value -> MockWallet () contribute campaign

    value = do when (value <= 0) $ throwOtherError "Must contribute a positive value" ownPK <- ownPubKey tx <- payToScript (Ledger.scriptAddress (contributionScript campaign)) value DataScript (Ledger.lifted ownPK) register (refundTrigger campaign) (refundHandler (Ledger.hashTx tx) campaign) contributionScript :: Campaign -> ValidatorScript contributionScript campaign = ValidatorScript (validator `apply` campaign) where validator = Ledger.fromCompiledCode $$(PlutusTx.compile [|| (\Campaign{..} action contrib tx -> let PendingTx ps outs _ _ (Height h) _ _ = tx isValid = case action of Refund -> h > collectionDeadline && contributorOnly outs && $$(txSignedBy) tx contrib Collect -> h > deadline && h <= collectionDeadline && totalInputs >= target && $$(txSignedBy) p campaignOwner in $$(P.errorIfNot) isValid ||]) off-chain on-chain
  104. contribute :: Campaign -> Value -> MockWallet () contribute campaign

    value = do when (value <= 0) $ throwOtherError "Must contribute a positive value" ownPK <- ownPubKey tx <- payToScript (Ledger.scriptAddress (contributionScript campaign)) value DataScript (Ledger.lifted ownPK) register (refundTrigger campaign) (refundHandler (Ledger.hashTx tx) campaign) contributionScript :: Campaign -> ValidatorScript contributionScript campaign = ValidatorScript (validator `apply` campaign) where validator = Ledger.fromCompiledCode $$(PlutusTx.compile [|| (\Campaign{..} action contrib tx -> let PendingTx ps outs _ _ (Height h) _ _ = tx isValid = case action of Refund -> h > collectionDeadline && contributorOnly outs && $$(txSignedBy) tx contrib Collect -> h > deadline && h <= collectionDeadline && totalInputs >= target && $$(txSignedBy) p campaignOwner in $$(P.errorIfNot) isValid ||]) core off-chain on-chain
  105. contribute :: Campaign -> Value -> MockWallet () contribute campaign

    value = do when (value <= 0) $ throwOtherError "Must contribute a positive value" ownPK <- ownPubKey tx <- payToScript (Ledger.scriptAddress (contributionScript campaign)) value DataScript (Ledger.lifted ownPK) register (refundTrigger campaign) (refundHandler (Ledger.hashTx tx) campaign) contributionScript :: Campaign -> ValidatorScript contributionScript campaign = ValidatorScript (validator `apply` campaign) where validator = Ledger.fromCompiledCode $$(PlutusTx.compile [|| (\Campaign{..} action contrib tx -> let PendingTx ps outs _ _ (Height h) _ _ = tx isValid = case action of Refund -> h > collectionDeadline && contributorOnly outs && $$(txSignedBy) tx contrib Collect -> h > deadline && h <= collectionDeadline && totalInputs >= target && $$(txSignedBy) p campaignOwner in $$(P.errorIfNot) isValid ||]) core core off-chain on-chain
  106. contribute :: Campaign -> Value -> MockWallet () contribute campaign

    value = do when (value <= 0) $ throwOtherError "Must contribute a positive value" ownPK <- ownPubKey tx <- payToScript (Ledger.scriptAddress (contributionScript campaign)) value DataScript (Ledger.lifted ownPK) register (refundTrigger campaign) (refundHandler (Ledger.hashTx tx) campaign) contributionScript :: Campaign -> ValidatorScript contributionScript campaign = ValidatorScript (validator `apply` campaign) where validator = Ledger.fromCompiledCode $$(PlutusTx.compile [|| (\Campaign{..} action contrib tx -> let PendingTx ps outs _ _ (Height h) _ _ = tx isValid = case action of Refund -> h > collectionDeadline && contributorOnly outs && $$(txSignedBy) tx contrib Collect -> h > deadline && h <= collectionDeadline && totalInputs >= target && $$(txSignedBy) p campaignOwner in $$(P.errorIfNot) isValid ||]) core core off-chain on-chain
  107. Mockchain Functional blockchain emulator Event trace applying ledger rules and

    running Plutus on- and off-chain code Semantics-driven development Greatly simplified by having mathematical models of the components
  108. Mockchain Functional blockchain emulator Event trace applying ledger rules and

    running Plutus on- and off-chain code Semantics-driven development Greatly simplified by having mathematical models of the components From learning to continuous integration Lightweight, detailed introspection, but this is just the start
  109. mchakravarty TacticalGrace justtesting.org iohk.io Functional Blockchain Platform https://testnet.iohkdev.io/plutus/ ∀∃⊢ λτ

    Extended functional UTxO ledger Integrated on- & off-chain code in Haskell https://plutusfest.io