A Bitcoin-címek technikai háttere

Egyes felhasználók számára ez a szócikk túlságosan is technikai lehet. Számukra inkább a Bitcoin-címekkel foglalkozó alapszócikk ajánlott.

A Bitcoin-cím egy titkos/nyilvános ECDSA kulcspár nyilvános felének 160 bites hashe. A titkos kulcsoddal matematikai úton “aláírhatsz” különböző adatsorokat, a nyilvános kulcsod ismeretében pedig bárki ellenőrizheti, hogy valódi/érvényes-e az aláírásod. Erről a Wikipédia szócikkében olvashatsz bővebben.

Minden fogadó címhez új kulcspár generálódik. A Bitcoin-címeket (a nyilvános kulcsok) és a hozzájuk tartozó titkos kulcsokat a Bitcoin-kliens a tárcafájlban tárolja. Kizárólag erről az egy fájlról kell rendszeresen biztonsági másolatokat készítened. Bitcoint küldeni csak olyan címre lehet, amelyhez érvényes titkos kulcs tartozik a címzett tárcájában. Ami egyben azt is jelenti, hogy ha létrehozol egy fogadó címet, fogadsz vele valamennyi bitcoint, majd egy korábbi, még az ezen cím létrehozása előtt készített biztonsági másolatból állítod helyre a tárcádat, akkor az új címre küldött bitcoinokhoz többé nem fogsz tudni hozzáférni, vagyis azok végleg elvesztek. Felhasználás előtt minden cím felkerül az ún. cím-kulcskarikádra (key pool); ha teljes egészében elveszíted az egész tárcádat, akkor az összes bitcoinodnak is végleg búcsút mondhatsz, mert soha, semmi módon nem szerezheted vissza őket többet.

Az “érmegeneráló” tranzakciók is pontosan ugyanúgy zajlanak le, ahogy a küldések: a frissen generált érmék kötege a direkt erre a célra generált címre kerül elküldésre a szerencsés bányásznak. Ezeket a címeket is a tárca tárolja, de ezek nem jelennek meg a fogadó címek listájában.

Annyi Bitcoin-címet generálhatsz, amennyit csak szeretnél, és mindegyik teljesen különálló. Nincs semmiféle “főcím”, így annak sincs semmi jelentősége, hogy éppen milyen címet látsz a kliensed Bitcoin-cím-mezőjében. Az egyszerűen azért van ott, hogy kényelmesen és egyszerűen hozzáférhess, kimásolhasd és beilleszthesd ahova csak gondolod, és időről időre automatikusan megváltozik a névtelenséged fokozása érdekében. Ezzel együtt azonban a korábban generált címeid is mindaddig használhatóak és fogadóképesek maradnak, amíg ügyelsz a tárcád biztonságára. Ezeket a fogadó címeidnél láthatod kilistázva. Az egyes címek mindössze megközelítőleg 500 bájt méretűek, így az sem jelenthet komoly gondot, ha tényleg nagyon sok címet tárolsz a tárcádban.

A Bitcoin-címek tartalmaznak egy beépített ellenőrző-kódot is, így általában nem lehet félregépelt, hibás címekre küldeni bitcoinokat. Ha azonban mégis sikerül félregépelve is egy érvényes címet beütnöd, aminek azonban nincs gazdája (vagy volt ugyan, de az illető elvesztette a tárcafájlját), akkor az arra a címre küldött bitcoinok örökre elvesznek.

A hash-értékeket és a checksum-adatot a rendszer a Base58Check egyéni kódolási képlete alapján konvertálja át alfanumerikus karaktersorozattá. A Base58Checkkel konvertált címek az 0, a O, az I és az l kivételével minden más alfanumerikus karaktert tartalmazhatnak. A normál címek jelenleg az 1-es számmal kezdődnek, de ez későbbi verziókban megváltozhat, ha ez valamiért szükségessé válna. A teszthálózati címek általában m vagy n betűvel kezdődnek. A fővonalbeli címek 25-34, míg a teszthálózatiak 26-34 karakter hosszúak lehetnek, de a legtöbb cím 33 vagy 34 karakteres.

Lehet küldeni bitcoinokat továbbá közvetlenül IP-címre is, ám ez a módszer erősen ellenjavallt, mivel ez esetben egy külső támadó könnyedén eltérítheti az utalt érméket.

Mivel a Bitcoin-címek alapvetően véletlen számok, ezért bár rendkívül valószínűtlen ugyan, de elméletileg és technikailag mégis lehetséges, hogy két ember egymástól függetlenül ugyanazt a címet generálja. Ezt ütközésnek nevezzük. Ha ez bekövetkezik, akkor az erre a címre küldött érmék felett egyformán rendelkezhet mindkét, ugyanazt a címet legenerált személy (egymás tárcájának teljes tartalmához így sem fognak hozzáférni, csak a konkrétan erre az egy bizonyos, közös címre kerülő érmék lesznek közösek). Szándékos ütközéssel azonban nem érdemes próbálkozni, mivel jelen állás szerint 2^107x tovább tartana sikeresen legenerálni egyetlen ütköző címet, mint egy blokkot. Amíg az aláíró és hashelő algoritmusok kellően erősek maradnak kriptográfiailag, addig mindig jövedelmezőbb lesz a blokkgenerálásért járó jutalom, valamint a tranzakciós díjak begyűjtése, mint az ütközésre való törekvés.

Bitcoin-cím-generálás

1.) Veszünk egy nyilvános kulcsot (65 bájt, 1 bájt 0x04, 32 bájt X, 32 bájt pedig Y koordinátát jelöl)

04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f

2.) SHA-256-tal hasheljük a nyilvános kulcsot:

261c1eb21fc4708c6acbe1cfc6d4565652e9e768b620782898936b93000a6c02

3.) RIPEMD-160-nal hasheljük az előbbi SHA-256 hasht:

62e907b15cbf27d5425399ebf6f0fb50ebb88f18

4.) Hozzáadjuk a hálózati bájtot a RIPEMD-160 hash elejéhez (főhálózat esetén ez 0x00):

0062e907b15cbf27d5425399ebf6f0fb50ebb88f18

5.) SHA-256-tal hasheljük a bővített RIPEMD-160-eredményt:

9b90f16de7f0e580c07735dac15ffe23e2f8f8e103914e509aa91913ffdb9fb6

6.) SHA-256-tal hasheljük az előbbi hasht:

c29b7d937e3049e279391e62fdf00c12def7444013ddf6215808d10e9f2d5996

7.) Vesszük a második SHA-256 hash első négy bájtját. Ez lesz a cím checksumja:

c29b7d93

8.) Ezt a 4 checksum-bájtot beillesztjük a 4. lépésben kibővített RIPEMD-160 hash végéhez. Ez a 25 bájtos bináris Bitcoin-cím:

0062e907b15cbf27d5425399ebf6f0fb50ebb88f18c29b7d93

9.) Végül ezt a bájtsztringet Base58-sztringgé konvertáljuk a Base58Check-kódoló eljárással. Ez a legelterjedtebb Bitcoin-cím-formátum:

1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa

Lásd még: Bitcoin-cím

Forrás: Bitcoin Wiki