tweaks to blog view
This commit is contained in:
parent
b340cfd2f0
commit
c3f39d430d
|
@ -13,10 +13,25 @@ article {
|
||||||
margin-bottom: 2rem;
|
margin-bottom: 2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
article>section> :is(p, h1, h2, h3, h4, h5, h6) {
|
article>section> :is(pre, p, h1, h2, h3, h4, h5, h6) {
|
||||||
margin-top: 2rem;
|
margin-top: 2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
article>section {
|
||||||
|
font-family: "Lucida" Grande, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
article>section> :is(h1, h2, h3, h4, h5, h6, code) {
|
||||||
|
font-family: "jetbrains-mono";
|
||||||
|
}
|
||||||
|
|
||||||
|
article>section>blockquote {
|
||||||
|
padding: 1rem;
|
||||||
|
border-left-width: 4px;
|
||||||
|
border-color: rgb(239 68 68);
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
article>section>h1 {
|
article>section>h1 {
|
||||||
margin-top: 2rem;
|
margin-top: 2rem;
|
||||||
font-size: 3rem;
|
font-size: 3rem;
|
||||||
|
@ -27,7 +42,6 @@ article>section>h1::before {
|
||||||
}
|
}
|
||||||
|
|
||||||
article>section>h2 {
|
article>section>h2 {
|
||||||
margin-top: 2rem;
|
|
||||||
font-size: 2rem;
|
font-size: 2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,10 +49,18 @@ article>section>h2::before {
|
||||||
content: "## ";
|
content: "## ";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
article>section>h3 {
|
||||||
|
font-size: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
article>section>h3::before {
|
article>section>h3::before {
|
||||||
content: "### ";
|
content: "### ";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
article>section>h4 {
|
||||||
|
font-size: 1.3rem;
|
||||||
|
}
|
||||||
|
|
||||||
article>section>h4::before {
|
article>section>h4::before {
|
||||||
content: "#### ";
|
content: "#### ";
|
||||||
}
|
}
|
||||||
|
@ -61,6 +83,11 @@ article a:hover {
|
||||||
}
|
}
|
||||||
|
|
||||||
article ul {
|
article ul {
|
||||||
margin-left: 2rem;
|
margin-left: 1rem;
|
||||||
list-style-type: "❯ ";
|
list-style-type: "- ";
|
||||||
|
}
|
||||||
|
|
||||||
|
article ol {
|
||||||
|
margin-left: 1rem;
|
||||||
|
list-style: decimal inside;
|
||||||
}
|
}
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,3 @@
|
||||||
|
/* PrismJS 1.29.0
|
||||||
|
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+bash+haskell+json+nix+racket+rust+scheme */
|
||||||
|
code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}
|
|
@ -1,108 +0,0 @@
|
||||||
---
|
|
||||||
title: Are we zk-Cardano yet?
|
|
||||||
date: 2023-08-07
|
|
||||||
---
|
|
||||||
|
|
||||||
Not so long ago Emurgo announced they were doing a Cardano centered hackathon.
|
|
||||||
It was a welcome prospect - very few similar such events seem to exist in the space.
|
|
||||||
Things went monotonically south ever since the announcement, but that's a different story.
|
|
||||||
|
|
||||||
One particularly interesting quirk was that of the three "tracks" of the hackathon,
|
|
||||||
one was _Zero Knowledge_ (aka zk).
|
|
||||||
Why particularly interesting quirk? In some sense it is not suprising:
|
|
||||||
zK has been very trendy these last few years around blockchains.
|
|
||||||
However, building on Cardano is notoriously challenging.
|
|
||||||
Building with zk on a zk-native blockchain is itself a very steep learning curve.
|
|
||||||
So combining the two, zk on Cardano seemed... a bit mad.
|
|
||||||
|
|
||||||
This post is bourne out of a best effort of how far "zk on cardano" can be pushed.
|
|
||||||
|
|
||||||
## What is zk?
|
|
||||||
|
|
||||||
There is no shortage of explanations describing what zk is [TODO: Links].
|
|
||||||
There is also a reasonable breath to the field of zk that includes things like distributed compute.
|
|
||||||
Zk involves some really neat maths that lets you do some seemingly magical feats,
|
|
||||||
and pairs well with blockchain in extending what is functionally possible.
|
|
||||||
Let's stick to a simple and prototypical example.
|
|
||||||
|
|
||||||
Suppose Alice and Bob are playing battleships.
|
|
||||||
The game begins with Alice and Bob placing their ships within their own coordinate grid.
|
|
||||||
They then take in terms picking coordinates to "bomb".
|
|
||||||
If they hit nothing, then their turn ends, but if they hit a ship then they guess again.
|
|
||||||
The winner is the first to sink all their oponents ships.
|
|
||||||
|
|
||||||
Alice knows Bob has a reputation of being a notorious liar; how can she enjoy the game?
|
|
||||||
Each guess she makes, Bob says gleefully shouts "Miss!".
|
|
||||||
She can't ask Bob to show he's not lying by revealing the actual locations of the ships.
|
|
||||||
She could ask Charlie to independently verify Bob's not lying,
|
|
||||||
but then what if Charlie is actually on team Bob and also lies.
|
|
||||||
Or Bob might suspect Charlie is actually on team Alice, slyly brought in to give could Alice some hints.
|
|
||||||
|
|
||||||
Is there a way that Bob can prove to Alice that each guess is a miss,
|
|
||||||
but without revealing the locations of the ships either to Alice or anyone else?
|
|
||||||
|
|
||||||
The answer is yes.
|
|
||||||
Using zk Bob can produce a proof each time Alice's guess misses if and only if it honestly does.
|
|
||||||
Alice can inspect each proof and verify Bob's response.
|
|
||||||
Alice can interogate the proof as much as she wants, but she won't learn anything more than
|
|
||||||
her guess was a miss.
|
|
||||||
|
|
||||||
There are multiplitude of different ways to do this,
|
|
||||||
but essentially it involves modelling the problem as a bunch of algebra
|
|
||||||
over finite fields - like a lot of cryptography.
|
|
||||||
|
|
||||||
What's the snark of zk-snark?
|
|
||||||
Snark stands for _Succinct Non-Interactive Argument of Knowledge_.
|
|
||||||
And without saying anything more: it means that Alice has to do way less algebra than Bob.
|
|
||||||
In applications this is important, because Bob might not be able to lie anymore,
|
|
||||||
but he could still waste Alice's time.
|
|
||||||
|
|
||||||
|
|
||||||
## Sudoku snark
|
|
||||||
|
|
||||||
Sudoku snark was the entrant to Emurgo hackathon.
|
|
||||||
The summary/ pitch/ story deck is [here](https://pub.kompact.io/sudoku-snark).
|
|
||||||
Links to associated repos [plutus-zk]() and [sudoku-snark]().
|
|
||||||
|
|
||||||
Just after the hackathon got underway there was a large PR merged into the main branch of plutus.
|
|
||||||
It's a mammoth PR that is the culmination of many many months of work.
|
|
||||||
In it were some fundamental primitives needed for running zk algos.
|
|
||||||
|
|
||||||
The idea of the project was as follows:
|
|
||||||
|
|
||||||
- write a validator implementing a zk algorithm with the new primitives
|
|
||||||
- write a programme to generate the setup and proofs
|
|
||||||
- try to get a version of hydra running this newest version of plutus.
|
|
||||||
|
|
||||||
Unsurprisingly to anyone who's hung around the Cardano repos long enough,
|
|
||||||
this final part is where things got stuck.
|
|
||||||
Things got as far as running a cluster of nodes in the conway era supposedly with the latest plutus
|
|
||||||
but some unrelated changes seemed to thwart any chance of building transactions.
|
|
||||||
|
|
||||||
The validator uses [groth16].
|
|
||||||
In part because this was already mostly available from the plutus repo itself.
|
|
||||||
It is also the most obvious candidate to begin with.
|
|
||||||
It's relatively mature, relatively simple, can be implemented from the new primitives,
|
|
||||||
and, importantly in cardano land, has small proof size.
|
|
||||||
(As far as I know, the smallest of comparable algos.)
|
|
||||||
|
|
||||||
The program to generate the setup and proofs uses the arkworks framework.
|
|
||||||
Again this was initially inspired by a script from the IOG team.
|
|
||||||
|
|
||||||
The choice of game, sudoku, was in turn inspired by an arkworks example.
|
|
||||||
It's not the most compelling of choices, but it did for now.
|
|
||||||
|
|
||||||
The intended game play involved locking ada at a utxo
|
|
||||||
spendable only if a player could provide proof you knew the solution.
|
|
||||||
And through the magic of zk, not disclosing to the competition the solution itself.
|
|
||||||
Other details were TBC: is it first and second prizes? are players whitelisted?
|
|
||||||
|
|
||||||
## So are we zk-Cardano yet?
|
|
||||||
|
|
||||||
We're close.
|
|
||||||
|
|
||||||
There is potentially still quite a stretch between being in the plutus repo and being run on-chain.
|
|
||||||
The word on the street is that it might happen before the end of 2023.
|
|
||||||
|
|
||||||
Before it's available on mainnet there will be versions the cardano node available,
|
|
||||||
and so possibly plumbable into hydra without causing oneself an aneurysm.
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
---
|
||||||
|
title: Tracing Aiken Build
|
||||||
|
date: 2023-09-02
|
||||||
|
---
|
||||||
|
|
||||||
Aims:
|
Aims:
|
||||||
|
|
||||||
> Describe the pipeline and components getting from Aiken to Uplc.
|
> Describe the pipeline and components getting from Aiken to Uplc.
|
||||||
|
@ -50,7 +55,8 @@ To redeem it, some (possibly large) sections remain black boxes.
|
||||||
## Aiken build
|
## Aiken build
|
||||||
|
|
||||||
Tracing `aiken build`, the pipeline is roughly:
|
Tracing `aiken build`, the pipeline is roughly:
|
||||||
```
|
|
||||||
|
```sample
|
||||||
. -> Project::read_source_files ->
|
. -> Project::read_source_files ->
|
||||||
Vec<Source> -> Project::parse_sources ->
|
Vec<Source> -> Project::parse_sources ->
|
||||||
ParsedModules -> Project::type_check ->
|
ParsedModules -> Project::type_check ->
|
||||||
|
@ -60,6 +66,7 @@ Tracing `aiken build`, the pipeline is roughly:
|
||||||
Program / Term<Name> -> serialize ->
|
Program / Term<Name> -> serialize ->
|
||||||
.
|
.
|
||||||
```
|
```
|
||||||
|
|
||||||
We'll pick our way through these steps
|
We'll pick our way through these steps
|
||||||
|
|
||||||
At a high level we are trying to do something straightforward: reformulate Aiken code as Uplc.
|
At a high level we are trying to do something straightforward: reformulate Aiken code as Uplc.
|
||||||
|
@ -129,9 +136,13 @@ More on what an airtree is and its construction below.
|
||||||
At the same time `self` is treated as `mut`, so we need to keep an eye on this too.
|
At the same time `self` is treated as `mut`, so we need to keep an eye on this too.
|
||||||
The method which is called and uses this mutability of self is `self.assignment`.
|
The method which is called and uses this mutability of self is `self.assignment`.
|
||||||
It does so by
|
It does so by
|
||||||
|
|
||||||
```sample
|
```sample
|
||||||
self.assignment >> self.expect_type_assign >> self.code_gen_functions.insert
|
- self.assignment
|
||||||
|
└ self.expect_type_assign
|
||||||
|
└ self.code_gen_functions.insert
|
||||||
```
|
```
|
||||||
|
|
||||||
and thus is creating a hashmap of all the functions that appear in the definition.
|
and thus is creating a hashmap of all the functions that appear in the definition.
|
||||||
From the call to return of `assign` covers > 600 LoC so we'll leave this as a black box.
|
From the call to return of `assign` covers > 600 LoC so we'll leave this as a black box.
|
||||||
(`self.handle_each_clause` is also called with `mut` which in turn calls `self.build` for which `mut` it is needed.)
|
(`self.handle_each_clause` is also called with `mut` which in turn calls `self.build` for which `mut` it is needed.)
|
||||||
|
@ -149,7 +160,8 @@ Script context is the final argument of a validator - for any script purpose.
|
||||||
The importance of this is not immediate, and I've still yet to appreciate why this happens.
|
The importance of this is not immediate, and I've still yet to appreciate why this happens.
|
||||||
|
|
||||||
Let's take a look at what AirTree actually is
|
Let's take a look at what AirTree actually is
|
||||||
```rust
|
|
||||||
|
```language-rust
|
||||||
pub enum AirTree {
|
pub enum AirTree {
|
||||||
Statement {
|
Statement {
|
||||||
statement: AirStatement,
|
statement: AirStatement,
|
||||||
|
@ -159,6 +171,7 @@ pub enum AirTree {
|
||||||
UnhoistedSequence(Vec<AirTree>),
|
UnhoistedSequence(Vec<AirTree>),
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Note that `AirStatement` and `AirExpression` are mutually recursive definitions with `AirTree`.
|
Note that `AirStatement` and `AirExpression` are mutually recursive definitions with `AirTree`.
|
||||||
Otherwise, it would be unclear from first inspection how tree-like this really is.
|
Otherwise, it would be unclear from first inspection how tree-like this really is.
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -6,9 +6,9 @@
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<link rel="icon" type="image/x-icon" href="/favicon.png">
|
<link rel="icon" type="image/x-icon" href="/favicon.png">
|
||||||
<link href="/css/mini.css" rel="stylesheet">
|
<link href="/css/mini.css" rel="stylesheet">
|
||||||
|
<link href="/css/prism.css" rel="stylesheet" />
|
||||||
<title>$title$</title>
|
<title>$title$</title>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// On page load or when changing themes, best to add inline in `head` to avoid FOUC
|
// On page load or when changing themes, best to add inline in `head` to avoid FOUC
|
||||||
function updateTheme() {
|
function updateTheme() {
|
||||||
|
@ -37,4 +37,6 @@
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
|
<script src="/scripts/prism.js"></script>
|
||||||
|
|
||||||
</html>
|
</html>
|
|
@ -1,4 +1,4 @@
|
||||||
<article>
|
<article class="mx-auto px-4 max-w-prose">
|
||||||
<section class="header">
|
<section class="header">
|
||||||
<h1>
|
<h1>
|
||||||
$title$
|
$title$
|
||||||
|
|
Loading…
Reference in New Issue