Autor: SJORS PROVOOST

Zdroj: https://sprovoost.nl/2022/11/10/what-is-a-bitcoin-address/

Bitcoinová adresa není součástí bitcoinového blockchainu, ale je token, který bitcoinový software (peněženka) používá ke komunikaci, kam poslat bitcoiny: buď na určitý veřejný klíč (P2PK) nebo hash veřejného klíče (P2PKH). , hash skriptu (P2SH), hash veřejného klíče SegWit (P2WPKH) nebo hash skriptu SegWit (P2WSH). Adresa také obsahuje některá metadata o jejím typu.

(Pozn. překladatele: Typy adres bitcoinu se budou i nadále zvyšovat s upgradem bitcoinové sítě a standardizací metod skriptování. Ve skutečnosti se typy adres uvedené výše, kromě P2PK a P2PKH, objevily s počátečním vydáním bitcoinu. , zbytek přišel později Nyní, kvůli upgradu Taproot aktivovanému v roce 2021, má Bitcoin jiný typ adresy „P2TR“).

Bitcoinové adresy používají k vyjádření výše uvedených platebních metod jedinečný systém číslování. Tento článek představí každý z těchto různých systémů číslování a poskytne hloubkovou analýzu výhod bitcoinových adres obecně a adres bech32. Dále vysvětlíme, odkud se vzala zranitelnost (nižší hrozba) obsažená v první verzi adres bech32 a jak byla vyřešena. Nakonec jsme se dotkli dopadu kvantového počítání.

- Tento článek je výňatek z mé nové knihy "Bitcoin: Nedokončený výzkum" -

Historie pozadí

Když někomu posíláte bitcoiny, v podstatě vytváříte transakci s více vstupy a alespoň jedním výstupem. Výstupy specifikují, kdo je může utratit prostřednictvím vestavěných omezení (právně nazývaných věcná břemena, která omezují převod vlastnictví aktiva).

Nejtriviálnější zátěží je umožnit komukoli utratit bitcoiny. To není dobrý nápad, protože bitcoiny budou rychle ukradeny. Proto v počátcích vývoje bitcoinu mohla naprostá většina bitcoinů na blockchainu používat pouze dvě omezení: Pay-to-Public-Key (P2PK) nebo Pay-to-Public-Key-Hash (P2PKH). První lze chápat jako „Pouze ti, kteří vlastní soukromý klíč odpovídající veřejnému klíči, aby utratili bitcoiny“.

V té době jsme také mohli odesílat bitcoiny na IP adresu příjemce, ale tato funkce byla v roce 2012 ukončena. Chcete-li jej použít, musíte se připojit k IP adrese příjemce, požádat příjemce o veřejný klíč a ten vám veřejný klíč předá1. Vaše peněženka pak vytvoří bitcoiny pomocí skriptu P2PK.

Tento pracovní postup by se dnes zdál divný2, ale odpovídal běžnému vzoru peer-to-peer aplikací jako Napster a Kazaa v té době, který spočíval v přímém připojení k jiným lidem a stahování věcí z nich. V dnešní době s největší pravděpodobností neznáte IP adresu svého přítele, a pokud používají mobilní zařízení, může se jejich IP adresa dokonce neustále měnit. Ačkoli můžete svému bitcoinovému uzlu dát pokyn, aby se připojil konkrétně k uzlu vašeho přítele, obecně se připojí pouze k náhodným uzlům, viz kapitola 2.

Běžnější způsob transakce je podobný bankovnímu převodu. Příjemce vám dá adresu a vy na tuto adresu pošlete bitcoiny, stejně jako byste posílali peníze na bankovní účet. Zpočátku jsme všichni používali jako adresu P2PKH (význam P2PKH je vysvětlen níže).

Tímto způsobem není transakce odeslána přímo příjemci, ale je vysílána přes všechny uzly v síti a nakonec je objevena těžebním uzlem a zabalena do bloku. Je možné, že uzel vaší protistrany viděl transakci z rovnocenného uzlu nebo přijal blok, ve kterém se transakce vyskytuje.

Třetí transakční metodou je těžba, posílání blokových odměn získaných z těžby sobě. Zpočátku měl bitcoinový software v sobě zabudovaný těžební software. Jakmile si tedy stáhnete bitcoinový software, váš bitcoinový software začne těžit a poté bitcoiny odešle do vaší peněženky, v tomto případě není potřeba vyměňovat si adresy. Všechny tyto bitcoiny používají P2PK jako omezení 3.

Jaká je adresa?

Adresy jsou pohodlným způsobem, jak označit, který skript musí vstoupit do blockchainu. Jak jsme uvedli výše, účelem skriptu je uvalit omezení na bitcoiny a umožnit příjemci je pouze utratit4. Samotná adresa na blockchainu neexistuje a adresa neobsahuje ani kompletní skript.

Ze dvou nejpoužívanějších typů skriptů v minulosti se adresy používají pouze pro Pay-to-Public-Key-Hash (P2PKH). Když peněženka uvidí takovou adresu, vygeneruje skript, který vyžaduje, aby osoba, která v ní bitcoiny utratí, držela odpovídající veřejný klíč pro daný hash (skutečný skript je uveden v kapitole 10). Zveřejňuje se pouze hash a veřejný klíč zůstává tajný, dokud příjemce bitcoiny neutratí.

Adresy P2PKH začínají číslem 1, za kterým následuje hash veřejného klíče. Adresa je zakódována v base58, jak ukazuje následující příklad:

1HLoFgMiDL3hvACAfbkDUjcP9r9veUcqAF

Co je základní systém?

Abychom porozuměli base58, musíme nejprve porozumět základním principům základního systému.

Vezměte si například base10, představte si to jako svých 10 prstů. Pokud byste tedy chtěli vyjádřit číslo 115 (1, 1, 5), udělali byste oběma rukama tři gesta odpovídající 1, 1, 5. Protože lidé vynalezli hliněné tabulky a papír, můžete tato čísla psát také perem, což je mnohem pohodlnější než používat prsty. Proto je základ10 desítková soustava, která používá 10 různých symbolů, přičemž k vyjádření libovolného čísla (celého čísla) používá různé kombinace těchto 10 symbolů.

Kromě toho existuje mnoho různých základních systémů. Například staří Babyloňané používali base60. Ke čtení strojového kódu obvykle používáme hexadecimální, také známý jako base16 - pomocí 16 znaků číslic 0 až 9 a písmen A až F. Mezitím počítače mají tendenci používat základnu 2 (binární číselný systém) interně, protože tranzistory mají pouze dva stavy: zapnuto a vypnuto. To znamená, že vše probíhá pouze se dvěma čísly, 0 a 1, a můžete je použít k reprezentaci libovolného čísla.

Satoshi Nakamoto představil systém base58, který používá 58 různých symbolů: čísla 0 až 9 a většinu malých a velkých písmen abecedy. Některá písmena a čísla, která uživatelé snadno zamění a špatně identifikují, však nejsou zahrnuta – například číslo 0 a velké písmeno O a velké písmeno I a malé písmeno l.

Viděli jste někdy zdrojový kód přílohy e-mailu? Hromada podivných čísel. Toto je base64 a base58 se rodí na základě bas64. Base64 však obsahuje znaky jako podtržítko, znaménko plus, rovnítko a lomítko. base58 tyto znaky odstraňuje, usnadňuje vizuální kontrolu a lze jej efektivně aplikovat na adresy URL.

Base58 和 Pay-to-Public-Key-Hash

Co to má společného s P2PKH? Adresy P2PKH začínají 1, po které následuje hash veřejného klíče zakódovaný base58.

Toto jsou informace, které musíte poslat někomu jinému, když od něj chcete získat bitcoiny. Můžete jim také poslat 0x005 a veřejný klíč. Možná dokážou úspěšně přeložit 0x00, ale s největší pravděpodobností ne.

Teoreticky byste mohli poslat někomu jinému bitcoinový skript reprezentovaný v hexadecimální soustavě (formát používaný na blockchainu), protože bitcoinové skripty jsou binární zprávy. Na blockchainu by bitcoinový skript, jako je tento, znamenal: „Pokud má tato osoba správný hash veřejného klíče a jemu odpovídající veřejný klíč, můžete tento bitcoin utratit. Pokud chcete jít hlouběji, je popsáno, jak funguje bitcoinový skript v kapitole 10.

Přestože je na výběr tolik reprezentací, lidé obvykle volí standardizované formáty adres. To vysvětluje, proč všechny tradiční bitcoinové adresy začínají 1 a všechny jsou přibližně stejně dlouhé.

Kromě toho, že se base58 používá k odesílání bitcoinových adres, může být také použit k předávání soukromých klíčů. V tomto případě je úvodní symbol 5 (představující 128 jako bajt verze), za nímž následuje soukromý klíč.

