بررسی اتریوم و قابلیت قرارداد هوشمند آن از دید برنامه نویسی

اتریوم (Ethereum) پلتفرمی عمومی، متن‌باز، زنجیره بلوکی-محور با رایانش توزیع‌شده برای قرارداد هوشمند است. این پلتفرم ماشین مجازی تورینگ کامل اتریوم (EVM) را فراهم می‌آورد و اسکریپت‌ها را با استفاده از شبکهٔ بین‌المللی گره‌های عمومی اجرا می‌کند. اتریوم همچنین یک توکن ارز رمزپایه به نام «اتر» ارائه می‌کند، که میان حساب‌ها قابل انتقال بوده و می‌تواند به گره‌های شرکت‌کننده برای محاسباتی که انجام داده‌اند پرداخت شود. «گَس»، سازوکار کار داخلی قیمتگذاری است که برای جلوگیری از اسپمینگ و مکان‌یابی منابع روی شبکه به کار گرفته می‌شود.

اتریوم یک شبکه غیرمتمرکز است، هیچ نهاد حکومتی بر آن نظارت ندارد و توسط هیچ شخص یا واسطه‌ای کنترل نمی‌شود. غیرمتمرکز بودن شبکه اتریوم باعث شده تا این بلاک چین در برابر اتفاق‌هایی مانند هک، از کار افتادن شبکه به دلیل از کار افتادن تجهیزات و… مقاوم باشد. همانطور که می‌دانید، در شبکه‌های متمرکز امکان به سرقت رفتن اطلاعات توسط اعضای شبکه، از کار افتادن سرورها، امکان نظارت بر اطلاعات شخصی و… وجود دارد. اما در شبکه‌های غیرمتمرکزی مانند اتریوم، امکان چنین اتفاق‌هایی نزدیک به صفر است.

اتریوم شبکه‌ای غیرمتمرکز و کاملا ناشناس است که توسط هیچ شخصی کنترل نمی‌شود. درواقع، شبکه اتریوم توسط هزاران سیستم کامپیوتری در سراسر جهان اداره می‌شود که هر کدام از آنها، داوطلب شده‌اند تا فعالیت‌های این شبکه را پیش ببرند و برای اینکار از شبکه پاداش دریافت می کنند. یکی دیگر از ویژگی‌های اتریوم، توزیع شده بودن آن است. یعنی اطلاعات شبکه در اختیار تمام اعضای شبکه قرار دارد و این مسئله، امکان تغییر و دستکاری در اطلاعات را از بین می‌برد.

پس اگر بخواهیم اتریوم را به زبان ساده تعریف کنیم، باید بگوییم اتریوم شبکه‌ای مبتنی بر تکنولوژی بلاک چین است که امکان ایجاد برنامه‌های غیرمتمرکز را فراهم می‌کند. این برنامه‌های غیرمتمرکز، با استفاده از قراردادهایی به نام قرارداد هوشمند ایجاد می‌شوند و ویژگی بارز آنها، نبود امکان تقلب، سانسور، از کار افتادن و دخالت شخص ثالث است.

هدف اتریوم چیست؟

وقتی از جوزف لوبین (Joseph Lubin)، یکی از توسعه‌دهندگان اصلی اتریوم، درباره هدف از ایجاد این شبکه سؤال کردند، در جواب گفت:

اتریوم ایجاد شد تا برای انجام امور زندگی‌مان به هیچ بانک، شرکت و نهاد دیگری به‌جز خودمان نیاز نداشته باشیم.

توکن اتریوم

اتر یک ارز رمزپایه است که در شبکه اتریوم از آن استفاده می‌شود. پس اگر قرار باشد در شبکه اتریوم تراکنشی انجام دهیم، باید از توکن اتر استفاده کنیم. دقیقاً مثل ارز دلار که از واحدهای کوچکتری به نام سنت تشکیل شده و بیت کوین که دارای واحدهای کوچکتری به نام میلی بیت و ساتوشی است، اتر هم دارای واحدهای کوچکتری با نام گذاری‌های مختلف است. واحدهای کوچکتر آتریوم را szabo (سابو) گویند؛ و تقسیم‌بندی آن به صورت زیر است.

هر یک ether برابر با یک میلیون سابو می‌باشد.

قرارداد‌های هوشمند چگونه کار می‌کنند؟

اتریوم اصلی‌ترین پلتفرم قرارداد هوشمند است و هنوز هم بیشترین مزیت استفاده برای dApp‌ها را دارد. همچنین با توجه به اینکه مایکروسافت و AWS هر دو سرویس بلاک چین اتریوم را به عنوان سرویس ارائه می‌دهند، احتمالاً اتریوم مهمترین پلتفرم برای اجرای قراردادهای هوشمند است.

به زبان ساده می‌توان گفت که قرارداد‌های هوشمند مانند وندینگ ماشین (vending machine) یا دستگاه فروش خودکار کار می‌کنند. تنها کافی است مقداری ارز دیجیتال را وارد قرارداد مورد نظر کنید، بعد از آن مالکیت کالا مورد نظر به شما تعلق خواهد گرفت. قرارداد هوشمند نه تنها همه قوانین و ضوابط را از پیش تعیین می‌کند، بلکه این قوانین و ضوابط را مو به مو اجرا می‌کند.

