''فکت کوینز'' حاصل تلاش یک تیم متخصص وعلاقمند درزمینه بلاک چین وارزهای دیجیتال است که سعی می کند مقالات آموزش های مرتبط را با کیفیت بالا به علم اندوزان ارائه نماید وب سایت www.factcoins.com
وایت پیپر اتریوم- قسمت چهارم
در ادامه قسمت سوم وایت پیپر اتریوم:
هدف اتریوم ادغام و بهبود مفاهیم اسکریپت نویسی، آلتکوین ها و پروتکل های متای مبتنی بر زنجیره است . این سیستم به توسعه دهندگان و برنامه نویسان اجازه میدهد برنامه های مبتنی بر اجماعی را ایجاد کنند که از قابلیت هایی مثل مقیاس پذیری، استاندارد سازی، ویژگی های کامل، سهولت در توسعه و تعامل متقابل و همزمان برخوردار باشند.
اتریوم از طریق آخرین لایه بنیادی انتزاعی این فعالیت را انجام می دهد. یک بلاکچینی که به زبان برنامه نویسی مبتنی بر تورینگ کامل نوشته شده.و برای افراد شرایط ایجاد قراردادهای هوشمند و اپلیکیشن های غیرمتمرکز را فراهم میکند. تا از این راه قوانینی دلخواه برای مالکیت ،فرم های تراکنش و توابع انتقال وضعیت وضع کنند. مهمترین بخش این است که میتوان نسخه ای از Namecoin را در دو خط کد نوشت. البته بقیه پروتکل ها مثل ارزها و سیستمهای اعتبار سنجی( رپیوتیشن) در کمتر از 20 خط کد نوشته میشوند.
قراردادهای هوشمند، جعبه های رمز نگاری شده با ارزشی هستند که تنها در صورت وجود شرایطی خاص قفل آنها باز میشود. این قراردادها میتوانند بر روی پلتفرم ما که بسیار قدرتمند تر ازپلتفرم بیتکوین است، ساخته شوند. قدرت مضاف این پلتفرم به خاطر وجود قابلیت هایی اعم از تورینگ کامل، بلاکچین هوشمند و وضعیت است.
حساب های کاربری اتریوم
در سیستم اتریوم، فاز ( وضعیت) از حسابهای کاربری ای تشکیل شده که هر حساب یک آدرس 20 بیتی دارد. انتقال وضعیت ،حامل مبلغ و اطلاعاتی بین کاربران است. 4 بخش یک حساب اتریوم عبارتند از:
- عدد نانس، شمارش گری که برای اطمینان از اینکه هر تراکنش تنها یکبار پردازش شده به کار میرود.
- مانده حساب فعلی به اتر.
- در صورت وجود، کد قرارداد حساب کاربر.
- فضای ذخیره سازی حساب کاربر .( به صورت پیش فرض خالی است)
“اتر“، ارز بومی پلتفرم اتریوم است. که برای پرداخت کارمزد تراکنش ها استفاده میشود.به طور کلی دو نوع حساب کاربری وجود دارد: حساب های با مالکیت خارجی( EOA ) که با کلیدهای خصوصی مدیریت میشوند. و حساب های مبتنی بر قرارداد که توسط کد قرارداد کنترل میشوند.
حسابهای با مالکیت خارجی کد اختصاصی ندارند .و 2 کاربر با دو حساب از همین نوع میتوانند برای هم پیام ارسال کنند. فقط کافی است تراکنش را ایجاد و امضا نمایند. در حساب های مبتنی بر قرارداد ،هر بار که کاربر پیام یا تراکنشی دریافت کند کد آن حساب فعال شده ، پس او میتواند پیام ها را بخواند و به نوبت به آنها پاسخ دهد و یا اصلاً قراردادهای دیگری بسازد.
پیام ها و تراکنش ها (Messages and Transactions )
در پلتفرم اتریوم پیام ها تقریبا شبیه به تراکنش های بیتکوین هستند اما برخی ویژگی هایشان فرق دارد، اولین تفاوت این است که پیام اتریوم میتواند از طرف یک حساب خارجی یا قراردادی باشد در حالی که تراکنش بیتکوین فقط توسط یک حساب خارجی ایجاد میشود.
دوم اینکه پیام های اتریوم حاوی داده هستند.
و در آخر اگر دریافت کننده ی پیام اتریوم یک حساب قراردادی باشد گزینه پاسخ به پیام برای آن فعال است. این بدین معناست که پیام های اتریوم از قابلیت توابع هم برخوردار میباشند.
کلمه ” تراکنش” در سیستم اتریوم به بسته های داده امضا شده ای گفته میشود که پیام ارسال شده از حساب با مالکیت خارجی را ذخیره میکند. قسمتهای مختلف تراکنش عبارتند از:گیرنده پیام، امضایی که هویت فرستنده را تأیید میکند، مقدار اتر ، داده هایی برای ارسال و مقادیری به نام های STARTGAS و GASPRICE.
GASPRICE و STARTGAS
به منظور جلوگیری از ایجاد حلقه های نا محدود در کد نویسی ، هر تراکنش باید محدودیتی برای تعداد مراحل محاسباتی اجرای کد تعیین کند(STARTGAS )، پیام های اولیه و پیام های اضافی که در حین اجرا پدید می آیند هم شامل این تراکنش ها میباشند. GASPRICE کارمزدی است که در ازای اقدامات محاسباتی که ماینر انجام میدهد به او داده میشود.
اگر اجرای یک تراکنش منجر به اتمام سوخت شود، تمام تغییرات به جز پرداخت کارمزدها به حالت اولیه برمیگردند ولی اگر اجرای تراکنش به هر دلیلی متوقف شود و قسمتی از سوخت باقی بماند ، این قسمت باقی مانده از کارمزد به فرستنده مسترد میشود. برای ایجاد یک قرارداد ، یک نوع تراکنش و پیامی جداگانه وجود دارد . آدرس این قرارداد بر اساس هش نانس حساب و داده تراکنش محاسبه میشود.
نتیجه مهم مکانیزم پیام، نظریه دارایی ” شهروند درجه یک”(first class citizen) اتریوم است. نظریه ای که طبق آن حسابهای مبتنی بر قرارداد و حساب های خارجی توانایی های یکسانی دارند. هر دو قادرند پیام ارسال کنند. و قراردادهای جدید بسازند. این ویژگی به قراردادها اجازه میدهد تا برای هر افراد مختلف نقش متفاوتی ایفا کنند. مثلا: نفر اول ممکن است در سازمان غیر متمرکزی عضو باشد ( یک قرارداد) ،نفر دوم حساب سپرده گذاری داشته باشد. (قرارداد دوم) ،نفر سوم مبتلا به پارانویا باشد. (قرارداد سوم) و از امضا های لمپورت استفاده کند .و حساب چهارم حساب مشترک یک سازمان باشد که این حساب برای امنیت بیشتر 5 کلید داشته باشد.نقطه قوت پلتفرم اتریوم این است که نهاد غیر متمرکز و مشتری سپرده گذار هیچ نگرانی ای نسبت به نوع حساب طرف مقابلشان ندارند.
تابع انتقال وضعیت اتریوم ( Ethereum State Transition Function )
تابع APPLY(S,TX) -> S به شرح زیر میباشد:
- در ابتدا از صحت اطلاعات مطمئن شوید ، یعنی در درجه اول امضای حساب معتبر باشد. و عدد نانس با نانس حساب فرستنده مطابقت داشته باشد. در غیر این صورت خطا میدهد.
- کارمزد تراکنش را از طریق معادله STARTGAS * GASPRICE محاسبه کنید ، از میان اطلاعات، امضا آدرس فرستنده را مشخص کنید ،کارمزد را از مانده حساب فرستنده کم کرده و آنقدر عدد نانس را اضافه کنید تا نانس مورد نظر پیدا شود. اگر مانده حساب به اندازه کافی نباشد فرآیند با خطا روبرو خواهد شد.
- GAS = STARTGAS، در ابتدا مقدار سوخت را به اندازه STARTGAS درنظر گرفته ، در ازای هر بایت مقدار مشخصی سوخت در نظر بگیرید چرا که این سوخت در تراکنش خرج میشود.
- مبلغ تراکنش را از حساب فرستنده به حساب گیرنده منتقل کنید ، اگر هنوز حسابی برای گیرنده وجود ندارد ،یک حساب بسازید . در صورتی که حساب گیرنده قراردادی است کد قرارداد را برای تکمیل فرآیند ویا تا اجرای کامل تراکنش ، فعال نمایید.
- اگر فرآیند انتقال وجه به خاطر نبود موجودی کافی در حساب مبداء یا اتمام کد اجرایی متوقف شد، همه چیز به جز کارمزد که به ماینر پرداخت میشود به شرایط اولیه باز میگردد.
- در غیر این صورت، کارمزد همه سوخت باقیمانده را به حساب فرستنده بر گردانید و کارمزد سوخت خرج شده را به ماینر پرداخت کنید. برای مثال تصور کنید کد قرارداد به شرح زیر باشد:
بیشتر بخوانید : اثبات دانش صفر (ZKP) چیست؟ قسمت اول
if !contract.storage[msg.data[0]]:
contract.storage[msg.data[0]] = msg.data[1]
EVM
توجه داشته باشید که در واقعیت، کد قرارداد با کد سطح پایین EVM(ماشین مجازی) نوشته میشود. امابرای شفاف سازی بهتر ،مثال بالا به زبان سطح بالای ما یعنی سرپنت نوشته شده و قابل تدوین به EVM است. فرض کنید فضای این قرارداد در ابتدا خالی و تراکنش حاوی 1 اتر، 2000 سوخت ، 0.001 اتر کارمزد و 2 داده باشد: [ 2, ‘CHARLIE’ ] [3] پس در چنین شرایطی،
فرآیند تابع انتقال وضعیت به شرح زیر می باشد:
Check that the transaction is valid and well formed.
Check that the transaction sender has at least 2000 * 0.001 = 2 ether. If it is, then subtract 2 ether from the sender’s account.
Initialize gas = 2000; assuming the transaction is 170 bytes long and the byte-fee is 5, subtract 850 so that there is 1150 gas left.
Subtract 10 more ether from the sender’s account, and add it to the contract’s account.
Run the code. In this case, this is simple: it checks if the contract’s storage at index 2 is used, notices that it is not, and so it sets the storage at index 2 to the value CHARLIE. Suppose this takes 187 gas, so the remaining amount of gas is 1150 – 187 = 963
Add 963 * 0.001 = 0.963 ether back to the sender’s account, and return the resulting stat
فرآیند تابع
- در ابتدا مطمئن شو که تراکنش معتبر است و به درستی انجام شده است.
- چک کنید که فرستنده این تراکنش حداقل 2000 * 0.001 = 2 اتر داشته باشد. اگر همه این شرایط فراهم بود پس 2 اتر از حساب مبدا ء کم کن.
- مقدار اولیه سوخت 2000 است ؛ با فرض اینکه حجم تراکنش 170 بایت و هزینه هر بایت 5 باشد، 850 اتر کم کن تا 1150 سوخت باقی بماند.
- 10 اتر دیگر از حساب فرستنده کم و به حساب قرارداد اضافه کن.
- در این مرحله کد را فعال کن. در این شرایط کار زیاد هم سخت نیست. کد به صورت خودکار چک میکند که آیا ذخیره قرارداد در ایندکس 2 استفاده شده یا نه. که اگر این طور نباشد، فضای ذخیره سازی را در ایندکس 2 به مقدار CHARLIE تنظیم می کند. اگر این پروسه 187 اتر سوخت مصرف کند ،بنابراین 1150 سوخت باقی خواهد ماند.
- با استفاده از فرمول 963 * 0.001 = 0.963 ، مقدار اتر را محاسبه و به حساب فرستنده برگردان. و نهایتاً “وضعیت” نهایی به دست خواهد آمد.
اگر در انتهای تراکنش هیچ قراردادی موجود نبود، کارمزد تراکنش دقیقاً برابر با نتیجه معادله GASPRICE ضربدر حجم تراکنش به بایت خواهد بود.
کد اجرایی اتریوم (Code Execution )
در قراردادهای اتریوم ،کد به زبان بایتکد و مبتنی بر پشته نوشته میشود. که به”کد ماشین مجازی اتریوم ” یا ” کد” EVM” معروف است. این کد از مجموعه ای از بایت ها تشکیل شده که هر بایت نشانگر یک عملیات است. کلاً کد اجرایی حلقه های نامحدودی است که در شمارنده برنامه جاری به صورت مداوم در حال انجام عملیات میباشد.( با صفر شروع میشود). بعد از این عملیات کانتر(شمارنده) یکی یکی افزایش پیدا میکند. تا زمانی که یا کد تمام شود یا به خطا بر بخورد و یا به گزینه return برسد، این فرآیند ادامه دارد. عملیات ذکر شده به منظور ذخیره داده به 3 نوع فضا دسترسی دارد:
- پشته: حافظه ای که عناصر با حجم 32 بایت میتوانند به آن اضافه یا از آن حذف شوند. عنصری که از همه دیرتر وارد پشته شود، از همه زودتر از پشته حذف میگردد.
- حافظه: یک آرایه بایتی و تا بی نهایت قابل توسعه است.
- فضای ذخیره سازی طولانی مدت قرارداد: برخلاف پشته و حافظه که بعد از مراحل محاسباتی ریست میشوند، ذخیره سازی (storage) مدت طولانی به فعالیتش ادامه میدهد.کلیدها و مقادیر در این فضا هردو 32 بایت هستند.
مدل اجرایی
مدل اجرایی کد EVM به طرز عجیبی ساده است.زمانی که ماشین مجازی اتریوم در حال فعالیت است، وضعیت محاسباتی کامل آن شامل موارد زیر میباشد: وضعیت بلاک، تراکنش، پیام، کد، حافظه، پشته، شمارنده برنامه، سوخت.وضعیت بلاک یا (block state ) یک وضعیت همگانی است که حاوی همه حساب ها،مانده حساب ها و ذخیره هاست.
برای مثال، گزینه ADD دو آیتم از پشته بر میدارد. و سپس حاصل جمع آنها را به پشته اضافه میکند.در این مرحله 1 اتر از سوخت کم شده و شمارنده یک واحد افزایش پیدا میکند. SSTORE دومین عنصر حذف شده از بالای پشته را مطابق با ایندکس مشخص شده به وسیله عنصر اول به فضای ذخیره سازی قرارداد وارد میکند . و پس از آن 200 اتر سوخت کم کرده و شمارنده 1 واحد افزایش پیدا میکند.
اگر چه با تدوین به موقع شبکه اتریوم میتوان حداکثر استفاده را از قابلیت های فوق العاده این شبکه برد، اما اجرای پایه ای و ساده آن از طریق چند صد خط کد قابل انجام است.
منبع: factcoins.com
مطلبی دیگر از این انتشارات
هاوینگ بیتکوین halving
مطلبی دیگر از این انتشارات
رادیکس (Radix) جایگزینی برای بلاکچین
مطلبی دیگر از این انتشارات
ذخیره سازی در بلاکچین