V minulosti uživatelé používali papírové peněženky, které bylo možné vytisknout. Pokud jsou generovány bezpečně bez zadních vrátek, pak má papír řetězec začínající "1" na jedné straně a řetězec začínající "5" na druhé straně s poznámkou, že mohou být prezentovány pouze bitcoinové adresy, soukromý klíč by měl nesdílet.

Existují také adresy začínající na „3“, což znamená, že bitcoiny jsou uzamčeny v haši skriptu, nikoli v haši veřejného klíče. V kapitole 10 představíme Pay to Script Hash (P2SH). Takové adresy jsou obvykle vícesig adresy, ale mohou to být také adresy SegWit6.

Přestože adresy base58 fungují dobře, existuje prostor pro zlepšení. Takže máme bech32.

objeví se bech32

V březnu 2017 Pieter Wuille hovořil o novém formátu adresy, bech32. Bech32 se používá od úspěšné aktivace SegWitu. Jak název napovídá, bech32 je systém base32. To znamená, že můžete použít téměř všechna písmena a všechna čísla, kromě několika, která mohou způsobit zmatek.

Video s vysvětlením: https://youtu.be/NqiN9VFE4CU

Největší rozdíl mezi bech32 a base58 je v tom, že se nekombinují velká a malá písmena. Každé písmeno se objeví pouze jednou (buď celé velké nebo malé), takže bude mnohem snazší ho přečíst. Přesné mapování mezi každým písmenem nebo číslem a jejich odpovídající hodnotou je pevné, ale spíše libovolné: Q znamená pouze 0, P znamená pouze 1, bez hlubšího významu.

- mapovací tabulka bech32. Například q znamená 0 ​​a 3 znamená 17 (1+16) -

Adresa bech327 se skládá ze dvou částí oddělených „1“, například bc1q9kdcd08adkhg35r4g6nwu8ae4nkmsgp9vy00gf.

První polovina je záměrně čitelná, například „bc“ (pro Bitcoin) nebo „Inbc“ (Lightning Network on Bitcoin). Hodnoty reprezentované písmeny jako "b" a "c" nemají žádný význam. Existují pouze pro lidi, aby je poznali: „Rozumím, pokud adresa začíná „bc“, odkazuje to na bitcoin jako na kryptoměnu, peněženka však zkontroluje, zda tyto hodnoty existují jako kontrola důvěryhodnosti, a Tyto hodnoty jsou také zahrnuty v kontrolním součtu.

"1" je pouze oddělovací znak a nepředstavuje žádnou hodnotu. Pokud se podíváte na mapovací tabulku pro bech32, uvidíte, že „1“ není zahrnuto, což znamená „přeskočit“.

Druhá polovina začíná číslem verze SegWit. Verze 0 je reprezentována Q(bc1q…) (viz kapitola 3). Verze 1 je to, co nazýváme Taproot (viz část 4 této knihy), reprezentované "P" (bc1p...). V případě verze 0 SegWit bude za číslem verze následovat 20 nebo 32 bajtů, které představují hash veřejného klíče nebo hash skriptu. Rozdíl v délce je v tom, že SegWit používá hash SHA256 skriptu (32 bajtů) místo hash RIPEMD160 (20 bajtů) skriptu.

V base58 má hash skriptu stejnou délku jako hash veřejného klíče. Ale v SegWitu se délky obou liší. Pouhým pohledem na délku adresy tedy okamžitě poznáte, zda platíte skript nebo hash veřejného klíče. Mimochodem, Taproot odstraňuje tento délkový rozdíl a dále zlepšuje soukromí.

Bench32 se proto vyznačuje použitím pouze 32 znaků pro druhou polovinu adresy a jinak se příliš neliší od base58. Podívejte se na tuto funkci a budete vědět: „Aha, toto je adresa P2PKH, v tomto případě Pay-to-Witness-Public-Key-Hash (P2WPKH), kde „Witness“ odkazuje na SegWit, ale hlavní myšlenku.“ zůstává stejný: Lidé a počítače mohou identifikovat typ adresy na základě krátké předpony, za kterou následuje hash veřejného klíče nebo skriptu.

32rozměrná šipková hra

Jednoduchost však není jedinou výhodou. Další výhodou je oprava chyb, alespoň detekce chyb.

