neděle 3. ledna 2021

Vytvoření Bitcoin peněženky (WIF) v Bashi pomocí OpenSSL

Bitcoin je tu již nějaký ten pátek, což dalo vzniknout nepřebernému množství peněženek, jež nám umožňují držet BTC s ohledem na pohodlí a bezpečnost (věšinou jde pohodlí a bezpečnost proti sobě, což nyní pomiňme:). Jako softwarovému vývojáři a fanouškovi Bitcoin zajímá i z jiného, než ekonomického či společenského hlediska. Jako svůj první skutečný kontakt s Bitcoinem (tím nemyslím nákup BTC na burze) považuji instalaci a provoz tzv. Bitcoin Full Node, čímž jsem se stal malou, bezvýznamnou:) součástí světa nejslavnější kryptoměny. 

V tomto čánku bych rád popsal, jak je možné vygenerovat funkční bitcoinovou adresu "vlastními silami", z příkazové řádky linuxu, tedy pomocí nástrojů, které s Bitcoinem nemají vlastně nic společného a jsou běžnou součástí operačních systémů.

Wallet Import Format

Obecně, bitcoinová peněženka není nic jiného než aplikace (pro PC či telefon), která nám spravuje veřejné a privátní klíče, umí z veřejného klíče generovat adresu a pomocí privátního klíče podepisovat transakce a poslat je do mempoolu.

Pokud chceme uchovat svoje bitcoiny "na papíře", nic nám nebrání si klíče a adresy vytisknout na papír. K tomuto účelu se standardizoval Wallet Import Format - speciální formát pro privátní klíč, kterému elektronické peněženky rozumí a umožní nám BTC utratit. Nutno podotknout, že Bitcoin používá šifrování nad eliptickými křivkami, kde lze z privátního klíče odvodit klíč veřejný, takže stačí uchovat jen privátní klíč. Vytisknutému papíru s kódem ve WIF formátu a s odpovídající veřejnou adresou, se běžně říká "papírová peněženka".

Použíté nástroje

K vyvoření WIF peněženky budeme potřebovat tyto nástroje:

  • OpenSSL -  nástroj na kryptografii použitelný z příkazové řádky.
  • Bash včetně obvyklých nástrojů - cat, head, xxd, sed, tr, sha256sum...
  • Bitcoin Bash Tools- sada funkcí pro sofistikované generování WIF...

Naposledy uvedený nástroj Bitcoin Bash Tools, nutno říci, kompletně řeší záležitosti kolem adres a generování peněženky:) Z edukativních důvodů však z toolu užijem "jen" base58.

Jdeme na to!

Prvním krokem vygenerujem privátní klíč do souboru key.pem

    openssl ecparam -genkey -name secp256k1 -noout -out key.pem

Hned potom můžem z privátního klíče vyrobit veřejný klíč a oba uložit v hexadecimální podobě do souboru key.plain.

   openssl ec -in ./key.pem -text -out keys.plain 2> /dev/null

Pokud si prohlédnem obsah souboru keys.plain, uvidíme oba klíče v hex formátu.

Private-Key: (256 bit)
priv:
    6f:91:ac:0d:5e:a6:04:16:9c:98:d7:56:0c:ba:91:
    09:a2:45:e3:43:86:0e:21:61:50:06:f7:c0:5d:17:
    64:e6
pub:
    04:fd:ed:80:48:09:60:92:a5:ed:6c:2a:45:6c:f1:
    5b:e5:fe:84:90:65:ae:24:5b:66:7f:b2:ae:24:41:
    40:83:47:43:67:7c:ed:58:29:54:99:8c:5e:08:59:
    bb:be:e4:fb:ba:c9:df:b4:52:96:88:5b:48:25:e9:
    a5:82:8e:bb:d2
ASN1 OID: secp256k1
-----BEGIN EC PRIVATE KEY-----
MHQCAQEEIG+RrA1epgQWnJjXVgy6kQmiReNDhg4hYVAG98BdF2TmoAcGBSuBBAAK
oUQDQgAE/e2ASAlgkqXtbCpFbPFb5f6EkGWuJFtmf7KuJEFAg0dDZ3ztWClUmYxe
CFm7vuT7usnftFKWiFtIJemlgo670g==
-----END EC PRIVATE KEY----- 

