build broke
This commit is contained in:
parent
0d72bc00e3
commit
4911f6b3e3
27
flake.lock
27
flake.lock
|
|
@ -5,11 +5,11 @@
|
|||
"nixpkgs-lib": "nixpkgs-lib"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1733312601,
|
||||
"narHash": "sha256-4pDvzqnegAfRkPwO3wmwBhVi/Sye1mzps0zHWYnP88c=",
|
||||
"lastModified": 1763759067,
|
||||
"narHash": "sha256-LlLt2Jo/gMNYAwOgdRQBrsRoOz7BPRkzvNaI/fzXi2Q=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"rev": "205b12d8b7cd4802fbcb8e8ef6a0f1408781a4f9",
|
||||
"rev": "2cccadc7357c0ba201788ae99c4dfa90728ef5e0",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
|
@ -20,11 +20,11 @@
|
|||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1734424634,
|
||||
"narHash": "sha256-cHar1vqHOOyC7f1+tVycPoWTfKIaqkoe1Q6TnKzuti4=",
|
||||
"lastModified": 1764517877,
|
||||
"narHash": "sha256-pp3uT4hHijIC8JUK5MEqeAWmParJrgBVzHLNfJDZxg4=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "d3c42f187194c26d9f0309a8ecc469d6c878ce33",
|
||||
"rev": "2d293cbfa5a793b4c50d17c05ef9e385b90edf6c",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
|
@ -36,14 +36,17 @@
|
|||
},
|
||||
"nixpkgs-lib": {
|
||||
"locked": {
|
||||
"lastModified": 1733096140,
|
||||
"narHash": "sha256-1qRH7uAUsyQI7R1Uwl4T+XvdNv778H0Nb5njNrqvylY=",
|
||||
"type": "tarball",
|
||||
"url": "https://github.com/NixOS/nixpkgs/archive/5487e69da40cbd611ab2cadee0b4637225f7cfae.tar.gz"
|
||||
"lastModified": 1761765539,
|
||||
"narHash": "sha256-b0yj6kfvO8ApcSE+QmA6mUfu8IYG6/uU28OFn4PaC8M=",
|
||||
"owner": "nix-community",
|
||||
"repo": "nixpkgs.lib",
|
||||
"rev": "719359f4562934ae99f5443f20aa06c2ffff91fc",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"type": "tarball",
|
||||
"url": "https://github.com/NixOS/nixpkgs/archive/5487e69da40cbd611ab2cadee0b4637225f7cfae.tar.gz"
|
||||
"owner": "nix-community",
|
||||
"repo": "nixpkgs.lib",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
|
|
|
|||
|
|
@ -25,10 +25,12 @@
|
|||
build = pkgs.writeShellScriptBin "build"
|
||||
''
|
||||
pandoc -t revealjs \
|
||||
-V revealjs-url=https://unpkg.com/reveal.js \
|
||||
--from markdown+yaml_metadata_block+link_attributes \
|
||||
-H src/header.html \
|
||||
-o public/index.html \
|
||||
-s \
|
||||
--slide-level 2 \
|
||||
src/index.md
|
||||
'';
|
||||
serve = pkgs.writeShellScriptBin "serve"
|
||||
|
|
@ -44,7 +46,7 @@
|
|||
shellHook = ''
|
||||
echo 1>&2 "Welcome to the development shell!"
|
||||
'';
|
||||
name = "glossary-devshell";
|
||||
name = "devshell";
|
||||
packages = [
|
||||
pkgs.pandoc
|
||||
pkgs.caddy
|
||||
|
|
|
|||
Binary file not shown.
|
After Width: | Height: | Size: 96 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 61 KiB |
|
|
@ -3,12 +3,12 @@
|
|||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="generator" content="pandoc">
|
||||
<title>Cardano Lightning</title>
|
||||
<title>Konduit.channel</title>
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui">
|
||||
<link rel="stylesheet" href="https://unpkg.com/reveal.js@^4//dist/reset.css">
|
||||
<link rel="stylesheet" href="https://unpkg.com/reveal.js@^4//dist/reveal.css">
|
||||
<link rel="stylesheet" href="https://unpkg.com/reveal.js/dist/reset.css">
|
||||
<link rel="stylesheet" href="https://unpkg.com/reveal.js/dist/reveal.css">
|
||||
<style>
|
||||
.reveal .sourceCode { /* see #7635 */
|
||||
overflow: visible;
|
||||
|
|
@ -29,21 +29,24 @@
|
|||
}
|
||||
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
|
||||
</style>
|
||||
<link rel="stylesheet" href="https://unpkg.com/reveal.js@^4//dist/theme/black.css" id="theme">
|
||||
<link rel="stylesheet" href="https://unpkg.com/reveal.js/dist/theme/black.css" id="theme">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&display=swap" rel="stylesheet">
|
||||
<style>
|
||||
body {
|
||||
font-family: ui-sans-serif;
|
||||
font-family: "JetBrains Mono", monospace;
|
||||
}
|
||||
.reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6
|
||||
.reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6
|
||||
{
|
||||
font-family:"TruenoSemiBold", "ui-sans-serif";
|
||||
font-family: "JetBrains Mono", monospace;
|
||||
}
|
||||
|
||||
@font-face{
|
||||
font-family:"TruenoSemiBold";
|
||||
src:local("TruenoSemiBold"),
|
||||
url("./fonts/TruenoSemiBold.woff2") format("woff2");
|
||||
font-family: "JetBrains Mono", monospace;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.black h2 {
|
||||
background-color: #020210;
|
||||
}
|
||||
|
|
@ -54,7 +57,6 @@
|
|||
|
||||
.reveal .slides p {
|
||||
margin: 2rem 0;
|
||||
text-align:left;
|
||||
}
|
||||
|
||||
.reveal .slides blockquote > p {
|
||||
|
|
@ -68,177 +70,150 @@
|
|||
<div class="slides">
|
||||
|
||||
<section id="title-slide" data-background-image="./assets/logo.png" data-background-opacity="0.3" data-background-size="contain">
|
||||
<h1 class="title">Cardano Lightning</h1>
|
||||
<p class="subtitle">Permissionless, near instant, highly scalable</p>
|
||||
<h1 class="title">Konduit.channel</h1>
|
||||
<p class="subtitle">(Actually why all* dapps should be L2s)</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<section id="problem" class="title-slide slide level2">
|
||||
<h2>Problem</h2>
|
||||
|
||||
</section>
|
||||
<section id="payments" class="slide level3">
|
||||
<h3>Payments</h3>
|
||||
<section id="outline" class="slide level2">
|
||||
<h2>Outline</h2>
|
||||
<ul>
|
||||
<li>A fundamental part of all commerce: payment.</li>
|
||||
<li>What is …</li>
|
||||
<li>Architecture</li>
|
||||
<li>HTLs</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section id="who" class="slide level3">
|
||||
<h3>Who?</h3>
|
||||
<p>There are three parties involved in a payment</p>
|
||||
<ul>
|
||||
<li>Consumer (ie payer)</li>
|
||||
<li>Provider (ie payee)</li>
|
||||
<li>Facilitator</li>
|
||||
</ul>
|
||||
<p>All of us are consumers, some are providers, a few are
|
||||
facilitators.</p>
|
||||
</section>
|
||||
<section id="what-users-want" class="slide level3">
|
||||
<h3>What users want</h3>
|
||||
<section id="what-is" class="slide level2">
|
||||
<h2>What is …</h2>
|
||||
<h3 id="konduit">Konduit?</h3>
|
||||
<blockquote>
|
||||
<p>Users want secure, fast, low cost transactions</p>
|
||||
<p>A Cardano to Bitcoin Lighting Pipe</p>
|
||||
</blockquote>
|
||||
<p>However participants have different priorities, <em>eg</em></p>
|
||||
<!--
|
||||
The first question is then "what is Bitcoin Lightning"
|
||||
-->
|
||||
<h3 id="bitcoin-lightning">Bitcoin Lightning?</h3>
|
||||
<p>… a payment protocol built on the bitcoin intended to enable fast
|
||||
transactions among participating nodes and has been proposed as a
|
||||
solution to the bitcoin scalability problem.</p>
|
||||
<!--
|
||||
A slightly trucated opening lines from the wikipedia page.
|
||||
Whoever provided or endorsed this version clearly thinks this point is moot.
|
||||
-->
|
||||
<h3 id="the-problem">The problem?</h3>
|
||||
<p><img data-src="./assets/does-it-scale.jpg" /></p>
|
||||
<ul>
|
||||
<li>Consumers want ease-of-use</li>
|
||||
<li>Providers want fast confirmation</li>
|
||||
<li>Facilitators need to handle at scale</li>
|
||||
<li>Scalability</li>
|
||||
<li>Finality</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section id="existing-systems-12" class="slide level3">
|
||||
<h3>Existing systems (1/2)</h3>
|
||||
<ul>
|
||||
<li>Cash: Permissionless, instant, scalable-ish (lots of people can use
|
||||
it at the same time, but only to pay people near them), questionable
|
||||
security (fraud happens).</li>
|
||||
<li>Bank transfer: Permissioned, some instant others very slow,
|
||||
scalable.</li>
|
||||
<li>Contactless/ Card: Permissioned, near instant, scalable</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section id="section" class="slide level3">
|
||||
<h3>… (2/2)</h3>
|
||||
<ul>
|
||||
<li>Decentralised Ledger *: permissionless, maybe fast or scalable but
|
||||
generally not both.</li>
|
||||
</ul>
|
||||
<p><span style="font-size: small"> * There are many different designs of
|
||||
decentralised ledger, each with different choices and trade-offs. Some
|
||||
permissioned, some more decentralised than others, some faster,
|
||||
<em>etc</em>. </span></p>
|
||||
</section>
|
||||
<section id="market-size" class="slide level3">
|
||||
<h3>Market size</h3>
|
||||
<ul>
|
||||
<li><p>Contactless transactions will reach $11 trillion by 2027 <span
|
||||
style="font-size: small"> source : Juniper Research </span></p></li>
|
||||
<li><p>Market Cap for crypto : > $3 trillion <span
|
||||
style="font-size: small"> source : coinmarketcap.com (Dec 2024)
|
||||
</span></p></li>
|
||||
</ul>
|
||||
</section>
|
||||
<section id="intersection" class="slide level3">
|
||||
<h3>Intersection</h3>
|
||||
<blockquote>
|
||||
<p>Can we have contactless like experience but permissionless.</p>
|
||||
</blockquote>
|
||||
</section>
|
||||
<section id="problem-statement" class="slide level3">
|
||||
<h3>Problem statement</h3>
|
||||
<p>We want a payment system that is:</p>
|
||||
<ol type="1">
|
||||
<li>Permissionless and secure</li>
|
||||
<li>Near instant</li>
|
||||
<li>Highly scalable</li>
|
||||
</ol>
|
||||
</section>
|
||||
<section id="bitcoin-lightning-network" class="slide level3">
|
||||
<h3>Bitcoin Lightning Network?</h3>
|
||||
<p>In a lightning network:</p>
|
||||
<ul>
|
||||
<li>The network is fundamentally a set of channels, not a shared
|
||||
ledger.</li>
|
||||
<li>There is no need to reach consensus, or globally broadcasting
|
||||
state.</li>
|
||||
<li>Payments are routed across channels by participants.</li>
|
||||
<li>Speed of payment isn’t a global property, but a more local one.</li>
|
||||
</ul>
|
||||
<p>BLN does this and is the closest to meeting our aims.</p>
|
||||
</section>
|
||||
<section id="problems-with-bln" class="slide level3">
|
||||
<h3>Problems with BLN</h3>
|
||||
<p>However it has some issues:</p>
|
||||
<ul>
|
||||
<li>Large technical and resource overhead to use. Every user must run a
|
||||
node.</li>
|
||||
<li>Difficult to efficiently manage capital. Liquidity is required to
|
||||
enable payments to be routed across a network. Moving capital between
|
||||
channels requires multiple transactions.</li>
|
||||
</ul>
|
||||
</section></section>
|
||||
<section>
|
||||
<section id="solution" class="title-slide slide level2">
|
||||
<h2>Solution</h2>
|
||||
<!--
|
||||
You cannot walk into a cafe, say, and purchase a coffee on the L1.
|
||||
Ok its probably fine (we have no traffic, long rollbacks don't happen. wink emoji).
|
||||
But it shouldn't make sense: We cannot have all the nodes handling everyone's morning coffee purchase.
|
||||
It does not scale.
|
||||
|
||||
In truth, we are not really competing with web2 on finality.
|
||||
Payment providers can retroactively deny payments (no source).
|
||||
-->
|
||||
</section>
|
||||
<section id="cardano-lightning" class="slide level3">
|
||||
<h3>Cardano Lightning</h3>
|
||||
</section>
|
||||
<section id="design" class="slide level3">
|
||||
<h3>Design</h3>
|
||||
<section id="lightning" class="slide level2">
|
||||
<h2>Lightning</h2>
|
||||
<!--
|
||||
A lightning round on Lightning network
|
||||
-->
|
||||
<h3 id="overview">Overview</h3>
|
||||
<ul>
|
||||
<li>A perturbation on BLN: its a Lightning Network</li>
|
||||
<li>Focused on addressing the key technical blockers to it being used as
|
||||
a day-to-day payment system.</li>
|
||||
<li>A network of two party channels</li>
|
||||
<li>L1: Each channel is “underwritten” by locked funds</li>
|
||||
<li>L2: exchange messages altering how and who can claim these
|
||||
funds</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section id="tailored-nodes" class="slide level3">
|
||||
<h3>Tailored Nodes</h3>
|
||||
<p>CL recognises a diversity users have a diversity of needs.</p>
|
||||
<ul>
|
||||
<li>For consumers we have a lightweight node, minimal resources, and
|
||||
runs on their phone.</li>
|
||||
<li>Some providers might be happy running their own servers, others
|
||||
wont. There’s a flexible CL node + SDK to suit a full spectrum of
|
||||
usecases.</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section id="leveraging-cardano" class="slide level3">
|
||||
<h3>Leveraging Cardano</h3>
|
||||
<ul>
|
||||
<li><p>Cardano’s more powerful scripting language allows us to achieve
|
||||
more with less.</p></li>
|
||||
<li><p>In particular we can optimize capital allocation for
|
||||
nodes.</p></li>
|
||||
<li><p>For the facilitators, we have a node for efficient handling of
|
||||
many channels concurrently. Those with capital and wanting to put it to
|
||||
use become the facilitators. They receive income on the service they
|
||||
provide, each payment they facilitate in routing.</p></li>
|
||||
</ul>
|
||||
</section></section>
|
||||
<section>
|
||||
<section id="team" class="title-slide slide level2">
|
||||
<h2>Team</h2>
|
||||
<!--
|
||||
Lightning is a network of two party channels.
|
||||
Each channel corresponds to a utxo holding the funds that underwrite L2 messages.
|
||||
For example you could have a channel with the coffee shop,
|
||||
and for each morning, you hand them (ie the L2) an IOU that allows
|
||||
|
||||
</section>
|
||||
<section id="section-1" class="slide level3">
|
||||
<h3></h3>
|
||||
Ok. How is this a network?
|
||||
Do i need a channel with everyone I want to pay? Whats the point.
|
||||
An asside: This is a super interesting setup.
|
||||
|
||||
Subscriptions are "handwave" a trillion dollar and growing.
|
||||
In some sectors we barely buy to own anymore. There's a
|
||||
|
||||
Shoe horning in another idea:
|
||||
The topology of our networks should reflect their use case.
|
||||
The L1 makes it as easy for anyone to pay anyone:
|
||||
a very flexible basis, but this is basically nobodies use case.
|
||||
I'm far more likely to pay somone i've already paid, than someone at random.
|
||||
-->
|
||||
<h3 id="hops">Hops</h3>
|
||||
<ul>
|
||||
<li><span class="citation" data-cites="waalge">@waalge</span></li>
|
||||
<li><span class="citation" data-cites="paluh">@paluh</span></li>
|
||||
<li><span class="citation" data-cites="nhenin">@nhenin</span></li>
|
||||
<li>2 channels: Alice <-> Bob; Bob <-> Charlie</li>
|
||||
<li>Alice ~> Charlie ?</li>
|
||||
<li>Alice ~> Bob ~> Charlie.</li>
|
||||
<li>Problem: Naive hops require trust</li>
|
||||
</ul>
|
||||
</section></section>
|
||||
<!--
|
||||
How to make a set of channels a network.
|
||||
-->
|
||||
<h3 id="htlcs">HTLCs</h3>
|
||||
<ul>
|
||||
<li>Hashed TimeLocked Contract (also, utxo and general mechanism).</li>
|
||||
<li>A contract parameterized by (<code>timeout</code>,
|
||||
<code>lock</code>, <code>payer</code>, <code>payee</code> ) with two
|
||||
spend:</li>
|
||||
<li>Two spend pathways:
|
||||
<ul>
|
||||
<li>Ok:
|
||||
<ul>
|
||||
<li>Before <code>timeout</code>,</li>
|
||||
<li>Has <code>secret</code> (<code>hash(secret) == lock</code>)</li>
|
||||
<li>Signed by <code>payee</code></li>
|
||||
</ul></li>
|
||||
<li>Ko:
|
||||
<ul>
|
||||
<li>After <code>timeout</code>,</li>
|
||||
<li>Has <code>payee</code></li>
|
||||
</ul></li>
|
||||
</ul></li>
|
||||
</ul>
|
||||
<!--
|
||||
This is a basic implementation of an HTLC.
|
||||
In practice we want to reuse the same locked funds multiple times,
|
||||
and for values, timeouts, and locks that are not apriori known.
|
||||
But ultimately, its some version of this.
|
||||
|
||||
This bit is the essence of an atomic swap.
|
||||
-->
|
||||
<h3 id="routes">Routes</h3>
|
||||
<ul>
|
||||
<li>C ~> A : Invoice including lock.</li>
|
||||
<li>A ~> B : HTLC with timeout <code>T</code> and lock</li>
|
||||
<li>B ~> C : HTLC with timeout <code>T - d</code> and lock</li>
|
||||
<li>C ~> B : Secret</li>
|
||||
<li>B ~> C : Commitment to pay (no htlc)</li>
|
||||
<li>B ~> A : Secret</li>
|
||||
<li>A ~> B : Commitment to pay (no htlc)</li>
|
||||
</ul>
|
||||
<!--
|
||||
This is the message flow
|
||||
This is a basic implementation of an HTLC.
|
||||
In practice we want to reuse the same locked funds multiple times,
|
||||
and for values, timeouts, and locks that are not apriori known.
|
||||
But ultimately, its some version of this.
|
||||
|
||||
This bit is the essence of an atomic swap.
|
||||
-->
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="https://unpkg.com/reveal.js@^4//dist/reveal.js"></script>
|
||||
<script src="https://unpkg.com/reveal.js/dist/reveal.js"></script>
|
||||
|
||||
<!-- reveal.js plugins -->
|
||||
<script src="https://unpkg.com/reveal.js@^4//plugin/notes/notes.js"></script>
|
||||
<script src="https://unpkg.com/reveal.js@^4//plugin/search/search.js"></script>
|
||||
<script src="https://unpkg.com/reveal.js@^4//plugin/zoom/zoom.js"></script>
|
||||
<script src="https://unpkg.com/reveal.js/plugin/notes/notes.js"></script>
|
||||
<script src="https://unpkg.com/reveal.js/plugin/search/search.js"></script>
|
||||
<script src="https://unpkg.com/reveal.js/plugin/zoom/zoom.js"></script>
|
||||
|
||||
<script>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,17 +1,20 @@
|
|||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&display=swap" rel="stylesheet">
|
||||
<style>
|
||||
body {
|
||||
font-family: ui-sans-serif;
|
||||
font-family: "JetBrains Mono", monospace;
|
||||
}
|
||||
.reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6
|
||||
.reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6
|
||||
{
|
||||
font-family:"TruenoSemiBold", "ui-sans-serif";
|
||||
font-family: "JetBrains Mono", monospace;
|
||||
}
|
||||
|
||||
@font-face{
|
||||
font-family:"TruenoSemiBold";
|
||||
src:local("TruenoSemiBold"),
|
||||
url("./fonts/TruenoSemiBold.woff2") format("woff2");
|
||||
font-family: "JetBrains Mono", monospace;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.black h2 {
|
||||
background-color: #020210;
|
||||
}
|
||||
|
|
@ -22,7 +25,6 @@ body {
|
|||
|
||||
.reveal .slides p {
|
||||
margin: 2rem 0;
|
||||
text-align:left;
|
||||
}
|
||||
|
||||
.reveal .slides blockquote > p {
|
||||
|
|
|
|||
187
src/index.md
187
src/index.md
|
|
@ -1,9 +1,7 @@
|
|||
---
|
||||
title: Cardano Lightning
|
||||
subtitle: Permissionless, near instant, highly scalable
|
||||
mainfont: TruenoSemiBold
|
||||
background-image: ./assets/background.svg
|
||||
background-opacity: "0.35"
|
||||
title: Konduit.channel
|
||||
subtitle: (Actually why all\* dapps should be L2s)
|
||||
mainfont: Monobrain
|
||||
title-slide-attributes:
|
||||
data-background-image: ./assets/logo.png
|
||||
data-background-size: contain
|
||||
|
|
@ -12,119 +10,130 @@ background-image: ./assets/background.svg
|
|||
background-opacity: "0.35"
|
||||
---
|
||||
|
||||
## Problem
|
||||
## Outline
|
||||
|
||||
### Payments
|
||||
- What is ...
|
||||
- Architecture
|
||||
- HTLs
|
||||
|
||||
- A fundamental part of all commerce: payment.
|
||||
## What is ...
|
||||
|
||||
### Who?
|
||||
### Konduit?
|
||||
|
||||
There are three parties involved in a payment
|
||||
> A Cardano to Bitcoin Lighting Pipe
|
||||
|
||||
- Consumer (ie payer)
|
||||
- Provider (ie payee)
|
||||
- Facilitator
|
||||
<!--
|
||||
The first question is then "what is Bitcoin Lightning"
|
||||
-->
|
||||
|
||||
All of us are consumers, some are providers, a few are facilitators.
|
||||
### Bitcoin Lightning?
|
||||
|
||||
### What users want
|
||||
... a payment protocol built on the bitcoin intended to enable fast transactions among participating nodes
|
||||
and has been proposed as a solution to the bitcoin scalability problem.
|
||||
|
||||
> Users want secure, fast, low cost transactions
|
||||
<!--
|
||||
A slightly trucated opening lines from the wikipedia page.
|
||||
Whoever provided or endorsed this version clearly thinks this point is moot.
|
||||
-->
|
||||
|
||||
However participants have different priorities, _eg_
|
||||
### The problem?
|
||||
|
||||
- Consumers want ease-of-use
|
||||
- Providers want fast confirmation
|
||||
- Facilitators need to handle at scale
|
||||

|
||||
|
||||
### Existing systems (1/2)
|
||||
- Scalability
|
||||
- Finality
|
||||
|
||||
- Cash: Permissionless, instant, scalable-ish (lots of people can use it at the same time, but only to pay people near them),
|
||||
questionable security (fraud happens).
|
||||
- Bank transfer: Permissioned, some instant others very slow, scalable.
|
||||
- Contactless/ Card: Permissioned, near instant, scalable
|
||||
<!--
|
||||
You cannot walk into a cafe, say, and purchase a coffee on the L1.
|
||||
Ok its probably fine (we have no traffic, long rollbacks don't happen. wink emoji).
|
||||
But it shouldn't make sense: We cannot have all the nodes handling everyone's morning coffee purchase.
|
||||
It does not scale.
|
||||
|
||||
### ... (2/2)
|
||||
In truth, we are not really competing with web2 on finality.
|
||||
Payment providers can retroactively deny payments (no source).
|
||||
-->
|
||||
|
||||
- Decentralised Ledger \*: permissionless, maybe fast or scalable but generally not both.
|
||||
## Lightning
|
||||
|
||||
<span style="font-size: small">
|
||||
\* There are many different designs of decentralised ledger,
|
||||
each with different choices and trade-offs.
|
||||
Some permissioned, some more decentralised than others, some faster, _etc_.
|
||||
</span>
|
||||
<!--
|
||||
A lightning round on Lightning network
|
||||
-->
|
||||
|
||||
### Market size
|
||||
### Overview
|
||||
|
||||
- A network of two party channels
|
||||
- L1: Each channel is "underwritten" by locked funds
|
||||
- L2: exchange messages altering how and who can claim these funds
|
||||
|
||||
- Contactless transactions will reach $11 trillion by 2027 <span style="font-size: small"> source : Juniper Research </span>
|
||||
<!--
|
||||
Lightning is a network of two party channels.
|
||||
Each channel corresponds to a utxo holding the funds that underwrite L2 messages.
|
||||
For example you could have a channel with the coffee shop,
|
||||
and for each morning, you hand them (ie the L2) an IOU that allows
|
||||
|
||||
- Market Cap for crypto : > $3 trillion <span style="font-size: small"> source : coinmarketcap.com (Dec 2024) </span>
|
||||
Ok. How is this a network?
|
||||
Do i need a channel with everyone I want to pay? Whats the point.
|
||||
An asside: This is a super interesting setup.
|
||||
|
||||
### Intersection
|
||||
Subscriptions are "handwave" a trillion dollar and growing.
|
||||
In some sectors we barely buy to own anymore. There's a
|
||||
|
||||
> Can we have contactless like experience but permissionless.
|
||||
Shoe horning in another idea:
|
||||
The topology of our networks should reflect their use case.
|
||||
The L1 makes it as easy for anyone to pay anyone:
|
||||
a very flexible basis, but this is basically nobodies use case.
|
||||
I'm far more likely to pay somone i've already paid, than someone at random.
|
||||
-->
|
||||
|
||||
### Problem statement
|
||||
### Hops
|
||||
|
||||
We want a payment system that is:
|
||||
- 2 channels: Alice <-> Bob; Bob <-> Charlie
|
||||
- Alice ~> Charlie ?
|
||||
- Alice ~> Bob ~> Charlie.
|
||||
- Problem: Naive hops require trust
|
||||
|
||||
1. Permissionless and secure
|
||||
2. Near instant
|
||||
3. Highly scalable
|
||||
<!--
|
||||
How to make a set of channels a network.
|
||||
-->
|
||||
|
||||
### Bitcoin Lightning Network?
|
||||
### HTLCs
|
||||
|
||||
In a lightning network:
|
||||
- Hashed TimeLocked Contract (also, utxo and general mechanism).
|
||||
- A contract parameterized by (`timeout`, `lock`, `payer`, `payee` ) with two spend:
|
||||
- Two spend pathways:
|
||||
- Ok:
|
||||
- Before `timeout`,
|
||||
- Has `secret` (`hash(secret) == lock`)
|
||||
- Signed by `payee`
|
||||
- Ko:
|
||||
- After `timeout`,
|
||||
- Has `payee`
|
||||
|
||||
- The network is fundamentally a set of channels, not a shared ledger.
|
||||
- There is no need to reach consensus, or globally broadcasting state.
|
||||
- Payments are routed across channels by participants.
|
||||
- Speed of payment isn't a global property, but a more local one.
|
||||
<!--
|
||||
This is a basic implementation of an HTLC.
|
||||
In practice we want to reuse the same locked funds multiple times,
|
||||
and for values, timeouts, and locks that are not apriori known.
|
||||
But ultimately, its some version of this.
|
||||
|
||||
BLN does this and is the closest to meeting our aims.
|
||||
This bit is the essence of an atomic swap.
|
||||
-->
|
||||
|
||||
### Problems with BLN
|
||||
### Routes
|
||||
|
||||
However it has some issues:
|
||||
- C ~> A : Invoice including lock.
|
||||
- A ~> B : HTLC with timeout `T` and lock
|
||||
- B ~> C : HTLC with timeout `T - d` and lock
|
||||
- C ~> B : Secret
|
||||
- B ~> C : Commitment to pay (no htlc)
|
||||
- B ~> A : Secret
|
||||
- A ~> B : Commitment to pay (no htlc)
|
||||
|
||||
- Large technical and resource overhead to use. Every user must run a node.
|
||||
- Difficult to efficiently manage capital.
|
||||
Liquidity is required to enable payments to be routed across a network.
|
||||
Moving capital between channels requires multiple transactions.
|
||||
<!--
|
||||
This is the message flow
|
||||
This is a basic implementation of an HTLC.
|
||||
In practice we want to reuse the same locked funds multiple times,
|
||||
and for values, timeouts, and locks that are not apriori known.
|
||||
But ultimately, its some version of this.
|
||||
|
||||
## Solution
|
||||
|
||||
### Cardano Lightning
|
||||
|
||||
### Design
|
||||
|
||||
- A perturbation on BLN: its a Lightning Network
|
||||
- Focused on addressing the key technical blockers
|
||||
to it being used as a day-to-day payment system.
|
||||
|
||||
### Tailored Nodes
|
||||
|
||||
CL recognises a diversity users have a diversity of needs.
|
||||
|
||||
- For consumers we have a lightweight node, minimal resources, and runs on their phone.
|
||||
- Some providers might be happy running their own servers, others wont.
|
||||
There's a flexible CL node + SDK to suit a full spectrum of usecases.
|
||||
|
||||
### Leveraging Cardano
|
||||
|
||||
- Cardano's more powerful scripting language allows
|
||||
us to achieve more with less. In particular we can optimize capital allocation for nodes.
|
||||
|
||||
- For the facilitators, we have a node for efficient handling of many channels concurrently.
|
||||
Those with capital and wanting to put it to use become the facilitators.
|
||||
They receive income on the service they provide, each payment they facilitate in routing.
|
||||
|
||||
## Team
|
||||
|
||||
###
|
||||
|
||||
- @waalge
|
||||
- @paluh
|
||||
- @nhenin
|
||||
This bit is the essence of an atomic swap.
|
||||
-->
|
||||
|
|
|
|||
|
|
@ -0,0 +1,116 @@
|
|||
|
||||
## Problem
|
||||
|
||||
### Payments
|
||||
|
||||
- A fundamental part of all commerce: payment.
|
||||
|
||||
<!--
|
||||
A slightly trucated opening lines from the wikipedia page.
|
||||
Whoever provided or endorsed this version clearly thinks this point is moot.
|
||||
-->
|
||||
|
||||
### Who?
|
||||
|
||||
There are three parties involved in a payment
|
||||
|
||||
- Consumer (ie payer)
|
||||
- Provider (ie payee)
|
||||
- Facilitator
|
||||
|
||||
All of us are consumers, some are providers, a few are facilitators.
|
||||
|
||||
### What users want
|
||||
|
||||
> Users want secure, fast, low cost transactions
|
||||
|
||||
However participants have different priorities, _eg_
|
||||
|
||||
- Consumers want ease-of-use
|
||||
- Providers want fast confirmation
|
||||
- Facilitators need to handle at scale
|
||||
|
||||
### Existing systems (1/2)
|
||||
|
||||
- Cash: Permissionless, instant, scalable-ish (lots of people can use it at the same time, but only to pay people near them),
|
||||
questionable security (fraud happens).
|
||||
- Bank transfer: Permissioned, some instant others very slow, scalable.
|
||||
- Contactless/ Card: Permissioned, near instant, scalable
|
||||
|
||||
### ... (2/2)
|
||||
|
||||
- Decentralised Ledger \*: permissionless, maybe fast or scalable but generally not both.
|
||||
|
||||
<span style="font-size: small">
|
||||
\* There are many different designs of decentralised ledger,
|
||||
each with different choices and trade-offs.
|
||||
Some permissioned, some more decentralised than others, some faster, _etc_.
|
||||
</span>
|
||||
|
||||
### Market size
|
||||
|
||||
|
||||
- Contactless transactions will reach $11 trillion by 2027 <span style="font-size: small"> source : Juniper Research </span>
|
||||
|
||||
- Market Cap for crypto : > $3 trillion <span style="font-size: small"> source : coinmarketcap.com (Dec 2024) </span>
|
||||
|
||||
### Intersection
|
||||
|
||||
> Can we have contactless like experience but permissionless.
|
||||
|
||||
### Problem statement
|
||||
|
||||
We want a payment system that is:
|
||||
|
||||
1. Permissionless and secure
|
||||
2. Near instant
|
||||
3. Highly scalable
|
||||
|
||||
### Bitcoin Lightning Network?
|
||||
|
||||
In a lightning network:
|
||||
|
||||
- The network is fundamentally a set of channels, not a shared ledger.
|
||||
- There is no need to reach consensus, or globally broadcasting state.
|
||||
- Payments are routed across channels by participants.
|
||||
- Speed of payment isn't a global property, but a more local one.
|
||||
|
||||
BLN does this and is the closest to meeting our aims.
|
||||
|
||||
### Problems with BLN
|
||||
|
||||
However it has some issues:
|
||||
|
||||
- Large technical and resource overhead to use. Every user must run a node.
|
||||
- Difficult to efficiently manage capital.
|
||||
Liquidity is required to enable payments to be routed across a network.
|
||||
Moving capital between channels requires multiple transactions.
|
||||
|
||||
## Solution
|
||||
|
||||
### Cardano Lightning
|
||||
|
||||
### Design
|
||||
|
||||
- A perturbation on BLN: its a Lightning Network
|
||||
- Focused on addressing the key technical blockers
|
||||
to it being used as a day-to-day payment system.
|
||||
|
||||
### Tailored Nodes
|
||||
|
||||
CL recognises a diversity users have a diversity of needs.
|
||||
|
||||
- For consumers we have a lightweight node, minimal resources, and runs on their phone.
|
||||
- Some providers might be happy running their own servers, others wont.
|
||||
There's a flexible CL node + SDK to suit a full spectrum of usecases.
|
||||
|
||||
### Leveraging Cardano
|
||||
|
||||
- Cardano's more powerful scripting language allows
|
||||
us to achieve more with less. In particular we can optimize capital allocation for nodes.
|
||||
|
||||
- For the facilitators, we have a node for efficient handling of many channels concurrently.
|
||||
Those with capital and wanting to put it to use become the facilitators.
|
||||
They receive income on the service they provide, each payment they facilitate in routing.
|
||||
|
||||
## Team
|
||||
|
|
@ -0,0 +1,795 @@
|
|||
<!DOCTYPE html>
|
||||
<html$if(lang)$ lang="$lang$"$endif$$if(dir)$ dir="$dir$"$endif$>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="generator" content="pandoc">
|
||||
$for(author-meta)$
|
||||
<meta name="author" content="$author-meta$" />
|
||||
$endfor$
|
||||
$if(date-meta)$
|
||||
<meta name="dcterms.date" content="$date-meta$" />
|
||||
$endif$
|
||||
$if(keywords)$
|
||||
<meta name="keywords" content="$for(keywords)$$keywords$$sep$, $endfor$">
|
||||
$endif$
|
||||
<title>$if(title-prefix)$$title-prefix$ – $endif$$pagetitle$</title>
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui">
|
||||
<link rel="stylesheet" href="$revealjs-url$/css/reveal.css"/>
|
||||
|
||||
$if(highlightjs)$
|
||||
<link rel="stylesheet"
|
||||
href="$highlightjs$/$if(highlightjs-theme)$$highlightjs-theme$$else$default$endif$.css"
|
||||
$if(html5)$$else$type="text/css" $endif$/>
|
||||
<script src="$highlightjs$/highlight.js"></script>
|
||||
$endif$
|
||||
|
||||
$if(highlighting-css)$
|
||||
<style type="text/css">
|
||||
$highlighting-css$
|
||||
</style>
|
||||
$endif$
|
||||
|
||||
$if(theme)$
|
||||
<link rel="stylesheet" href="$revealjs-url$/css/theme/$theme$.css" id="theme">
|
||||
$endif$
|
||||
|
||||
$if(theme-dark)$
|
||||
<style type="text/css">
|
||||
.reveal section img {
|
||||
background: rgba(255, 255, 255, 0.85);
|
||||
}
|
||||
</style>
|
||||
$endif$
|
||||
|
||||
<!-- some tweaks to reveal css -->
|
||||
<style type="text/css">
|
||||
.reveal h1 { font-size: 2.0em; }
|
||||
.reveal h2 { font-size: 1.5em; }
|
||||
.reveal h3 { font-size: 1.25em; }
|
||||
.reveal h4 { font-size: 1em; }
|
||||
|
||||
.reveal .slides>section,
|
||||
.reveal .slides>section>section {
|
||||
padding: 0px 0px;
|
||||
}
|
||||
|
||||
$if(center)$
|
||||
|
||||
$else$
|
||||
.reveal .title {
|
||||
margin-top: 125px;
|
||||
margin-bottom: 50px;
|
||||
}
|
||||
$endif$
|
||||
|
||||
.reveal table {
|
||||
border-width: 1px;
|
||||
border-spacing: 2px;
|
||||
border-style: dotted;
|
||||
border-color: gray;
|
||||
border-collapse: collapse;
|
||||
font-size: 0.7em;
|
||||
}
|
||||
|
||||
.reveal table th {
|
||||
border-width: 1px;
|
||||
padding-left: 10px;
|
||||
padding-right: 25px;
|
||||
font-weight: bold;
|
||||
border-style: dotted;
|
||||
border-color: gray;
|
||||
}
|
||||
|
||||
.reveal table td {
|
||||
border-width: 1px;
|
||||
padding-left: 10px;
|
||||
padding-right: 25px;
|
||||
border-style: dotted;
|
||||
border-color: gray;
|
||||
}
|
||||
|
||||
$if(plugin-menu)$
|
||||
$if(plugin-chalkboard)$
|
||||
.reveal .slide-menu-button {
|
||||
left: 105px !important;
|
||||
}
|
||||
$endif$
|
||||
$endif$
|
||||
|
||||
</style>
|
||||
|
||||
<style type="text/css">code{white-space: pre;}</style>
|
||||
|
||||
$if(css)$
|
||||
$for(css)$
|
||||
<link rel="stylesheet" href="$css$"/>
|
||||
$endfor$
|
||||
$endif$
|
||||
|
||||
<!-- Printing and PDF exports -->
|
||||
<script id="paper-css" type="application/dynamic-css">
|
||||
|
||||
/* Default Print Stylesheet Template
|
||||
by Rob Glazebrook of CSSnewbie.com
|
||||
Last Updated: June 4, 2008
|
||||
|
||||
Feel free (nay, compelled) to edit, append, and
|
||||
manipulate this file as you see fit. */
|
||||
|
||||
|
||||
@media print {
|
||||
|
||||
/* SECTION 1: Set default width, margin, float, and
|
||||
background. This prevents elements from extending
|
||||
beyond the edge of the printed page, and prevents
|
||||
unnecessary background images from printing */
|
||||
html {
|
||||
background: #fff;
|
||||
width: auto;
|
||||
height: auto;
|
||||
overflow: visible;
|
||||
}
|
||||
body {
|
||||
background: #fff;
|
||||
font-size: 20pt;
|
||||
width: auto;
|
||||
height: auto;
|
||||
border: 0;
|
||||
margin: 0 5%;
|
||||
padding: 0;
|
||||
overflow: visible;
|
||||
float: none !important;
|
||||
}
|
||||
|
||||
/* SECTION 2: Remove any elements not needed in print.
|
||||
This would include navigation, ads, sidebars, etc. */
|
||||
.nestedarrow,
|
||||
.controls,
|
||||
.fork-reveal,
|
||||
.share-reveal,
|
||||
.state-background,
|
||||
.reveal .progress,
|
||||
.reveal .backgrounds {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
/* SECTION 3: Set body font face, size, and color.
|
||||
Consider using a serif font for readability. */
|
||||
body, p, td, li, div {
|
||||
font-size: 20pt!important;
|
||||
font-family: Georgia, "Times New Roman", Times, serif !important;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
/* SECTION 4: Set heading font face, sizes, and color.
|
||||
Differentiate your headings from your body text.
|
||||
Perhaps use a large sans-serif for distinction. */
|
||||
h1,h2,h3,h4,h5,h6 {
|
||||
color: #000!important;
|
||||
height: auto;
|
||||
line-height: normal;
|
||||
font-family: Georgia, "Times New Roman", Times, serif !important;
|
||||
text-shadow: 0 0 0 #000 !important;
|
||||
text-align: left;
|
||||
letter-spacing: normal;
|
||||
}
|
||||
/* Need to reduce the size of the fonts for printing */
|
||||
h1 { font-size: 28pt !important; }
|
||||
h2 { font-size: 24pt !important; }
|
||||
h3 { font-size: 22pt !important; }
|
||||
h4 { font-size: 22pt !important; font-variant: small-caps; }
|
||||
h5 { font-size: 21pt !important; }
|
||||
h6 { font-size: 20pt !important; font-style: italic; }
|
||||
|
||||
/* SECTION 5: Make hyperlinks more usable.
|
||||
Ensure links are underlined, and consider appending
|
||||
the URL to the end of the link for usability. */
|
||||
a:link,
|
||||
a:visited {
|
||||
color: #000 !important;
|
||||
font-weight: bold;
|
||||
text-decoration: underline;
|
||||
}
|
||||
/*
|
||||
.reveal a:link:after,
|
||||
.reveal a:visited:after {
|
||||
content: " (" attr(href) ") ";
|
||||
color: #222 !important;
|
||||
font-size: 90%;
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
/* SECTION 6: more reveal.js specific additions by @skypanther */
|
||||
ul, ol, div, p {
|
||||
visibility: visible;
|
||||
position: static;
|
||||
width: auto;
|
||||
height: auto;
|
||||
display: block;
|
||||
overflow: visible;
|
||||
margin: 0;
|
||||
text-align: left !important;
|
||||
}
|
||||
.reveal pre,
|
||||
.reveal table {
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
}
|
||||
.reveal pre code {
|
||||
padding: 20px;
|
||||
border: 1px solid #ddd;
|
||||
}
|
||||
.reveal blockquote {
|
||||
margin: 20px 0;
|
||||
}
|
||||
.reveal .slides {
|
||||
position: static !important;
|
||||
width: auto !important;
|
||||
height: auto !important;
|
||||
|
||||
left: 0 !important;
|
||||
top: 0 !important;
|
||||
margin-left: 0 !important;
|
||||
margin-top: 0 !important;
|
||||
padding: 0 !important;
|
||||
zoom: 1 !important;
|
||||
|
||||
overflow: visible !important;
|
||||
display: block !important;
|
||||
|
||||
text-align: left !important;
|
||||
-webkit-perspective: none;
|
||||
-moz-perspective: none;
|
||||
-ms-perspective: none;
|
||||
perspective: none;
|
||||
|
||||
-webkit-perspective-origin: 50% 50%;
|
||||
-moz-perspective-origin: 50% 50%;
|
||||
-ms-perspective-origin: 50% 50%;
|
||||
perspective-origin: 50% 50%;
|
||||
}
|
||||
.reveal .slides section {
|
||||
visibility: visible !important;
|
||||
position: static !important;
|
||||
width: auto !important;
|
||||
height: auto !important;
|
||||
display: block !important;
|
||||
overflow: visible !important;
|
||||
|
||||
left: 0 !important;
|
||||
top: 0 !important;
|
||||
margin-left: 0 !important;
|
||||
margin-top: 0 !important;
|
||||
padding: 60px 20px !important;
|
||||
z-index: auto !important;
|
||||
|
||||
opacity: 1 !important;
|
||||
|
||||
page-break-after: always !important;
|
||||
|
||||
-webkit-transform-style: flat !important;
|
||||
-moz-transform-style: flat !important;
|
||||
-ms-transform-style: flat !important;
|
||||
transform-style: flat !important;
|
||||
|
||||
-webkit-transform: none !important;
|
||||
-moz-transform: none !important;
|
||||
-ms-transform: none !important;
|
||||
transform: none !important;
|
||||
|
||||
-webkit-transition: none !important;
|
||||
-moz-transition: none !important;
|
||||
-ms-transition: none !important;
|
||||
transition: none !important;
|
||||
}
|
||||
.reveal .slides section.stack {
|
||||
padding: 0 !important;
|
||||
}
|
||||
.reveal section:last-of-type {
|
||||
page-break-after: avoid !important;
|
||||
}
|
||||
.reveal section .fragment {
|
||||
opacity: 1 !important;
|
||||
visibility: visible !important;
|
||||
|
||||
-webkit-transform: none !important;
|
||||
-moz-transform: none !important;
|
||||
-ms-transform: none !important;
|
||||
transform: none !important;
|
||||
}
|
||||
.reveal section img {
|
||||
display: block;
|
||||
margin: 15px 0px;
|
||||
background: rgba(255,255,255,1);
|
||||
border: 1px solid #666;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.reveal section small {
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
<script id="pdf-css" type="application/dynamic-css">
|
||||
|
||||
/**
|
||||
* This stylesheet is used to print reveal.js
|
||||
* presentations to PDF.
|
||||
*
|
||||
* https://github.com/hakimel/reveal.js#pdf-export
|
||||
*/
|
||||
|
||||
* {
|
||||
-webkit-print-color-adjust: exact;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0 auto !important;
|
||||
border: 0;
|
||||
padding: 0;
|
||||
float: none !important;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
html {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
/* Remove any elements not needed in print. */
|
||||
.nestedarrow,
|
||||
.reveal .controls,
|
||||
.reveal .progress,
|
||||
.reveal .playback,
|
||||
.reveal.overview,
|
||||
.fork-reveal,
|
||||
.share-reveal,
|
||||
.state-background {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
text-shadow: 0 0 0 #000 !important;
|
||||
}
|
||||
|
||||
.reveal pre code {
|
||||
overflow: hidden !important;
|
||||
font-family: Courier, 'Courier New', monospace !important;
|
||||
}
|
||||
|
||||
ul, ol, div, p {
|
||||
visibility: visible;
|
||||
position: static;
|
||||
width: auto;
|
||||
height: auto;
|
||||
display: block;
|
||||
overflow: visible;
|
||||
margin: auto;
|
||||
}
|
||||
.reveal {
|
||||
width: auto !important;
|
||||
height: auto !important;
|
||||
overflow: hidden !important;
|
||||
}
|
||||
.reveal .slides {
|
||||
position: static;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
|
||||
left: auto;
|
||||
top: auto;
|
||||
margin: 0 !important;
|
||||
padding: 0 !important;
|
||||
|
||||
overflow: visible;
|
||||
display: block;
|
||||
|
||||
-webkit-perspective: none;
|
||||
-moz-perspective: none;
|
||||
-ms-perspective: none;
|
||||
perspective: none;
|
||||
|
||||
-webkit-perspective-origin: 50% 50%; /* there isn't a none/auto value but 50-50 is the default */
|
||||
-moz-perspective-origin: 50% 50%;
|
||||
-ms-perspective-origin: 50% 50%;
|
||||
perspective-origin: 50% 50%;
|
||||
}
|
||||
|
||||
.reveal .slides section {
|
||||
page-break-after: always !important;
|
||||
|
||||
visibility: visible !important;
|
||||
position: relative !important;
|
||||
display: block !important;
|
||||
position: relative !important;
|
||||
|
||||
margin: 0 !important;
|
||||
padding: 0 !important;
|
||||
box-sizing: border-box !important;
|
||||
min-height: 1px;
|
||||
|
||||
opacity: 1 !important;
|
||||
|
||||
-webkit-transform-style: flat !important;
|
||||
-moz-transform-style: flat !important;
|
||||
-ms-transform-style: flat !important;
|
||||
transform-style: flat !important;
|
||||
|
||||
-webkit-transform: none !important;
|
||||
-moz-transform: none !important;
|
||||
-ms-transform: none !important;
|
||||
transform: none !important;
|
||||
}
|
||||
|
||||
.reveal section.stack {
|
||||
margin: 0 !important;
|
||||
padding: 0 !important;
|
||||
page-break-after: avoid !important;
|
||||
height: auto !important;
|
||||
min-height: auto !important;
|
||||
}
|
||||
|
||||
.reveal img {
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.reveal .roll {
|
||||
overflow: visible;
|
||||
line-height: 1em;
|
||||
}
|
||||
|
||||
/* Slide backgrounds are placed inside of their slide when exporting to PDF */
|
||||
.reveal section .slide-background {
|
||||
display: block !important;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
/* All elements should be above the slide-background */
|
||||
.reveal section>* {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
/* Display slide speaker notes when 'showNotes' is enabled */
|
||||
.reveal .speaker-notes-pdf {
|
||||
display: block;
|
||||
width: 100%;
|
||||
max-height: none;
|
||||
left: auto;
|
||||
top: auto;
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
/* Display slide numbers when 'slideNumber' is enabled */
|
||||
.reveal .slide-number-pdf {
|
||||
display: block;
|
||||
position: absolute;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
<script>
|
||||
var style = document.createElement( 'style' );
|
||||
style.type = 'text/css';
|
||||
var style_script_id = window.location.search.match( /print-pdf/gi ) ? 'pdf-css' : 'paper-css';
|
||||
var style_script = document.getElementById(style_script_id).text;
|
||||
style.innerHTML = style_script;
|
||||
document.getElementsByTagName('head')[0].appendChild(style);
|
||||
</script>
|
||||
|
||||
$for(header-includes)$
|
||||
$header-includes$
|
||||
$endfor$
|
||||
</head>
|
||||
<body>
|
||||
$for(include-before)$
|
||||
$include-before$
|
||||
$endfor$
|
||||
<div class="reveal">
|
||||
<div class="slides">
|
||||
|
||||
$if(title)$
|
||||
<section>
|
||||
<h1 class="title">$title$</h1>
|
||||
$if(subtitle)$
|
||||
<h1 class="subtitle">$subtitle$</h1>
|
||||
$endif$
|
||||
$for(author)$
|
||||
<h2 class="author">$author$</h2>
|
||||
$endfor$
|
||||
$if(date)$
|
||||
<h3 class="date">$date$</h3>
|
||||
$endif$
|
||||
</section>
|
||||
$endif$
|
||||
$if(toc)$
|
||||
<section id="$idprefix$TOC">
|
||||
$toc$
|
||||
</section>
|
||||
$endif$
|
||||
|
||||
$body$
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="$revealjs-url$/lib/js/head.min.js"></script>
|
||||
<script src="$revealjs-url$/js/reveal.js"></script>
|
||||
|
||||
<script>
|
||||
|
||||
// Full list of configuration options available at:
|
||||
// https://revealjs.com/config/
|
||||
Reveal.initialize({
|
||||
$if(controls)$
|
||||
// Display controls in the bottom right corner
|
||||
controls: $controls$,
|
||||
$endif$
|
||||
$if(progress)$
|
||||
// Display a presentation progress bar
|
||||
progress: $progress$,
|
||||
$endif$
|
||||
$if(slideNumber)$
|
||||
// Display the page number of the current slide
|
||||
// - true: Show slide number
|
||||
// - false: Hide slide number
|
||||
//
|
||||
// Can optionally be set as a string that specifies the number formatting:
|
||||
// - "h.v": Horizontal . vertical slide number (default)
|
||||
// - "h/v": Horizontal / vertical slide number
|
||||
// - "c": Flattened slide number
|
||||
// - "c/t": Flattened slide number / total slides
|
||||
slideNumber: $slideNumber$,
|
||||
$endif$
|
||||
$if(history)$
|
||||
// Push each slide change to the browser history
|
||||
history: $history$,
|
||||
$endif$
|
||||
$if(keyboard)$
|
||||
// Enable keyboard shortcuts for navigation
|
||||
keyboard: $keyboard$,
|
||||
$endif$
|
||||
$if(overview)$
|
||||
// Enable the slide overview mode
|
||||
overview: $overview$,
|
||||
$endif$
|
||||
$if(center)$
|
||||
// Vertical centering of slides
|
||||
center: $center$,
|
||||
$endif$
|
||||
$if(touch)$
|
||||
// Enables touch navigation on devices with touch input
|
||||
touch: $touch$,
|
||||
$endif$
|
||||
$if(loop)$
|
||||
// Loop the presentation
|
||||
loop: $loop$,
|
||||
$endif$
|
||||
$if(rtl)$
|
||||
// Change the presentation direction to be RTL
|
||||
rtl: $rtl$,
|
||||
$endif$
|
||||
$if(fragments)$
|
||||
// Turns fragments on and off globally
|
||||
fragments: $fragments$,
|
||||
$endif$
|
||||
$if(embedded)$
|
||||
// Flags if the presentation is running in an embedded mode,
|
||||
// i.e. contained within a limited portion of the screen
|
||||
embedded: $embedded$,
|
||||
$endif$
|
||||
$if(help)$
|
||||
// Flags if we should show a help overlay when the questionmark
|
||||
// key is pressed
|
||||
help: $help$,
|
||||
$endif$
|
||||
$if(autoSlide)$
|
||||
// Number of milliseconds between automatically proceeding to the
|
||||
// next slide, disabled when set to 0, this value can be overwritten
|
||||
// by using a data-autoslide attribute on your slides
|
||||
autoSlide: $autoSlide$,
|
||||
$endif$
|
||||
$if(autoSlideStoppable)$
|
||||
// Stop auto-sliding after user input
|
||||
autoSlideStoppable: $autoSlideStoppable$,
|
||||
$endif$
|
||||
$if(mouseWheel)$
|
||||
// Enable slide navigation via mouse wheel
|
||||
mouseWheel: $mouseWheel$,
|
||||
$endif$
|
||||
$if(hideAddressBar)$
|
||||
// Hides the address bar on mobile devices
|
||||
hideAddressBar: $hideAddressBar$,
|
||||
$endif$
|
||||
$if(previewLinks)$
|
||||
// Opens links in an iframe preview overlay
|
||||
previewLinks: $previewLinks$,
|
||||
$endif$
|
||||
$if(transition)$
|
||||
// Transition style
|
||||
transition: '$transition$', // none/fade/slide/convex/concave/zoom
|
||||
$endif$
|
||||
$if(transitionSpeed)$
|
||||
// Transition speed
|
||||
transitionSpeed: '$transitionSpeed$', // default/fast/slow
|
||||
$endif$
|
||||
$if(backgroundTransition)$
|
||||
// Transition style for full page slide backgrounds
|
||||
backgroundTransition: '$backgroundTransition$', // none/fade/slide/convex/concave/zoom
|
||||
$endif$
|
||||
$if(viewDistance)$
|
||||
// Number of slides away from the current that are visible
|
||||
viewDistance: $viewDistance$,
|
||||
$endif$
|
||||
$if(parallaxBackgroundImage)$
|
||||
// Parallax background image
|
||||
parallaxBackgroundImage: '$parallaxBackgroundImage$', // e.g. "'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg'"
|
||||
$endif$
|
||||
$if(parallaxBackgroundSize)$
|
||||
// Parallax background size
|
||||
parallaxBackgroundSize: '$parallaxBackgroundSize$', // CSS syntax, e.g. "2100px 900px"
|
||||
$endif$
|
||||
$if(parallaxBackgroundHorizontal)$
|
||||
// Amount to move parallax background (horizontal and vertical) on slide change
|
||||
// Number, e.g. 100
|
||||
parallaxBackgroundHorizontal: '$parallaxBackgroundHorizontal$',
|
||||
$endif$
|
||||
$if(parallaxBackgroundVertical)$
|
||||
parallaxBackgroundVertical: '$parallaxBackgroundVertical$',
|
||||
$endif$
|
||||
$if(width)$
|
||||
// The "normal" size of the presentation, aspect ratio will be preserved
|
||||
// when the presentation is scaled to fit different resolutions. Can be
|
||||
// specified using percentage units.
|
||||
width: $width$,
|
||||
$endif$
|
||||
$if(height)$
|
||||
height: $height$,
|
||||
$endif$
|
||||
$if(margin)$
|
||||
// Factor of the display size that should remain empty around the content
|
||||
margin: $margin$,
|
||||
$endif$
|
||||
$if(minScale)$
|
||||
// Bounds for smallest/largest possible scale to apply to content
|
||||
minScale: $minScale$,
|
||||
$endif$
|
||||
$if(maxScale)$
|
||||
maxScale: $maxScale$,
|
||||
$endif$
|
||||
|
||||
$if(plugin-menu)$
|
||||
menu: {
|
||||
$if(menu-side)$
|
||||
side: $menu-side$,
|
||||
$endif$
|
||||
$if(menu-numbers)$
|
||||
numbers: $menu-numbers$,
|
||||
$endif$
|
||||
$if(menu-titleSelector)$
|
||||
titleSelector: $menu-titleSelector$,
|
||||
$endif$
|
||||
$if(menu-hideMissingTitles)$
|
||||
hideMissingTitles: $menu-hideMissingTitles$,
|
||||
$endif$
|
||||
$if(menu-markers)$
|
||||
markers: $menu-markers$,
|
||||
$endif$
|
||||
$if(menu-openButton)$
|
||||
openButton: $menu-openButton$,
|
||||
$endif$
|
||||
$if(menu-openSlideNumber)$
|
||||
openSlideNumber: $menu-openSlideNumber$,
|
||||
$endif$
|
||||
$if(menu-keyboard)$
|
||||
keyboard: $menu-keyboard$,
|
||||
$endif$
|
||||
custom: false,
|
||||
themes: false,
|
||||
transitions: false
|
||||
},
|
||||
|
||||
$endif$
|
||||
|
||||
$if(plugin-chalkboard)$
|
||||
|
||||
chalkboard: {
|
||||
$if(chalkboard-src)$
|
||||
src: $chalkboard-src$,
|
||||
$endif$
|
||||
$if(chalkboard-readOnly)$
|
||||
readOnly: $chalkboard-readOnly$,
|
||||
$endif$
|
||||
$if(chalkboard-toggleNotesButton)$
|
||||
toggleNotesButton: $chalkboard-toggleNotesButton$,
|
||||
$endif$
|
||||
$if(chalkboard-toggleChalkboardButton)$
|
||||
toggleChalkboardButton: $chalkboard-toggleChalkboardButton$,
|
||||
$endif$
|
||||
$if(chalkboard-transition)$
|
||||
transition: $chalkboard-transition$,
|
||||
$endif$
|
||||
$if(chalkboard-theme)$
|
||||
theme: '$chalkboard-theme$',
|
||||
$endif$
|
||||
$if(chalkboard-color)$
|
||||
color: $chalkboard-color$,
|
||||
$endif$
|
||||
$if(chalkboard-background)$
|
||||
background: $chalkboard-background$,
|
||||
$endif$
|
||||
$if(chalkboard-pen)$
|
||||
pen: $chalkboard-pen$,
|
||||
$endif$
|
||||
},
|
||||
|
||||
keyboard: {
|
||||
67: function() { RevealChalkboard.toggleNotesCanvas() }, // toggle notes canvas when 'c' is pressed
|
||||
66: function() { RevealChalkboard.toggleChalkboard() }, // toggle chalkboard when 'b' is pressed
|
||||
46: function() { RevealChalkboard.clear() }, // clear chalkboard when 'DEL' is pressed
|
||||
8: function() { RevealChalkboard.reset() }, // reset chalkboard data on current slide when 'BACKSPACE' is pressed
|
||||
68: function() { RevealChalkboard.download() }, // downlad recorded chalkboard drawing when 'd' is pressed
|
||||
},
|
||||
$endif$
|
||||
|
||||
// Optional reveal.js plugins
|
||||
dependencies: [
|
||||
$if(plugin-notes)$
|
||||
{ src: '$revealjs-url$/plugin/notes/notes.js', async: true },
|
||||
$endif$
|
||||
$if(plugin-search)$
|
||||
{ src: '$revealjs-url$/plugin/search/search.js', async: true },
|
||||
$endif$
|
||||
$if(plugin-zoom)$
|
||||
{ src: '$revealjs-url$/plugin/zoom-js/zoom.js', async: true },
|
||||
$endif$
|
||||
$if(plugin-chalkboard)$
|
||||
{ src: '$revealjs-url$/plugin/chalkboard/chalkboard.js', async: true },
|
||||
$endif$
|
||||
$if(plugin-menu)$
|
||||
{ src: '$revealjs-url$/plugin/menu/menu.js', async: true },
|
||||
$endif$
|
||||
]
|
||||
});
|
||||
</script>
|
||||
$if(mathjax-url)$
|
||||
<!-- dynamically load mathjax for compatibility with self-contained -->
|
||||
<script>
|
||||
(function () {
|
||||
var script = document.createElement("script");
|
||||
script.type = "text/javascript";
|
||||
script.src = "$mathjax-url$";
|
||||
document.getElementsByTagName("head")[0].appendChild(script);
|
||||
})();
|
||||
</script>
|
||||
$endif$
|
||||
|
||||
<script>
|
||||
(function() {
|
||||
if (window.jQuery) {
|
||||
Reveal.addEventListener( 'slidechanged', function(event) {
|
||||
window.jQuery(event.previousSlide).trigger('hidden');
|
||||
window.jQuery(event.currentSlide).trigger('shown');
|
||||
});
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
|
||||
$for(include-after)$
|
||||
$include-after$
|
||||
$endfor$
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Loading…
Reference in New Issue