Ievads
Bitcoin dažreiz tiek saukta par programmējamu naudu. Digitālā rakstura dēļ tas lietotājiem sniedz lielu elastības pakāpi, nosakot nosacījumus līdzekļu izlietojumam.
Apspriežot Bitcoin, mēs runājam par makiem un monētām. Taču mēs varētu arī domāt par makiem kā atslēgām, monētām kā čekiem un blokķēdi kā rindu pēc aizslēgtu seifu rindas. Katrā seifā ir plāns slots, lai ikviens varētu iemaksāt čekus vai ieskatīties seifā. Taču iekšpusei varēs piekļūt tikai atslēgas turētājs.
Kad atslēgu turētājs vēlas kādam citam iedot naudu, viņš atslēdz savu kastīti. Viņi izraksta jaunu čeku, kas atsaucas uz vecāko čeku (kas pēc tam tiek iznīcināts), un bloķē to lodziņā, ko saņēmējs var atvērt. Lai to iztērētu, jaunais adresāts atkārto procesu.
Šajā rakstā mēs sīkāk aplūkosim Script — programmēšanas valodu, ko interpretē Bitcoin tīkla mezgli. Skripts ir tas, kas regulē seifiem minēto bloķēšanas/atbloķēšanas mehānismu.
Kā darbojas Bitcoin?
Izmantojot mūsu analoģiju no augšas, jūs varētu teikt, ka katram darījumam ir divas daļas - atslēga (kas atbloķēšanai) un slēdzene. Jūs izmantojat atslēgu, lai atvērtu lodziņu, kurā ir čeks, kuru vēlaties nosūtīt, un pēc tam pievienojat jaunu čeku jaunai kastei ar citu slēdzeni. Lai tērētu no jaunās kastes, nepieciešama cita atslēga.
Pietiekami vienkārši. Varat arī nedaudz mainīt sistēmas slēdzeņu veidus. Iespējams, ka dažos seifos ir jāiesniedz vairākas atslēgas, un varbūt citiem jums jāpierāda, ka zināt kādu noslēpumu. Ir daudz nosacījumu, ko cilvēki var iestatīt.
Mūsu atslēga ir tas, ko mēs saucam par scriptSig. Slēdzene ir mūsu scriptPubKey. Ja mēs aplūkosim šos komponentus mazliet sīkāk, mēs atklāsim, ka tie faktiski sastāv no datu bitiem un koda blokiem. Apvienojot, tie izveido niecīgu programmu.
Veicot darījumu, jūs pārraidāt šo kombināciju tīklā. Katrs mezgls, kas to saņem, pārbaudīs programmu, kas tai paziņo, vai darījums ir derīgs. Ja nē, tas vienkārši tiks izmests, un jūs nevarēsit tērēt bloķētos līdzekļus.
Jūsu rīcībā esošie čeki (monētas) tiek saukti par neiztērēto darījumu rezultātiem (UTXO). Līdzekļus var izmantot ikviens, kurš var nodrošināt slēdzenei atbilstošo atslēgu. Konkrēti, atslēga ir scriptSig, un atslēga ir scriptPubKey.
Ja UTXO ir jūsu makā, iespējams, tiem būs nosacījums, ka tikai persona, kas var pierādīt šīs publiskās atslēgas īpašumtiesības, var atbloķēt šos līdzekļus. Lai to atbloķētu, jums ir jāiesniedz scriptSig, kas ietver ciparparakstu, izmantojot privāto atslēgu, kas ir saistīta ar publisko atslēgu, kas norādīta scriptPubKey. Tas viss drīz kļūs skaidrāks.
Izpratne par Bitcoin kaudzi
Skripts ir tā dēvētā steka valoda. Tas viss nozīmē, ka, lasot instrukciju kopu, mēs tās ievietojam vertikālā kolonnā. Piemēram, saraksta A, B, C rezultātā tiktu izveidota kaudze ar A apakšā un C augšpusē. Kad norādījumi mums liek kaut ko darīt, mēs darbojamies ar vienu vai vairākiem elementiem, sākot no kaudzes augšdaļas.

Elementi A, B un C tiek pievienoti un “izlecināti” no kaudzes.
Mēs varam atšķirt datus (piemēram, parakstus, jaucējkodus un publiskās atslēgas) no instrukcijām (vai opkodiem). Norādījumi noņem datus un dariet ar tiem kaut ko. Šeit ir ļoti vienkāršs piemērs tam, kā varētu izskatīties skripts:
<xyz> <md5 hasher> <d16fb36f0911f878998c136191af705e> <atzīmējiet, ja vienāds>
Sarkanā krāsā mums ir dati, bet zilā krāsā mums ir opkodi. Mēs lasām no kreisās uz labo pusi, tāpēc vispirms stekā ievietojām virkni <xyz>. Nākamais ir <md5 hasher> opkods. Šis nepastāv Bitcoin, taču pieņemsim, ka tas noņem steka augšējo elementu (<xyz>) un sajauc to, izmantojot MD5 algoritmu. Pēc tam izvade tiek pievienota atpakaļ kaudzei. Izvade šeit ir d16fb36f0911f878998c136191af705e.
Kāda sakritība! Nākamais pievienojamais elements ir <d16fb36f0911f878998c136191af705e>, tāpēc tagad mūsu kopai ir divi identiski elementi. Visbeidzot, <check if equal> izceļ divus elementus no augšas un pārbauda, vai tie ir vienādi. Ja tie ir, tas pievieno <1> stekam. Ja nē, tas pievieno <0>.
Mēs esam nonākuši līdz mūsu norādījumu saraksta beigām. Mūsu skripts varēja izgāzties divos veidos — ja atlikušais elements bija nulle vai ja kāds no operatoriem izraisīja tā kļūmi, kad netika izpildīti daži nosacījumi. Šajā piemērā mums nebija šādu operatoru, un mēs iegūstam elementu, kas nav nulle (<1>), tāpēc mūsu skripts bija derīgs. Šie noteikumi attiecas arī uz reāliem Bitcoin darījumiem.
Tā bija tikai izdomāta programma. Apskatīsim dažus faktiskos tagad.
Pay-to-Pubkey (P2PK)
Pay-to-Pubkey (P2PK) ir neticami vienkārša. Tas ietver līdzekļu bloķēšanu noteiktai publiskai atslēgai. Ja vēlaties saņemt līdzekļus šādā veidā, jūs sūtītājam jānorāda sava publiskā atslēga, nevis Bitcoin adrese.
Pats pirmais darījums starp Satoši Nakamoto un Halu Finniju 2009. gadā bija P2PK darījums. Struktūra tika plaši izmantota Bitcoin sākuma dienās, taču mūsdienās Pay-to-Pubkey-Hash (P2PKH) to lielā mērā ir aizstājusi.
P2PK darījuma bloķēšanas skripts atbilst formātam <publiskā atslēga> OP_CHECKSIG. Pietiekami vienkārši. Jūs, iespējams, uzminējāt, ka OP_CHECKSIG pārbauda parakstu, salīdzinot ar sniegto publisko atslēgu. Tādējādi mūsu scriptSig būs vienkāršs <paraksts>. Atcerieties, ka scriptSig ir atslēga uz slēdzeni.