Všiměme si, že privární klíč je o proti veřejnému klíči asi poloviční (32bytu v.s. 65bytů).

Nejprve se soustřeďme na důležitější, privátní klíč, ze kterého vyrobíme WIF a začneme odstraněním dvojteček a prázdných bílých znaků:

    cat ./keys.plain | sed -n '3,5p' | sed 's/[:[:space:]]//g' | tr -d '\n' > private-key.hex

Skvělé, klíč je ve hexadecimálním formátu v souboru private-key.hex.

    6f91ac0d5ea604169c98d7560cba9109a245e343860e21615006f7c05d1764e6

Připravmě si do proměnné EXT_PRIVATE_KEY_HEX privátní klíč rozšířený o byte pro identifikaci btc sítě. Tedy řekneme, že vyrábíme WIF pro Mainnet (znak 0x80) a ne Testnet (znak 0xef)

    EXT_PRIVATE_KEY_HEX="80$(cat ./private-key.hex)"

Kontrolni součet je dalších 4 bytes spočtených právě z EXT_PRIVATE_KEY_HEX. Musíme tuto proměnnou převést do binárního tvaru a 2x zahashovat. K tomu nám poslouží příkazy xxd, sha256sum a head pro odstranění přebytečného výstupu:

    echo $EXT_PRIVATE_KEY_HEX | xxd -r -p | sha256sum | head -c 64 |  xxd -r -p | sha256sum | head -c 64 > double-sha256.hex 

Obsah souboru double-sha256.hex je 66e5fd257cd7489c70282607d636acf1c1028af34ea1db0d1a5e2253795cb1b3. Máme 2xhash, teď vzit jen 4 byte (8 znaků) a je kontrolní součet:
 
    CHECKSUM="$(cat ./double-sha256.hex | head -c 8)"
 
Výslekek a obsah CHECKSUM je něco jako 66e5fd25. WIF kód v hex. tvaru vynikne spojením EXT_PRIVATE_KEY_HEX a CHECKSUM:
 
    WIF_ADDRESS_HEX="$EXT_PRIVATE_KEY_HEX$CHECKSUM" 

Ještě převést do base58 kódování. Je možné použít online převodník, nebo si stáhnout uvedený bitcoin bash tool příkazem 
 
    git clone https://github.com/grondilu/bitcoin-bash-tools.git

a pak zadat dva příkazy:

    source ./bitcoin-bash-tools/bitcoin.sh
    encodeBase58 $WIF_ADDRESS_HEX > wif_address.base58


První řádek nám aktivuje bitcoin-bash-tools, další nám do wif_address.base58 uloží finální peněženku ve Wallet Import Format.
 
5JfRTnhsKR9WczygHaUVhjfcLCc3F8XKUZWv48CrPiXPDqodvUL

Pokud chcete vyrobit QR code, lze použít např.

    qrencode "5JfRTnhsKR9WczygHaUVhjfcLCc3F8XKUZWv48CrPiXPDqodvUL" -o paper-wallet.png

Výsledkem je pak fungující QR kód pro utracení:

V dalším díle se vrhnem na generování veřejné adresy, kterou můžem sdílet s ostatními a na níž se můžou posílat bitcoiny. K tomu použijem existující soubor s veřejným klíčem keys.plain.

Poznámka na závěr: Článek má edukativní charakter. Pro správu privátních klíčů k Vaším BTC doporučuji použít sofistikované rešení zavedených peněženek. Jinak může dojít ke ztrátě Vašich klíčů a tím i BTC.

Použité zdroje:

  • https://en.bitcoin.it/wiki/Wallet_import_format
  • http://gobittest.appspot.com/Address
  • http://gobittest.appspot.com/PrivateKey
  • https://en.bitcoin.it/wiki/Invoice_address
  • https://en.bitcoin.it/wiki/Technical_background_of_version_1_Bitcoin_addresses
  • https://wiki.openssl.org/index.php/Command_Line_Elliptic_Curve_Operations#Generating_EC_Keys_and_Parameters
  • https://kjur.github.io/jsrsasign/sample/sample-ecdsa.html

