Try Bitcoin - Technisches Tutorial für Anfänger

Hey,

ich habe das kürzlich erschiene technische Tutorial Try Bitcoin von Stacie Waleyko ins Deutsche übersetzt.
Es veranschaulicht die technischen Bitcoin-Konzepte mit JavaScript und einigen Bitcoin Core RPC-Befehlen. Programmiererfahrung ist hilfreich, aber nicht erforderlich.

Das Tutorial ist ein erster Vorgeschmack darauf, was an Bitcoin eigentlich genau „Crypto“ ist (Hashing, Signaturen, etc.). Daher sowohl für Nocoiner als auch Einsteiger sicherlich interessant.

Über Feedback würde ich mich sehr freuen! :slight_smile:

https://blueballroom.github.io/trybitcoin/

14 „Gefällt mir“

@BlueBallroom, das ist eine gute Idee von Dir und ich finde die Seite wirklich gut!

Ich weiß nicht ob das so gewollt ist, aber meine Fragen / Anmerkungen anbei:

Lektion 2 - Signaturen
Sie können den beliebige Nachricht Teil in einen Text Ihrer Wahl ändern. to something more exciting (achten Sie nur darauf, dass Sie die Anführungszeichen beibehalten!).

Ich denke die Stelle mit „to something more exciting“ könnte eigentlich weg oder?

Lektion 5 - Adressen
Hier ist ein Beispiel für eine Bitcoin-Adresse:
2NEwkTybLpYyaRooBFMXAJDtchRdA8FMM4G

Die hier angegebene Adresse wäre eine Testnet-Script-Hash (?) Adresse. Da vermutlich Anfänger weniger bis nichts mit den Testnetz zu tun haben könnte dies ggfls. zu Verwirrungen führen. Wäre es daher nicht besser, eine der üblichen Mainnet Adressen abzubilden?

Lektion 8 - Übermittlung einer Transaktion
Each Bitcoin node has a set of peers it reguarly „talks“ to. When a node hears about a new transaction, it shares it with its peers.

Da fehlt noch die Übersetzung.

4 „Gefällt mir“

Ich danke dir vielmals für deinen Input!! Gerade die Flüchtigkeitsfehler sieht man nach wiederholtem Lesen einfach nicht mehr :sweat_smile:
Die Adresse aus Lektion 5 habe ich gegen eine beliebige Legacy-Adresse ausgetauscht.

1 „Gefällt mir“

Großartige Arbeit, danke dafür. Ein paar Kleinigkeiten hab ich dir als PullRequest gestellt.

1 „Gefällt mir“

@RottingCleaner Auch an dich ein großes Dankeschön!! :partying_face:

Falls sich noch jemand mit Webdesign/HTML auskennt, würde ich mich über weiteren Input zur Optimierung der Seite sehr freuen :innocent:

1 „Gefällt mir“

Die Idee gefällt mir. Leider kann ich sie als Noob nur schwer nachvollziehen. Zum Beispiel hat mich das Tutorial zum ersten mal verloren, als vom Transfer eines Bitcoin besprochen wurde ohne zu sagen, wie der Wert zum Hash wurde.

Seite 8 kann ich genauso wenig nachvollziehen. Wo kommt mit einmal die

0200000001797a827a25bdf354b9f9440d7de2ded6596cc2c8b8dc2eaf936a476049f898c4000000006a473044022034c2cde7e751cb6d72bceb73cbad5614f43d60a59142f6eef20a40786f683772022070b9a8c6d71d9ea628fa943e51ccf5d35bafd71e364f00e1dfbacb5b8b873c5901210227d85ba011276cf25b51df6a188b75e604b38770a462b2d0e9fb2fc839ef5d3ffdffffff03c41b1a1e010000001976a914a96c7dbd1264f69bb52549618f3c59c9440f3c6f88ac80d1f008000000001976a91460baa0f494b38ce3c940dea67f3804dc52d1fb9488ac80f0fa02000000001976a914ba27f99e007c7f605a8305e318c1abde3cd220ac88ac00000000

her?

Sollten die Antworten auf meine Fragen im Tutorial enthalten sein, konnte ich sie leider nicht ausfindig machen. Mir ist bewusst, dass Du eine Übersetzung von stasie anbietest. Vielleicht könnt Ihr sie zusammen aus Sicht unbedarfter Nutzer durchspielen und vervollständigen. Dann könnte ich das auch an meine technisch noch unbedarfteren Freunde verteilen :slight_smile:

2 „Gefällt mir“

Hey Achse, auch dir Danke für dein Feedback!
ich habe mir die Stellen nochmal genau angeschaut.

Zwischen Lektion 7 und 8 wurde die Rohdaten nach dem Signieren im Hintergrund in hexadezimal umgewandelt. Diese lange Zeichenfolge kann man entsprechend des angehängten Beispielbildes wieder zuordnen. Zum Beispiel geben die ersten 8 Zeichen die Version an. Anstelle von Adressen wird mit Public Keys gearbeitet (s. oranger Kasten, „scriptPubKey“).

