A software engineer website

Plutus: Pioneers Program 4th cohort - Lecture 10 - Built with plutus

Gautier DI FOLCO May 07, 2023 [HaskellBlockchain] #haskell #cardano #smart contracts

As a last lecture, instead of writing regular Plutus code through Haskell, alternatives are presented.

First, we have MeshJS, which aims to bootstrap DApps, based on React, NextJS, and JavaScript/TypeScript.

Then come plu-ts, which allows tu write scripts which will be compiled down to plutus.

It looks a lot like Haskkell-based Plutus scripts:

import { Address, bool, compile, makeValidator, PaymentCredentials, pBool, pfn, Script, ScriptType, V2 } from "@harmoniclabs/plu-ts";

export const contract = pfn([
    AnyDatum.type,
    AnyRedeemer.type,
    V2.PScriptContext.type
],  bool)
(( datum, redeemer, ctx ) =>
    pBool( true )
);


export const untypedValidator = makeValidator( contract );

export const compiledContract = compile( untypedValidator );

export const script = new Script(
    ScriptType.PlutusV2,
    compiledContract
);

export const scriptMainnetAddr = new Address(
    "mainnet",
    new PaymentCredentials(
        "script",
        script.hash
    )
);

Then we have OpShin, which is python-based.

from opshin.prelude import *


@dataclass()
class WithdrawDatum(PlutusData):
    pubkeyhash: bytes


def validator(datum: WithdrawDatum, redeemer: None, context: ScriptContext) -> None:
    sig_present = False
    for s in context.tx_info.signatories:
        if datum.pubkeyhash == s:
            sig_present = True
    assert sig_present, "Required signature missing"

Then we have plutarch, which is a Haskell eDSL, it aims to produce a smaller and more efficient Untyped PLutus Core:

alwaysSucceeds :: Term s (PAsData PDatum :--> PAsData PRedeemer :--> PAsData PScriptContext :--> PUnit)
alwaysSucceeds = plam $ \_datm _redm _ctx -> pconstant ()

Finally there's Aiken which is a dedicated functional programming language for Smart Contracts.

validator {
  fn hello_world(datum, redeemer, context) -> Bool {
    let must_say_hello =
      redeemer == "Hello, World!"

    let must_be_signed =
      list.has(
        context.transaction.extra_signatories,
        datum.owner,
      )

    must_say_hello? && must_be_signed?
  }
}

Notes: while Plutus Pioneers Program 4th Cohort ends here, the 1st cohort, which I attended to, cover Plutus Application Backend.

Its aims to enable interactions between clients and contracts (e.g. through HTTP requests to long-running contracts, or notify clients when ledger changes).

To be deployed, it takes: