Den beste trinnvise Bitcoin-skripthåndboken del 1

Målet med denne guiden for å hjelpe deg med å forstå logikken bak Bitcoin Script. Siden det vil være for mye å dekke, vil guiden være delt inn i to deler.

Bitcoin ble opprettet for ett formål alene … transaksjoner. Bitcoin var i stand til å vise verden at et betalingssystem kan eksistere på et desentralisert peer-to-peer-system. Men hva skjer bak kulissene i disse transaksjonene? Bak hver lille transaksjon er det noen kode som fungerer i bakgrunnen. Denne koden er Bitcoin Scripting Language eller bare Bitcoin Script for kort.

Den beste Bitcoin Script Guide

Introduksjon til Bitcoin Script

Script er et Forth-lignende, stabelbasert, omvendt-polsk, Turing ufullstendig språk. Ja, det høres veldig komplisert ut, men det er det virkelig ikke. La oss gå gjennom hver eneste periode fra omvendt.

Turing Ufullstendig

Et Turing Ufullstendig språk vil ha begrenset funksjonalitet og ikke være i stand til å hoppe og / eller løkke. Derfor kan de ikke gå inn i en endeløs løkke. Å være Turing Complete betyr at gitt Tures Complete-programmet gitt ressurser og minne, vil det være i stand til å løse ethvert problem. Soliditet er et eksempel på et Turing Complete-språk.

Så hvorfor er ikke Bitcoin Script Turing Complete?

Fordi det ikke trenger å være. Bitcoin Script trenger ikke være så komplisert som en smart Ethereum-kontrakt. Faktisk, hvis et skript var Turing Complete, ville det ha gitt ondsinnede parter friheten til å lage kompliserte transaksjoner og spise opp hash-hastigheten til Bitcoin Network og redusere hele systemet.

Omvendt polsk

Omvendt polsk notasjon er et system der operatørene følger operandene.

Betydning:

  • 3 + 4 vises som 34+.
  • Så for lengre mer kompliserte summer:
  • 5 * 3 + 4 vises som 534 + *.

Stackbasert

Stabler er en av de mest populære datastrukturene der ute. I følge Wikibooks, de kan logisk sett tenkes som lineær struktur representert av en reell fysisk bunke eller haug, en struktur der innsetting og sletting av gjenstander foregår i den ene enden kalt toppen av bunken.

Den grunnleggende ideen med stack er LIFO eller Last In First Out. Tenk på følgende bunke:

Den beste Bitcoin Script Guide

Hva var den første boka som ble lagt på denne bunken? Ensom ulv & Cub ikke sant? Hva var den siste boka? Månens hager.

Hvis man skulle ta ut en bok fra denne bunken, Lone Wolf & Cub blir ikke boken du tar ut først, Gardens of the Moon vil være den første du tar ut.

Derfor Last In First Out.

Den siste boka som gikk på denne bunken, blir den første boka som blir tatt ut.

Nå er det to stabeloperasjoner du trenger å vite om:

  • Trykk.
  • Pop.

Trykk: Handlingen med å legge til ting i bunken kalles skyve.

Pop: Handlingen med å fjerne ting fra bunken kalles popping. Som nevnt tidligere, blir den siste gjenstanden som ble presset inn i bunken spratt først ut.

Den beste Bitcoin Script Guide

Bildekreditt: Wikimedia

Forth-Like

Denne er ganske rett frem. Bitcoin Script ligner tilfeldigvis programmeringsspråket “Forth”, som også tilfeldigvis er stakkbasert.

Så nå vet vi i det minste hva manus er, la oss forstå hvordan Transaksjoner fungerer.

Hvordan fungerer transaksjoner i en Bitcoin?

Før vi fortsetter, et stort rop til professor Donald J Patterson og hans Youtube-kanal “djp3” for forklaringen.