Tas nekļūst daudz vienkāršāks par šo. Kaudzei tiek pievienots paraksts, kam seko publiskā atslēga. OP_CHECKSIG uznirst tos abus un pārbauda parakstu pret publisko atslēgu. Ja tie sakrīt, tas stekam pievieno <1>. Pretējā gadījumā tas pievieno <0>.
Iemeslu dēļ, par kuriem mēs sīkāk runāsim nākamajā sadaļā, P2PK vairs netiek izmantots.
Pay-to-Pubkey-Hash (P2PKH)
Pay-to-Pubkey-Hash (P2PKH) tagad ir visizplatītākais darījumu veids. Ja vien necenšaties lejupielādēt arhaisku programmatūru, visticamāk, jūsu maciņš to darīs pēc noklusējuma.
P2PKH scriptPubKey ir šāds:
OP_DUP OP_HASH160 <publiskās atslēgas hash> OP_EQUALVERIFY OP_CHECKSIG
Pirms scriptSig ieviešanas noskaidrosim, ko darīs jaunie opkodi:
OP_DUP
OP_DUP uznirst pirmo elementu un dublē to. Pēc tam tas pievieno abus atpakaļ kaudzei. Parasti tas tiek darīts, lai mēs varētu veikt darbību ar dublikātu, neietekmējot oriģinālu.
OP_HASH160
Tas uznirst pirmo elementu un divreiz sajauc to. Pirmajā kārtā tiks jaukta ar SHA-256 algoritmu. Pēc tam SHA-256 izvade tiek sajaukta ar RIPEMD-160 algoritmu. Iegūtā izvade tiek pievienota atpakaļ kaudzītei.
OP_EQUALVERIFY
OP_EQUALVERIFY apvieno divus citus operatorus – OP_EQUAL un OP_VERIFY. OP_EQUAL parāda divus elementus un pārbauda, vai tie ir identiski. Ja tie ir, tas pievieno 1 kaudzei. Ja nē, tas pievieno 0. OP_VERIFY parāda augšējo elementu un pārbauda, vai tas ir patiess (t.i., nav nulle). Ja tā nav, darījums neizdodas. Apvienojot, OP_EQUALVERIFY izraisa darījuma neveiksmi, ja divi galvenie elementi nesakrīt.
Šoreiz skriptsSig izskatās šādi:
<paraksts> <publiskā atslēga>
Lai atbloķētu P2PKH izejas, jums ir jānorāda paraksts un atbilstošā publiskā atslēga.

Iepriekš redzamajā GIF attēlā varat redzēt, kas notiek. Tas pārāk neatšķiras no P2PK skripta. Mēs tikai pievienojam papildu darbību, lai pārbaudītu, vai publiskā atslēga atbilst skripta jaucējzīmei.
Tomēr ir ko atzīmēt. P2PKH bloķēšanas skriptā publiskā atslēga nav redzama — mēs varam redzēt tikai tās jaucējfunkciju. Ja mēs ejam uz blokķēdes pētnieku un skatāmies uz P2PKH izvadi, kas nav iztērēta, mēs nevaram noteikt publisko atslēgu. Tas tiek atklāts tikai tad, kad saņēmējs nolemj pārskaitīt līdzekļus.
Tam ir pāris priekšrocības. Pirmais ir tas, ka publiskās atslēgas jaucējkodu ir vienkārši vieglāk nodot nekā pilnu publisko atslēgu. Tieši šī iemesla dēļ Satoshi to laida klajā 2009. gadā. Publiskās atslēgas hash ir tas, ko mēs šodien zinām kā Bitcoin adresi.
Otrs ieguvums ir tas, ka publiskās atslēgas jaucējkodi varētu nodrošināt papildu drošības līmeni pret kvantu skaitļošanu. Tā kā mūsu publiskā atslēga nav zināma, kamēr mēs neiztērējam līdzekļus, citiem ir vēl grūtāk aprēķināt privāto atslēgu. Lai to iegūtu, viņiem ir jāapgriež divas jaukšanas kārtas (RIPEMD-160 un SHA-256).
➠ Vai vēlaties sākt darbu ar kriptovalūtu? Pērciet Bitcoin vietnē Binance!
Pay-to-Script-Hash (P2SH)
Pay-to-Script-Hash (P2SH) bija ļoti interesanta Bitcoin attīstība. Tas ļauj sūtītājam bloķēt līdzekļus skripta jaukšanai — viņam nav jāzina, ko skripts faktiski dara. Izmantojiet šādu SHA-256 jaucēju:
e145fe9ed5c23aa71fdb443de00c7d9b4a69f8a27a2e4fbb1fe1d0dbfb6583f1
Jums nav jāzina hash ievade, lai tam piesaistītu līdzekļus. Tomēr tērētājam ir jānodrošina skripts, kas tika izmantots tā jaukšanai, un tam ir jāatbilst šī skripta nosacījumiem.
Iepriekš minētais hash tika izveidots no šāda skripta:
<reizināt ar 2> <4> <pārbaudīt, ja vienāds>
Ja vēlaties tērēt ar šo scriptPubKey piesaistītās monētas, jūs ne tikai sniedzat šīs komandas. Jums ir nepieciešams arī skriptsSig, kas padara pabeigto skriptu novērtēt uz True. Šajā piemērā šis ir elements, kuru <reizināt ar 2>, lai iegūtu rezultātu <4>. Protams, tas nozīmē, ka mūsu scriptSig ir tikai <2>.
Reālajā dzīvē scriptPubKey P2SH izvadei ir:
OP_HASH160 <redeemScript hash> OP_EQUAL
Šeit nav jaunu operatoru. Taču mums ir <redeemScript hash> kā jauns elements. Kā norāda nosaukums, tas ir skripta sajaukums, kas mums ir jānodrošina, lai izpirktu līdzekļus (ko sauc par redeemScript). SkriptsSig mainīsies atkarībā no tā, kas ir iekļauts redeemScript. Tomēr parasti jūs redzēsit, ka tā ir kāda parakstu un pievienoto publisko atslēgu kombinācija, kam seko (obligāts) redeemScript:
<paraksts> <publiskā atslēga> <redeemScript>
Mūsu vērtējums nedaudz atšķiras no līdz šim redzētā steka izpildes. Tas notiek divās daļās. Pirmais vienkārši pārbauda, vai esat norādījis pareizo jaucējkodu.

