Bitcoin Script гэж юу вэ?
Биткойныг заримдаа програмчилж болох мөнгө хэмээн тодорхойлох нь бий. Цахим хөрөнгө учир, ямар нөхцөлд зарцуулагдахыг нь зааж, тохируулах боломжтой учраас тэр. Биткойн гэхээр л бидний толгойд хэтэвч, зоос гэсэн ойлголтууд бууж байдаг ч, хэтэвчийг түлхүүр, зоосыг чек буюу зарлагын баримт, Блокчэйнийг цуваа гагнагдсан олон сейф буюу авдар зэргээр төсөөлж болно. Тэдгээр авдар бүрт, жижигхэн нээлхий байх ба түүнийг ашиглаж, зарлагын баримтаа хийх, эсвэл авдарт хэр их хөрөнгө байгааг харах боломжтой. Гэхдээ, түлхүүрийг атгаж байгаа хүн л түүнийг нээж, доторх хөрөнгөнд хандаж чадна. Түлхүүрийг эзэмшигч нь, бусдад хөрөнгө шилжүүлэхийг хүссэн үедээ, авдраа нээж, гаднаас ирсэн баримтуудыг нэгтгэн харж байгаад, шинэ баримтыг бичиж, илгээгээд, дүнг нь ашигласан хуучин баримтуудаа устгах ёстой. 1 баримтыг дахин ашиглаж болохгүй учир, хүлээн авагч нь ирсэн хөрөнгийг зарцуулахын тулд, мөн адил шинэ баримт үүсгэн ашиглах юм. Энэхүү нийтлэлээрээ, Биткойны сүлжээн дэх зангилаануудын хөрвүүлэн ашигладаг Bitcoin Script хэмээх програмчлалын хэлийг танилцуулахаар бэлдлээ. Дээрх хялбаршуулсан жишээгээр бол, энэ хэл нь авдарны түгжих, тайлагдах ажиллагааг хариуцаж буй цоож юм.
Гарчиг
Биткойн яаж ажилладаг вэ?
Дээрх жишээнээс харахад, гүйлгээ бүр 2 хэсгээс бүрдэж байгааг хялбархан анзаарч болохоор байгаа. Тэдгээр нь, түлхүүр болон цоож юм. Түлхүүр нь авдраа нээх боломжыг олгох бол, цоож нь шинээр бичсэн баримтаа түгжихэд хэрэглэгдэнэ. Өөрөөр хэлбэл, гүйлгээ хийх бүртээ тэдгээрт харгалзах шинэ цоож болон түлхүүрийг үүсгэн ашиглах юм. Гэхдээ, тэдгээр түлхүүр болон цоожуудыг нэгэн төрлөөр дагнуулах боломжтой. Гэхдээ, зарим авдрууд нь бүүр, олон түлхүүртэй, нууц үгээр хамгаалагдсан гэх зэргээр тохируулагдсан байж ч болно.
Жишээн дээрх түлхүүрийг маань, scriptSig, цоожыг нь scriptPubKey гэдэг. Тэдгээрийг жаахан анхааралтай ажиглахад л, кодын блок болон багахан өгөгдлөөс бүтсэн байгааг таньж болох ба, тэдгээрийн нэгдлээс бяцхан програм үүсдэг. Хэрэглэгчийн хийсэн гүйлгээ, дээрхийн нэгдлээс бүтэх бөгөөд, харгалзах сүлжээгээрээ түгээгдэнэ. Түүнийг хүлээн авсан зангилаа бүр, програмыг шалгаж, гүйлгээг хүлээн зөвшөөрөгдөх эсэхийг шийдвэрлэнэ. Хүлээн зөвшөөрөгдөөгүй тохиолдолд, тухайн гүйлгээ хүчингүй болох юм. Хадгалж буй баримт буюу зоосуудыг, UTXO буюу зарцуулагдаагүй гүйлгээний гаралт гэх ба, цоожыг нь тайлж чадах түлхүүртэй хэн ч түүнийг зарцуулах эрхтэй байна. UTXO нь Таны түрийвчинд байрлаж, "уг нийтийн түлхүүрийн эзэмшигч гэдгээ баталж чадсан хүн л, доторх хөрөнгөнд нь хандах эрхтэй" зэрэг нөхцлийг заана. Ийнхүү батлахын тулд, scriptPubKey-д заагдсан ил түлхүүрийг боловсруулж гаргасан, далд түлхүүрийг ашиглан, цахим гарын үсгийг агуулсан scriptSig-г бүрдүүлж өгөх шаардлагатай.
Биткойны бухал гэж юу вэ?
Bitcoin script хэл нь, stack-based буюу бухалдагч хэлэнд тооцогдоно. Энгийнээр бол, уншсан номуудаа дээр дээрээс нь давхарлан тавихтай адил зарчмаар бичигддэг гэж ойлгож болно. Доорх жишээ зурагт, A, B, C гэсэн 3 өгөгдлийг агуулсан жагсаалтыг, дарааллын дагуу давхарлаад, зааварчилгаа ирмэгц дээрээс нь эхлэн авч, боловсруулж байгааг харуулав.
Ингэхдээ өгөгдлүүд (гарын үсэг, хэш, ил түлхүүр гэх мэт) болон зааварчилгаа буюу opcodes-г 1, нөгөөгөөс нь ялгаж болох бөгөөд, уг зааварчилгаа нь өгөгдлийг устгаад, түүнийг өөр зүйлд ашиглаж чаддаг байна. Код нь дараах байдлаар харагдана. Жишээ нь,
<xyz> <md5 хэшлэх> <d16fb36f0911f878998c136191af705e> <тэнцүү эсэх шалгах>
Цагаанаар харуулсан хэсгүүд нь өгөгдөл, харин хар нь opcodes-г илэрхийлэх ба, зүүнээс баруунруу уншина. Эхлээд <эюя> гэсэн утгыг бухалдаа нэмж, араас нь <md5 хэшлэх> гэсэн зааварчилгаа кодыг оруулав. Хэдийгээр Биткойнд яг энэ жишээнийх шиг кодыг, тусгаагүй байдаг хэдий ч, үүнийг бухлын ёроол дахь буюу хамгийн эхэнд буй зүйлийг (жишээгээр бол, <эюя>) устгаад, түүнийгээ MD5 алгоритмаар хэшлэж, гарсан үр дүнгээ бухалд нэмэх зориулалттай код гээд төсөөлчихье. Тэрхүү үр дүн нь, d16fb36f0911f878998c136191af705e байсан гэвэл, энэ нь түүний араас бичигдэх <d16fb36f0911f878998c136191af705e> өгөгдөлтэй давхцаж, яг ижил 2 мэдээллийг цуваагаар бичих нь ээ. Эцэст нь, <тэнцүү эсэх шалгах> орсноор зааварчилгаа оруулах ажил дуусгавар болох ба уг <тэнцүү эсэх шалгах> код нь өмнөх давхаргууд дахь зүйлс хоорондоо адил утгатай байгаа эсэхийг шалгаж, хэрэв адил байвал <1>-г, ондоо байвал <0>-г бухалд нэмнэ.
Код амжилтгүй болох 2 зам байгаагийн 1 нь үлдэж буй утга 0-г заах, нөгөө нь зарим нөхцлүүд биелэгдээгүйн улмаас, гүйцэтгэлийн явцад саад учрах явдал юм. Гэхдээ, дээрх жишээнд тусгай нөхцөл заасан болон нөхцөл шалгах гүйцэтгэлийг зааж өгөөгүйгээс гадна, эцсийн үр дүн <1> гарах нь тодорхой буюу дээрх код маань амжилттай ажиллах учиртай. Энэ дүрэм Биткойны гүйлгээнд ч яг адил үйлчилж байдаг. Одоо, жишээ биш, жинхэнэ програмтай нь танилцацгаая.
Pay-to-Pubkey (P2PK)
Ил түлхүүрт тушаах энэ гүйлгээг, маш энгийн хялбар гэж тодорхойлж болно. Уг загварын үед, хөрөнгийг нийтийн түлхүүрт түгждэг. Ийм хэлбэрээр төлбөр хүлээж авахыг хүсвэл, илгээгчдээ өөрийн ил түлхүүрийг, Биткойны хаяг мэтээр өгч болно. 2009 онд Сатоши Накамото болон Гарольд Финни нарын хооронд хийгдсэн, Биткойны анхны гүйлгээ, P2PK хэлбэрээр гүйцэтгэгдсэн түүхтэй. Биткойны хөгжлийн эхэн үед, энэ загварыг өргөн хэрэглэж байсан ч, өдгөө P2PKH-г илүү төлхүү хэрэглэж байна.
P2PK гүйлгээний түгжих арга нь, <ил түлхүүр> OP_CHECKSIG хэвийг дагадаг. OP_CHECKSIG гэдэг нь, ил түлхүүрт харгалзах гарын үсгийг шалгагч бөгөөд, scriptSig маань энэ тохиолдолд, <гарын үсэг> гэсэн маш энгийн хэлбэрээр заагдсан байх юм.
Үүнээс илүү хялбар загвар гэж байхгүй. Эхлээд гарын үсгийг бухалд оруулаад, араас нь нийтийн түлхүүрийг нэмнэ. OP_CHECKSIG тэдгээрийг дуудаж, тулгаад, тохирч байвал байвал <1>-г, үгүй бол <0>-г бухалруу нэмэх юм. Цаашид хэрэглэгдэхгүй болсон арга учир, үүнээс илүү дэлгэрэнгүй тайлбарлах шаардлагагүй гэж үзээд, энэ хүргээд орхилоо. Гүнзгийрүүлэн судлахыг хүсвэл, P2PKH сэдвийг уншаарай.
Pay-to-Pubkey-Hash (P2PKH)
Ил түлхүүрийн хэшинд тушаах гүйлгээ нь, орчин цагт хамгийн өргөн хэрэглэгдэж буй арга билээ. Хуучны, хоцрогдсон програмыг л хэрэглэж байгаа биш бол, өдгөө бүх програмууд үндсэн тохиргоогоор P2PKH-г ашиглаж байгаа ба, scriptPubKey нь дараах байдлаар зарлагддаг. Үүнд:
OP_DUP OP_HASH160 <ил түлхүүрийн хэш> OP_EQUALVERIFY OP_CHECKSIG
scriptSig-г танилцуулахаас өмнө, дээрх кодоо задалж, үүргийг нь ойлгож авцгаая.
- OP_DUP - Эхний зүйлийг татаж хувилаад, хуулбарын хамт буцаан бухалд нэмдэг ба, үүний ачаар эх хувилбарыг хөндөхгүйгээр, хуулбарыг ашиглаж үйлдлээ гүйцэтгэх боломжыг олгодог.
- OP_HASH160 - Эхний зүйлийг татаж аваад, 2 дахин хэшлэх бөгөөд, эхний удаад SHA-256 алгоритмыг ашиглаад, гарсан үр дүнг дахин RIPEMD-160 алгоритмаар хэшилж, эцсийн үр дүнг бухалруу нэмнэ.
- OP_EQUALVERIFY - Энэ үйлдэл нь, OP_EQUAL болон OP_VERIFY гэсэн 2 тусдаа үйлдлээс бүрдэх ба эдгээрийн эхнийх нь, 2 хэсэг зүйлийг татаж, тэдгээрийг харьцуулааад, адил бол <1>-г, үгүй бол <0>-г бухалруу илгээх юм. Харин сүүлийнх нь өмнөх үйлдлийн үр дүнг, үнэн буюу <1> байгаа эсэхийг шалгаж, <0> байвал, гүйлгээг цуцалдаг. Ийн нэгтгэснээр, харьцуулаад, тохирохгүй бол цуцлах ажиллагааг гүйцэтгэх цогц үүргийг хүлээжээ.
Энэ удаад scriptSig, <гарын үсэг> <ил түлхүүр> байдлаар дүрслэгдэнэ.
P2PKH-н түгжээг тайлахын тулд, гарын үсэг болон түүнд харгалзах ил түлхүүрийг олгох шаардлагатай. Доорх зургаас, ажиллагааны зарчмыг ойлгох боломжтой ба энд ил түлхүүрийг, код дахь хэштэй таарч байгаа эсэхийг шалгаж байгаа нэмэлт давхаргаар л, P2PK-с ялгарч байгааг харж болно.
Гэхдээ P2PKH-н нийтийн түлхүүр нь ил харагддаггүй буюу зөвхөн түүний хэш л тодорхой байгаа. Блокчэйний хөтчөөс, P2PKH-н зарцуулагдаагүй байгаа гаралтыг харвал, түүний ил түлхүүрийг харах боломжгүй байх ба, зөвхөн хүлээн авагч нь түүнийг зарцуулсан цагт л уг түлхүүр ил тод болох юм. Ингэж тохируулснаар, хаягаа дамжуулахад хялбар болсон. Ил түлхүүрийн хэш нь, ил түлхүүртэйгээ харьцуулахад богино байдаг тул, 2009 онд үүнийг хэрэглээнд нэвтрүүлэхдээ Сатоши Накамото, "The public key hash is what we know as a Bitcoin address today" буюу "Нийтийн түлхүүрийн хэш гэдэг нь, бидний мэдэх Биткойны хаяг юм" хэмээсэн байдаг. Түүнчлэн уг хэш нь, квант компьютероос хамгаалах, аюулгүй байдлын нэмэлт үе давхаргыг бий болгодог. Хэшийн ачаар, хүлээн авсан хөрөнгөө зарцуулах хүртлээ, ил түлхүүр буюу хаягаа нууцлах, түүнээс тооцоолж, хувийн түлхүүрийг олох явдлыг хүндрүүлж, эрсдлийг бууруулах боломж бүрдсэн. 1 биш, 2 хэшийг урвуугаар тооцоолох хэрэгтэй болно гэдэг нь, 2 дахин илүү найдвартай байдлыг бүтээж байгаа хэрэг юм.
#CoinMarketCap
Pay-to-Script-Hash (P2SH)
Кодын хэшинд тушаах гүйлгээ нь, Биткойны түүхэнд тохиолдсон нэн сонирхолтой хөгжүүлэлтүүдийн 1 юм. Уг аргыг ашиглаж байхад, илгээгч нь хөрөнгөө кодын хэшинд түгжих бөгөөд тухайн кодыг яг юу хийдгийг мэдэх шаардлагагүй байдаг. Харин түүнийг зарцуулагч нь, хэшлэхэд хэрэглэсэн кодыг өгч, нөхцлийг нь биелүүлснээр хөрөнгөө зарцуулах эрхийг олж авна. Хэшийг дараах кодоор үүсгэх бөгөөд, scriptPubKey-д уягдсан зоосоо хөдөлгөхийг хүсвэл, эдгээр тушаалыг өгөхөөс гадна, кодыг гүйцэт ачааллуулж, гүйлгээг үнэн болохыг батлах scriptSig-г олгох хэрэгтэй болно.
<2 дахин үржүүлэх> <4> <тэнцүү эсэх шалгах>
Дээрх жишээ кодын хувьд, <2 дахин үржүүлэх> хэрэгжээд, үр дүн <4> гарсан учир, scriptSig = <2> байж таарна. Үүний бодит код нь дараах байдлаар бичигддэг.
OP_HASH160 <redeemScript хэш> OP_EQUAL
<redeemScript hash> гэх шинэ зүйл нэмэгдсэн нь, хөрөнгөө гаргаж авахад зориулагдсан кодын хэш юм. Үүнээс хамаарч, scriptSig өөрчлөгдөх ба, энэ нь гарын үсгүүд болон холбогдох нийтийн түлхүүрүүд, зохих redeemScript-с бүтнэ.
<гарын үсэг> <ил түлхүүр> <redeemScript>
Бухалдахдаа, 2 тусдаа боловсруулалт хийх замаар ажиллах тул, өмнө үзсэн аргуудаас бага зэрэг ялгаатай. Эхний шатанд, зөв хэшийг тодорхойлсон эсэхийг л шалгах ба redeemScript-г хүртэлх утгуудыг огтоос оролдохгүй. Эхний шатны уг жижиг програмын орой хоосон буюу <0> заагаагүй байгаа учир, хүчин төгөлдөрт тооцогдоно.
Сүлжээн дэх зангилаанууд, уг гүйлгээг P2SH болохыг тэр даруйд таньж чадах бөгөөд, тусдаа бухалд scriptSig-г боловсруулагдаж дуусаад, зарлагдахыг хүлээнэ. Тэнд гарын үсэг болон ил түлхүүр хэрэглэгдсэнээр 2-р шат эхлэх ба, энэ үеэс redeemScript утга биш болж, зааварчилгаа болон ажиллаж эхэлнэ. P2PKH дээр жишээ болгон тайлбарлая л даа, <redeemScript> дотор, <ил түлхүүрийн хэш>-д нийцэх <гарын үсэг> болон <ил түлхүүр> тусгагдсан байх ёстой.
redeemScript задарсны дараа, P2PKH-н ажиллагаатай яг адил, энгийн боловсруулалтыг гүйцэтгэж байгааг харж болно. Дээрх жишээнд танилцуулсан аргыг P2SH(P2PKH) гэх ба, үүнийг ашигласан гүйлгээтэй таарах боломж бараг л байхгүй. Хэдийгээр хүссэн хүн бүр ийм байдлаар гүйлгээ хийж болох ч, тэглээ гээд ямар 1 мэдэгдэхүйц ашиг гарахгүй, харин ч эсрэгээр блокт эзлэх зай нэмэгдэж, шимтгэл өсөх сул талтай.
P2SH-г голчлон, MultiSig болон SegWit нийцтэй гүйлгээнд ашиглахад илүү зохимжтой байдаг. Олон түлхүүрийн системд, боломжит бүх ил түлхүүрүүдийг түгжих кодонд тусгаж өгч болно. Гэхдээ P2SH-д, зарцуулах нөхцлийн хэр нарийн төвөгтэй нь огтоос хамааралгүй буюу redeemScript-н хэмжээ ямагт тогтмол байх учир, түгжээг тайлсан хэрэглэгч(ид) л тэрхүү нэмэлт зардлыг төлөх шаардлагатай болох юм.
SegWit шилжүүлгүүд (P2WPKH ба P2WSH)
Энэ сэдвийг бүрэн гүйцэт ойлгохын тулд эхлээд, ЭНД дарж SegWit гэж юу болохтой танилцаарай.
SegWit-н гүйлгээний хэв загвар нь, дээрхээс арай өөр буюу scriptSig, scriptPubKey зэргээс гадна, witness буюу гэрч гэсэн шинэ талбартай болсон байдаг. Өмнө нь scriptSig-т хадгалагдаж байсан өгөгдлийг одоо гэрч дотор хадгалдаг болсон тул scriptSig хоосорсон байх болно. "bc1" гэсэн 3 оронгоор эхэлж байгаа хаягууд нь, SegWit-native буюу SegWit-н унаган хаягууд юм. Харин, "3" гэсэн 1 тоогоор эхэлж байвал, тэр нь, P2SH-н SegWit-compatible буюу SegWit-д нийцтэй хаягууд гэсэн үг.
Pay-to-Witness-Pubkey-Hash (P2WPKH)
Ил түлхүүрийн хэшийн гэрчид тушаах гүйлгээ нь, P2PKH-н гүйлгээний SegWit хувилбар юм. Уг гүйлгээний боловсруулалтын үед, гэрчийг <гарын үсэг> <ил түлхүүр> байдлаар зарлах ба, энэ нь P2PKH гүйлгээтэй яг адил зохицуулагдсан. Харин scriptPubKey-д <OP_0> <ил түлхүүрийн хэш> гэсэн кодыг тусгасан байх ба, энд ямар ч нэмэлт зааварчилгааг тусгаагүй байгааг Та харж байна. Учир нь зангилаанууд үүнийг хүлээж авмагцаа, <ил түлхүүрийн хэш>-н уртаар нь таниад, нөгөө л P2PKH гэдгийг нь шууд мэдэх боломжтой болохоор тэр. Шинэчлэгдээгүй, хуучин зангилаанууд уг гүйлгээг, тэр дундаа гэрчийг таньж уншиж чадахгүй боловч, хоосон scriptSig-г, харгалзах өгөгдлийн хамтаар боловсруулж, зөрчилгүйд тооцож чадна. Тэдний хувьд, гаралтыг нь хэн ч ашиглаж болохоор, гүйлгээ хийгдэж байгаа мэт харагдах юм. Тийм ч учраас SegWit-г, урвуу нийцтэй сул салаалалт гэж хэмээн нэрийддэг.
Pay-to-Witness-Script-Hash (P2WSH)
Шинэ төрлийн P2SH-г, Кодын хэшийн гэрчид тушаах гүйлгээ гэж тодорхойлох ба P2WSH-д, P2PKH гүйлгээг шингээж өгөх учир дараах байдлаар харагдана. Үүнд:
<гарын үсэг 1> <ил түлхүүр>
scriptPubKey энд байрлана.
<OP_0> <кодын хэш>
P2PWKH гүйлгээтэй яг адил зарчмаар ажиллана.
Дүгнэлт
Pay-to-Pubkey (P2PK)
Pay-to-Pubkey-Hash (P2PKH)
Pay-to-Script-Hash (P2SH)
Уг нийтлэл болон манай БЛОГ танд таалагдсан бол манай Fb хуудас болон twitter хуудас дээр биднийг дагаарай!
Баярлалаа!
Join the conversation