ماشین تورینگ (Turing Machine) چیست؟ بیتکوین و اتریوم کدامیک تورینگ کامل هستند؟
امروزه یکی از مباحثی که در میان کامیونیتی شبکه های بلاکچینی و توسعه کاربردهای آنها در بین افراد مطرح میگردد به این اصطلاح برخورد میکنیم که آیا این شبکه ها تورینگ کامل هستند یا خیر؟ در این مقاله نگاهی گذرا به این امر و مفهوم ماشین تورینگ خواهیم داشت. با کوینایران همراه باشید.
ماشین تورینگ
مفهوم ماشین تورینگ به عنوان یک ماشین محاسباتی، اولین بار توسط “آلن تورینگ” ریاضی دان و دانشمند انگلیسی درسال 1936 میلادی ارائه گردید. ریشه این نظریه اقتباس از نظریه ماشین محاسباتی چارلز بابیج (1834) است. این ماشین یک دستگاه فرضی است شامل یک نوار با طول نامتناهی از هر طرف و یک هد خواندن/نوشتن که میتواند با یک مکانیزم بسیار ساده اطلاعات را از روی این نوار برطبق یک سری قوانین بخواند یا بنویسد. در هر حالت این نوار فقط به اندازه یک خانه به سمت راست یا چپ حرکت کرده و هد دستگاه روی آن یک خانه قرار میگیرد و پس از خواندن نشانهی آن خانه با توجه به برنامه موجود تصمیم میگیرد آن نشانه بدون تغییر باقی بماند و یا اینکه نشانه دیگری در آن خانه نوشته شود.
فرضیه آلن تورینگ برای ابداع این ماشین این است که بتوان هر نوع محاسبات پیچیده را توسط این مکانیزم ساده انجام داد (هرچند که از نظر تئوری ممکن است زمان بینهاتی لازم باشد). حافظه این ماشین ساختار بسیار ساده ای دارد. در واقع یک آرایه یک بعدی است که از دو طرف نامحدود است و میتواند اطلاعات را به هر شکلی فراخوانی نماید.
مکانیزم کار دستگاه طوری است که هِد دستگاه در هر وضعیت روی یک خانه قرار گرفته و فقط میتواند اطلاعات همان خانه از نوار را بخواند یا بنویسد. کنترل این فرایند بر اساس یک برنامه (program) از نوع ماشین وضعیت (state machine) است که دنباله ای از وردودی ها را به خروجی مورد نظر تبدیل کرده و در محل مشخص روی نوار مینویسد یا از روی آن میخواند.
برای مثال نحوه کار ماشین وضعیت در شکل فوق بدینگونه است:
حالت اولیه یا شروع از q0: اطلاعات خانه ای که مقابل هد دستگاه است خوانده شده اگر 1 باشد در همان خانه 0 مینویسد و هد به سمت چپ حرکت میکند و ماشین به وضعیت q1 میرود.
در وضعیت q1: تکرار (loop) است. مادامی که دیتای خوانده شده 1 باشد، مقدار آن 0 شده و هد به سمت چپ میرود. با خواندن اولین 0 مقدار 1 شده و ماشین به وضعیت q2 میرود.
در وضعیت q2: با خواندن مقدار 0 تغییری انجام نشده و هد به سمت چپ میرود و با خواندن مقدار 1 تغییری انجام نشده و هد به سمت راست میرود. در هر دو حالت وارد وضعیت q0 میشود.
در اینجا با خواندن 0 تغییری در مقدار انجام نمیشود اما وارد وضعیت Halt یا توقف میشود. وضعیت qh برای اجتناب از تکرار نامتناهی، لازم و ضروری است.
یک ماشین تورینگ میتواند محاسبات و عملگر های زیر را داشته باشد:
- عملگرهای ریاضی (+, -, *) با هر ترتیب
- حلقه (loop)
- انتقال یا انشعاب (Go to)
- شرط (If then else)
چنانچه یک ماشین همه خاصیت های فوق را باهم داشته باشد به آن “ماشین تورینگ کامل” (Turing Completeness) گفته میشود.
اتریوم یا بیتکوین، کدامیک تورینگ کامل است؟
برای پاسخ به این سوال بهتر است نگاهی بیاندازیم به کدهای محاسباتی اتریوم و بیتکوین و ببینیم هریک چه خصوصیاتی دارند.
بیتکوین:
در شبکه بیتکوین هر نود شبکه برای پردازش تراکنش ها از اسکریپت های تعیین شده در این شبکه یا همان آپ کد ها (OpCodes) استفاده میکند. این آپ کد ها دارای دستورات محاسباتی معین و محدود بوده و نحوه اجرای آنها بر اساس مکانیزم اِستَک (stack-based) است. در این مکانیزم که در شکل زیر نشان داده شده، اطلاعات وارد یک آرایه ای یک بعدی از حافظه شده و فراخوانی و اجرا همیشه از بالاترین (آخرین) ورودی انجام میشود. به عبارت دیگر استک دارای مکانیزم “آخرین ورودی-اولین خروجی” (Last-in, First-out) است. هیچ نوع پرش و حلقه ای (loop) در دستورات بیتکوین وجود ندارد.
با توجه به خاصیت هایی که برای یک ماشین تورینگ کامل در بالا گفته شد، بیتکوین تورینگ کامل نیست زیرا حلقه، انشعاب و پرش در دستورات وجود ندارد. سوال اینجاست که آیا این نقطه ضعفی برای بیتکوین است؟ قطعا اینگونه نیست و اصولا پروتکل بیتکوین و ماهیت وجودی آن نیازی ندارد به اینکه بخواهد ماشین تورینگ کامل باشد.
اتریوم:
در شبکه اتریوم زبان برنامه نویسی (به عنوان مثال solidity) که برای تعریف اسمارت کانترکت ها و اجرای دستورات و پردازش تراکنش ها استفاده میشود یک زبان برنامه نویسی کامل است و طبیعتا قابلیت اجرای دستورات و محاسبات پیچیده را دارد. در شکل زیر نیز یک نمونه از کد برنامه نویسی این زبان نشان داده شده است. همانگونه که دیده میشود کلیه خاصیت های یک ماشین تورینگ کامل (از جمله حلقه، انشعاب، شرط) را دارد. بنابراین شبکه اتریوم یک ماشین تورینگ کامل محسوب میگردد.
نکته ای که در اینجا مطرح میشود این است که آیا وجود این خاصیت ها در کد برنامه نویسی در شبکه اتریوم خطری برای پایداری این شبکه محسوب نمیشود؟ به عنوان مثال اگر یک برنامه نویس مخرب با این هدف در کد برنامه اش یک حلقه بی پایان (endless loop) قرار دهد و این کد روی تمام نودهای شبکه منتشر گردد، کل شبکه اسپم شده و مختل خواهد شد. شبکه اتریوم برای مقابله با این شرایط چه راهکاری برای پایدار ماندن شبکه دارد؟
پاسخ به این سوال در وجود مکانیزم سوخت (Gas) در این شبکه نهفته است. در تعریف پروتکل شبکه اتریوم برای اجرای هر واحد محاسباتی (مثل عملگرهای جمع، ضرب، انشعاب، حلقه و …) یک مقدار مشخصی از این سوخت که مقدار کارمزدی (fee) از جنس کوین شبکه (اِتِر) است باید خرج گردد. از آنجا که این کارمزد را باید ارسال کننده تراکنش یا اسمارت کانترکت پرداخت نماید لذا نمیتواند حلقه بی نهایت اجرا کند چرا که در هر بار اجرای حلقه مقداری سوخت مصرف میشود و به محض اتمام کارمزدِ پرداخت شده برای آن تراکنش یا قرارداد، در هر مرحله ای اجرای آن برنامه قطع میشود. بنابراین چنین کاری برای آن فرد مخرب مقرون به صرفه نیست و به این ترتیب از اسپم شدن شبکه جلوگیری میشود.