Pokud zadáte špatnou adresu, nejhorší, co se může stát, je, že pošlete bitcoiny na nesprávný hash veřejného klíče. Když se příjemce pokusí utratit bitcoiny, zjistí, že hash jeho veřejného klíče neodpovídá požadavkům blockchainu, protože odesílatel předtím zadal špatnou adresu. Tento bitcoin nebude nikdy obnoven.

Naštěstí adresa base58 má na konci kontrolní součet. Tímto způsobem, pokud zadáte špatnou adresu, ověření kontrolního součtu na konci adresy selže. Vaše peněženka vás upozorní a odmítne transakci odeslat (blockchain vás neochrání, ale vaše peněženka ano). Pokud však máte opravdu smůlu, je možné získat správný kontrolní součet, i když uděláte chybu.

Bech32 je navržen tak, aby se zabránilo takovým extrémním náhodám. Navíc vám Bech32 nejen řekne, jestli jste udělali chybu, ale také kde jste udělali chybu. Specifickou metodou je vzít všechny bajty adresy a zahašovat je pomocí nějakého složitého matematického vzorce. I když uděláte 4 chyby, Bech32 bude stále vědět, kde jste udělali chybu a jaká je skutečná hodnota. Pokud uděláte více než 4 chyby, Bech32 nemůže nic dělat.

Ukažme si to na analogii: Na zeď nakreslíte spoustu nepřekrývajících se kruhů. Bullseye každého kruhu představuje správnou hodnotu, zatímco ostatní body v kruhu představují vstupní chybu. Pokud jste zkušený hráč šipek, většinou se trefíte do terče, což znamená, že ztrácíte správnou hodnotu. Pokud terč trochu minete, ale přesto spadnete do kruhu, znamená to, že zadaná hodnota je mírně mimo. Kontrola chyb je vědět, že jste minuli terč. Oprava zahrnuje přesunutí šipky na nejbližší terč.

Myšlenka je taková, že chcete udělat kruh co nejširší, aby vyhovoval i těm nejnedbalejším hráčům šipek, ale nechcete plýtvat příliš prostorem. Stejně tak nechceme, aby bitcoinová adresa byla dlouhá stovky znaků. Toto je oblíbený optimalizační problém matematiků.

Na rozdíl od 2D stěny je bech32 jako 32D stěna s 32D hyperkoulí. Když zadáte svou adresu, někde v tomto 32-rozměrném prostoru je nepatrná odchylka, ale bez ohledu na to, jak to vypadá, stále jste uvnitř této hypersféry. V takovém případě vaše peněženka ví, co je špatně, a dokáže účinně zabránit ztrátě bitcoinů způsobené odesláním na špatnou adresu8.

zranitelnost bech32

V roce 2019 lidé zjistili, že pokud je poslední znak adresy bech32 P a později omylem zadáte jedno nebo více Q, ověření kontrolního součtu stále projde a neobdržíte výzvu k chybě vstupu. Software vaší peněženky si bude myslet, že adresa byla zadána správně, což vám umožní poslat bitcoiny na špatnou adresu, což bude mít za následek, že bitcoiny nebudou utraceny, jak jsme vysvětlili výše.

Dobrou zprávou je, že bech32 funguje pouze se SegWit a adresy SegWit mají omezení délky – mohou mít pouze 20 bajtů nebo 32 bajtů. Naštěstí, pokud za adresou dlouhou 20 nebo 32 bajtů zadáte Q navíc, zadaná adresa bude neplatná, protože překračuje limit délky. Vaše peněženka si tohoto problému všimne a odmítne bitcoiny odeslat. Původně se uvažovalo o zavedení podobného omezení délky adresy pro Taproot, ale níže uvedené řešení tuto potřebu eliminuje. Flexibilní délka adresy nám pomůže Taproot v budoucnu vylepšit.

bech32m se narodil

Pro opravu zranitelností bech32 byl navržen nový standard nazvaný bech32m9. bech32m je ve skutečnosti velmi jednoduchá změna: do vzorce kontrolního součtu bech32 je přidáno další číslo, aby bylo zajištěno, že jakékoli další znaky vygenerují neplatný kontrolní součet.

Tento nový standard se vztahuje pouze na Taproot adresy a budoucí adresy. Pro adresy SegWit se nic nemění, protože jsou již chráněny limitem délky 20 nebo 32 bajtů. V době psaní tohoto článku většina softwaru pro peněženky podporuje nový standard bech32m.

Co mě přimělo setřást svou úzkost a zamilovat se do kvantových počítačů?

