banca / site / index.html
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>banca — a serverless p2p bank among friends</title>
<style>
  :root {
    --bg: #0d1117; --panel: #161b22; --panel-2: #1c2129; --border: #262c36;
    --text: #e6edf3; --muted: #8b949e; --accent: #3fb68b; --accent-2: #2ea043;
  }
  * { margin: 0; padding: 0; box-sizing: border-box; }
  body {
    background: var(--bg); color: var(--text);
    font: 16px/1.6 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
    padding: 40px 20px 80px;
  }
  main { max-width: 780px; margin: 0 auto; }
  h1 { font-size: 34px; letter-spacing: 1px; }
  h1 .coin { font-size: 26px; }
  .tag { color: var(--muted); margin: 6px 0 30px; font-size: 17px; }
  h2 { margin: 44px 0 12px; font-size: 22px; color: var(--accent); }
  h3 { margin: 24px 0 8px; font-size: 17px; }
  p, li { color: #c9d3dd; }
  ul { padding-left: 22px; margin: 10px 0; }
  li { margin: 5px 0; }
  a { color: var(--accent); }
  pre {
    background: var(--panel); border: 1px solid var(--border); border-radius: 10px;
    padding: 14px 16px; overflow-x: auto; margin: 12px 0;
    font: 13.5px/1.55 ui-monospace, SFMono-Regular, Menlo, monospace;
  }
  code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 14px;
    background: var(--panel-2); border-radius: 5px; padding: 1px 6px; }
  pre code { background: none; padding: 0; }
  .card {
    background: var(--panel); border: 1px solid var(--border); border-radius: 12px;
    padding: 18px 20px; margin: 14px 0;
  }
  .grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 12px; }
  .muted { color: var(--muted); font-size: 14px; }
  .btn {
    display: inline-block; background: var(--accent-2); color: #fff; text-decoration: none;
    font-weight: 600; border-radius: 10px; padding: 12px 22px; margin: 8px 12px 8px 0;
  }
  .btn.ghost { background: var(--panel-2); border: 1px solid var(--border); }
  footer { margin-top: 60px; color: var(--muted); font-size: 13px; }
  .langs {
    position: fixed; top: 12px; right: 14px; color: var(--muted); font-size: 13px;
    letter-spacing: .06em; user-select: none;
  }
  .langs button {
    font: inherit; color: inherit; background: none; border: 0; padding: 3px 4px;
    cursor: pointer; opacity: .55;
  }
  .langs button.on { color: var(--accent); opacity: 1; }
</style>
</head>
<body>
<nav class="langs" id="langs"></nav>

<main data-lang-block lang="en">
  <h1><span class="coin">🪙</span> banca</h1>
  <p class="tag">a <strong>serverless p2p bank among friends</strong> — found one, issue its money, make payments final. No server, no accounts; this page is also the git repo.</p>

  <a class="btn" href="https://banca.ardegazu.ro">open the live bank</a>
  <a class="btn ghost" href="browse/index.html">browse the code</a>
  <a class="btn ghost" href="#clone">clone the repo</a>

  <h2 id="clone">Clone</h2>
  <p>This site serves the repository over git's dumb-HTTP protocol as plain static files (plain files — there is no git server here, or any server at all):</p>
  <pre><code>git clone https://git.ardegazu.ro/banca.git