čtvrtek 27. srpna 2020

Bitcoin Full Node

 Bitcoin full node

Bitcoin is probably biggest invention in economy since American dollar was separated from gold (last gold-covered currency in the world). When I discovered hat amazing technology, I decided to participate on that revolution a bit. 
 
 

Odroid-C2

When I migrated my home-made multimedia center to Raspberry 4 (full H.265 support, including TvHAT for DVB-T2), legacy, single-board computer Odroid-C2 stayed in desk drawer.... till the moment I bought external hdd 1TB capacity and enable public IP address for that computer. Since that moment I could start to install proper Bitcoin Full Node server. 
 
 
Some informations about computer:
  • Hardkernel Odroid-C2
  • ARMv8 AArch64, 2GB RAM
  • eMMC module socket with 16GB RAM
  • Ubuntu 18.04.3
  • Kernel version 3.16.78-48 aarch64 aarch64 aarch64 GNU/Linux
  • Western Digital 2,5`` - External 1TB
 

 
 
As a full node software I´m using https://bitcoin.org/en/bitcoin-core/ Because of public IP address, the node is regular part of Bitcoin network. Except SSH server without password login (key login only) for administration purposes, there is also nginx as simple web page server present. 

 
Server provides web pages with short description on https://lenka-public.pilsfree.net
 

Bitnodes

Bintodes is service for monitoring whole Bitcoin network nodes by crowling and checking their features. My full node is accessible in that service of course. Let check it on https://bitnodes.io/nodes/78.108.111.113-8333/
 

Troubles 

After Bitcoin Core update to 0.19.1 or newer, the mobile wallet Bitcoin Wallet (which is one of wallets with direct connection into network without special backend) is not able to connect to my node and I still didn't find the reason.  
 

pátek 3. dubna 2020

Oprava akuvrtačky 2

Transformátor definitivně dosloužil

a odporoučel se do křemíkového nebe. Odmítám se vzát i napodruhé a hledám, čím bych mohl trafo nahradit. Nechat převinout? Nejspíš by násobně převýšilo cenu nové akuvrtačky. Sehnat podobné nové trafo? Určité možnosti jsou, ale stále dost drahé. Cilem je najít stejnosměrný zdroj příliš nepřevyšující 18V, tedy napětí akumulátoru. Něco kolem 19V by mohlo úspěšně fungovat a zároveň články nezničit. Zdroj by měl být dostatečně silný, aspoň 10W (aby dal tak 0.5A nabíjecího proudu).

Ideální kandidát

se nakonec objevil: stačí sehnat vhodný zdroj ke starému notebooku. Jednak se jedná o zařízení o kompaktní velikosti a je to silný a efektivní zdroj. Jediná podmínka je aby měl správné výstupní napětí. Doma se mi válel náhradní zdroj ke staršímu ale přesto stále používanému Lenovu Thinkpad R51. Jeho výstupní napětí je 20V, což by možná bylo vhodné, ale mně se zdá, zě by pro akumulátory bylo šetrnějších tak 19V. Nakonec jsem sehnal od kolegy zdroj k Fujitsu Siemens notebooku s 19V výstupen. Stál mě dvě plechovky plzeňskýho piva:)





Drobné úpravy

Bez drobných úprav se neobejdu: Konektor zdroje je pochopitelně dost specifický, bude vhodné ho nahradit něčím obyklejším a hlavně něčím, co má i protikus. Dá se úspěšně sehnat napájecí konektor i s protikusem, který se instaluje "na drát". Je to jednodušší, protože se nemusím trápit s vrtáním a uchycením zdířky ke krabičce.


Po tom, co jsem se zbavil transformátoru, zapojil jsem přívodní kabely rovnou k desce plošného spoje. Zvolil jsem možnost zapojení přívodu před diody usměrňovacího můstku. Sice se diody budou zatěžovat, nicméně díky nim dojde k sražení napětí o půl až jeden volt. Pokud by napětí bylo moc nízké, diody vyřadím z obvodu.