Anta at Alice vil sende et visst antall bitcoins til Bob. Hvordan fungerer transaksjonssystemet i bitcoin? bitcoin-transaksjoner er veldig forskjellige fra Fiat-lommeboktransaksjoner. Hvis Alice skulle gi $ 2 til Bob, ville hun fysisk ta 2 dollar fra lommeboken og gi den til Bob. Imidlertid fungerer ting ikke slik i bitcoin. Du eier ikke fysisk bitcoin, det du har er beviset på at du har Bitcoins.

Det er to ting du må vite:

  • Gruvearbeiderne validerer transaksjonene dine ved å plassere dataene i gruvene de har blokkert. Til gjengjeld for å gi denne tjenesten belaster de et transaksjonsgebyr.

  • Når det gjelder FIAT-valutaen, holder du ikke rede på hvordan og hvor du fikk den spesifikke noten fra. F.eks. Åpne lommeboken din akkurat nå og ta ut alle sedlene og myntene i den. Kan du fortelle hvor nøyaktig du fikk hver eneste spesifikke seddel og mynt fra? Sjansen er at du ikke gjør det. Imidlertid blir historien til hver eneste bitcoin-transaksjon i bitcoin notert.

Ok, så la oss gjøre et dypdykk i hvordan en bitcoin-transaksjon mellom Alice og Bob foregår. Det er to sider ved en transaksjon, inngangen og utgangen. Hele denne transaksjonen vil ha et navn som vi til slutt vil finne ut. For nå, la oss se på dynamikken.

Transaksjonsinngang

For å få denne transaksjonen til å skje, må Alice skaffe seg bitcoins som hun har mottatt fra forskjellige tidligere transaksjoner. Husk, som vi sa før, i bitcoins blir hver mynt regnskapsført via en transaksjonshistorikk.

Anta at Alice trenger å hente bitcoins fra følgende transaksjoner som vi skal gi navnet TX (0), TX (1) og TX (2). Disse tre transaksjonene blir lagt sammen, og det vil gi deg inngangstransaksjonen som vi skal kalle TX (Input).

Diagrammatisk vil det se slik ut:

Den beste Bitcoin Script Guide

Så det er det fra inngangssiden, la oss sjekke hvordan utgangssiden vil se ut.

Transaksjonsutgang

Utgangen vil i utgangspunktet ha antall bitcoins som Bob vil ha, etter transaksjonen og gjenværende endring som er igjen, som deretter sendes tilbake til Alice. Denne endringen blir hennes inngangsverdi for alle fremtidige transaksjoner.

En billedlig fremstilling av utgangssiden ser slik ut:

Den beste Bitcoin Script Guide

Dette er en veldig enkel transaksjon som bare har en utgang (bortsett fra ENDRE), det er transaksjoner som er mulige med flere utganger.

Slik ser den grunnleggende utformingen av transaksjonen ut. For at hele denne tingen skal gå gjennom, må imidlertid visse vilkår være oppfylt.

Vilkår for en transaksjon

  • TX (inngang) > TX (utgang). Inngangstransaksjonen må alltid være større enn utgangstransaksjonen. I enhver transaksjon er underskuddet mellom input og output (output + endring) transaksjonsgebyrene som gruvearbeidere samler inn. Så:

    Transaksjonsgebyrer = TX (inngang) – (TX (utgang) + endring).

  • På inngangssiden:

    TX (0) + TX (1) + TX (2) = TX (inngang).

    Hvis Alice ikke har midlene som er nødvendige for å utføre transaksjonene, vil gruvearbeiderne bare avvise transaksjonene.

  • Bob må vise at han kan gi bevisene som trengs for å få bitcoins. Alice vil låse transaksjonene med Bobs offentlige adresse. Han må produsere sin private nøkkel for å låse opp transaksjonene og få tilgang til gebyrene sine.

  • Alice må også bekrefte at hun har de nødvendige rettighetene til å sende over bitcoins i utgangspunktet. Måten hun gjør det på er å signere transaksjonen med sin digitale signatur (også kalt hennes private nøkkel). Alle kan dekode dette ved å bruke hennes offentlige nøkkel og bekrefte at det virkelig var Alice som sendte dataene. Dette beviset kalles “Signaturdata”. Husk dette fordi dette vil være veldig viktig senere.

