پیشرفته کریپتو پدیا

اتریوم در نگاهی بسیار عمیق و با ذکر جزئیات موجود!

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

https://hackernoon.com/getting-deep-into-geth-why-syncing-ethereum-node-is-slow-1edb04f9dc5

https://hackernoon.com/getting-deep-into-evm-how-ethereum-works-backstage-ac7efa1f0015

در این مقاله به تحقیق در مورد لایه انبارش داده های اتریوم می پردازیم. ما مفهوم “وضعیت” بلاک چین را معرفی خواهیم کرد و تئوری پشت ساختار داده Patricia Trie را پوشش خواهیم داد. در این مقاله پیاده سازی واقعی Tries اتریوم با استفاده از پایگاه داده Leveldb گوگل ارائه داده می شود.

چه چیزی در لایه انبارشی ذخیره می شود؟

اول از همه باید ببینیم که همه چیز های مورد نیاز برای ذخیره و برای به کار انداختن سیستم بلاک چین چه هستند. اجازه بدهید مثال ساده دادن ده دلار به باب توسط آلیس را مورد بررسی قرار دهیم.

اتریوم

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

بیت کوین

وضعیت بیت کوین توسط مجموعه جهانی آن یعنی خروجی های تراکنشی خرج نشده (UTXOs) ارائه داده می شود. انتقال ارزش در بیت کوین از طریق تراکنش ها انجام می شود. یک کاربر بیت کوین به طور خاص می تواند به خرج یک یا تعدا بیشتری از UTXO های خود با ایجاد یک تراکنش بپردازد و یک یا تعداد بیشتری از UTXO ها را به عنوان ورودی تراکنش اضافه نماید.

این مدل UTXO بیت کوین را متفاوت از اتریوم می کند. بیایید چند مثال را برای درک این تفاوت مورد بررسی قرار دهیم. در ابتدا باید گفت که UTXO های بیت کوین را نمی توان به طور ناقص خرج کرد. اگر یک کاربر بیت کوین مقدار ۰.۵ بیت کوین خرج کند (با استفاده از تنها UTXO خود که به ارزش یک بیت کوین است)، آنها مجبورند عمدا آدرس خودشان را بدهند و ۰.۵ بیت کوین را در عوض برای خود ارسال کنند. اگر این بقیه را برای خودشان نفرستند، آنها این ۰.۵ بیت کوین را به ماینری می بازند که تراکنش آنها را استخراج می کند.

اتریوم

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

اتریوم

سیستم UTXO در بیت کوین به خوبی کار می کند که تا حدودی به علت این حقیقت می باشد که کیف پول های دیجیتال قادر به تسهیل اکثر وظایف همراه با تراکنش ها می باشد. از جمله این وظایف می توان به موارد زیر اشاره کرد:

  • مدیریت UTXO ها
  • ذخیره کلید ها
  • تنظیم کارمزد های تراکنش
  • فراهم کردن آدرس های بازگردادندن بقیه
  • جمع کردن UTXO ها برای نشان دادن موجودی کلی، معلق و موجود

می توان تراکنش ها در مدل UTXO را با اسکناس های کاغذی مقایسه کرد. هر اکانت با اضافه کردن تعداد اسکناس ها در کیف پول به پیگیری مقدار پول موجود می پردازد. وقتی می خواهیم پول خرج کنیم، ما از یک یا چند اسکناس (UTXO های موجود) استفاده می کنیم به طوری که برای پوشش هزینه کافی باشد و شاید مقداری بقیه (UTXO جدید) را نیز دریافت کنیم. هر اسکناس را تنها یکبار می توان خرج کرد، زمانی که خرج شد، UTXO از مجموعه برداشته می شود.

به طور خلاصه می دانیم که:

بلاک چین بیت کوین موجودی های اکانت را نگه نمی دارد.

کیف پول های بیت کوین برای UTXO ها کلید نگه می دارند.

اگر یک UTXO در یک تراکنش داخل شود، تمامی آن خرج می شود. (در بعضی از موارد بقیه به صورت یک UTXO کاملا جدید به طور ناقص دوباره دریافت می شود)

اتریوم

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

اجازه دهید از ابتدا شروع کنیم. مانند همه بلاک چین های دیگر، بلاک چین اتریوم نیز در بلاک پیدایش خود شروع به زندگی کرده است. از این نقطه (وضعیت پیدایش در بلاک ۰) به بعد، فعالیت هایی مانند تراکنش ها، قرارداد ها و استخراج دائما وضعیت بلاک چین اتریوم را تغییر می دهند. یک مثال از این مورد در اتریوم، موجودی یک اکانت می باشد (ذخیره شده در وضعیت trie) که هر زمان تراکنشی در ارتباط با آن اکانت صورت بگیرد، تغییر می کند.

