
تپروت (Taproot) یک ارتقاء بالقوه در پروتکل بیت کوین است که برای اولین بار توسط گرگوری مکسول (Gregory Maxwell)، یکی از اعضای هسته بیت کوین (bitcoin core) پیشنهاد شده و اکنون در مراحل پایانی توسعه است. این فناوری شامل ترکیبی هوشمندانه از ترفندهای ارز دیجیتال است که به کاربران اجازه میدهد قراردادهای هوشمند پیچیده را در تراکنشهای به نظر عادی، مخفی کنند؛ این پیچیدگی تنها در صورتی آشکار میشود که طرفین یک قرارداد با هم همکاری نکنند. اعضای هسته بیت کوین شامل جرمی روبین (Jeremy Rubin)، آنتوان ریارد (Antoine Riard)، گلب نومنكو (Gleb Naumenko) و خود گرگوری مكسول، با استفاده از این ایده در حال گمانه زنی درباره مفهوم عمومی هستند كه به استخر پرداخت (payment pool)، جوین پولز (joinpools) یا coinpools اشاره دارد.
این استخرها – که اکنون آنها را استخر پرداخت مینامیم – به گروههای کاربران امکان میدهد تا مالکیت همان کوینها (از نظر فنی: UTXO) را که در بلاک چین بیت کوین ثبت شده است را به اشتراک بگذارند؛ در حالی که به هر یک از این کاربران اجازه میدهند با آنها پرداخت داشته باشند (یا دریافت کنند). در حالی که این گروه و اعضای آن در ساختار تپروت پنهان میشوند، همه آنها از حریم خصوصی و انعطاف پذیری قرارداد هوشمند و مزایای دیگر لذت میبرند و حتی به طور بالقوه میتوانند از مزایای خارج از زنجیرهای نیز بهرهمند شوند و استخرهای پرداخت را به یک راهکار جدید لایه دوم تبدیل کنند.
اگرچه نسبت به موارد دیگر، مشخصات طراحی کمی متفاوت از یک پروپوزال استخر پرداخت است، اما مفهوم کلی آن یکسان است.
نگهداری اشتراکی کوینها در استخر پرداخت
در ابتدا برای ایجاد یک استخر پرداخت ، کاربران با جمع کردن آنها در آدرس تپروت که بین آنها مشترک است، کوینهای خود را جمع میکنند. بنابراین بیایید بگوییم که آلیس ۳ کوین دارد، باب ۲ کوین و کارول یک کوین، که مجموع آنها ۶ کوین میشود. آنها با هم تراکنشی ایجاد میكنند كه این کوینها را به آدرس مشترک ارسال کرده و با آن یك استخر پرداخت با ۶ کوین میسازند.
آدرس استخر پرداخت در بلاک چین مانند آدرس معمولی بیت کوین به نظر میرسد که اکنون شش کوین در آن نگهداری میشود؛ اما در پشت ماجرا آلیس، باب و کارول هوشمندانه از تپروت استفاده کردند تا مطمئن شوند که هر یک از آنها در استخر پرداخت ، سهم خود از بیت کوین را کنترل میکنند. آلیس هر لحظه میتواند سه کوین، باب ۲ کوین و کارول یک کوین را از آدرس مطالبه کند.
دلیل این امر این است که فقط دو گزینه اصلی برای خرج کردن کوین از آدرس وجود دارد:
گزینه اول، خرج کردن مستقیم از آدرس، و از نظر فنی مسیر اصلی تپروت است. این کار مستلزم همکاری (یعنی: امضاهای رمزنگاری) از هر سه شرکت کننده است. اگر آلیس، باب و کارول همه موافق باشند، شش کوین را میتوان هر گونه که دوست دارند، خرج کنند و این مانند هر تراکنش معمولی دیگر در شبکه بیت کوین به نظر میرسد.
به عنوان مثال این سه نفر میتوانند تصمیم بگیرند که موجودی مربوط به خود را به آدرسهای شخصی برگردانند: سه کوین برای آلیس، دو کوین برای باب و یکی برای کارول. اما اگر این گونه تصمیم بگیرند، میتوانند برای اهدای هر شش کوین به جولیان، یا خرج کردن آن به روش مورد توافق دیگری همکاری کنند. نکته مهم این است که هر سه نفر نیاز به مشارکت دارند؛ بنابراین موجودی هیچ کس بدون همکاری او خرج نمیشود.
گزینه اصلی دوم در واقع از چندین گزینه فرعی تشکیل شده است. آلیس، باب و کارول قبل از ارسال کوینهای خود به استخر پرداخت، چیزی را در درخت رمزنگاری یا درخت مرکل (Merkle Tree) در پشت آدرس تپروت پنهان کردهاند: آنها راههای جایگزین برای ارسال وجه از استخر پرداخت را حساب کرده بودند. این موضوع این گونه فهمیده میشود که هر سه شرکت کننده از قبل تراکنشها را از این مسیرها امضا کرده بودند، که برای تنظیم همه گزینهها به برخی از پیچیدگیها نیاز دارد و دارای مقیاس پذیری مناسبی نیست؛ ارتقاء پروتکل پیشنهادی این کار را در آینده آسانتر میکند.
اگر یکی از شرکت کنندگان تصمیم بگیرد تا کوینهای خود را در استخر پرداخت از طریق یک مسیر جایگزین تپروت خرج کند، معمولا مبلغی متناسب با موجودی آن شرکت کننده را به آدرس مورد نظر خود ارسال می کند؛ درست مانند آدرس فردی که آنها کنترل میکنند (در مورد آلیس، سه کوین به آدرس خودش، در مورد باب ۲ کوین به آدرس او و در مورد کارول نیز یک کوین).
با استفاده از این مسیر جایگزین، کوینهای باقیمانده نیز به طور خودکار خرج میشوند. این کار بسته به نوع طراحی استخر پرداخت، از چند طریق قابل اجرا است و از لحاظ پیچیدگی و مقیاس پذیری، تریدهای متفاوتی را ارائه میدهد.
سادهترین راهکار این است که سهم کوینهای هر یک از شرکت کنندگان دیگر را نیز به آدرس مورد نظر آنها ارسال کرد. به عبارت دیگر: اگر یک کاربر از استخر خارج شود، همه از استخر خارج میشوند.
راهکار دوم که ریچارد و جسیکا آن را ترجیح میدهند، ارسال تمام کوینهای باقیمانده به استخر پرداخت جدید است که دقیقا مانند اولین استخر پرداخت، تنها از هر چیزی که کاربر خارج شده را درگیر کند، خالی شده است. این طرح بهترین تجربه کاربری را ارائه میدهد. اما از همه مهمتر سختترین آنها برای مقیاس پذیری است؛ زیرا لازم است برای همه سناریوهای خروجی ممکن، از جمله سناریوهای خروج ممکن برای همه استخرهای جدید آماده شود. با این وجود، مقیاس پذیری میتواند با یک نسخه ارتقا یافته پروتکل بیت کوین به دست آید تا اطمینان حاصل شود که قوانین مربوط به استخر پرداخت قبلی به استخر پرداخت جدید منتقل میشود.
با این حال روبین معتقد است که راهکار دوم غیر عملی است و ترجیح میدهد بین راهکارهای اول و دوم به دنبال چیزی بگردد: برخی از شرکت کنندگان بلافاصله کوینهای خود را در آدرس مورد نظر خود دریافت کرده و سایر شرکت کنندگان کوینهای خود را به یک استخر پرداخت جدید ارسال میکنند. این طراحی تجربه کاربری کمتر ایدهآلی را ارائه میدهد؛ اما مقیاس پذیری آن بهتر خواهد شد و ارتقاء پروتکل بالقوه OP_CHECKTEMPLATEVERIFY به ساده سازی طراحی کمک کرده و حتی مقیاس پذیری را بیشتر میکند.
برای فهمیدن این که کوینهای باقیمانده چه موقع به استخر پرداخت جدید ارسال میشوند، بیایید بگوییم که آلیس، باب و کارول گزینه دوم را انتخاب میکنند که در آن، تمام کوینهای باقی مانده به یک استخر پرداخت جدید ارسال میشود.
اگر در این طرح آلیس از اولین استخر پرداخت خارج شود، سه کوین به آدرس مورد نظر وی ارسال میشود، در حالی که سه کوین دیگر به یک استخر پرداخت جدید بین باب و کارول ارسال میشوند. آلیس در آن زمان دوباره کنترل مجدد کوینهای خود را در اختیار دارد، در حالی که برای باب و کارول چیزی تغییر نکرده است. این دو هنوز هم میتوانند هر طور که بخواهند برای خرج کردن سه کوین باقیمانده همکاری کنند یا هر یک از آنها میتواند به صورت یک طرفه، مانند کاری که آلیس قبلا انجام داده بود، از استخر خارج شوند.
اگر باب به صورت یک طرفه از استخر پرداخت دوم خارج شود، دو کوین را به آدرس منتخب خود ارسال میکند و یک کوین را به یک استخر پرداخت حتی جدیدتر (سومی) به کارول میسپارد (البته در این مثال ساده در طرحی که این استخر پرداخت آخر با آدرس منتخب کارول جایگزین شود، قابل درکتر است، اما این جزئیات اجرایی است).
نکته مهم این است که شرکت کنندگان در یک استخر پرداخت میتوانند برای انجام هر نوع پرداخت از استخر مورد نظر خود همکاری کنند، در حالی که هر یک از آنها میتواند هر موقع که بخواهد با کوینهای خود خارج شود و سایر شرکت کنندگان را با کوینهای خودشان تنها بگذارد.
قرار دادن پرداخت در استخر پرداخت
ما ثابت کردهایم که همه شرکت کنندگان میتوانند به طور جداگانه موجودی خود را از استخر پرداخت خارج کنند یا اگر همه موافق باشند، از استخر هزینه کنند. این گزینه دوم است که چیزی هوشمندانه را ممکن میسازد: استخر پرداخت میتواند پویا باشد؛ اگر همه شرکت کنندگان موافق نباشند، آنها نمیتوانند سرمایه خود را پس بگیرند یا به دیگران (مانند جولیان) بپردازند، بلکه میتوانند کاری جالبتر انجام دهند؛ آنها میتوانند با طرحهای مختلف سرمایه خود را به نسخههای جدیدتر استخر پرداخت انتقال دهند. به عنوان مثال، به هر یک از آنها امکان میدهد تا از استخر هزینه کنند.
فرض کنید آلیس در حال خرید یک ماشین جدید است و میخواهد با یک بیت کوین هزینه آن را بپردازد. آلیس، باب و کارول میتوانند تراکنشی را از استخر پرداخت ایجاد کنند که یک کوین را برای نمایندگی خودرو ارسال میکند و پنج کوین باقی مانده را نیز به یک استخر پرداخت جدید ارسال میکند که مانند استخر اول به نظر میرسد، به جز این که این بار تنها آلیس میتواند از آن به طور یک طرفه با دو کوین خارج شود.
در ضمن این تراکنش مانند هر تراکنش معمولی بیت کوین دیگری به نظر میرسید. شاید جاسوسان بلاک چین (یا در این مثال نمایندگی خودرو) نتیجه بگیرند که هر ۶ کوین متعلق به آلیس بوده که از یکی از آنها برای خرید خودرو استفاده کرده و پنج کوین دیگر را نگه داشته است. آنها نمیدانند که برخی از کوینها متعلق به باب و کارول هستند یا این که اصلا آنها درگیر این تراکنش بودهاند.
دفعه دیگر هنگامی که باب پرداختی دارد و آلیس و کارول همکاری میکنند، از همان استخر پرداخت استفاده میشود و یک بار دیگر، مانند یک تراکنش معمولی بیت کوین است. در نتیجه باب به جای دو کوین با یک کوین خارج میشود. در همین حال همان جاسوسان بلاک چین فکر میکنند که آلیس دوباره مبلغی را پرداخت کرده و این موضوع آنها را گیجتر میکند و حتی اگر جاسوسان بلاک چین متوجه شوند که آدرس واقعا یک استخر پرداخت بین آلیس، باب و کارول است، هنوز هم نمیتوانند بگویند که کدام یک از آنها آخرین پرداخت را انجام داده است.
هر دفعه که آلیس، باب یا کارول کوینی خرج میکنند، ممکن است تراکنش مربوط به هر یک از آنها باشد و هیچ کس در خارج از استخر پرداخت نمیتواند صاحب تراکنش را تشخیص دهد.
استخرهای پرداخت تنها اجازه خرج کردن را نمیدهند. اگر آلیس بخواهد، میتواند موجودی خود را در استخر پرداخت بالا ببرد. آلیس، باب و کارول در این مورد همکاری کرده تا پنج کوین فعلی را به یک آدرس جدید تپروت منتقل کنند که آلیس در همان تراکنش، یک کوین اضافی را از یکی از آدرسهای شخصی خود ارسال میکند. آدرس جدید تپروت بار دیگر حاوی شش کوین بوده که سه کوین آنها متعلق به آلیس است، همانطور که در گزینه خروج یک طرفه او نشان داده شده است.
کاربران جدید نیز میتوانند به همین روش به استخر پرداخت بپیوندند. اگر آلیس، باب و کارول با شرکت کردن دیوید موافقت کنند، این سه نفر با دیوید همکاری میکنند تا تراکنشی را ایجاد کنند که وجوه استخر پرداخت را به همراه کوینهای جدید دیوید به یک استخر پرداخت جدید ارسال میکند و به گونهای طراحی شده که به دیوید نیز اجازه میدهد که در آن شرکت کند و اگر میخواهد از آن خارج شود.
علاوه بر این، گزینهای برای شرکت کنندگان در استخر پرداخت وجود دارد که به میتوانند به یکدیگر پرداخت داشته باشند. اگر به عنوان مثال آلیس به باب یك کوین بپردازد، این سه نفر میتوانند برای ارسال وجه در استخر پرداخت جدید كه در آن آلیس یک کوین دارد و به باب یك کوین اضافه شده، همکاری كنند. این پرداخت در بلاک چین مانند یک پرداخت معمولی به نظر میرسد و جاسوسان بلاک چین نمیدانند چه کسی یا چه مقدار پرداخت کرده است (شایان ذکر است که دیو میتوانست با دریافت یک پرداخت داخلی از یکی از شرکت کنندگان موجود، به روشی مشابه وارد استخر شود).
با کمی پیچیدگی اضافی (و از نظر ایده آل با حداقل یک نسخه اضافی پروتکل بیت کوین مانند Noinput)، انتقالات حتی میتوانند خارج از زنجیره نیز انجام شود. هنگامی که آلیس به باب پرداخت دارد، همه شرکت کنندگان در این حالت یک تراکنش را برای خرج کردن وجوه در یک استخر پرداخت جدید ایجاد میکنند؛ اما این تراکنش تنها بین آنها به اشتراک گذاشته شده و در شبکه منتشر نمی شود (مگر اینکه کسی تقلب کند).
به این ترتیب آلیس، باب و کارول میتوانند موجودی خود را در داخل به روز کنند و حتی اجازه دهند دیوید در مقطعی وارد استخر شود. وقتی همه موافقت کردند که استخر را ببندند، یک تراکنش نهایی که از استخر پرداخت اصلی هزینه میکند را ایجاد میکنند و آخرین موجودی هر یک را به آنها میدهند.
مشابه ایده قدیمی که به عنوان Channel Factories شناخته میشود، این نوع از استخرهای پرداخت در نهایت حتی میتوانند برای میزبانی کانالهای لایتنینگ یا سایر پروتکلهای لایه دوم استفاده شوند. این کار پتانسیل پیچاندن هر نوع لایه پروتکل اضافی را در چنین استخرهایی دارد؛ بنابراین تمام پیچیدگی آنها در تراکنشهای یکسان و منظم مخفی میشود.