cd banca</code></pre>

  <h2>What it is</h2>
  <p>Any identity can found a bank: charter a currency, take customers, mint, settle
  payments. A bank is <strong>one end-to-end-encrypted replicated log</strong> and its
  link — <code>#&lt;secret&gt;.&lt;bankerPub&gt;</code> — is the whole capability: who
  the banker is falls out of the URL before a single entry is read, and the ledger
  lives only on its members' devices. No server holds it, or could.</p>
  <p>Payments settle <strong>provisionally</strong> the moment they replicate — two
  customers standing in a market converge with the banker asleep — and become
  <strong>final</strong> when the banker acknowledges them. Acknowledged money carries a
  portable <a href="https://git.ardegazu.ro/wallet-kit">wallet-kit</a> receipt that
  verifies on its own, in any wallet, with the bank offline. The interface never blurs
  the two states; that distinction is the product. And the neutral unit of account, the
  <strong>gaz</strong> (GAZ), is reserved: a charter claiming it is refused for every
  banker — nobody can issue it.</p>
  <p>Installable PWA, safe-area aware, works from any static file host.</p>

  <h2>What's in the repo</h2>
  <div class="grid">
    <div class="card"><h3>client/src/banca/lib/ — the bank</h3>
      <p class="muted"><code>protocol.cljs</code> — the BANK/1 op union; <code>fold.cljs</code> — the settlement fold, a pure replay of the whole history (no window, no eviction: a fold that forgot would be a fold that lied); <code>wallet.cljs</code> + <code>view.cljs</code> — receipts and the view model that names every payment state honestly.</p></div>
    <div class="card"><h3>the rooms core — not in this repo</h3>
      <p class="muted">The encrypted replicated log, presence and the offline mailbox are <code>ardegazu.rooms.*</code>, compiled off the classpath out of <a href="https://git.ardegazu.ro/rooms-kit">ardegazu-rooms-kit</a> (sha-pinned). Fix it there; every rooms app inherits.</p></div>
    <div class="card"><h3>docs/PROTOCOL.md — the contract</h3>
      <p class="muted">BANK/1, the normative text: ops, authorization, the fold, receipts, injection surfaces. §11 is the honest list of limits; §12 is what any interface built on it has to say.</p></div>
    <div class="card"><h3>deploy/ — the publish pipeline</h3>
      <p class="muted"><code>publish-repo.sh</code> builds this very site: landing page + bare mirror exploded to loose objects, behind an anonymity gate that refuses to publish identity-bearing bytes.</p></div>
  </div>

  <h2>How it works (the short version)</h2>
  <ul>
    <li><strong>The link IS the bank.</strong> The secret and the banker's public key live in the URL fragment (<code>#…</code>) and never leave the browser. Policy is a pure function of the link, so the banker is known before an op is read — an op claiming banker powers without the banker's signature simply does not fold.</li>
    <li><strong>No server.</strong> Browsers are libp2p peers: they meet through a circuit-relay node, upgrade to direct WebRTC, and replicate an encrypted OrbitDB log. Every entry is sealed at rest; a decrypt failure is the access check. Members who are never online together converge through the sealed offline mailbox.</li>
    <li><strong>Provisional, then final.</strong> Any member's replica may append a payment; the deterministic fold settles it everywhere it lands. The banker's ack pins it — and a mint's ack signs an issuance receipt no back-dated entry can displace.</li>
    <li><strong>Receipts stand alone.</strong> A receipt is Ed25519 over canonical JSON — it verifies in any wallet, against nothing but the banker's key, with the bank offline or dead.</li>
    <li><strong>Money is arithmetic, not floats.</strong> The fold is BigInt end to end; amounts up to 2<sup>50</sup> settle exactly, in any order, on every device.</li>
    <li><strong>Hosting without an origin server.</strong> The client is a static build served as plain files — IPFS, named by IPNS, fronted by DNSLink. This page works the same way.</li>
  </ul>

  <h2>Run it yourself</h2>
  <pre><code>cd client && npm install && npm run dev   # http://localhost:5173
# open two tabs on the same #room URL — you are your own first customer</code></pre>
  <p>(needs JVM ≥ 17 + the clojure CLI for shadow-cljs; <code>npm test</code> drives the
  black-box suite against the BUILT output — the settlement fold against hand-computed
  golden scenarios with order independence asserted for every one, the wire vectors, and
  the whole view model, because the part of a money app that can lie to you is the part
  that renders it.)</p>
  <p>Deploy: <code>npm run build</code>, then publish <code>client/dist/</code> as static
  files anywhere. It needs nothing but a libp2p circuit relay + mailbox it's allowed to
  talk to.</p>

  <h2>Guarantees &amp; limits, honestly</h2>
  <ul>
    <li><strong>You trust each banker with that bank's money.</strong> A banker can mint without limit, refuse to ack forever, and close your account — none of it cryptographically prevented. What you get is a signed, replicated record of every act, which you can show to anyone. That is <em>attribution</em>, not <em>security</em>, and the two are never confused here.</li>
    <li><strong>Provisional is not final.</strong> A settled payment can still be displaced by an entry that has not reached you yet. Only final — acked — is irreversible, and the interface says so beside every payment it renders.</li>
    <li><strong>The bank dies with the banker key.</strong> No recovery, no succession. A lost banker seed leaves a bank that still settles provisionally and can never mint or finalize again.</li>
    <li><strong>The ledger is public to link holders, permanently.</strong> Removal is not retraction; guard the link like you'd guard the vault.</li>
    <li><strong>A rate is an assertion, not an oracle</strong> — a number the banker published, no more binding than a sign in a window. And nothing here is insured, redeemable or legal tender: a balance is a record of what a log says, agreed to by the people reading it.</li>
    <li>The relay/mailbox operator sees ciphertext, sizes, timing and IPs. Not content, not balances, not who banks with whom.</li>
  </ul>

  <footer>
    MIT licensed. Built on <a href="https://git.ardegazu.ro/rooms-kit">ardegazu-rooms-kit</a>, <a href="https://git.ardegazu.ro/wallet-kit">wallet-kit</a>, libp2p, OrbitDB, WebCrypto.<br>
    Live app: <a href="https://banca.ardegazu.ro">banca.ardegazu.ro</a> · this repo: <code>git clone https://git.ardegazu.ro/banca.git</code>
  </footer>
