همانطور که میدانید اتریوم از مدل account based بجای UTXO استفاده میکند. اکانت ها در اتریوم، با شبکه بیتکوین تفاوت هایی اساسی دارند. اکانت های اتریوم بصورت کلی به دو دسته EOA و CA تقسیم میشوند. (external owned account) (contract account)
در ادامه به خصوصیات و جزییات هر یک از اکانت های کانترکت و اکانت های مالک خارجی (کنترل شده توسط شخص) میپردازیم.
12.3.4.1 external owned accounts (EOA) #
حساب های کنترل شده توسط افراد خارجی یا کنترل شده توسط شخص، حساب هایی معمولی هستند که توانایی نگهداری ارز اتر و انتقال ان با استفاده از ایجاد تراکنش بر روی شبکه را دارند.
این اکانت ها با یک کلید خصوصی کنترل میشوند.
این اکانت های دارای دو بخش هستند (هر ادرس یا کلید عمومی به یک فیلد دو بخشی از این اطلاعات در ورلد استیت اتریوم اشاره دارد.)
12.3.4.1.1 nonce #
مقدار اول یا عدد نانس یک شمارنده برای حساب مورد نظر است. در ازای هر تراکنش که حساب شما ایجاد میکند یک واحد به مقدار نانس اضافه میشود. برای مثال اگر نانس حساب شما ۱۳ باشد یعنی شما تا به حال ۱۴ تراکنش ایجاد کرده اید. (شمارش از ۰ شروع میشود) اما گفتنی است که خواندن اطلاعات یا تراکنش هایی که به حساب شما به عنوان مقصد صورت میگیرد تاثیری در نانس حساب شما ندارد.
اما بحث اصلی خاصیت عدد نانس است. زمانی که حساب شما تراکنشی ایجاد میکند تراکنش مورد نظر شامل عدد نانس حساب مبدا هم میشود. در همین حین نود های اتریوم میتوانند بر اساس نانس تراکنش شما را از روی ترتیب این شمارنده اجرا کنند. (در شبکه اتریوم انتخاب تراکنش توسط نود ها پردازش انها بصورت کلی به ترتیب نیست و بستگی به نود ها و بار شبکه و تراکنش دارد. در بخش تراکنش به جزییات این مساله میپردازیم.) یعنی اگر سه تراکنش متوالی از طرف شما ثبت شود. به انها بر اساس نانس ترتیب بندی میشوند و با اینکه اجرای کل تراکنش ها به ترتیب نیست اما تراکنش های هر شخص باید دقیقا زمانی اجرا شوند که یک واحد به نانس فعلی اضافه کنند. و در این حالت ترتیب تراکنش های شما حفظ خواهد شد.
اما یکی از کاربرد های اصلی نانس جلوگیری از حمله تکرار است. (reply attack) برای مثال اگر الیس به باب ۱ اتر انتقال دهد. و این تراکنش شامل نانس نشود. باب با پیدا کردن تراکنش امضا شده الیس بر بستر شبکه میتواند انرا تکرار کند و از موجودی حساب الیس کم کند. اما زمانی که در تراکنش امضا شده نانس هم قرار بگیرد هر تراکنش حتی با مقصد و مبدا و مبلغ ثابت هم از هم متمایز هستند. و زمانی که تراکنشی تکراری ثبت شود نانس مورد نظر با نانس حساب مبدا همخوانی ندارد. پس نود ها انرا رد میکنند. و باب نیاز دارد تا یک تراکنش جدید با نانس جدید داشته باشد.
12.3.4.1.2 balance #
مقدار دوم یک بالانس یا موجودی است که بطور خلاصه این بالانس مقدار موجودی یک حساب را به وی (wei) نمایش میدهد و نگهداری میکند.
12.3.4.2 contract accounts (CA) #
نوع دوم اکانت های اتریوم اکانت های قرار داد هوشمند است. این حساب ها قابلیت پردازش تراکنش و ایجاد تغییر در ورلد استیت را دارا هستند. این حساب ها بجای یک کلید خصوصی توسط یک کد EVM کنترل میشوند.
12.3.4.2.1 nonce #
نانس در کانترکت ها با عدد صفر شروع میشد که طی EIP-161 این عدد به یک تغییر کرد. بر خلاف حساب های عادی در حساب های کانترکت تنها زمانی نانس افزایش پیدا میکند که کانترکت یک کانترکت جدید بسازد.
کانترکت ها میتوانند کانترکت های جدیدی بر روی شبکه مستقر کنند.
هیچ کانترکتی نمیتواند مالک کانترکت دیگری باشد. اما زمانی که کاربری با یک تراکنش تابعی از یک کانترکت ایجاد میکند که کانترکتی دیگر ایجاد شود. نانس کانترکت افزایش پیدا میکند. و مالک کانترکت حساب ایجاد کننده تراکنش خواهد بود.
همچنین خوب است نگاهی به این رشته در وبسایت استک اکسچنج اتریوم بیندازید: https://ethereum.stackexchange.com/questions/764/do-contracts-also-have-a-nonce
12.3.4.2.2 balance #
حساب های کانترکت هم مثل حساب های شخصی یا EOA دارای موجودی هستند. که موجودی انها به واحد wei نگهداری میشود.
12.3.4.2.3 code hash #
همانطور که میدانید حساب های کانترکت شامل یک کد که توسط ماشین مجازی اتریوم قابل اجرا هستند را هم شامل میشوند. خود مقدار بایت کد های کانترکت در دیتابیس نود ها بصورت کلید و مقدار نگهداری میشود. در مقدار خود حساب در استیت جهانی یک هش از حساب نگهداری میشود. دلیل نگهداری شدن هش این است که زمانی که با تغییر نانس یا موجودی نیاز به محاسبه دوباره ریشه هش حساب (درخت مرکل) می باشد این محاسبه ارزان تر از محاسبه کل مقدار کد خواهد بود.
با این روش ما کد مربوط به حساب را میتوانیم در دیتابیس نود پیدا کنیم. انرا اعبتار سنجی کنیم که یک کد مربوط به ان حساب اجرا خواهد شد. و در نهایت حین محسابیه ریشه هش درخت مرکل حساب هزینه کمی صرف خواهیم کرد.
12.3.4.2.4 storage root #
همانطور که اشاره کردیم هر کانترکت به یک دیتابیس با مدل مقدار و کلید (key/value) دسترسی دارد. این مقادیر در دیتابیس نود ها نگهداری میشوند. ریشه درخت مرکل این دیتا ها (مربوط به همان کانترکت خاص فقط) در این بخش نگهداری میشود. علت نگهداری این هش مشابه نگهداری هش کد کانترکت است.
با این روت هش میتوان فضای ذخیره سازی کانترکت را اعتبار سنجی کرد. تغییر ان را تشخیص داد و همچنین از جایی که یک روت هش از ان داریم محسابه روت هش خود حساب را ارزان نگه میدارد.
12.3.4.3 address #
آدرس های حساب های شخصی و کانترکت تفاوت هایی دارند. در بخش کلید ها و ادرس بصورت جزیی انهارا بررسی کرده ایم. اما در این بخش هم توضیحی خلاصه جهت تکمیل مطلب خواهیم داشت.
12.3.4.3.1 EOA #
ادرس در اکانت های شخصی از هش شدن کلید عمومی بدست می آید. که طول ان ۶۴ کاراکتر بر مبنای ۱۶ است.
12.3.4.3.2 CA #
ادرس حساب های کانترکت از هش ادرس حساب مالک (حساب شخصی که تراکنش استقرار کانترکت را ایجاد میکند.) و عدد نانس همان حساب بدست می اید که طول ان ۴۲ کاراکتر بر مبنای ۱۶ است.
12.3.4.4 ادرس صفر #
آدرس صفر در شبکه اتریوم یک ادرس است که همراه با ایجاد اولین بلاک ایجاد میشود. این آدرس یک حساب شخصی یا کانترکت نیست و هیچ کلید خصوصی و مالکی هم ندارد. همچنین هیچ خروجی یا تراکنشی از این آدرس به بیرون وجود ندارد.