به شیوه مهمی داده هایی مانند موجودی های اکانت مستقیما در بلاک های بلاک چین اتریوم ذخیره نمی شوند. تنها هش های نود ریشه تراکنش trie، وضعیت trie و رسید های trie مستقیما در بلاک چین ذخیره می شوند. این مطلب در نمودار زیر ارائه شده است.

اتریوم

اگر به بالای نمودار توجه کنید می بینید که هش نود ریشه از انبارش trie که در آنجا همه داده های قرارداد هوشمند نگهداری می شود، در واقع به وضعیت trie اشاره می کند که این اشاره در نهایت به بلاک چین ختم می شود. به زودی همه این موارد را با جزئیات بیشتر پوشش می دهیم.

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

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

مقایسه بین UTXO و رویکرد اکانت

از مزایای مدل UTXO می توان موارد زیر را نام برد:

مقیاس پذیری: از آنجا که پردازش UTXO های متعدد به طور همزمان ممکن است، تراکنش های موازی مقدور می شود و نوآوری مقیاس پذیری تشویق می شود.

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

از مزایای مدل اکانت/ موجودی می توان موارد زیر را نام برد:

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

کارایی: مدل اکانت/ موجودی علاوه بر سادگی دارای کارایی بیشتری نیز می باشد زیرا هر تراکنش تنها لازم است به اعتبار بخشی این بپردازد که اکانت فرستنده موجودی کافی برای پرداخت در تراکنش را داشته باشد.

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

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

نگاهی دقیق تر به ساختار trie در اتریوم

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

Trie وضعیت، تک و تنها

تنها یک وضعیت جهانی trie در اتریوم وجود دارد. این trie وضعیت جهانی مدام در حال به روز رسانی است. trie وضعیت شامل یک کلید و جفت ارزشی برای هر اکانت می باشد که بر روی شبکه اتریوم موجود می باشد. این کلید یک شناسایی کننده 160 بیتی منفرد می باشد (آدرس یک اکانت اتریوم).

ارزش در trie وضعیت جهانی با کدگذاری جزئیات زیر از یک اکانت اتریوم ایجاد می شود (با استفاده از روش کدگذاری RLP):

Nonce

موجودی

storageRoot (ریشه انبارشی)

codeHash (هش کد)

نود ریشه trie وضعیت (یک هش از کل trie وضعیت در یک نقطه زمان داده شده) به عنوان یک شناسنده ایمن و منحصر به فرد برای trie وضعیت مورد استفاده قرار می گیرد؛ نود ریشه trie وضعیت از لحاظ رمزنگاری وابسته به همه داده های trie وضعیت داخلی است.

اتریوم

Trie انبارشی، جایی که داده های قرارداد جریان دارند 

اتریوم

Trie انبارشی جایی است که همه داده های قرارداد در آنجا جریان دارند و زندگی می کنند. هر اکانت اتریوم دارای trie انبارشی خود می باشد. یک هش 256 بیتی از نود ریشه trie انبارشی به عنوان ارزش storageRoot در trie وضعیت جهانی ذخیره می شود.

Trie تراکنش، یکی برای هر بلاک 

اتریوم

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

مثال هایی ملموس از trie در اتریوم

