Dieser Blogpost stammt vom Gleichgesinnten und Lightning Enthusiasten @notgrubles, und wurde ursprünglich auf seinem eigenen Blog veröffentlicht.
Abschnitte
- Einleitung / Voraussetzungen
- Setup: Paketweiterleitung
- Kompilieren von c-lightning und bitcoin-cli
- Installation von Lightning Charge
- Installation von nanopos für eine ‘point of sale’ Lösung
Das “Inverse Path USB Armory” ist ein einzigartiges Gerät unter den derzeit immer beliebteren ‘System auf einem Chip’ (SoC) mit Energie versorgten Hardware-Arten, wie z.B das Raspberry Pi und das Rock64. Im Vergleich zu ähnlichen Systemen ist die Rechenkraft eher limitiert. Abseits davon sind die kompakte Form und die dazugehörigen Komponenten einzigartig. Das “Armory” benötigt kein Netzteil oder Steckdose um zu funktionieren; es versorgt sich selbst mit Strom durch USB und kommuniziert ebenfalls mit dem Host-Rechner durch eine emulierte Ethernet-Verbindung. Das Armory verwendet einem NXP i.MX53 ARM® Cortex™-A8 Prozessor mit einer Taktfrequenz von 800 Mhz. 512 MB DDR RAM stehen zur Verfügung und ein MicroSD Card Slot ist auch vorhanden.
“Das Armory USB-Platine wurde von Inverse Path erstellt und unterstützt die Entwicklungen von diversen sicherheitsrelevanten Anwendungen. Das USB-Platine kann verschiedene, willkürliche USB Geräten mit i.MX53 SoC Geschwindigkeiten emulieren, die Sicherheitsmerkmale und die flexible, vollständig anpassbare Betriebsumgebung macht das Armory USB-Platine ideal für jegliche Art persönlicher Security-Anwendungen. Dadurch dass das Armory ein transparentes, minimalistisches Design vorweisen kann, ist es möglich, die Hardware zu revidieren und somit das Risiko für ‘supply chain’ Angriffe erheblich minimieren.”
Quelle: https://inversepath.com/usbarmory
Ein guter Anwendungsfall, der die Kleinform-Vorteile und Stromversorgung über USB samt emulierter Ethernet-Verbindung nutzt, ist die Bitcoin Lightning Wallet. Mit einer solchen Konfiguration können Nutzer ein Gerät verwenden, das c-lightning ausführt und die Privatschlüssel auf einer tragbaren Plattform speichert. Somit kann die tragbare Plattform einfach in Raspberry Pis gesteckt werden welche bitcoindausführen.
Ein anderer Anwendungsfall: ein Nutzer verwendet einen Laptop um eine “Full Node” zu betreiben; Ein Armory könnte einfach ins Laptop eingesteckt werden und der Nutzer könnte über das Lightning Netzwerk Transaktionen sowie Lightning Applikationen (LApps) ausführen.
Ein weiterer Anwendungsfall: Rechenleistung wird für schwache Rechner wie Laptops oder RPis erhöht. Was heißt das genau? Armory funktioniert als Co-Prozessor für Lightning.
Anforderungen:
- Ein Inverse Path USB Armory
- 4GB MicroSD-Karte oder größer, vorinstalliert mit dem official Debian base Image.
- Ein USB Host-Gerät (Laptop, Workstation oder Raspberry Pi)
- bitcoind als Daemon der im lokalen LAN läuft, kann aber auch sonstwo installiert werden, konfiguriert mit entsprechender Anmeldeinformationen für RPC.
Den Armory für die Installation vorbereiten
Alles was nötig ist, damit lightningd mit einem Remote installiertem bitcoind Dienst kommunizieren kann, ist bitcoin-cli, welches die für Armory zu erstellen benötigte Zeit sehr stark reduziert. Cross-Kompilierung ist möglich aber wird hier nicht erörtert. Um bitcoin-cli zu erstellen, muss der Bitcoin Code vom eigenen Github Repository heruntergeladen werden. Vorher müssen wir aber Paketweiterleitung auf dem Host-Gerät (das Gerät wo der Armory eingesteckt ist) erlauben.
Netzwerken
Der Armory (falls das offizielle Debian Base Image verwendet worden ist) erstellt eine virtuelle Schnittstelle, die eine Ethernet Verbindung emuliert sobald er eingesteckt und hochgefahren ist. Einmal konfiguriert, kann der Armory mit dem USB Host-Gerät kommunizieren als wären sie im gleichen Netzwerk. Das USB Host-Gerät entscheidet ob Pakete weitergeleitet werden oder nicht; falls erlaubt, kann der Armory Lightning Netzwerk Kanäle mit anderen Nodes außerhalb des lokalen Netzwerks öffnen. Paketweiterleitung ist auch nötig, um Softwarewerkzeuge und andere Abhängigkeiten (dependencies) zu erstellen.
Windows: Anweisungen zum Erlauben der Paketweiterleitung (Connection Sharing) unter Windows 7, 8 und 10 sind hier zu finden.
MacOS: Anweisungen für MacOS sind hier zu finden.
Linux: Anmerkung: Auf Ubuntu 16.04 hatNetwork Manager nicht störend eingegriffen. Andere Linux Distros haben jedoch ihre eigenen Konfigurationen. Von Linux Anweisungen:
Masquerading für ausgehende Verbindungen erlauben:
# iptables -t nat -A POSTROUTING -s 10.0.0.2/32 -o wlan0 -j MASQUERADE
IP weiterleitung erlauben:
# echo 1 > /proc/sys/net/ipv4/ip_forward
Armory einstecken. Die weiße LED blinkt, was bedeutet, dass der Armory läuft. Je mehr der “heartbeat” LED blinkt, umso mehr wird der Armory verwendet.
Mit SSH kann man sich jetzt in Armory einloggen (Benutzername und Passwort ist usbarmory)
$ ssh usbarmory@10.0.0.1
Ein Ping durchführen um festzustellen, ob der Armory richtig geroutet wird:
$ ping 8.8.8.8
Falls erfolgreich, kommen die Rückmeldungen:
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=60 time=46.3 ms 64 bytes from 8.8.8.8: icmp_seq=2 ttl=60 time=48.0 ms 64 bytes from 8.8.8.8: icmp_seq=3 ttl=60 time=48.1 ms 64 bytes from 8.8.8.8: icmp_seq=4 ttl=60 time=71.5 ms
c-lightning kompilieren und erstellen
$ sudo apt update && sudo apt -y upgrade
Sobald die Updates fertig installiert sind ist ein Neustart erforderlich:
$ sudo reboot
Jetzt holen wir uns die Abhängigkeiten (dependencies) und Erstellungswerkzeuge die nötig sind, um bitcoin-cli und c-lightning zu kompilieren:
$ sudo apt-get install -y \ autoconf automake build-essential git libtool libgmp-dev \ libsqlite3-dev python python3 net-tools libsodium-dev \ pkg-config libssl-dev libevent-dev \ libboost-system-dev libboost-filesystem-dev \ libboost-chrono-dev libboost-program-options-dev \ libboost-test-dev libboost-thread-dev tmux curl
C-lightning Repository klonen:
$ git clone https://github.com/ElementsProject/lightning.git
Zum Ordner navigieren:
$ cd lightning
“Build” ausführen:
$ make
Sobald der Prozess fertig ist, zum $HOME Verzeichnis navigieren:
$ cd ~/
Das Bitcoin Core 0.16.0 Quellcode Archiv, SHA256SUMS.asc herunterladen und den Core Betreiber Schlüssel importieren um die Hashes zu verifizieren. Als letztes das Archiv entpacken:
$ wget https://bitcoincore.org/bin/bitcoin-core-0.16.0/bitcoin-0.16.0.tar.gz
$ wget https://bitcoincore.org/bin/bitcoin-core-0.16.0/SHA256SUMS.asc
$ gpg --recv-key 90C8019E36C2E964
$ gpg --verify SHA256SUMS.asc
$ sha256sum -c --ignore-missing SHA256SUMS.asc
$ tar zxvf bitcoin-0.16.0.tar.gz
Als nächstes wird bitcoin-cli erstellt.
Erstellung von bitcoin-cli
Zum Bitcoin Quelltext Verzeichnis navigieren:
$ cd bitcoin-0.16.0/
Autogen ausführen:
$ ./autogen.sh
Es kann vorkommen, dass viele Warnungen bezüglich ‘Locales’ erscheinen. Beim Einstellen von ‘Locales’ wird das behoben.
$ sudo dpkg-reconfigure locales
Wähle etwas wie en_US.UTF-8 aus.
Der Erstellungsprozess wird weiterhin ausgeführt:
$ CFLAGS="-march=native" ./configure --disable-wallet -march=native Parameter zwingt den Compiler, gcc, den Armory Prozessor automatisch zu finden und optimieren. Die Optimierungen vom ARM Prozessor hilft, da der Prozessor wenig Rechenkraft besitzt. bitcoind wird nicht erstellt und somit wird libdb nicht gebraucht. Das --disable-wallet Parameter wird verwendet, wenn kein Wallet Support gewünscht wird. In dieser Anleitung wird c-lightning das Wallet werden.
Jetzt wird bitcoin-cli erstellt:
$ make src/bitcoin-cli
Die bitcoin-cli Binary Datei zum /usr/local/bin kopieren
$ sudo cp src/bitcoin-cli /usr/local/bin
Nochmals kontrollieren ob es richtig kopiert worden ist:
$ whereis bitcoin-cli
Es sollte folgendes ergeben:
$ /usr/local/bin/bitcoin-cli
Armory zum bitcoind via RPC verbinden
C-lightning verwendet bitcoin-cli, was unverarbeitete Transaktionen an bitcoind sendet um verschiedene Aktionen durchzuführen wie zb öffnen, schließen und die gegenseitige Schließung von Kanälen. Da c-lightning auf dem Armory ausgeführt werden, wird bitcoin-cli ebenfalls benutzt. Allerdings mussen bitcoin-cli und bitcoind miteinander kommunizieren; der Armory und das USB Host-Gerät brauchen jeweils eine bitcoin.conf Datei mit folgenden Parametern:
Im USB Host-Gerät oder wo der bitcoind Dienst gerade ausgeführt wird, sollten folgende Parameter in bitcoin.conf stehen:
rpcuser= Benutzername rpcpassword= Kennwort rpcallowip= Armorys IP Adresse
Speichern, und dann die bitcoin.conf Datei auf dem Armory erstellen und anpassen:
$ nano ~/.bitcoin/bitcoin.conf
rpcuser= gleicher Benutzername wie auf dem Host-Gerät rpcpassword= gleiches Kennwort wie auf dem Host-Gerät rpcconnect= USB hosts's IP (10.0.0.2)
Die IP Adresse des USB Host-Geräts sollte natürlich angepasst werden.
Als nächstes ist festzustellen ob wir eine Query vom bitcoind auf dem Armory abfragen können:
$ bitcoin-cli -getinfo
Eine Antwort sollte relevante Informationen beinhalten, wie z.B Block Height, Difficulty, usw.
C-lightning ausführen
Da jetzt alles erstellt, konfiguriert und vernetzt ist, kann c-lightning ausgeführt werden.
Starte eine tmux Session (oder ein screen Session) und führe lightningd aus:
$ tmux $ ./lightning/lightningd/lightningd --network testnet --log-level debug $ ./lightning/cli/lightning-cli getinfo
Sobald “Adding block number” in der Terminalausgabe zu sehen ist und lightning-cli get-info die derzeitige ‘block height’ und andere Infos zurücksendet, funktioniert der Armory.
lightning-cli kann jetzt verwendet werden um neue Bitcoin Adressen für Einzahlungen / Abhebungen zu generieren. Lightning Network Channels können auch geöffnet und geschlossen werden.
Lightning Charge
LApps sind Lightning Applikationen welche die instant payments von Lightning Network verwenden. Unlängst veröffentlichte LApps sind of Blockstreams Blog gelistet. Um diese LApps auszuführen, muss Lightning Charge auf dem Armory installiert sein. Lightning Charge ist ein Mikropayment-Abwicklungssytem, geschrieben in node.js. Es legt die Funktionalität von c-lightning durch ein REST API offen, das dann durch JavaScript und PHP Bibliotheken aufgerufen werden kann. Siehe https://blockstream.com/2018/01/16/lightning-charge/
Lightning Charge benötigt c-lightning und node.js und kann mit folgenden Befehlen installiert werden:
$ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - $ sudo apt-get install -y nodejs
Um Berechtigungsfehler mit dem nodejs Paket von nodesource.com zu vermeiden, kann folgender Befehl ausgeführt werden:
$ mkdir ~/.npm-global $ npm config set prefix '~/.npm-global'
Ein paar Zusatzzeilen werden im ~/.profile benötigt:
$ export PATH=~/.npm-global/bin:$PATH
Dann:
$ source ~/.profile
Lightning Charge kann jetzt einfach durch npm installiert und ausgeführt werden, mittels folgender Befehle:
$ npm install -g lightning-charge
$ charged --api-token
Charge läuft jetzt auf dem voreingestellten Port 9112
Nanopos LApp installieren und dein Lightning Modul in eine Mikro Point-of-Sale Lösung umwandeln
Nanopos wird sehr einfach mit npm installiert:
$ npm install -g nanopos
Die items.yaml Datei kann editiert werden, um z.B Produkte oder eine Währung hinzuzufügen. Schließlich wird nanopos ausgeführt.
$ nanopos -t <charge API token> --items-path items.yaml --currency USD
Der Titel der dargestellten Webseite kann mit dem --title Parameter geändert werden. Verschiedene Themen können von bootswatch.com ausgewählt werden, mit dem -m Parameter.
Jetzt laufen c-lightning, charged und das nanopos LApp alle auf dem Armory!
Sobald die Transaktionen ausgeführt sind, kann der Armory einfach ausgehängt werden und ist somit transportbereit. Sind weitere Transaktionen erwünscht, kann man den Armory erneut einstecken, mit SSH einloggen und c-lightning erneut starten.
bitcoind kann auch als Dienst auf einer VPS ausgeführt werden und somit ist nur der Armory notwendig (anstatt Laptop/Workstation oder Host-Gerät), was wiederum die Portabilität erhöht.
Der Armory kann auch in Standalone Mode ausgeführt werden, ohne ein USB Host-Gerät, das Strom und Konnektivität zur Verfügung stellt.
Selbstverständlich braucht der Armory Strom durch USB um zu funktionieren. Hiermit entstehen interessante Möglichkeiten Anwendungsfälle wie z.B eine tragbare, batteriebetriebene WiFi aktivierte Konfiguration.
Dank fürs Lesen!
-grubles