Så hva kommer til å være navnet på hele denne transaksjonen?

Inngangen (inkludert signaturdataene) og utdataene blir lagt sammen og hash ved hjelp av SHA 256-hashingalgoritmen. Utgangshashen er navnet som blir gitt til denne transaksjonen.

Så, la oss nå se bak kulissene og se hvordan transaksjonen faktisk ser ut.

Bitcoin-skripttransaksjonen: Bak kulissene

Slik ser transaksjonen ut i kodeskjemaet.

Anta at Alice vil sende 0,0015 BTC til Bob, og for å gjøre det, sender hun innganger som er verdt 0,0015770 BTC. Slik ser transaksjonsdetaljene ut:

Den beste Bitcoin Script Guide

Bilde med tillatelse: djp3 youtube-kanal.

Den første linjen du ser:

Den beste Bitcoin Script Guide

Er navnet på Transaksjonen også hash for inngangs- og utgangsverdien.

Vin_sz er antall inngangsdata siden Alice sender dataene ved hjelp av bare en av hennes tidligere transaksjoner, det er 1.

Vout_sz er 2 fordi de eneste utgangene er Bob og endringen.

Dette er inngangsdataene:

Den beste Bitcoin Script Guide

Ser du inngangsdataene? Alice bruker bare en inngangstransaksjon (i eksemplet vi ga ovenfor, dette vil være TX (0)), dette er grunnen til at vin_sz var 1.

Under inngangsdataene er signaturdataene hennes.

Under alt dette er utdataene:

Den beste Bitcoin Script Guide

Den første delen av dataene betyr at Bob får 0,0015 BTC.

Den andre delen betyr at 0.00005120 BTC er det Alice får tilbake som endring.

Husk nå at utdataene var 0,0015770 BTC? Dette er større enn (0,0015 + 0,00005120). Underskuddet på disse to verdiene er transaksjonsgebyret som gruvearbeiderne samler inn.

En nærmere titt på transaksjonsutgangene

Som vi har sett ovenfor, blir hver inngang i en transaksjon til utganger, noen av disse utgangene blir brukt, mens noen blir ubrukt og blir forandring. Denne endringen er også kjent som UTXO eller Unspent Transaction Output. UTXO fortsetter å bli innspill i fremtidige transaksjoner.

Hver transaksjonsoutput består av to deler:

  • Verdien av den utgangen.

  • Det kryptografiske puslespillet som enten kalte et låseskript, eller et vitneskript eller et skriptPubKey. Puslespillet må låses opp for å kunne bruke pengene. Dette puslespillet er kodet ved hjelp av bitcoin Script-språket.

Så la oss undersøke resultatene av en transaksjon for å identifisere de ovennevnte delene i den. Kode hentet fra Andreas M. Antonopoulos. “Mestring av bitcoin.”

“Vout": [

{

"verdi": 0,01500000,

"scriptPubKey": "OP_DUP OP_HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 OP_EQUALVERIFY OP_CHECKSIG"

},

{

"verdi": 0,08450000,

"scriptPubKey": "OP_DUP OP_HASH160 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 OP_EQUALVERIFY OP_CHECKSIG",

}

]

OK, så vi har to utganger i koden ovenfor.

Den ene utgangen har en verdi på 0,015 BTC, mens den andre har en verdi på 0,0845 BTC. For å låse opp verdien til 0,015, går låseskriptet som man trenger å låse opp slik:

“ScriptPubKey”: “OP_DUP OP_HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 OP_EQUALVERIFY OP_CHECKSIG”

En enda nærmere titt på transaksjonsinnganger

La oss nå se på den andre siden av mynten, transaksjonsinngangene.

For å gjøre et inndata går brukerens lommebok gjennom UTXO-ene sine og velger de som har nok verdi til at transaksjonen kan gjennomføres.

F.eks. hvis Alice vil sende 0,15 BTC til Bob og her ser UTXO-sett slik ut:

  • UTXO A = 0,09 BTC
  • UTXO B = 0,2 BTC
  • UTXO C = 0,005 BTC

Hvilke UTXO-er velges for denne transaksjonen? Det er riktig, A og B vil bli valgt, og det som er igjen blir UTXO for Alice neste transaksjon.

La oss nå se på en inngangskode.

“Vin": [

{

"txid": "7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18",

"vout": 0,

"scriptSig" : "3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813 [ALL] 0484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf",

"sekvens": 4294967295

}

]

La oss se hva hver del av inngangsskriptet inkluderer:

  • txid: Transaksjons-ID refererer til transaksjonen som denne UTXO ble generert fra. Dette hjelper med å holde oversikt over transaksjonen

  • vout: Dette refererer til hvilken produksjon fra den transaksjonen som brukes. F.eks. hvis den transaksjonen hadde to UTXO-er, vil den første bli merket 0 (for som vi har sett før, starter telling fra 0 og ikke 1) og den andre vil bli merket 1. I dette tilfellet bruker vi den første UTXO dvs.UTXO 0.

  • scriptSig: Som vi har nevnt tidligere, inneholder hver UTXO et låseskript. ScriptSig inkluderer dataene som er nødvendige for å låse opp dataene.

  • sekvens: Ble inkludert for å hjelpe folk med å oppdatere transaksjonene sine før de ble bekreftet og avsluttet i en blokk, egentlig ikke så relevant for å forstå det grunnleggende.

Serialisering av transaksjoner

La oss nå bringe dette sammen og se hva vi har. Når en transaksjon videresendes over et nettverk, blir de seriellisert. Som Andreas Antonopoulos sier,

“Serialisering er prosessen med å konvertere den interne representasjonen av en datastruktur til et format som kan overføres en byte om gangen, også kjent som en byte-strøm.”

I de to foregående seksjonene så vi en enkel inngang og en utgangstransaksjon. Hvis vi skulle serieisere det og lagre det i heksadesimalt format, hvordan ville det se ut?

0100000001186f9f998a5aa6f048e51dd8419a14d8a0f1a8a2836dd73 4d2804fe65fa35779000000008b483045022100884d142d86652a3f47 ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039 ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813 01410484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade84 16ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc1 7b4a10fa336a8d752adfffffffff0260e31600000000001976a914ab6 8025513c3dbd2f7b92a94e0581f5d50f654e788acd0ef800000000000 1976a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac 00000000

Yup, denne forfatteren slo ikke ved et uhell hodet på tastaturet her … slik ser det faktisk ut.

Ikke vær redd. Vi vil forstå det snart nok. Et eller annet sted i den heksadesimale strømmen har vi ut inngangsdata og utdataene våre. La oss finne dem begge!

Utgangsserialiseringen

Serialiseringen av utgangsdelen av transaksjonen inneholder følgende deler:

Den beste Bitcoin Script Guide

Bildekreditt: Andreas Antonopoulos “Mastering Bitcoin”

Nå, hvilke data om produksjonen vet vi faktisk?

  • Det er to utgangsverdier.

  • En utgangsverdi er verdt 0,015 BTC eller 1500 000 satoshier

  • I heksadesimal er 1.500.000 16 e3 60, som når kodet i liten endian, dvs. minst signifikant byte første notasjon gir 60 e3 16.

  • ScriptPubKey-lengden er 25 byte, som er 19 i heksadesimal.

Så vær oppmerksom på disse delene, la oss søke etter utdataene våre.

0100000001186f9f998a5aa6f048e51dd8419a14d8a0f1a8a2836dd73 4d2804fe65fa35779000000008b483045022100884d142d86652a3f47 ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039 ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813 01410484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade84 16ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc1 7b4a10fa336a8d752adfffffffff0260e31600000000001976a914ab6 8025513c3dbd2f7b92a94e0581f5d50f654e788acd0ef800000000000 1976a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac 00000000

Inngangsserialiseringen

Inngangsserialiseringen inneholder følgende komponenter:

Den beste Bitcoin Script Guide

Nå kan du finne innspillene til transaksjonen hennes?

0100000001186f9f998a5aa6f048e51dd8419a14d8a0f1a8a2836dd73 4d2804fe65fa35779000000008b483045022100884d142d86652a3f47 ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039 ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813 01410484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade84 16ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc1 7b4a10fa336a8d752adfffffffff0260e31600000000001976a914ab6 8025513c3dbd2f7b92a94e0581f5d50f654e788acd0ef800000000000 1976a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac 00000000

Ok, så hva har vi sett så langt?

  • Resultatene av en transaksjon og UTXO-ene.
  • Inngangene til en transaksjon.
  • Hvordan hele transaksjonen serialiseres.

Nå vet vi at UTXO-er bare kan brukes hvis de er ulåst. Vi vet at inngangsverdiene har scriptSig som hjelper med å låse dem opp. Hvordan samhandler de med hverandre?

Før vi kommer til det, bør vi ha en ide om hvordan beregninger og operasjoner skjer i et bitcoin-skript.

Hvordan fungerer skriptet?

Før vi fortsetter med Script, vil det være nyttig å forstå hvordan et stabelbasert, omvendt poleringssystem fungerer.

Enkel tilsetning i et stabelbasert omvendt poleringssystem

Som vi har sagt før 3 + 4 i omvendt polering vil se ut som 34+, la oss utføre tilleggsoperasjonen ved hjelp av en stabel.

Den beste Bitcoin Script Guide

Slik blir en enkel tilleggsoperasjon gjort på bunken. Nå som dette er gjort, hvordan vil dette se ut hvis det var et manus?

OP_3 OP_4 OP_ADD

Bare utseendet endres, resten av operasjonen forblir den samme som vist ovenfor. Prefikset “OP_” er en signatur av skriptspråket.

Hvis du vil ha en primer på de forskjellige Opcodes som brukes i et skript klikk deretter her.

Enkelt tillegg ved hjelp av Bitcoin Script med en sjekk

Anta at vi vil gjøre 2 + 3 = 5.

På omvendt polsk vil det se ut som 23 + 5 =.

I skriptnotasjon vil det se slik ut:

OP_2 OP_3 OP_ADD OP_5 OP_EQUAL

Den beste Bitcoin Script Guide Den beste Bitcoin Script Guide

Nå, hva hadde skjedd hvis vi brukte postfix VERIFY i EQUAL? I stedet for OP_EQUAL brukte vi OP_EQUALVERIFY?

I det øyeblikket du legger til VERIFY-suffikset, blir TRUE eller FALSE ikke presset på bunken, i stedet for skriptet fortsetter utfører hvis SANT eller det stopper utføre hvis det er FALSE.

Dette er hva som skjer når du legger “VERIFY” til en opcode. Husk dette for fremtidige eksempler.

Ok, la oss ta et siste eksempel.

Enkel duplisering i skriptet

Vi tar dette eksemplet bare for å introdusere deg for en ekstremt viktig opcode, DUP aka duplikat.

La oss, vi vil skyve et tall i en bunke, duplisere det og se om de to tallene er like eller ikke (som det åpenbart vil være).

Vi skal bruke dette skriptet:

OP_5 OP_DUP OP_EQUALVERIFY

Den beste Bitcoin Script Guide

OK, nå har du en ide om hvordan beregninger blir behandlet i bitcoin Script, la oss fortsette med transaksjonene våre og se hvordan de blir utført.

Spillet med å låse og låse opp

Transaksjoner i bitcoin er et konstant spill av låsing og opplåsing. UTXO-ene låses av scriptPubKey mens inngangene til transaksjonen inneholder scriptSig. Ideen med scriptPubKey er å tilby et kryptografisk puslespill som bare kan låses opp via tilsvarende scriptSig.

Så hva skjer akkurat og hvordan spilles dette spillet?