Závěr

Po zprovoznění a vyzkoušení se zdá, že vsechno jede a akumulátory se celkem spolehlivě nabíjejí. Při předchozí opravě jsem vyřadil z trafa tepelnou pojistku, čímž jsem vytvořil "technický dluh", jak trefně prohlásil kolega. S odstraněním trafa tak došlo i k odstranění dluhu:) Celkem mě potěšilo, že se zdroj vejde i do kufříku k akuvrtačce. Jen je třeba použít rošku násilí při zavírání:) 



středa 18. prosince 2019

LibreELEC: z Rapsbery Pi3 na Odroid C2

RASPBERRY Pi 2 Model B - Mini počítačNachytření staré televize




Po přestěhování do vlastního bytu, poté co utichl ruch rekostrukčních prací, jsem s údivem zjistil, že společenství vlastníků se v minulosti rozhodlo zrušt společnou anténu (včetně rozvodů) na příjem pozemního televizního vysílání. Tento geniální krok měl za následek, že na každém balkóně začly růst satelity jak houby po dešti. Nechme stranou ohyzdný vzhled domu i to, že by náklady na společný rozvod ve výsledku rozhodně vyšly levněji než dvacet satelitů na balkónéch. 
https://freebit.cz/wp-content/uploads/2019/07/pilsfree_logo.jpg
Vyzbrojen znalostmi z IT a poměrně spolehlivou přípojkou do ryché komunitní sítě Pilsfree drátem až do bytu jsem přemýšlel, jak efektivně vyřešit problém moderního domácího krbu.

RPi jako spása

V dobách bez závazků, bezedných pivních sudů a nekonečných kocovin, kdy se veškerý můj majetek dal sbalit na do turistické krosny, jsem s úspechem použával IP televizi poskytovanou v síti Pilsfree. Vskutku stabilní příjem (výpadek programu s nutností dvojkliku tak dvakrát za hodinu) vyžadoval zapnutý počítač, VLC přehrávač a pár hbitých kliknutí myší. Nic, co by v malém podnájemním pokoji způsobilo jakkoli snížení komfortu či dokonce nějak otravovalo.

S přibívajícími roky přibývaly závazky a nároky na rychlost a jednoduchost. Počítač již nebyl střed mého vesmírů. Tam si našla místo lidská bytost opačného pohlaví:). Počítač se stal těžítkem umýstěným na nejvyšší polici ve skříni v komoře, hned vedle starého povlečení a prošlých konzerv na luncheon meat.

Byly zde pokusy použít počítač a propojit ho s televizí. Jenže zapnutí vyžadovalo tu nejtěžší formu námahy - zvednout se z gauče a dojít k televiznímu stolku, otevřít víko notebooku a stiskout tlačítko. Bezdrátová myš již umožnila poměrně pohodlné přepínání programů, ale na klasický dálkový ovladač to jistě nemá.

RASPBERRY Pi 2 Model B - Mini počítač

https://cdn.alza.cz/ImgW.ashx?fd=f3&cd=RK100a3
Psal se rok 2015 a právě vyšla nová verze minipočítače zvaného RPI. Výkonově dostačoval na přehrávání videí na tu dobu výborném Full-HD rozlišení. Jako nováček v oblasti minipočítačů se mi povedlo si jeden Raspberry Pi 2 na víkend půjčit od kolegy z práce. Nastal maraton pokusů a instalací, kde se mi v neděli v pozdních hodinách povedlo rozběhat systém OpenELEC včetně ipTV ze sítě Pilsfree včetně EPG - popisu tv programů. Aby se v televizi obraz nezpoždoval, bylo třeba počítač trochu nataktovat. To doubou jsem zkusil i OSMC. Zde se mi výkon při přehrávání TV zdál o dost hoší.

Vše se zdálo být úžasné a krásne až do do doby, kdy Pilsfree začalo mít problémy s licencí na streamování Prima kanálů. Dále zde od začátku panovala nestabilita při přehrávání programů - každé dvě hodiny (plus minus) kanál prostě vypadl a bylo nutné přehrávání pustit znovu. Problém byl i s EPG - veřejný seznam programů s popisem nebyl vždy úplný. Mapování programů mezi Pilsfree a EPG vyžadovalo úpravu XML souboru apod.