</main>

<main data-lang-block lang="ro" hidden>
  <h1><span class="coin">🪙</span> banca</h1>
  <p class="tag">o <strong>bancă p2p între prieteni, fără servere</strong> — fondezi una, îi emiți banii, faci plățile finale. Fără server, fără conturi; pagina asta e și repo-ul git.</p>

  <a class="btn" href="https://banca.ardegazu.ro">deschide banca live</a>
  <a class="btn ghost" href="browse/index.html">răsfoiește codul</a>
  <a class="btn ghost" href="#clone-ro">clonează repo-ul</a>

  <h2 id="clone-ro">Clonare</h2>
  <p>Situl servește repository-ul prin protocolul dumb-HTTP al lui git, ca simple fișiere statice (chiar simple fișiere — nu există aici niciun server git, de fapt niciun server):</p>
  <pre><code>git clone https://git.ardegazu.ro/banca.git
cd banca</code></pre>

  <h2>Ce este</h2>
  <p>Orice identitate poate fonda o bancă: își întemeiază o monedă, primește clienți,
  emite, decontează plăți. O bancă e <strong>un singur log replicat, criptat
  cap-la-cap</strong>, iar linkul ei — <code>#&lt;secret&gt;.&lt;bankerPub&gt;</code> —
  e toată capabilitatea: cine e bancherul reiese din URL înainte să fie citită vreo
  intrare, iar registrul trăiește doar pe dispozitivele membrilor. Niciun server nu-l
  ține — și nici n-ar avea cum.</p>
  <p>Plățile se decontează <strong>provizoriu</strong> în clipa în care se replică —
  doi clienți față în față într-o piață ajung la aceleași solduri cu bancherul dormind —
  și devin <strong>finale</strong> când bancherul le confirmă. Banii confirmați poartă o
  chitanță portabilă <a href="https://git.ardegazu.ro/wallet-kit">wallet-kit</a> care se
  verifică singură, în orice portofel, cu banca offline. Interfața nu amestecă niciodată
  cele două stări; distincția asta e produsul. Iar unitatea de cont neutră,
  <strong>gazul</strong> (GAZ), e rezervată: o cartă care o revendică e refuzată
  oricărui bancher — gazul nu-l poate emite nimeni.</p>
  <p>PWA instalabil, atent la safe-area, merge de pe orice host de fișiere statice.</p>

  <h2>Ce e în repo</h2>
  <div class="grid">
    <div class="card"><h3>client/src/banca/lib/ — banca</h3>
      <p class="muted"><code>protocol.cljs</code> — uniunea de operații BANK/1; <code>fold.cljs</code> — decontarea, o rejucare pură a întregii istorii (fără fereastră, fără evacuare: un fold care ar uita ar fi un fold care minte); <code>wallet.cljs</code> + <code>view.cljs</code> — chitanțele și modelul de vedere care numește cinstit fiecare stare a unei plăți.</p></div>
    <div class="card"><h3>nucleul de camere — nu e în repo-ul ăsta</h3>
      <p class="muted">Logul replicat criptat, prezența și mailboxul offline sunt <code>ardegazu.rooms.*</code>, compilate de pe classpath din <a href="https://git.ardegazu.ro/rooms-kit">ardegazu-rooms-kit</a> (pin pe sha). Repari acolo; moștenesc toate aplicațiile cu camere.</p></div>
    <div class="card"><h3>docs/PROTOCOL.md — contractul</h3>
      <p class="muted">BANK/1, textul normativ: operații, autorizare, foldul, chitanțele, suprafețele de injecție. §11 e lista cinstită de limite; §12 e ce trebuie să spună orice interfață construită pe el.</p></div>
    <div class="card"><h3>deploy/ — conducta de publicare</h3>
      <p class="muted"><code>publish-repo.sh</code> construiește chiar situl ăsta: pagină de prezentare + oglindă bare desfăcută în obiecte loose, în spatele unei porți de anonimat care refuză să publice octeți purtători de identitate.</p></div>
  </div>

  <h2>Cum funcționează (versiunea scurtă)</h2>
  <ul>
    <li><strong>Linkul ESTE banca.</strong> Secretul și cheia publică a bancherului stau în fragmentul URL-ului (<code>#…</code>) și nu pleacă niciodată din browser. Politica e o funcție pură a linkului, așa că bancherul e cunoscut înainte de citirea vreunei operații — o operație care pretinde puteri de bancher fără semnătura bancherului pur și simplu nu se foldează.</li>
    <li><strong>Fără server.</strong> Browserele sunt peers libp2p: se întâlnesc printr-un nod circuit-relay, trec pe WebRTC direct și replică un log OrbitDB criptat. Fiecare intrare e sigilată; eșecul decriptării e chiar controlul de acces. Membrii care nu sunt niciodată online în același timp converg prin mailboxul offline sigilat.</li>
    <li><strong>Provizoriu, apoi final.</strong> Replica oricărui membru poate adăuga o plată; foldul determinist o decontează identic oriunde ajunge. Confirmarea bancherului o pironește — iar confirmarea unui mint semnează o chitanță de emisiune pe care nicio intrare antedatată n-o mai poate disloca.</li>
    <li><strong>Chitanțele stau singure.</strong> O chitanță e Ed25519 peste JSON canonic — se verifică în orice portofel, doar cu cheia bancherului, cu banca offline sau moartă.</li>
    <li><strong>Banii sunt aritmetică, nu floats.</strong> Foldul e BigInt de la un capăt la altul; sume până la 2<sup>50</sup> se decontează exact, în orice ordine, pe fiecare dispozitiv.</li>
    <li><strong>Găzduire fără server de origine.</strong> Clientul e un build static servit ca simple fișiere — IPFS, numit prin IPNS, cu DNSLink în față. Pagina asta funcționează la fel.</li>
  </ul>

  <h2>Rulează-l singur</h2>
  <pre><code>cd client && npm install && npm run dev   # http://localhost:5173
# deschide două taburi pe același URL cu #cameră — ești primul tău client</code></pre>
  <p>(cere JVM ≥ 17 + CLI-ul clojure pentru shadow-cljs; <code>npm test</code> mână
  suita black-box peste buildul COMPILAT — foldul de decontare pe scenarii de aur
  calculate de mână, cu independența de ordine afirmată pentru fiecare, vectorii de
  sârmă și tot modelul de vedere, pentru că partea dintr-o aplicație de bani care te
  poate minți e cea care îi afișează.)</p>
  <p>Deploy: <code>npm run build</code>, apoi publică <code>client/dist/</code> ca
  fișiere statice oriunde. N-are nevoie decât de un circuit relay libp2p + mailbox cu
  care are voie să vorbească.</p>

  <h2>Garanții și limite, pe bune</h2>
  <ul>
    <li><strong>Te încrezi în fiecare bancher pentru banii băncii lui.</strong> Un bancher poate emite fără limită, poate refuza confirmarea la nesfârșit și îți poate închide contul — nimic din toate astea nu e împiedicat criptografic. Ce primești e o evidență semnată și replicată a fiecărui act, pe care o poți arăta oricui. Asta e <em>atribuire</em>, nu <em>securitate</em>, și cele două nu se confundă niciodată aici.</li>
    <li><strong>Provizoriu nu înseamnă final.</strong> O plată decontată mai poate fi dislocată de o intrare care încă n-a ajuns la tine. Doar finalul — confirmatul — e ireversibil, iar interfața o spune lângă fiecare plată pe care o afișează.</li>
    <li><strong>Banca moare odată cu cheia bancherului.</strong> Fără recuperare, fără succesiune. Un seed de bancher pierdut lasă o bancă ce mai decontează provizoriu și nu mai poate emite sau finaliza niciodată.</li>
    <li><strong>Registrul e public pentru purtătorii linkului, permanent.</strong> Scoaterea nu e retractare; păzește linkul cum ai păzi seiful.</li>
    <li><strong>Un curs e o afirmație, nu un oracol</strong> — un număr publicat de bancher, cu nimic mai obligatoriu decât un afiș în vitrină. Și nimic de aici nu e asigurat, răscumpărabil sau mijloc legal de plată: un sold e evidența a ceea ce spune un log, acceptată de cei care îl citesc.</li>
    <li>Operatorul releului/mailboxului vede ciphertext, dimensiuni, timpi și IP-uri. Nu conținut, nu solduri, nu cine ține banii la cine.</li>
  </ul>

  <footer>
    Licență MIT. Construit pe <a href="https://git.ardegazu.ro/rooms-kit">ardegazu-rooms-kit</a>, <a href="https://git.ardegazu.ro/wallet-kit">wallet-kit</a>, libp2p, OrbitDB, WebCrypto.<br>
    Aplicația live: <a href="https://banca.ardegazu.ro">banca.ardegazu.ro</a> · repo-ul: <code>git clone https://git.ardegazu.ro/banca.git</code>
  </footer>
</main>

<main data-lang-block lang="hu" hidden>
  <h1><span class="coin">🪙</span> banca</h1>
  <p class="tag"><strong>szerver nélküli p2p bank a barátok között</strong> — alapíts egyet, bocsásd ki a pénzét, tedd véglegessé a fizetéseket. Se szerver, se fiókok; ez az oldal egyben a git repó is.</p>

  <a class="btn" href="https://banca.ardegazu.ro">nyisd meg az élő bankot</a>
  <a class="btn ghost" href="browse/index.html">böngészd a kódot</a>
  <a class="btn ghost" href="#clone-hu">repó klónozása</a>

  <h2 id="clone-hu">Klónozás</h2>
  <p>Az oldal a repót a git dumb-HTTP protokollján át szolgálja ki, sima statikus fájlokként (tényleg sima fájlok — nincs itt git szerver, sőt semmilyen szerver):</p>
  <pre><code>git clone https://git.ardegazu.ro/banca.git
cd banca</code></pre>

  <h2>Mi ez</h2>
  <p>Bármely identitás alapíthat bankot: valutát jegyez, ügyfeleket fogad, kibocsát,
  fizetéseket számol el. Egy bank <strong>egyetlen, végponttól végpontig titkosított
  replikált log</strong>, és a linkje — <code>#&lt;secret&gt;.&lt;bankerPub&gt;</code> —
  a teljes capability: hogy ki a bankár, az az URL-ből következik, mielőtt egyetlen
  bejegyzés is beolvasásra kerülne, a főkönyv pedig csak a tagok eszközein él. Szerver
  nem tárolja — nem is tudná.</p>
  <p>A fizetések a replikáció pillanatában <strong>ideiglenesen</strong> számolódnak el —
  két ügyfél a piacon ugyanoda jut, miközben a bankár alszik —, és akkor válnak
  <strong>véglegessé</strong>, amikor a bankár nyugtázza őket. A nyugtázott pénzhez
  hordozható <a href="https://git.ardegazu.ro/wallet-kit">wallet-kit</a> elismervény jár,
  amely önmagát igazolja, bármely tárcában, offline bank mellett is. A felület soha nem
  mossa össze a két állapotot; ez a különbség maga a termék. A semleges elszámolási
  egység, a <strong>gaz</strong> (GAZ) pedig fenntartott: az azt igénylő alapítólevelet
  minden bankártól megtagadja — a gazt senki sem bocsáthatja ki.</p>
  <p>Telepíthető PWA, safe-area-tudatos, bármilyen statikus fájlkiszolgálóról megy.</p>

  <h2>Mi van a repóban</h2>
  <div class="grid">
    <div class="card"><h3>client/src/banca/lib/ — a bank</h3>
      <p class="muted"><code>protocol.cljs</code> — a BANK/1 műveletunió; <code>fold.cljs</code> — az elszámolás, a teljes történet tiszta visszajátszása (nincs ablak, nincs kilakoltatás: a felejtő fold hazudó fold volna); <code>wallet.cljs</code> + <code>view.cljs</code> — az elismervények és a nézetmodell, amely minden fizetési állapotot őszintén nevez meg.</p></div>
    <div class="card"><h3>a szoba-mag — nincs ebben a repóban</h3>
      <p class="muted">A titkosított replikált log, a jelenlét és az offline mailbox az <code>ardegazu.rooms.*</code>, a classpathról fordítva az <a href="https://git.ardegazu.ro/rooms-kit">ardegazu-rooms-kit</a>-ből (sha-ra tűzve). Ott javítod; minden szobás app örökli.</p></div>
    <div class="card"><h3>docs/PROTOCOL.md — a szerződés</h3>
      <p class="muted">BANK/1, a normatív szöveg: műveletek, jogosultság, a fold, elismervények, injektálási felületek. A §11 a korlátok őszinte listája; a §12 az, amit minden ráépülő felületnek ki kell mondania.</p></div>
    <div class="card"><h3>deploy/ — a publikálási csővezeték</h3>
      <p class="muted">A <code>publish-repo.sh</code> építi ezt az oldalt: nyitóoldal + loose objektumokra bontott bare tükör, egy anonimitási kapu mögött, amely identitáshordozó bájtokat nem enged ki.</p></div>
  </div>

  <h2>Hogyan működik (a rövid változat)</h2>
  <ul>
    <li><strong>A link MAGA a bank.</strong> A titok és a bankár nyilvános kulcsa az URL fragmentben él (<code>#…</code>), és soha nem hagyja el a böngészőt. A szabályzat a link tiszta függvénye, így a bankár már azelőtt ismert, hogy egyetlen művelet beolvasásra kerülne — a bankári jogokat a bankár aláírása nélkül igénylő művelet egyszerűen nem foldolódik.</li>
    <li><strong>Se szerver.</strong> A böngészők libp2p peerek: egy circuit-relay csomóponton át találkoznak, közvetlen WebRTC-re váltanak, és egy titkosított OrbitDB logot replikálnak. Minden bejegyzés lepecsételve pihen; a sikertelen visszafejtés maga a hozzáférés-ellenőrzés. Az egyszerre sosem elérhető tagok a lepecsételt offline mailboxon át konvergálnak.</li>
    <li><strong>Ideiglenes, majd végleges.</strong> Bármely tag replikája hozzáfűzhet egy fizetést; a determinisztikus fold mindenhol ugyanúgy számolja el. A bankár nyugtája rögzíti — egy mint nyugtája pedig kibocsátási elismervényt ír alá, amelyet visszadátumozott bejegyzés többé nem mozdíthat ki.</li>
    <li><strong>Az elismervény önmagában megáll.</strong> Ed25519 kanonikus JSON felett — bármely tárcában ellenőrizhető, semmi máshoz nem kell, mint a bankár kulcsa, offline vagy halott bank mellett is.</li>
    <li><strong>A pénz aritmetika, nem float.</strong> A fold végig BigInt; a 2<sup>50</sup>-ig terjedő összegek pontosan, tetszőleges sorrendben, minden eszközön ugyanúgy számolódnak el.</li>
    <li><strong>Hosztolás origin-szerver nélkül.</strong> A kliens statikus build, sima fájlokként — IPFS-en, IPNS által nevezve, DNSLinkkel elöl. Ez az oldal is pontosan így működik.</li>
  </ul>

  <h2>Futtasd magad</h2>
  <pre><code>cd client && npm install && npm run dev   # http://localhost:5173
# nyiss két fület ugyanarra a #szoba URL-re — te vagy a saját első ügyfeled</code></pre>
  <p>(JVM ≥ 17 + clojure CLI kell a shadow-cljs-hez; az <code>npm test</code> a black-box
  csomagot a LEFORDÍTOTT build ellen hajtja — az elszámolási foldot kézzel számolt arany
  forgatókönyveken, mindegyikre kimondott sorrendfüggetlenséggel, a wire-vektorokat és a
  teljes nézetmodellt, mert egy pénzes appból az a rész tud hazudni neked, amelyik
  megjeleníti.)</p>
  <p>Deploy: <code>npm run build</code>, majd tedd ki a <code>client/dist/</code>-et
  statikus fájlokként bárhová. Semmi más nem kell hozzá, mint egy libp2p circuit relay +
  mailbox, amellyel beszélhet.</p>

  <h2>Garanciák és korlátok, őszintén</h2>
  <ul>
    <li><strong>Minden bankárban az ő bankja pénzéig bízol.</strong> Egy bankár korlát nélkül kibocsáthat, örökre megtagadhatja a nyugtázást, és lezárhatja a számládat — ezt semmi sem akadályozza kriptográfiailag. Amit kapsz: minden aktus aláírt, replikált nyoma, amelyet bárkinek megmutathatsz. Ez <em>attribúció</em>, nem <em>biztonság</em>, és a kettő itt sosem keveredik.</li>
    <li><strong>Az ideiglenes nem végleges.</strong> Egy elszámolt fizetést még kimozdíthat egy bejegyzés, amely nem ért el hozzád. Csak a végleges — a nyugtázott — visszafordíthatatlan, és a felület ezt minden megjelenített fizetés mellé odaírja.</li>
    <li><strong>A bank a bankárkulccsal együtt hal meg.</strong> Nincs helyreállítás, nincs utódlás. Az elveszett bankár-seed olyan bankot hagy, amely ideiglenesen még elszámol, de kibocsátani vagy véglegesíteni soha többé nem tud.</li>
    <li><strong>A főkönyv a link birtokosainak nyilvános, örökre.</strong> Az eltávolítás nem visszavonás; őrizd a linket, ahogy a széfet őriznéd.</li>
    <li><strong>Az árfolyam állítás, nem orákulum</strong> — egy szám, amelyet a bankár közzétett, semmivel sem kötelezőbb, mint egy tábla a kirakatban. És itt semmi sincs biztosítva, semmi sem beváltható vagy törvényes fizetőeszköz: az egyenleg annak nyoma, amit egy log mond, és amit az olvasói elfogadnak.</li>
    <li>A relé/mailbox üzemeltetője ciphertextet, méreteket, időzítést és IP-ket lát. Tartalmat nem, egyenlegeket nem, azt sem, ki kinél bankol.</li>
  </ul>

  <footer>
    MIT licenc. Az <a href="https://git.ardegazu.ro/rooms-kit">ardegazu-rooms-kit</a>-re, a <a href="https://git.ardegazu.ro/wallet-kit">wallet-kit</a>-re, libp2p-re, OrbitDB-re és WebCryptóra épül.<br>
    Az élő app: <a href="https://banca.ardegazu.ro">banca.ardegazu.ro</a> · a repó: <code>git clone https://git.ardegazu.ro/banca.git</code>
  </footer>
</main>

<script>
(function () {
  var LANGS = ["en", "ro", "hu"];
  var KEY = "ardegazu-site:lang";
  var lang = null;
  try { lang = localStorage.getItem(KEY); } catch (e) {}
  if (LANGS.indexOf(lang) < 0) {
    var cands = navigator.languages || [navigator.language];
    for (var i = 0; i < cands.length; i++) {
      var p = (cands[i] || "").slice(0, 2).toLowerCase();
      if (LANGS.indexOf(p) >= 0) { lang = p; break; }
    }
  }
  if (LANGS.indexOf(lang) < 0) lang = "en";

  var nav = document.getElementById("langs");
  function apply(l) {
    lang = l;
    document.documentElement.lang = l;
    try { localStorage.setItem(KEY, l); } catch (e) {}
    var blocks = document.querySelectorAll("[data-lang-block]");
    for (var i = 0; i < blocks.length; i++) blocks[i].hidden = blocks[i].getAttribute("lang") !== l;
    var btns = nav.querySelectorAll("button");
    for (var j = 0; j < btns.length; j++) btns[j].className = btns[j].textContent === l ? "on" : "";
  }
  LANGS.forEach(function (l, i) {
    if (i) nav.appendChild(document.createTextNode(" · "));
    var b = document.createElement("button");
    b.type = "button";
    b.textContent = l;
    b.addEventListener("click", function () { apply(l); });
    nav.appendChild(b);
  });
  apply(lang);
})();
</script>
</body>
</html>

static mirror of HEAD · about · clone: git clone https://git.ardegazu.ro/banca.git