قرارداد‌های هوشمند می‌توانند به تنهایی کار کنند و همچنین می‌توانند در ارتباط با دیگر قرارداد‌های هوشمند نیز مورد استفاده قرار بگیرند. در این حالت، تکمیل یک قرارداد هوشمند باعث شروع یک قرارداد هوشمند دیگر می‌شود و این فرآیند یکی پس از دیگری انجام می‌گیرد. این می‌تواند اساس کار بسیاری از سازمان‌ها باشد. این قضیه در سیستم‌های ارز دیجیتال متنوعی اعمال شده است. در این سیستم‌ها، همه قوانین از پیش تعیین شده‌اند و در نتیجه شبکه می‌تواند به صورت خودمختار و مستقل عملکرد داشته باشد.

اساسا هر قرارداد هوشمند از سه بخش اساسی تشکیل شده است که به آنها اشیای آن قرارداد هوشمند گفته می‌شود. بخش اول امضا‌کنندگان است و منظور از آن طرفین درگیر در قرارداد است که موافقت یا عدم موافقت خود را با مفاد قرارداد با استفاده از امضا‌های دیجیتال نشان می‌دهند.

شی دوم موضوع توافق است. این توافق باید در محیط قرارداد هوشمند موجود باشد و قرارداد هوشمند باید مستقیما به آن دسترسی داشته باشد. اگرچه اندیشه قرارداد‌های هوشمند برای اولین بار در سال ۱۹۹۶ مطرح شد، اما مشکل این تواقق خاص بود که توسعه این قرارداد‌ها را متوقف کرد. این مشکل بعد از تولد اولین ارز دیجیتال در سال ۲۰۰۹ حل شد.

در نهایت، یک قرارداد هوشمند باید شامل شرایط خاصی باشد. این شرایط را باید ابتدا به طور کامل به زبان ریاضی توصیف کرد و سپس با استفاده از یک زبان برنامه‌نویسی مناسب آن را در داخل محیط قرارداد هوشمند گنجاند. این شرایط و ضوابط شامل همه انتظاراتی است که از طرفین می‌رود و همچنین قوانین، پاداش‌ها و مجازات‌هایی نیز با این شرایط همراه هستند.

محیط قرارداد هوشمند

برای اینکه قرارداد‌های هوشمند به درستی کار کنند، نیازمند محیطی مناسب و مخصوص هستند. این محیط باید قبل از همه چیز، استفاده از رمزنگاری کلید عمومی را پشتیبانی کند، که این به کاربران اجازه تایید تراکنش را با استفاده از کد‌های رمزنگاری منحصر به فرد می‌دهد. این دقیقا همان سیستمی است که اکثریت ارز‌های دیجیتال در حال حاضر از آن استفاده می‌کنند.

ثانیا این قرارداد‌ها به یک پایگاه داده غیر متمرکز و باز نیاز دارند که همه طرفین قرارداد بتوانند به آن اعتماد کنند. برای اعمال قرارداد هوشمند، این محیط باید تماما غیر متمرکز باشد. بلاک چین‌ها، مخصوصا بلاک چین اتریوم محیط‌های ایده‌آلی برای این قرارداد‌های هوشمند هستند.

در نهایت، منبع داده‌های دیجیتالی که توسط قرارداد هوشمند مورد استفاده قرار می‌گیرد، باید کاملا قابل اعتماد باشد. این مستلزم استفاده از گواهی‌های امنیتی SSL، HTTPS و دیگر پروتکل‌های اتصال امنیتی است که به طور گسترده در نرم افزار‌های مدرن مورد استفاده قرار می‌گیرند.

امضاها و تاییدها در اتریوم چگونه انجام می‌شود؟

یکی از ویژگی های اصلی اتریوم و سایر ارزهای دیجیتال، قابلیت امضا اطلاعات است که توسط تمام کاربران قابل ثبت است. این موضوع باعث تقویت ماهیت توزیع شده بلاک چین می‌شود. در بیت کوین، تراکنشی را امضا می‌کنید که بیانگر ارسال ۴ بیت کوین به سالی می‌باشد. بدون این ویژگی، هرکسی می‌تواند تراکنش‌های جعلی ایجاد کند و تمام کوین‌ها را به خود ارسال کند.

چرا امضا کردن مهم است؟

امضا کردن روشی بسیار خوب برای دانستن این موضوع است که آیا اقدامات توسط شخص یا قرارداد درستی انجام شده است یا خیر. یعنی می‌توانیم به افرادی اعتماد کنیم که حرفی که می‌زنند را انجام می‌دهند.

به جای امضاهای واقعی که می‌توان آن‌ها را جعل کرد، امضاهای دیجیتال غیرقابل جعل است. اگر می‌خواهید بدانید کاربر A اقدامی انجام می‌دهد یا خیر، قبل از انجام هرکاری او را مجبور به امضا کنید. سپس اگر تناقضی به وجود آمد، امضا را بررسی کنید.