Anta at Alice vil sende Bob litt bitcoin. Bobs offentlige tale er allment kjent, og hun vil sende Bitcoins til Bobs offentlige adresse sammen med en tilstand, Bob må bevise at det faktisk er ham som får bitcoin.

La oss nå gå litt tilbake, og se på noen grunnleggende konsepter.

Alle i bitcoin har to nøkler:

Den offentlige nøkkelen er kryptografisk avledet fra den private nøkkelen.

Nå, for å få tilsendt penger til dem, må alle ha en offentlig adresse. Publikum drives av to hashingalgoritmer, SHA-256 og RIPEMD-160. Grunnen til at vi gjør dette er å sørge for at du har et ekstra beskyttelseslag, HVIS i tilfelle at noen på en eller annen måte finner ut hvordan du genererer din private nøkkel ved hjelp av den offentlige nøkkelen (som er umulig).

Merk: Den offentlige nøkkelen går først gjennom SHA-256 for å gi en 256-bit utgangshash, og deretter kjøres den hashen gjennom RIPEMD-160 som gir en 160-bit utgangshash. Så den endelige utgangen er en 160-bit hash.

Greit, så Alice vil sende pengene til Bobs offentlige tale sammen med en forutsetning om at Bob må vise et bevis på at det faktisk er ham som har fått pengene.

Beviset som Bob bruker for å låse opp midlene er hans digitale signatur, som kryptografisk kommer fra hans private nøkkel.

Tenk på transaksjonene som Alice sender Bob som en låst kiste, og Bobs signatur som passord.

Nå kommer vi tilbake til skriptet vårt.

Alice sender Bob en utgang som har scriptPubKey, som inkluderer Bobs adresse.

Bob låser opp inngangen ved hjelp av signaturen til scriptSig, som inkluderer signaturen og den offentlige nøkkelen.

Så hvordan representerer vi dette i kode?

scriptPubKey = OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG.

Merk: Hvordan OP_HASH160 og OP_CHECKSIG fungerer, vil snart bli klart for deg.

scriptSig =

For å låse opp utgangen og bruke midlene, sammenkobler Bob seg eller blir ganske god med scriptSig og scriptPubKey slik:

Den beste Bitcoin Script Guide

Bildekreditt: CryptoCompare

Ok, la oss nå se hvordan manuset fungerer for å gi dårlig Bob tilgang til midlene hans. Skriptet ser nå ut slik:

OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG.

Skriptimplementering av opplåsings- / verifiseringsprosessen

Ok, nå skal vi se hvordan skriptimplementeringen av hele bekreftelses- / opplåsingsprosessen fungerer.

Akkurat nå ser koden slik ut

Den beste Bitcoin Script GuideDen beste Bitcoin Script Guide

Den beste Bitcoin Script Guide

OP_CHECKSIG spretter ut og sjekker for å se om de er gyldige for å vite at de er gyldige signaturer og offentlige adresser.

Når hele prosessen er ferdig, kan Bob låse opp transaksjonen og få tilgang til midlene sine.

Gratulerer! Du har nettopp gått gjennom en hel bitcoin-transaksjon!

Det du ser her er den vanligste typen bitcoin-transaksjon: The P2PKH aka Lønn til offentlig nøkkel hash.

Så, hva er denne mystiske CHECKSIG-operatøren, og hvordan fungerer den? Vel, for det må vi se på kryptografien bak bitcoin.

Hvordan fungerer CHECKSIG?

For å vite hvordan CHECKSIG fungerer, må vi vite hva en digital signatur er. En digital signatur er en digital kode (generert og autentisert ved kryptering av offentlig nøkkel) som er festet til et elektronisk overført dokument for å verifisere innholdet og avsenderens identitet..

Den digitale signaturalgoritmen som brukes av bitcoin, er ECDSA eller Elliptical Curve Digital Signature Algorithm.

Elliptisk kurvekryptografi er det som brukes av bitcoin, ethereum etc. for krypteringsformål. Så hva er en elliptisk kurve? En elliptisk kurve er en hvilken som helst kurve som tilfredsstiller følgende ligning:

Y ^ 2 = x ^ 3 + øks + b

Der (x, y) er et punkt på kurven og a og b er konstanter.

Det er uendelige kurver du kan lage. Følgende er hvordan en av disse kurvene generelt ser ut:

Den beste bitcoin-guiden

Bildekreditt: YouTube-kanal CSBreakdown

Hva er egenskapene til en elliptisk kurve?

  • Kurven er symmetrisk over x-aksen.
  • Enhver linje som går gjennom to punkter på kurven vil skjære kurven på et tredje punkt.
  • Enhver tangens på kurven vil krysse kurven på ett punkt til.

Å utføre matematikk på kurven.

Tilleggsegenskap for kurven

Anta at det er to punkter på kurven V og A. La oss spore de på kurven og sette en linje gjennom dem. Dette vil skjære kurven på et tredje punkt.

Den beste Bitcoin Script Guide

Bildekreditt: YouTube-kanal CSBreakdown

Vi vil kalle dette tredje punktet X, og vi vil reflektere det på kurven slik:

Den beste Bitcoin Script Guide

Bildekreditt: YouTube-kanal CSBreakdown

Refleksjonen av X er et punkt som for øvrig vil være (V + A). Dette er additivegenskapen til den elliptiske kurven.

Interessant merknad. Hvis vi legger til to refleksjoner med hverandre aka hvis vi skulle legge til X og V + A i grafen over, vil vi få uendelig. Årsaken til det er at linjen gjennom X og (V + A) vil skjære kurven ved uendelig.

Multiplikasjonsegenskap for kurven

Nå, hva om vi vil legge til et nummer i seg selv? Anta at vi har et punkt V, hva gjør vi for å finne 2V? Vi vil kjøre en tangens gjennom V og krysse den på et punkt i grafen og deretter finne refleksjonen av punktet på kurven. Den refleksjonen vil være 2V.

Den beste Bitcoin Script Guide

Bildekreditt: YouTube-kanal CSBreakdown

Dette er også multiplikasjonsegenskapen til grafen fordi vi finner punkter som i utgangspunktet er multiplikasjonen av et heltall med selve punktet. Anta at vi vil finne 3V. Vi blir med på V og 2V og reflekterer deretter skjæringspunktet, slik:

Den beste Bitcoin Script Guide

Bildekreditt: YouTube-kanal CSBreakdown

Ser du hvordan poengene sykler over grafen? Dette er det som gir den sin sikkerhet.

Matematiske egenskaper til en elliptisk kurve

Eiendom nr. 1: Punktene på kurven danner en abelsk gruppe

Egenskapene til den abelske gruppen er som følger:

  • De har en identitet.
  • De har inverser aka refleksjoner.
  • Punktene er assosiativ betydning for tre punkter A, B og C på kurven: (A + B) + C = A + (B + C).
  • Punktene er lukket på kurven.
  • Poengene er kommutativ betydning for to punkter A og B. A + B = B + A.

Eiendom nr. 2: Multiplikasjon på kurven er rask

All multiplikasjon utført på kurven kan gjøres veldig raskt. Anta nå at vi har et poeng P, og vi vil finne 100P. I stedet for å legge til nummeret 100 ganger kan vi gjøre følgende:

  • Legg til punktet P for seg selv for å få 2P.
  • Legg til 2P og P for å få 3P.
  • Legg 3P til seg selv for å få 6P.
  • Legg 6P til seg selv for å få 12P.
  • Legg til 12P for seg selv for å få 24P.
  • Legg til 24P og P for å få 25P.
  • Legg 25P til seg selv for å få 50P.
  • Legg 50P til seg selv for å få 100P.

Så, i stedet for å gå gjennom 99 trinn, kutter du hele greia til bare 8 trinn.

Eiendom nr. 3: Delingen i kurven er treg