Hledání alternativy aneb když výkon již nestačí

Druhá řada Raspberry Pi přehrávání ipTV zvládala s přetaktováním a masivním chladičem s odřenými chlupy. K mému překvapení se však v roce 2016 objevila nová, tedy třetí řada RPI. Neváhal jsem a okamžitě jsem objednal a upgradoval. Rozhodnutí se jevilo jako správné - minimáně z pohledu odezvy systému bez nutnosti nějakého taktování.

https://www.mironet.cz/Foto/s4/92442415.jpg 

Pořízení rychlejší verze RPI rozhodně nevyřešilo problém stability příjmu ipTv. Obrovská příležitost přišla s koncem roku 2018, kdy výrobci slavného minipočítače uvádějí tvHat - modul pro příjem televizního signálu, navíc s podporou formátu DVB-T2 - nový standard pro pozemní vysílání.


https://cdn.alza.cz/ImgW.ashx?fd=FotoAdd&cd=RK110a-04
TV tuner šitý na míru RPI má jeden háček. Vlastně dva. Jednak RPI 3 nepodporuje hardwarové dekódování videa ve formátu H.265 (takže brzy nepůjde přijímat pozemní vysílání vůbec), jednak, jak již jsem zmínil - nemám televizní anténu :(. Jak z toho ven?

Instalace televizní antény

Internet je plný varování, že instalace televizní antény bez příslušné kvalifikace a měřících přístrojů je riskantní. Risk je zisk a tak objednávám jednu celkem solidně hodnocenou s tím, že se mi ji povede úspěšně nainstalovat a hlavně něco chytit:)

Se zručností sobě vlastní se mi povedlo nainstalovat anténu ba co víc, chytit na ní prakticky všechny dostupné kanály. Heureka.

Svatá trojice Odroid-C2 / RPi Zero / TvHat

Raspberry není jediný minipočítač na trhu. Hlavně není jediný, na kterém se dá zprovoznit LibreELEC distribuce. Existuje série produktů společnosti HardKernel zvaná Odroid. Minipočítač Odroid-C2 se zdá jako velmi vhodná náhrada za mutlimediální centrum postavené na RPI3 : kromě větší rychlosti nabízí především hardwarový kodek H.265, klíčový k příjmu pozemního výsílání.

https://cdn-reichelt.de/bilder/web/xxl_ws/A300/ODROID_C2-001.png

Podle informací z internetu je možné použít tvHat v kombinaci RPI Zero (malé a úsporné variantě raspberry pi) pro příjem DVB-T/DVB-T2 streamu bez nutnosti náročného dekódování obrazu H.265. Úsporná variata tak bude sloužit jen jako "jednoduchý přijímač toku televizních dat do sítě", na čež výkon zero varianty plně postačuje. Dekódování náročného H265 tak hravě zvládne Odroid C2.

Na instalaci bylo nejtěžší zprovoznit TvHeadend nástroj na RPI Zero osazeném TvHAT modulem. Neexistoval totiz snadno importovatelný seznam kanálů potřebný pro správné nastavení. TvHeaded je poměrně pokročilý nástroj a pro nezkušeného uživatele není cekjové nastavení příliš intutitvní. Jako nejtěžší se ukázalo ruční nastavení správné frekvence (kanály) jako DVB-T2 kanály podle tabulky kanálů v jednotlivých multiplexech.


Nastavení Low Noise Amplier
Nastavení mutexů, klíčové kanály musely být jeden po drumén přepnuty ručně z DVB-T na DVB-T2: Podle lokality jsem odhadnul vysílače a jejich DVB-T2 kanály. A tyto kanály jsem převedl na frekvenci (např. podle https://dvb-t2.cz/prevod-kanalu-a-frekvence/) a daný mutex jsem nastavil jako DVB-T2.

Seznam utomatický načyených mutexů pro ČR
Nastavení těch správných utexů na DVB-2


Mutex pak po prolhedání úspěšně našel odpovádající DVB-T2 programy.