Algo Rithm of Bit·Block·Rithm
How Bitcoin Works: Bitcoin Math Playground
https://github.com/agama-point/Bit-Block-Rithm
https://www.agamapoint.com/bbr
https://www.agamapoint.com/bbr_err/
https://www.agamapoint.com/bbr_tx/
https://github.com/agama-point/the_mathematics_of_Bitcoin
Matematické principy stejné, jako má Bitcoin, jen velmi zjednodušené.
Málá čísla:
ecc251 – má jen 251 privátních klíčů, takže by se daly všechny páry (secret+pubKey naučit zpaměti)
y^2 = x^3 + 7 mod 251
Jen jedna peněženka
Max tři adresy (pro testy já1 to já2… ale stačí jen jednen)
Jen celé jednotky mincí bez fee
Centralizovaná databáze:
jen simulováno na jediném serveru
mempool i blockchain zcela pod kontrolou admina
Tato velká zjednodušení vedou k jistým omezením, ale především se dá demonstrovat obrovská zranitelnost!
těžba
klikání po cca 3-5 sec
obtížnost 1 nebo 2 nuly
max dvě transakce v bloku
registrace nového testovacího uživatele?
možná jen zamčeno pro editaci
a odemykat jen na workshop – schválně, kdy se to zvrhne
ecc251 | ess251
Modulo tělesa p = 251: Určuje „velikost hřiště“. Všechny souřadnice x a y v [x,y] musí být menší než 251.
Řád grupy n = 252: Určuje „počet kroků“, než se po křivce vrátíme na začátek (potažmo do nekonečna).
původní bod $G=(15, 13)$ na křivce vůbec neležel -> Výběrem $G=(1, 192)$ jsme zajistili, že se pohybujeme po „kolejích“ definovaných křivkou.
ECC251_skips
https://www.agamapoint.com/bbr/tests_examples/simple_ecc251ec.html
ukázka zkoumá izomorfní (strukturálně stejné) vztahy mezi eliptickými křivkami v diskrétním a spojitém prostoru. Mapováním skalárních násobení v Galoisově tělese GF(251) na reálnou Weierstrassovu projekci vizualizace odhaluje základní algebraickou symetrii, která řídí moderní kryptografické systémy. Každý krok ukazuje transformaci diskrétních mřížkových bodů na jejich geometrické protějšky pomocí rekonstrukce znaménka založené na paritě.
Vysvětlení pro středoškoláka
- Eliptická křivka je speciální typ křivky dané rovnicí, například ve tvaru y2=x3+ax+by^2 = x^3 + ax + by2=x3+ax+b Taková křivka má zajímavé matematické vlastnosti a používá se v kryptografii (např. u Bitcoinu).
- Existují dvě prostředí, kde s ní můžeme pracovat:
- Spojitý (reálný) prostor – klasický graf v souřadnicové rovině s reálnými čísly.
- Diskrétní prostor – místo reálných čísel používáme konečné těleso, zde GF(251).
To znamená, že počítáme „modulo 251“ (po dosažení 250 se vracíme na 0).
- Izomorfní vztah znamená, že i když vypadají jinak (jednou je to hladká křivka, podruhé jen sada bodů na mřížce), jejich vnitřní struktura a pravidla sčítání bodů jsou si odpovídající.
- Skalární násobení znamená opakované sčítání bodu se sebou samým (např. 5·P = P + P + P + P + P).
To je základ operací v kryptografii. - Parita (sudé/liché) se používá k určení správného znaménka u souřadnice yyy, protože rovnice dává dvě možnosti: yyy a −y-y−y.
Shrnutí jednoduše
V experimentu se vezme eliptická křivka počítaná v „modulárním světě“ (jen čísla 0–250) a ukáže se, že její chování odpovídá hladké křivce v běžném grafu. I když jedna verze je jen sada bodů a druhá spojitá čára, jejich matematická struktura je stejná. Tato skrytá symetrie je základem moderní kryptografie.
Galoisovo těleso (finite field) je množina konečného počtu čísel, ve které lze sčítat, odčítat, násobit a dělit (kromě dělení nulou) a vždy zůstáváme uvnitř té množiny.
Typický příklad:
GF(251) znamená, že počítáme s čísly 0–250 a všechny operace děláme modulo 251.
Například v GF(251):
- 250 + 5 = 4 (protože 255 mod 251 = 4)
- 3 · 100 = 49 (protože 300 mod 251 = 49)
Když řekneme, že eliptická křivka je „na Galoisově tělese“, znamená to, že:
- souřadnice bodů nejsou běžná reálná čísla,
- ale čísla modulo 251,
- výsledkem není hladká křivka, ale konečný počet bodů v mřížce.
To je klíčové pro kryptografii – pracujeme s konečnou, přesně definovanou strukturou.
„Weierstrassova projekce“
Eliptická křivka se obvykle zapisuje ve tvaru: y2=x3+ax+by^2 = x^3 + ax + by2=x3+ax+b
Tomuto tvaru se říká Weierstrassův tvar (podle matematika Karla Weierstrasse).
„Weierstrassova projekce“ zde znamená:
- zobrazení bodů křivky do běžné souřadnicové roviny (x, y),
- tedy klasický graf, kde osa x a y jsou reálná čísla.
V reálném prostoru vznikne hladká symetrická křivka.
V konečném tělese (např. GF(251)) vznikne jen sada oddělených bodů.
Podepisování a ověřování
1) GENEROVÁNÍ VEŘEJNÉHO KLÍČE
Funkce: scalar_mult(priv, G_POINT)
Vstup: priv = 111 G_POINT = [1,192]
Výstup: veřejný bod P = [131,193] x = 131 y = 193
Funkce: pubkey_to_addr(pub)
Vstup: pub = [131,193]
Výstup: hex veřejného klíče = 83c1
2) HASH ZPRÁVY
Funkce: ASH24(input_msg) | Vstup: input_msg = „1“ |
Výstup: h_raw = ASH24(msg) = 9366529 | hex24(…) = 0x8eec01
3) PODPIS ZPRÁVY
Funkce: signToy(priv, h_raw) | Vstup: priv = 111 | h_raw = 9366529
Výstup objektu: sig.R_point = [19,198] | sig.r = 19 sig.s = 27
Mezikroky ověřitelné ručně:
L = scalar_mult(s, G) = [230,182]
e*Pub = scalar_mult(h mod n, Pub) = [155,235]
P = R + e*Pub = [230,182]
4) OVĚŘENÍ PODPISU
Funkce: verifyToy(pub, h_raw, sig)
Vstup: pub = [131,193] | h_raw = 9366529 | sig = { r:19, s:27 }
Výstup: valid = true
Proč je podpis validní?
Podpis je validní, pokud platí:
s*G = R + e*Pub
což znamená, že podpis mohl vytvořit pouze držitel privátního klíče.
Zde: L = [230,182] | P = [230,182]
=> L == P → Podpis je VALIDNÍ ✅
hashujeme: „1“
| 0x8eec01 | signed | R=[19,198]
L = s*G: [230,182], P = R + e*PubKey: [230,182], Valid ✅
1. Příprava a výběr vstupu (UTXO)
Předtím, než se začne cokoliv podepisovat, musí systém zjistit, zda má uživatel čím platit.
- Identifikace: Ze soukromého klíče uloženého v session (
k1) se odvodí veřejný klíč a následně adresa uživatele (myAddr). - Hledání mincí: Skript zavolá backend (
get_utxo), aby našel dostupný neutracený výstup (UTXO), který patří dané adrese. Tento záznam obsahujetxid(identifikátor předchozí transakce) avalue(kolik mincí je k dispozici).
2. Co se hashuje (The Message)
Aby byla transakce bezpečná, nepodepisuje se jen částka, ale celá struktura, která definuje „kdo, co a komu“. Vytvoří se řetězec msg (zpráva), který obsahuje:
myAddr: Adresa odesílatele.txid: ID předchozí transakce (tím se zajistí, že odesílatel skutečně „vlastní“ ty mince, které utrácí).to: Adresa příjemce.amount: Částka, kterou posílá.
Tento řetězec vypadá například takto: e875|1005|abcd|3.
Následně se na něj aplikuje hashovací funkce ASH24, která vytvoří unikátní číselný otisk (hash) této zprávy.
3. Jakým klíčem se podepisuje
K podpisu se používá soukromý klíč (myPriv), který má uživatel v session.
- Používá se funkce
signToy(myPriv, h). - Využívá se kryptografie na bázi eliptických křivek (ECC). Výsledkem podpisu jsou dvě čísla: r a s.
- Tento podpis dokazuje, že zprávu (obsahující hash) vytvořil držitel soukromého klíče, aniž by tento klíč musel komukoliv ukazovat.
4. Jak se transakce odesílá
Po podepsání se na backend pošle balíček dat:
- Odkud, kam, kolik.
- Hodnota původního UTXO (
val1) a posílaná částka (val2). - Samotný digitální podpis (
r,s). - ID původního UTXO, aby ho databáze mohla označit za „utracené“.
5. Jak pak ověříme (Validace)
Ačkoliv to v tomto výřezu kódu není přímo vidět (děje se to na straně příjemce nebo v historii), ověření probíhá takto:
- Sestavení zprávy: Vezmou se data uložená v databázi (from, txid, to, amount) a vytvoří se úplně stejný hash jako při podepisování.
- Veřejný klíč: Z adresy odesílatele (
from_addr) se zrekonstruuje jeho veřejný klíč. - Kryptografický test: Zavolá se funkce
verifyToy(pubKey, hash, signature).
Princip ověření: Matematika eliptických křivek umožní ověřit, zda dvojice
(r, s)odpovídá danémuhashiaveřejnému klíči. Pokud se levá strana rovnice ($L = s \cdot G$) rovná pravé straně ($P = R + h \cdot Pub$), víme s jistotou, že data nebyla změněna a podpis je pravý.