کلاینت های اصلی اتریوم از دو راه حل نرم افزاری پایگاه داده مختلف برای ذخیره trie های خود استفاده می کنند. کلاینت Rust از rocksdb استفاده می کند. در حالی که کلاینت های Ethereum`s Go، C++ و Python همگی از leveldb استفاده می کنند.

اتریوم و rocksdb

Rocksdb خارج از حیطه این نوشتار است. ممکن است این موضوع زمان دیگری مورد پوشش قرار داده شود اما حالا اجازه دهید به بررسی این مطلب بپردازیم که چگونه ۳ از ۴ کلاینت اصلی اتریوم از leveldb استفاده می کنند.

اتریوم و leveldb

LevelDB یک کتابخانه انبارشی متن باز key-value گوگل می باشد که تکرار به جلو وعقب را بر روی داده ها فراهم می آورد و نقشه کشی منظم را از کلید های رشته به ارزش های رشته فراهم می آورد. تابع های مقایسه سفارشی و فشرده سازی خودکار از دیگر چیز های فراهم شده می باشند. این داده ها با استفاده از Snappy که یک کتابخانه فشرده سازی/ غیر فشرده کردن متن باز گوگل است، به طور خودکار فشرده می شوند. در حالی که هدف Snappy فشرده سازی حداکثر نیست اما سرعت خیلی بالایی را هدف گرفته است. leveldb یک مکانیسم بازیابی و انبارشی مهم است که وضعیت شبکه اتریوم را مدیریت می کند. بنابراین leveldb یک وابستگی برای اکثر کلاینت های محبوب اتریوم مانند go-ethereum، cpp-ethereum و pyethereum می باشد.

در حالی که پیاده سازی ساختار داده های trie می تواند بر روی دیسک انجام شود اما توجه داشته باشید که یک تفاوت بین عبور کردن از یک trie و نگاه ساده به flat key/ پایگاه داده ارزشی وجود دارد.

برای یادگیری بیشتر باید به داده ها در leveldb با استفاده از کتابخانه های Patricia trie مناسب دسترسی داشت. برای انجام این، نصب اتریوم مورد نیاز است. تنظیم شبکه شخصی اتریوم کار آسانی است و با مراجعه به مواد آموزشی می توان آن را انجام داد.

https://medium.com/mercuryprotocol/how-to-create-your-own-private-ethereum-blockchain-dad6af82fc9f

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

تحلیل پایگاه داده اتریوم

همچنان که قبلا بحث شد، تعداد زیادی Merkle Patricia Tries در داخل بلاک چین اتریوم موجود هستند:

  • Trie وضعیت
  • Trie انبارشی
  • Trie تراکنش
  • Trie رسید ها

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

برای ارجاع به یک Merkle Patricia Trie خاص در یک بلاک خاص، لازم است که هش ریشه آن را به عنوان مرجع بدست بیاوریم. دستورات زیر به ما اجازه می دهند که هش های ریشه وضعیت، trie های رسید و تراکنش در بلاک پیدایش را به دست بیاوریم.

توجه: اگر هش های ریشه آخرین بلاک را می خواهید (به جای بلاک پیدایش)، لطفا از فرمان زیر استفاده کنید.

نصب npm، نود، level و ethereumjs

ما از ترکیبی از nodejs، level و ethereumjs که به پیاده سازی ماشین مجازی اتریوم در جاوا اسکریپت می پردازد، استفاده می کنیم تا پایگاه داده leveldb را بازرسی کنیم. دستورات زیر محیط ما را بیشتر آماده می کند.

اتریوم

از این منظر، اجرای کد زیر یک لیست از کلید های اکانت اتریوم را چاپ می کند که در ریشه وضعیت شبکه خصوصی اتریوم شما ذخیره می شود. این کد به پایگاه داده leveldb اتریوم متصل می شود و وارد وضعیت جهانی اتریوم می شود (با استفاده از ارزش stateRoot از یک بلاک در بلاک چین)؛ و سپس به کلید همه اکانت ها در شبکه خصوصی اتریوم دسترسی خواهد داشت.

اتریوم

به طور جالبی، اکانت ها در اتریوم تنها زمانی به trie وضعیت اضافه می شوند که تراکنش روی داده باشد. به عنوان مثال، ایجاد یک اکانت جدید با استفاده از geth account new آن اکانت را در trie وضعیت داخل نخواهد کرد، حتی بعد از اینکه بلاک های زیادی استخراج شده باشد. اما اگر تراکنش موفقی در برابر آن اکانت ثبت شود، تنها آن وقت است که آن اکانت در trie وضعیت ظاهر می شود. این یک منطق هوشمندانه ای است که مرتبا در مقابل مهاجمان بدخواه با ایجاد اکانت های جدید و متورم کردن trie وضعیت به محافظت می پردازد.

کدگشایی داده ها

متوجه شده اید که بررسی leveldb نتایج کدگذاری شده رابرمی گرداند. این به دلیل این حقیقت است که اتریوم وقتی با leveldb تعامل می کند، از پیاده سازی Modified Merkle Patricia Trie خاص خود استفاده می کند. Ethereum Wiki اطلاعاتی را در رابطه با طراحی و پیاده سازی Modified Merkle Patricia Trie و کدگذاری RLP فراهم می کند. به طور خلاصه، اتریوم در ساختار های داده trie گسترش یافته است. به عنوان مثال، Modified Merkle Patricia شامل روشی است که می تواند نزول را با استفاده از نود extension میان بر دهد.

در اتریوم یک نود معین Modified Merkle Patricia Trie یکی از موارد زیر است:

یک رشته خالی که به عنوان NULL به آن اشاره می شود.

آرایه ای که شامل ۱۷ گزینه است و به عنوان شاخه (branch) مورد اشاره قرار می گیرد.

آرایه ای که شامل ۲ گزینه است و از آن به برگ (leaf) تعبیر می شود.

آرایه ای که شامل ۲ گزینه است و به عنوان افزونه (extension) به آن اشاره می شود.

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

کد زیر (وقتی با یک stateRoot بلاک خاص و همچنین آدرس اکانت اتریوم فراهم می شود) موجودی صحیح آن اکانت را به یک فرم بشری قابل خواندن برمی گرداند.

اتریوم

نتیجه گیری

ما در این مقاله نشان دادیم که اتریوم توانایی مدیریت وضعیت خود را دارد. این طراحی پیشگام هوشمندانه مزیت های زیادی دارد.

منبع
hackernoon

نوشته های مشابه

اشتراک
اطلاع از
0 دیدگاه
Inline Feedbacks
View all comments
دکمه بازگشت به بالا