Bitcoin Script چیست؟
اگر UTXO را یک خروجی قفلشده در نظر بگیریم، باید راهی وجود داشته باشد که شبکه بفهمد چه شرایطی برای خرجکردن آن خروجی لازم است. این کار در بیتکوین با Script انجام میشود.
Script زبان کوچک و عمداً محدود بیتکوین برای بیان و بررسی شرایط خرجکردن است. بنابراین یک آدرس بهتنهایی «مالک» بیتکوین نیست؛ آدرس معمولاً نمایش قابلخواندنتری از شرایطی است که یک خروجی باید برای خرجشدن برآورده کند.
این موضوع را باید کنار مدل UTXO بیتکوین خواند: هر UTXO شامل مقدار بیتکوین و شرایط خرجکردن است.
scriptPubKey و scriptSig
در مدل کلاسیک تراکنش، خروجی دارای scriptPubKey است؛ یعنی برنامه/شرطی که خروجی را قفل میکند. هنگام خرجکردن، تراکنش ورودی دادههای لازم برای برآوردهکردن این شرط را ارائه میکند.
در الگوهای قدیمیتر، این دادهها در scriptSig قرار میگرفتند. برای نمونه در P2PKH، خروجی به یک hash از کلید عمومی مرتبط است و خرجکننده باید امضای معتبر و کلید عمومی متناظر را ارائه کند.
نکته مهم این است که «آدرس» و «Script» یکی نیستند. آدرس یک قالب ارائه و کدگذاری برای رساندن اطلاعات لازم به پرداختکننده است؛ Script شرایطی است که هنگام اعتبارسنجی تراکنش بررسی میشود.
یک مسیر ساده از آدرس تا خرجکردن
میتوان فرآیند را به این شکل دید:
Address، سپس Output، بعد UTXO، سپس Spending Transaction و در نهایت Script Validation
مثلاً یک کیف پول آدرس دریافت را در اختیار فرستنده میگذارد. فرستنده تراکنشی میسازد که یک خروجی ایجاد میکند. آن خروجی تا زمانی که خرج نشده، یک UTXO است. بعداً مالک باید تراکنشی بسازد که آن UTXO را بهعنوان ورودی مصرف کند و دادههای لازم برای برآوردهکردن شرط Script را ارائه دهد.
نودها در هنگام اعتبارسنجی بررسی میکنند که این خرج واقعاً مجاز است و تراکنش قوانین اجماع را نقض نمیکند.
P2PKH؛ یک نمونه کلاسیک
در P2PKH، شرط خرجکردن به hash کلید عمومی وابسته است. خرجکننده باید کلید عمومی متناظر و یک امضای معتبر ارائه کند. Script با عملیات محدود خود بررسی میکند که hash کلید عمومی درست است و امضا با کلید عمومی و تراکنش سازگار است.
این مثال نشان میدهد چرا گفتن «بیتکوین داخل آدرس است» دقیق نیست. بیتکوین در UTXO قرار دارد و آن UTXO شرایطی برای خرجشدن دارد که آدرس آن را بهشکل قابلاستفاده برای انسان/نرمافزار معرفی میکند.
یک مثال کامل: از قفلکردن UTXO تا بررسی امضا
برای اینکه نقش Script ملموستر شود، یک نمونه ساده از P2PKH را مرحلهبهمرحله بررسی کنیم. فرض کنید کاربر «الف» میخواهد ۰٫۰۰۱ بیتکوین را برای «ب» ارسال کند.
در تراکنش دریافت، خروجی مربوط به «ب» یک شرط شبیه این دارد:
OP_DUP OP_HASH160 <PublicKeyHash> OP_EQUALVERIFY OP_CHECKSIG
این خط به زبان ساده میگوید: کلید عمومی ارائهشده باید با hash مورد انتظار مطابقت داشته باشد و امضای ارائهشده نیز باید برای همین تراکنش معتبر باشد.
وقتی «ب» بعداً میخواهد این UTXO را خرج کند، تراکنش خرجکننده دادههایی مانند امضای دیجیتال و کلید عمومی را ارائه میکند. در مدل کلاسیک P2PKH، این دادهها در scriptSig قرار میگیرند.
نود هنگام اعتبارسنجی، دادههای لازم را با شرط خروجی ترکیب و Script را طبق قواعد همان الگو اجرا میکند. اگر hash کلید عمومی درست باشد و امضا نیز معتبر باشد، شرط مربوط به این UTXO برقرار است؛ در غیر این صورت، ورودی معتبر نیست.
نکته مهم این مثال این است که نود به کلید خصوصی «ب» دسترسی پیدا نمیکند. کیف پول با کلید خصوصی امضا را تولید میکند و نود فقط میتواند امضا را با کلید عمومی ارائهشده بررسی کند.
این مسیر را میتوان به چهار مرحله خلاصه کرد:
- ایجاد خروجی: فرستنده یک UTXO با شرط خرج مشخص ایجاد میکند.
- ارائه داده لازم: گیرنده هنگام خرجکردن، دادههای لازم مانند امضا و کلید عمومی را ارائه میکند.
- اجرای Script: نود شرایط تعریفشده برای خروجی را طبق قواعد اجماع بررسی میکند.
- نتیجه اعتبارسنجی: اگر شرایط برقرار باشند، ورودی میتواند معتبر باشد؛ در غیر این صورت تراکنش رد میشود.
این مثال عمداً ساده شده است. در تراکنشهای SegWit و Taproot، ساختار دادههای خرجکردن و روش اعتبارسنجی میتواند متفاوت باشد؛ بنابراین نباید این مدل P2PKH را به همه انواع خروجیهای بیتکوین تعمیم داد.
P2SH، SegWit و Witness
P2SH امکان ساخت خروجیهایی را فراهم کرد که شرایط خرجشدن به یک hash از Script مربوط باشد و جزئیات Script در زمان خرج ارائه شود.
SegWit ساختار داده تراکنش را تغییر داد و دادههای witness را از بخش اصلی تراکنش جدا کرد. در الگوهای native SegWit، شرایط خرج و دادههای witness طبق قوانین مربوط به نسخه witness تفسیر میشوند.
این معماری فقط تغییر ظاهری آدرس نیست؛ روی نحوه نمایش دادههای تراکنش، وزن تراکنش و در نتیجه محاسبه کارمزد نیز اثر دارد. برای جزئیات کارمزد، کارمزد بیتکوین چگونه تعیین میشود؟ را ببینید.
Taproot چه تغییری میدهد؟
Taproot که با SegWit version 1 معرفی شد، مدل جدیدی برای خروجیها و شرایط خرجکردن ارائه میکند. در حالت کلیدی، یک خروجی میتواند با یک کلید عمومی Taproot خرج شود؛ در حالت اسکریپتی نیز ساختار درختی شرایط Script امکان بیان سناریوهای پیچیدهتر را فراهم میکند.
آدرسهای Taproot معمولاً با bc1p شروع میشوند و برای witness version 1 از Bech32m استفاده میکنند.
برای تفاوت قالب آدرسها، انواع آدرس بیتکوین را بخوانید.
چرا Script عمداً محدود است؟
Script قرار نیست یک زبان برنامهنویسی عمومی باشد. محدودبودن آن به کاهش پیچیدگی اعتبارسنجی و جلوگیری از رفتارهای غیرضروری یا دشوار برای پیشبینی کمک میکند.
یک نود باید بتواند Scriptهای تراکنشها و بلاکها را با قواعد مشخص و قابلتکرار اجرا و نتیجه را تعیین کند. این ویژگی برای یک شبکه غیرمتمرکز حیاتی است: دو نود مستقل باید با دریافت داده یکسان و اجرای قوانین یکسان به نتیجه یکسان برسند.
Script با Consensus چه ارتباطی دارد؟
Script بخشی از فرایند validation است، اما نباید آن را با کل مفهوم اجماع یکی دانست. نود مجموعهای از قوانین اجماع را درباره ساختار و اعتبار تراکنش و بلاک اعمال میکند و بررسی شرایط Script یکی از اجزای مهم این اعتبارسنجی است.
همچنین ماینر تعیین نمیکند یک Script معتبر باشد یا نه. ماینر میتواند تراکنشهایی را برای ساخت بلاک انتخاب کند، اما نودهای شبکه بلاک و تراکنشهای آن را مستقل از ماینر اعتبارسنجی میکنند.
برای این رابطه، اجماع در بیتکوین و امنیت بیتکوین مفید هستند.
آیا Script یعنی «مالکیت»؟
بهتر است دقیقتر بگوییم: Script شرایطی را تعریف میکند که باید برای خرجشدن یک UTXO برآورده شود. در سادهترین حالت، این شرایط به اثبات کنترل یک کلید خصوصی از طریق امضای معتبر وابسته است.
اما این مدل میتواند پیچیدهتر باشد؛ Script میتواند شرایط چندامضایی یا سناریوهای دیگر را نیز بیان کند. بنابراین «مالکیت» در بیتکوین الزاماً معادل یک حساب با یک صاحب واحد نیست؛ مسئله اصلی کنترل یا برآوردهکردن شرایط خرج UTXO است.
جمعبندی
Bitcoin Script حلقه اتصال مهمی میان UTXO، آدرس، تراکنش و اعتبارسنجی نودها است. آدرس مقصد پرداخت را به قالبی قابلاستفاده تبدیل میکند، خروجی شرایط خرجشدن را در خود دارد و تراکنش خرجکننده باید دادههای لازم را برای برآوردهکردن آن شرایط ارائه کند.
این مدل همچنین توضیح میدهد چرا بیتکوین یک سیستم حسابداری ساده با «موجودی حساب» نیست؛ شبکه دائماً خروجیهای خرجنشده و شرایط معتبر خرجشدن آنها را دنبال و اعتبارسنجی میکند.
منابع
- BIP 13 — Pay to Script Hash
- BIP 141 — Segregated Witness
- BIP 143 — Transaction Signature Verification for Version 0 Witness Program
- BIP 341 — Taproot
- BIP 342 — Validation of Taproot Scripts
- Bitcoin Developer Guide — Transactions and Scripts
این مطلب با هدف آموزش و تحلیل تهیه شده است و نباید بهعنوان توصیه قطعی برای خرید، فروش یا شرطبندی تلقی شود.