Mens multiplikasjon er rask, er delingen veldig treg. Anta at vi har Q = nP, og vi vil finne verdien av n ved å dele Q med P. Vi kan egentlig ikke gjøre det. Vi må manuelt gå gjennom tallene en etter en for å finne en verdi som tilfredsstiller ligningen. Dette gjør det veldig sakte. Dette kalles det diskrete logaritmiske problemet, og det er det som gir kurvene sin felleportfunksjon, dvs. det er lett å multiplisere n og P for å få Q, men gitt Q og P, er det umulig å få n.

Så hvordan fungerer signaturverifisering på de elliptiske kurvene?

(Merk: Dette er hva som spesifikt skjer i bitcoin)

Før vi ser hvordan prosessen fungerer, la oss sjekke ut visse variabler og deres betydning som vi skal bruke i følgende ligninger.

Privat nøkkel = d.

Melding = z.

Offentlig nøkkel = Q.

G vil være et konstant punkt på grafen som vil bli gitt av bitcoin.

“K” er et tilfeldig tall som genereres automatisk for hver unike signatur.

“N” er en annen konstant som vil bli levert av bitcoin.

Ok, så la oss nå se hvordan matematikken bak verifiseringen fungerer.

Signerer en melding

Offentlig nøkkel Q = dG. (det er umulig å få den private nøkkelen fra Q og G på grunn av deling i umulig).

Nå skal vi multiplisere G med det tilfeldige tallet “k” og plotte det punktet på grafen. Koordinatene til det punktet er (x, y). dvs. (x, y) = kG

Deretter bestemmer vi to verdier r og s slik at:

r = x mod n.

s = (z + rd) k ^ -1 mod n

Grunnen til at vi genererer r og s er at dette er koordinatene til signaturen vår.

Så vi sender punktet (r, s) for bekreftelse.

Bekrefte en melding

Kontrollørene vil utføre en enkel ligning:

z * s ^ -1 * G + r * s ^ -1 * Q

Verdien av denne ligningen vil gi oss poenget (x, y).

Nå kan verifikatorene bare sammenligne x-koordinatene. De har ikke x-koordinaten gitt direkte til dem av avsenderen, MEN de har verdiene r og n.

Og som vi allerede vet at r = x mod n, og da kan de bare løse for x.

Hvis verdiene til x stemmer overens, betyr dette at signaturen er bekreftet!

Bonus: En dypere titt på matematikken

La oss sjekke ut ligningen som verifikatorene må gjøre igjen:

Trinn 1: z * s ^ -1 * G + r * s ^ -1 * Q

Vi vet at Q = d * G, la oss bare erstatte verdien.

Steg 2: z * s ^ -1 * g + r * s ^ -1 * d * G

Vi kan ta (z + r * d) vanlig

Trinn 3: (z + r * d) * s ^ -1 * G

Husk nå, vi har allerede slått fast at s = (z + r * d) * k ^ -1 mod n, la oss erstatte verdiene her:

Trinn 4: (z + r * d) * (z + r * d) ^ – 1 * k * G

(Z + r * d) * (z + r * d) ^ – 1 avbryter hverandre og vi sitter igjen med:

Trinn 5: k * G som er koordinaten (x, y) som avsenderen opprinnelig sendte.

Hva kan gå galt i elliptiske kurver?

Selv om det sier seg selv at elliptiske kurver er den beste modusen for kryptografi der ute, gjenstår faktum at den fortsatt har få sårbarheter:

  • Hva om feil kurve ble valgt? Hvis kurven har en sløyfe i seg, er det en mulighet for at 1001P = P for et hvilket som helst punkt P på kurven.

  • Det kan velges en svak kurve som kan brytes inn.

Det har sine svakheter, men de er ganske håndterbare svakheter.

SLUTT PÅ DEL 1

Det er her vi skal avslutte del 1 av Bitcoin Script Guide. I del 2 skal vi dekke:

  • Multisignaturtransaksjoner.
  • Betal til Script Hash.
  • Flytkontroll.
  • Timelocks.

Følg med for neste del!

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me