Ņemiet vērā, ka mēs neko nedarām ar elementiem, kas ir pirms redeemScript. Šobrīd tie netiek izmantoti. Mēs esam sasnieguši šīs miniprogrammas beigas, un augšējais elements nav nulle. Tas nozīmē, ka tas ir derīgs.
Tomēr mēs vēl neesam pabeiguši. Tīkla mezgli atpazīst šo struktūru kā P2SH, tāpēc tie faktiski ir ieguvuši scriptSig elementus, kas gaida citā kaudzē. Šeit tiks izmantots paraksts un publiskā atslēga.
Līdz šim mēs redeemScript esam uzskatījuši par elementu. Bet tagad tas tiks interpretēts kā norādījumi, kas var būt jebkas. Ņemsim piemēru P2PKH bloķēšanas skriptam, kuram ir jānorāda <signature> un <public key>, kas atbilst <publiskās atslēgas hash>, kas atrodas <redeemScript>.

Kad jūsu redeemScript ir izvērsts, varat redzēt, ka situācija ir tieši tāda pati kā parastais P2PKH darījums. No turienes jūs vienkārši palaidiet to tāpat kā parastu.
Mēs šeit esam parādījuši tā saukto P2SH(P2PKH) skriptu, taču diez vai jūs kādu no tiem atradīsit savvaļā. Nekas neliedz jums to izveidot, taču tas nedod papildu priekšrocības un aizņem vairāk vietas blokā (un līdz ar to arī maksā vairāk).
P2SH parasti noder, piemēram, vairāku parakstu vai ar SegWit saderīgiem darījumiem. Multisig darījumi var būt ļoti lieli, jo tiem var būt nepieciešamas vairākas atslēgas. Pirms Pay-to-Script-Hash ieviešanas sūtītājam savā bloķēšanas skriptā ir jānorāda visas iespējamās publiskās atslēgas.
Bet ar P2SH nav nozīmes tam, cik sarežģīti ir tēriņu nosacījumi. RedeemScript jaucējkods vienmēr ir fiksēts lielums. Tāpēc izmaksas tiek uzliktas lietotājam(iem), kuri vēlas atbloķēt bloķēšanas skriptu.
SegWit saderība ir vēl viens gadījums, kad noder P2SH (detaļās par to, kā darījuma struktūra atšķiras, mēs iepazīsimies nākamajā sadaļā). SegWit bija mīksta dakša, kuras rezultātā tika mainīti bloku/darījumu formāti. Tā kā tas ir izvēles jauninājums, ne visa maka programmatūra atpazīst izmaiņas. Nav nozīmes tam, vai klienti iesaiņo SegWit skripta jaucējkodu P2SH. Tāpat kā visiem šāda veida darījumiem, viņiem nav jāzina, kāds būs atbloķēšanas redeemScript.
SegWit darījumi (P2WPKH un P2WSH)
Plašāku ievadu par SegWit skatiet ceļvedī Segregated Witness iesācējiem.
Lai saprastu SegWit darījuma formātu, jums vienkārši jāzina, ka mums vairs nav tikai scriptSig un scriptPubKey. Tagad mums ir arī jauns lauks, ko sauc par liecinieku. Dati, ko izmantojām, lai saglabātu scriptSig, tiek pārvietoti uz liecinieku, tāpēc scriptSig ir tukšs.
Ja esat saskāries ar adresēm, kas sākas ar “bc1”, tās mēs saucam par SegWit native (pretstatā tikai segWit saderīgām adresēm, kas sākas ar 3, jo tās ir P2SH adreses).
Pay-to-Witness-Pubkey-Hash (P2WPKH)
Pay-to-Witness-Pubkey-Hash (P2WPKH) ir P2PKH SegWit versija. Mūsu liecinieks izskatās šādi:
<paraksts> <publiskā atslēga>
Ņemiet vērā, ka tas ir tāds pats kā scriptSig no P2PKH. Šeit skriptsSig ir tukšs. Tikmēr scriptPubKey atgādina šādu:
<OP_0> <publiskās atslēgas hash>
Tas izskatās mazliet dīvaini, vai ne? Kur ir opkodi, lai ļautu mums salīdzināt parakstu, publisko atslēgu un tā jaucējkodu?
Šeit netiek rādīti papildu operatori, jo mezgli, kas saņem darījumu, zina, ko ar to darīt, pamatojoties uz <publiskās atslēgas hash> garumu. Viņi aprēķinās garumu un sapratīs, ka tas ir jāveic tādā pašā stilā kā vecmodīgs P2PKH darījums.
Nejauninātie mezgli nezina, kā transakciju interpretēt šādā veidā, taču tam nav nozīmes. Saskaņā ar vecajiem noteikumiem liecinieku nav, tāpēc viņi nolasa tukšu scriptSig un dažus datus. Viņi to novērtē un atzīmē kā derīgu — ciktāl viņi attiecas, ikviens var iztērēt rezultātu. Tāpēc SegWit tiek uzskatīts par atpakaļsaderīgu mīksto dakšiņu.
Pay-to-Witness-Script-Hash (P2WSH)
Pay-to-Witness-Script Hash (P2WSH) ir jaunais P2SH. Ja esat ticis tik tālu, iespējams, varat izdomāt, kā tas izskatīsies, taču mēs tik un tā tiksim galā. Mūsu liecinieks ir tas, ko mēs parasti ievietojam skriptāSig. Piemēram, P2WSH, kas aptver P2PKH darījumu, tas varētu izskatīties šādi:
<paraksts 1> <publiskā atslēga>
Šeit ir mūsu scriptPubKey:
<OP_0> <script hash>
Tie paši noteikumi ir spēkā. SegWit mezgli nolasa skripta jaucējkoda garumu un nosaka, ka tā ir P2WSH izvade, kas tiek novērtēta līdzīgi kā P2SH. Tikmēr vecie mezgli to uzskata tikai par izvadi, ko var tērēt ikviens.
Noslēguma domas
Šajā rakstā mēs uzzinājām mazliet par Bitcoin pamatelementiem. Apkoposim tos ātri:
Skripta veids | Apraksts |
|---|---|
Pay-to-Pubkey (P2PK) | Bloķē līdzekļus noteiktai publiskai atslēgai |
Pay-to-Pubkey-Hash (P2PKH) | Bloķē līdzekļus noteiktai publiskās atslēgas hash (t.i., adresei) |
Pay-to-Script-Hash (P2SH) | Bloķē līdzekļus skripta jaukšanai, ko saņēmējs var nodrošināt |
Pay-to-Witness-Pubkey-Hash (P2WPKH) | P2PK SegWit versija |
Pay-to-Witness-Script-Hash (P2WSH) | P2SH SegWit versija |
Kad esat iedziļinājies Bitcoin, jūs sākat saprast, kāpēc tam ir tik liels potenciāls. Darījumus var veidot daudz dažādu sastāvdaļu. Manipulējot ar šiem elementiem, lietotājiem ir liela elastība, nosakot nosacījumus, kā un kad var tērēt līdzekļus.
➠ Vai jums ir jautājumi par skriptu? Dodieties uz Ask Academy!