Mimochodem, Pay-to-Public-Key-Hash (P2PKH) je považován za odolnější vůči kvantovým útokům, protože nemusíte odhalovat svůj veřejný klíč. Nevýhodou bylo, že hashe zabíraly více místa – ale to v té době nebyl problém, protože bloky nebyly zdaleka plné.

Mnoho lidí se obává, že kvantové počítače nakonec podkopou bezpečnost bitcoinové kryptografie a dají kvantovým hackerům příležitost ukrást bitcoiny. Pokud se jim podaří ukrást miliony bitcoinů, může to způsobit i krach trhu.

Problém je v tom, že navzdory širokému přijetí P2PKH byly zveřejněny veřejné klíče pro 5 až 10 milionů těchto bitcoinů. Je ironií, že s tolika bitcoiny zranitelnými vůči kvantovým hackerům nemá smysl snažit se chránit zbývající bitcoiny tímto způsobem. I když jsou vaše bitcoiny chráněny před krádeží, protože používáte P2PKH, nevyhnutelně se stanou bezcennými kvůli kolapsu cen.

Fyzik Stepan Snigirev a matematik Andrew Poelstra vysvětlují potenciál, že kvantové útoky budou mít v krátkodobém horizontu zničující důsledky, a možná protiopatření ve dvou epizodách podcastu s názvem What Bitcoin Did.

Prostor v blocích je nyní velmi vzácný, takže uživatelé nemusí ukládat hash veřejného klíče do cenného prostoru bloků, což uživatelům pomáhá ušetřit peníze. To je důvod, proč se v novém soft forku Taproot (viz část 4 této knihy) bitcoinová adresa opět stává P2PK10. Vezměte prosím na vědomí, že používání adres Taproot není povinné, takže pokud nesouhlasíte s výše uvedeným odůvodněním, můžete se rozhodnout nepoužívat Taproot.

poznámka pod čarou

1. Abychom uspokojili zvědavost milovníků „archeologie“ kódu: uzel odesílatele bude mít dialogové okno uživatelského rozhraní s výzvou k převodu částky a IP adresy. Funkce StartTransfer() vytvoří prázdnou šekovou transakci, do které kontrolní příkaz na uzlu příjemce vloží skript P2PK (jako scriptPubKey). OnReply2() poté vloží částku, podepíše transakci, vrátí transakci příjemci a odešle ji. zdrojový kód. ↩

2. A není to bezpečné, připustil to i Satoshi Nakamoto. ↩

3. Proč verze původně vydaná Satoshi Nakamotem podporovala P2PK i P2PKH? Nejsme si jisti přesně proč. Platební metoda P2PK slouží skutečně pouze k platbě IP adres a vyplácení blokových odměn těžařům. Ani jedno nevyžaduje lidskou interakci. Ve scénářích zahrnujících lidskou interakci uživatelé používají P2PKH. Použitá adresa odkazuje spíše na P2PKH než na P2PK. Automatizované systémy nepotřebují koncept adres, protože mohou také zpracovávat skripty, takže nejsou potřeba koncepty jako adresy P2PK. ↩

4. Dosud byl scénář podobný bankovnímu účtu. Jak se dozvíme v kapitole 10, skripty dělají mnohem víc než jen zadržování peněz pro majitele. ↩

5. Dvojice hexadecimálních čísel s předponou 0x se obvykle používá k reprezentaci bajtu, který může představovat 16 × 16 = 256 různých hodnot. Proto 0x00 představuje bajt a jeho hodnota je 0. ↩

6. Jak je vysvětleno v kapitole 3, SegWit obvykle používá adresy bech32. Trvalo však dlouho, než všechny peněženky a burzy podporovaly platby na adresy bech32. Abychom i nadále využívali některé z výhod SegWitu, zavádíme typ adresy, který z pohledu odesílatele vypadá jako běžný P2SH, ale má v sobě kouzlo SegWitu. Tento typ adresy se nazývá adresa P2SH-P2WPKH. ↩

7.bech32 navržený BIP173. ↩

8. Dřívější peněženky Ethereum nepoužívaly detekci chyb, protože jejich standardy adres postrádaly kontrolní součty. Přestože EIP55 zavedl kontrolní součty v roce 2016, ne všechny peněženky provádějí detekci chyb. Ještě v roce 2017 lidé stále ztráceli éter kvůli zadání špatné adresy. ↩

9.bech32m navržená BIP 350. ↩

10. Konkrétní důvody viz poznámky BIP 341. ↩