توسعه

شما به عنوان یک توسعه دهنده از کاربران خود می‌خواهید تا پیامی را امضا کنند. ایجاد این ویژگی در برنامه غیرمتمرکز مورد نظر ۳ بخش دارد که عبارتند از:

  • تابع تایید کننده سالیدیتی
  • کد کلاینت برای امضای پیام
  • کد کلاینت برای فراخوانی تایید کننده سالیدیتی

تایید کننده سالیدیتی

سالیدیتی یا همان زبان برنامه نویسی اتریوم روش دسترسی جهانی به اسم ecrecover ارائه می‌دهد که آدرس را برمی‌گرداند. اگر آدرس برگشتی مشابه با آدرس امضا کننده باشد، امضا واقعی است.

کد فوق، قرارداد Verifier با توابع recoverAddr و isSigned ایجاد می‌کند. تابع isSigned  آدرس را برخواهد گرداند. شما به عنوان توسعه دهنده، خارج از سالیدیتی باید صحت آدرس را تایید کنید. روش دوم اینگونه است که تابع isSigned داخل سالیدیتی بررسی می‌کند. اگر msgHash توسط addr_ امضا شده باشد، مقدار isSigned برابر با صحیح یا غلط (true or false) خواهد بود.

ایجاد امضا

دو روش برای ایجاد امضا وجود دارد:

  • استفاده از تابع جاوا اسکریپت Web3 (تابع web3.eth.sign)
  • فراخوانی RPC API نود اتریوم

اگر از جاوا اسکریپت استفاده می‌کنید، تنها کاری که باید انجام دهید این است که Web3 داشته باشید و به نود اتریوم ضمیمه کنید. در کد زیر، نود خصوصی اتریوم با localhost:8545 را اجرا می‌کنیم.

نکته: این مورد بر روی TESTRPC کار نخواهد کرد.

ساختاری در تابع وجود ندارد که رشته را به کد Hex تبدیل کند. بنابراین برای تبدیل از تابع toHex استفاده کردیم. آدرس کاربر (web3.eth.accounts[0]) و پیام دارای پیشوند 0x به تابع web3.eth.sign وارد شدند.

روش دیگر برای ایجاد امضا، فراخوانی RPC API اتریوم است. با استفاده از curl می‌توانید به نود اتریوم درخواست دهید.

اولین پارامتر در params آدرس کاربر و دومین پارامتر، مقدار hex پیام است. توجه داشته باشید که برای کار کردن RPC API، حساب شما باید باز باشد. عبارتی مشابه با عبارت زیر را دریافت خواهید کرد:

0x9955af11969a2d2a7f860cb00e6a00cfa7c581f5df2dbe8ea16700b33f4b4b9b69f945012f7ea7d3febf11eb1b78e1adc2d1c14c2cf48b25000938cc1860c83e01

امضای طولانی، متغیرهای v، r و s را رمزنگاری می‌کند. برای به دست آوردن این مقادیر، باید امضا را به زیر رشته‌های خود تجزیه کنید.

نکته: v باید یک عدد دسیمال باشد بنابراین v_decimal دوم hex v را به decimal v تبدیل می‌کند.

خطر: نتیجه v_decimal باید ۲۷ یا ۲۸ باشد.

با اتمام کار امضا و تایید کننده، تنها کاری که باقی می‌ماند بررسی واقعی بودن امضا است. یک هشدار کوچک در این خصوص وجود دارد. به یاد می‌آورید هنگام ایجاد امضا از رشته 0x + toHex(msg) استفاده کردیم؟ این همان هشی نیست که به تایید کننده انتقال می‌دهید.

هش مورد نیاز برای ایجاد امضا همان هش تایید کننده نیست. دلیل این موضوع، محافظت از کاربر در مقابل امضا کردن ظرفیت‌های دلخواه است.

راهکار این موضوع، افزودن پیام‌های شخصی سازی شده اتریوم است.

این تفکیک بسیار ضروری است. وقت خود را با انجام مراحل بعد تلف نکنید.

آخرین مرحله، فراخوانی کد سالیدیتی است. ما از ترافل ۳ برای اجرای قرارداد هوشمند قبلی استفاده می‌کنیم. لطفا توجه داشته باشید که محل نود اتریوم برای قرارداد باید اعلام شود. در غیر این صورت طبق انتظار کار نخواهد کرد.

ترافل یک تابع اجرا شده ایجاد می‌کند که قرارداد را برمی‌گرداند. ما پیام sha3 خود را ایجاد می‌کنیم و متغیرهای مورد نیاز را به  instance.verify.call انتقال می‌دهیم. اگر دو خط آخر آدرس‌های برگشتی مشابه باشد، امضای پیام واقعی است. در غیر این صورت جعلی است و باید نادیده گرفته شود.


منابع: arzdigital, mihanblockchain, wikipedia