Ich bin mir tatsächlich unsicher, wie ich das in das Tutorial einbringen kann. Vielleicht hast du ja einen Tipp, wie man das verständlicher machen kann.

Hey @BlueBallroom,

ich fasse mal kurz zusammen, was ich bisher verstehe. So kannst Du meine Rückfrage (mit dem Ziel mich einer Antwort für Dich anzunähern) einordnen.

Lektion 7: Signieren von Transaktionen

Die scriptSig sind die Hexadezimalzahlen (=Hashwerte?).

Lektion 8: Übermittlung einer Transaktion

Die scriptSig muss samt den Befehlen bitcoin-cli sendrawtransaction in die Konsole kopiert werden.

Korrekt?

Aus UX Sicht bewährt es sich, immer dasselbe Wording zu benutzen bzw. Synonyme als solche kenntlich zu machen. Also scriptSig = Hexadezimalzahl (=Hash?)

Ich hoffe, ich liege nicht falsch. Sonst korrigiere mich bitte und ich setze dort wieder mit meinen Gedanken an :slight_smile:

PS: Ich habe noch einen Verbesserungsvorschlag. Füge bitte noch einen back-Button ein. Den habe ich bereits beim ersten Mal vermisst und vergessen zu erwähnen.

scriptSig ist die mit dem privateKey signierte Transaktion und wird als Hashwert ausgegeben. Diese signierte Transaktion ist der Beweis deinerseits ans Netzwerk, dass du der Besitzer der Coins auf den dazugehörigen Adressen bist.

Dieser scriptSig wird mittels des Befehls bitcoin-cli senddrawtransaction zusammen mit weiteren Daten wie von BlueBallroom geschrieben aneinandergereiht an das Netzwerk gesendet.

Man muss hier ein wenig ausholen. Ein Hash ist ganz allgemein das Ergebnis der Hashfunktion über einen beliebigen Input. Schau dir dazu mal diese Seite an. Die Hashfunktion (Bei Bitcoin die SHA256) funktioniert nur in eine Richtung. Das Ergebnis ist unumkehrbar. Du kannst aus dem Ergebnis SHA256(‚Input‘)=xyz nicht auf den Input schließen.

Das Ergebnis einer SHA256-Funktion ist eine 256 Zeichen lange folge aus 0 und 1, die wiederum im Hexadezimalystem angegeben wird, weil 64 Zeichen einfach angenehmer sind als 256.

Welche Funktion dem scriptSig-Hash zugrunde liegt bzw. wie man diesen ableitet, kann sicherlich jemand anderes beantworten, dennoch ist der Ablauf stets der Gleiche bzw. ähnlich. FunktionXY(Input)=Output.

Kannst du dieser Erklärung folgen?

4 „Gefällt mir“

Kann ich und passt zu dem, was ich mir zusammengereimt habe. Daher gilt meine Empfehlung:

Hierfür würde ich Dir ans Herz legen, mal für alle Seiten aufzuschreiben,

  • welche Begriffe Du erklärst
  • welche Synonyme (i.S. technischer Detailierung) Du nutzt
  • welche Begriffe auf den Folgeseiten aufgegriffen werden um die Erklärung voranzutreiben

Sollten hier Lücken sein und seien es nur Synonyme, die vorher nicht eingeführt wurden, ist der User verloren. Dies gilt es zu vermeiden :slight_smile:

2 „Gefällt mir“

Erst einmal herzlichen Dank - das war eine interessante Einführung.
Es kostet sicher etwas Aufwand, aber um den langen Code:

verständlich zu machen, könnte man sicherlich anhand der Grafik:

genau aufschlüsseln, welche Werte letztendlich in welchen Teil des einzugebenden Hexadezimal-Codes umgewandelt wurden. (falls es dazu schon einen Thread gibt, gern auch die Verlinkung)
Das wäre sehr wertvoll denke ich.
Also in dem man den Code wirklich unterteilt und den Feldern zuordnet. Ist damit verständlich was ich meine?

So in der Art:
020000000 → Versionsnummer (+ kurze Erklärung?)
1797a827a25bdf354b9f9440d7de2ded6596cc2c8b8dc2eaf936a476049f898c4 → Input Info Previous Ouput Hash umgewandelt (das ist nicht korrekt, soll nur als Beispiel dienen)…
000000006 → usw.

Falls das überhaupt so möglich ist - aber so würde ich mir das vorstellen.

1 „Gefällt mir“

Wie so oft kommt hier eine Kombination von SHA-256 und RIPEMD-160 zum Einsatz. Durch den Opcode HASH160 aus der Bitcoin Script Sprache nennt man diese Kombination normalerweise auch genau so. Dahinter steckt einfach nur:

RIPEMD-160(SHA-256(...))

Damit hier keine Verwirrung entsteht: Im P2PKH Output, also dem locking script, steht neben den Opcodes nur der public key hash (PKH).

Das „scriptSig“ was jetzt mehrmals erwähnt wurde, oder besser unlocking script, beinhaltet dann bspw. den rohen Public Key zusammen mit der Signatur.

Wenn ich die Transaktion jetzt verifizieren möchte überprüfe ich:

  • Ob hinter dem PKH tatsächlich der im Input angegebene Public Key steckt. Dazu überprüfe ich einfach selbst ob HASH160(PK) == PKH.

  • Ob die Signatur gültig ist. Dafür brauche ich nur den Public Key.

scriptSig ist wie gesagt einfach nur eine Fancy Bezeichnung für das unlocking script, also der Input um das locking script zu lösen. Da sind erstmal keine Hashwerte, oder was meinst du damit?

Beispiel P2PKH: Hier links stehen die beiden Input Parameter, also Public Key und Signatur, rechts ein paar Opcodes und der Public Key Hash. Zusammen ist das dann ein (am Ende hoffentlich gültiges) Script in der Bitcoin Script Sprache (doofer Name).

In meiner Transaktion steht das Zeug rechts gar nicht drin, das ist schließlich bereits on-chain!

example

Die Sprache ist (absichtlich) sehr simpel und Stack basiert und damit auch sehr leicht lesbar. Von links nach rechts landet alles sozusagen auf einem Stapel, und dann wird abgearbeitet. Wenn der Stack am Ende leer ist, dann darf ich den UTXO ausgeben.

  1. Als erstes trifft DUP auf den Public Key. Dieser wird einfach nur duplicated, steht jetzt also zweifach drin.

  2. Dann trifft HASH160 auf einen der Public Keys. Jetzt steht also der von uns gehashte Public Key neben dem Public Key Hash aus dem Output.

  3. EQUALVERIFY gibt sich zufrieden wenn die beiden nächsten Elemente, also die beiden PKH’s, identisch sind.

  4. Jetzt liegen nur noch der ursprüngliche Public Key zusammen mit der Signatur auf dem Stack. CHECKSIG gibt jetzt grünes Licht wenn die Signatur gültig ist.

Stack leer → Gültige Transaktion.

validate

Mehr: What is the Script language in Bitcoin?, https://learnmeabitcoin.com/technical/p2pkh

Eine Hexadezimalzahl ist erstmal nur das: Eine Zahl. Das hat erstmal gar nichts mit Hashfunktionen zu tun. Hashwerte werden einfach nur üblicherweise in Hex dargestellt, wie sehr viele andere große Zahlen die auf einem Computer so auftauchen.

Die drei Begriffe sind also keine Synonyme! :smiley:

6 „Gefällt mir“

@sutterseba, so spannend Deine detailreichen Technikausführungen auch sind, so unnützlich sind sie für Ahnungslose wie mich. In dem Detailgrad bewirkt Deine Expertise mehr Verwirrung bei mir als mein Verständnis zu fördern. M.E. möchte @BlueBallroom die Laien abholen und ihnen einen Eindruck von Bitcoins Funktionsweise verschaffen. Dafür muss er von den Details abstrahieren.

Um dieses Ziel zu erreichen, würde ich mich bzw. er über Vorschläge freuen, wie die technische Komplexität für Laien nachvollziehbar heruntergebrochen werden kann.

PS: @BlueBallroom , sollte ich mich hinsichtlich Deiner Zielgruppe oder Deiner Intention irren, korrigiere mich bitte.

Wieso musst du denn die technischen Details überhaupt verstehen?

Abstrahierte Erklärungen sind doch völlig ausreichend! Meine technischen sind da nur eine Ergänzung wenn man Lust drauf hat. :slight_smile:

1 „Gefällt mir“

Ich versuche hierbei zu helfen:

Dazu muss ich erst einmal verstehen, worum es eigentlich geht.

:heart:

Hast Du hierzu Vorschläge?

Danke für die wieder einmal großartige Ausführung. Das war dann vielmehr noch etwas Unverständnis meinerseits :slight_smile: Klasse Beitrag! Ich hab Lust auf sowas :wink:

2 „Gefällt mir“

Danke vielmals @sutterseba. Auf dich ist immer Verlass :partying_face:

Korrekt. Danke auch erneut an dich @Achse für deinen Input!

Ich bin wie gesagt (bisher) nur der Übersetzer. Deine Anregungen @BessereZukunft sind auf jeden Fall auch sehr wertvoll. Ich werde schauen, wie sich das umsetzen lässt. Auf GitHub könnt ihr bei Interesse auf jeden Fall gerne mitwirken! :slight_smile:

1 „Gefällt mir“