راهکار های ذخیرهسازی داده در بلاکچین
آخرین ویرایش: @sipbikardi(opens in a new tab), ۲۹ خرداد ۱۴۰۳
راههای مختلفی وجود دارد تا دادهها را چه بهصورت مستقیم در بلاکچین و چه با روشی که امنیت آن از طریق بلاکچین تأمین شود، ذخیرهسازی کرد:
- بلابهای EIP-4844
- دادهی فراخوانی (calldata)
- خارج از زنجیره ولی بهره گرفته از مکانیزم بلاکچین لایه 1
- "کد" قرارداد
- رویدادها
- حافظه ابدی ماشین مجازی اتریوم (EVM storage)
انتخاب روش مورد استفاده بر اساس چندین معیار است:
- منبع اطلاعات. اطلاعات موجود در دادهی فراخوانی (calldata) مستقیماً از خود بلاکچین نشأت نمیگیرند.
- مقصد اطلاعات. Calldata فقط در تراکنشی که شروع می کند در دسترس است. رویدادها به هیچ وجه به صورت زنجیره ای قابل دسترسی نیستند.
- چقدر دردسر قابل قبول است؟ رایانههایی که یک گره در مقیاس کامل اجرا میکنند میتوانند پردازش بیشتری نسبت به یک کلاینت سبک در برنامهای که در مرورگر اجرا میشود انجام دهند.
- آیا تسهیل دسترسی آسان به اطلاعات از هر گره ضروری است؟
- الزامات امنیتی.
الزامات امنیتی
به طور کلی امنیت اطلاعات شامل سه ویژگی است:
محرمانگی، اشخاص غیر مجاز، مجاز به خواندن اطلاعات نیستند. این در بسیاری از موارد مهم است، اما در اینجا نه. هیچ رازی در بلاکچین وجود ندارد _. بلاک چینها کار می کنند زیرا هر کسی می تواند انتقال حالت را تأیید کند، بنابراین استفاده از آنها برای ذخیره مستقیم اسرار غیرممکن است. راههایی برای ذخیره اطلاعات محرمانه در بلاکچین وجود دارد، اما همه آنها برای ذخیره حداقل یک کلید به برخی اجزای خارج از زنجیره متکی هستند.
یکپارچگی، اطلاعات صحیح است، نمی توان آن را توسط نهادهای غیرمجاز یا به روش های غیرمجاز تغییر داد (به عنوان مثال، انتقال [توکن های ERC-20] (https://eips.ethereum.org/EIPS/eip-20#events(opens in a new tab)) بدون یک رویداد "انتقال"). در بلاکچین، هر گره هر تغییر حالت را تأیید می کند که یکپارچگی را تضمین می کند.
در دسترس بودن، اطلاعات در دسترس هر نهاد مجاز است. در بلاکچین، این امر معمولاً با داشتن اطلاعات در دسترس در هر [گره کامل] (https://ethereum.org/developers/docs/nodes-and-clients#full-node(opens in a new tab)) به دست می آید.
راه حل های مختلف در اینجا همه یکپارچگی عالی دارند، زیرا هش ها در L1 ارسال می شوند. با این حال، آنها دارای ضمانت های مختلف در دسترس بودن هستند.
پیش نیازها
شما باید درک خوبی از [اصول بلاکچین] (/developers/docs/intro-to-ethereum/) داشته باشید. این صفحه همچنین فرض میکند که خواننده با blocks، تراکنش ها و سایر موضوعات مرتبط آشنا است.
حباب های EIP-4844
در شروع با [هاردفورک دنکان] (https://github.com/ethereum/consensus-specs/blob/dev/specs/deneb/beacon-chain.md)،(opens in a new tab) بلاک چین اتریوم شامل [EIP-4844] است (https:// eips.ethereum.org/EIPS/eip-4844)، که به حباب های داده اتریوم با طول عمر محدود (در ابتدا حدود [18 روز]) اضافه می کند (https://github.com/ethereum/consensus-specs/blob/dev/specs(opens in a new tab)) /deneb/p2p-interface.md#configuration)). این حباب ها جدا از گس اجرا قیمت گذاری می شوند، اگرچه از مکانیزم مشابهی استفاده می کنند. آنها یک راه ارزان برای ارسال داده های موقت هستند.
مورد استفاده اصلی برای حباب های EIP-4844 این است که رولآپ ها تراکنش های خود را منتشر کنند. رولآپهای خوشبینانه باید تراکنشها را روی بلاکچینهای خود منتشر کنند. این تراکنشها باید در طول دوره چالش(opens in a new tab) در دسترس همه باشند تا اگر ترتیبدهنده(opens in a new tab) رولآپ یک ریشه وضعیت نادرست را ارسال کند، اعتبارسنجها(opens in a new tab) را قادر میسازد تا اشتباه را برطرف کنند.
با این حال، هنگامی که دوره چالش سپری شد و ریشه حالت نهایی شد، هدف باقی مانده برای دانستن این تراکنش ها تکرار وضعیت فعلی زنجیره است. این حالت از گره های زنجیره ای نیز در دسترس است و به پردازش بسیار کمتری نیاز است. بنابراین، اطلاعات تراکنش همچنان باید در چند مکان، مانند [کاوشگران بلوک] (/developers/docs/data-and-analytics/block-explorers) حفظ شود، اما نیازی به پرداخت هزینه برای سطح مقاومت سانسوری که اتریوم ارائه می کند نیست.
رولآپهای دانش-صفر همچنین دادههای تراکنش خود را ارسال میکنند تا دیگر گرهها بتوانند وضعیت موجود را تکرار کنند و اثبات اعتبار را تأیید کنند، اما باز هم این یک نیاز کوتاه مدت است.
هنگام نوشتن پست در EIP-4844 یک وی (10-18 ETH) در هر بایت هزینه دارد، که در مقایسه با 21000 گس اجرا که هر تراکنش، از جمله تراکنشی که حبابها را پست میکند، هزینه دارد، ناچیز است(opens in a new tab). میتوانید قیمت فعلی EIP-4844 را در [blobscan.com] (https://blobscan.com/blocks(opens in a new tab)) ببینید.
در اینجا آدرس هایی برای مشاهده حباب های ارسال شده توسط برخی از مجموعه های معروف وجود دارد.
کالدیتا
Calldata به بایت های ارسال شده به عنوان بخشی از تراکنش اشاره دارد. به عنوان بخشی از رکورد دائمی بلاکچین در بلوک که شامل آن تراکنش است، ذخیره می شود.
این ارزانترین روش برای قرار دادن دائمی داده ها در بلاکچین است. هزینه هر بایت یا 4 گس اجرا (اگر بایت صفر باشد) یا 16 گس (هر مقدار دیگر) است. اگر داده ها فشرده شوند، که یک روش استاندارد است، هر مقدار بایت به یک اندازه محتمل است، بنابراین میانگین هزینه تقریباً 15.95 گس در هر بایت است.
در نوشتن قیمت ها 12 جیوی/گس و 2300 دلار/اتر است، که به این معنی است که هزینه تقریباً 45 سنت در هر کیلوبایت است. از آنجایی که این ارزانترین روش قبل از EIP-4844 بود، این روشی است که برای ذخیره اطلاعات تراکنش استفاده میشود، که باید برای [چالشهای خطا] در دسترس باشد (https://docs.optimism.io/stack/protocol/overview#(opens in a new tab) اثبات عیب)، اما نیازی به دسترسی مستقیم روی زنجیره نیست.
در اینجا آدرس هایی برای مشاهده تراکنش های ارسال شده توسط چند مجموعه معروف وجود دارد.
خارج از زنجیره با مکانیسم های لایه 1
بسته به دوراهی های امنیتی شما، ممکن است قابل قبول باشد که اطلاعات را در جای دیگری قرار دهید و از مکانیزمی استفاده کنید که تضمین کند داده ها در صورت نیاز در دسترس هستند. دو شرط برای این کار وجود دارد:
یک [هش] (https://en.wikipedia.org/wiki/Cryptographic_hash_function(opens in a new tab)) از دادهها را روی بلاکین پست کنید، که به آن input commitment میگویند. این می تواند یک کلمه 32 بایتی باشد، بنابراین گران نیست. تا زمانی که تعهد ورودی در دسترس باشد، یکپارچگی تضمین میشود، زیرا یافتن دادههای دیگری که به همان مقدار هش شوند امکانپذیر نیست. بنابراین اگر داده های نادرست ارائه شود، می توان آن را شناسایی کرد.
مکانیزمی داشته باشید که در دسترس بودن را تضمین کند. برای مثال، در Redstone(opens in a new tab) هر گرهی می تواند یک چالش در دسترس بودن ارسال کند. اگر ترتیبدهنده در مهلت مقرر به زنجیره پاسخ ندهد، تعهد ورودی کنار گذاشته میشود، بنابراین در نظر گرفته میشود که اطلاعات هرگز پست نشده است.
این برای یک رولآپ خوشبینانه قابل قبول است زیرا ما در حال حاضر به داشتن حداقل یک تأیید کننده صادق برای ریشه حالت تکیه می کنیم. چنین تأیید کننده صادقی همچنین مطمئن می شود که داده هایی برای پردازش بلوک ها دارد و اگر اطلاعات در خارج از زنجیره در دسترس نباشد، چالش در دسترس بودن را صادر می کند. این نوع رولآپ خوشبینانه، پلاسما نامیده میشود.
کد قرارداد
اطلاعاتی که فقط باید یک بار نوشته شوند، هرگز بازنویسی نمی شوند و باید در زنجیره در دسترس باشند، می توانند به عنوان کد قرارداد ذخیره شوند. این بدان معنی است که ما یک "قرارداد هوشمند" با داده ها ایجاد می کنیم و سپس از EXTCODECOPY
(opens in a new tab) برای خواندن اطلاعات استفاده می کنیم. مزیت این است که کپی کردن کد نسبتاً ارزان است.
به غیر از هزینه گسترش حافظه، «EXTCODECOPY» برای اولین دسترسی به قرارداد 2600 گس و برای نسخه های بعدی از همان قرارداد 100 گس به همراه 3 گس در هر کلمه 32 بایتی هزینه دارد. در مقایسه با calldata که 15.95 در هر بایت هزینه دارد، در آغاز حدود 200 بایت ارزانتر است. بر اساس [فرمول هزینه های گسترش حافظه] (https://www.evm.codes/about#memoryexpansion)،(opens in a new tab) تا زمانی که به بیش از 4 مگابایت حافظه نیاز ندارید، هزینه گسترش حافظه کمتر از هزینه افزودن calldata است.
البته این فقط هزینه خواندن داده هاست. برای ایجاد قرارداد تقریباً 32000 گس + 200 گس برای هر بایت هزینه می شود. این روش تنها زمانی مقرون به صرفه است که اطلاعات یکسان در معاملات مختلف بارها خوانده شود.
کد قرارداد تا زمانی که با '0xEF' شروع نشود می تواند بی معنی باشد. قراردادهایی که با «0xEF» شروع میشوند به عنوان [فرمت شی اتریوم] (https://notes.ethereum.org/@ipsilon/evm-object-format-overview(opens in a new tab)) تفسیر میشوند که الزامات بسیار سختتری دارد.
رویدادها
[رویدادها] (https://docs.alchemy.com/docs/solidity-events(opens in a new tab)) توسط قراردادهای هوشمند منتشر میشوند و توسط نرمافزار خارج از زنجیره خوانده میشوند. مزیت آنها این است که کدهای آفلاین می توانند به رویدادها گوش دهند. هزینه [گس] (https://www.evm.codes/#a0?fork=cancun)،(opens in a new tab) 375 به اضافه 8 گس در هر بایت داده است. در 12 گیگاوی/گس و 2300 دلار/اتر، این به یک سنت به اضافه 22 سنت در هر کیلوبایت ترجمه میشود.
ذخیرهسازی
قراردادهای هوشمند به [حافظه های دائمی] (https://docs.alchemy.com/docs/smart-contract-storage-layout#what-is-storage-memory(opens in a new tab)) دسترسی دارند. با این حال، بسیار گران است. نوشتن یک کلمه 32 بایتی در یک اسلات از حافظه که قبلاً خالی بود، میتواند [22100 گس هزینه داشته باشد] (https://www.evm.codes/#55?fork=cancun(opens in a new tab)). در 12 گیگاوی/گس و 2300 دلار/اتر،این حدود 61 سنت در هر عملیات نوشتن یا 19.5 دلار در هر کیلوبایت است.
این گرانترین شکل ذخیرهسازی در اتریوم است.
خلاصه
این جدول تفاوت گزینه ها، مزایا و معایب آنها را خلاصه می کند.
نوع ذخیرهسازی | منبع دیتا | تضمین دسترسیپذیری | دسترسیپذیری آنچین | محدودیتهای دیگر |
---|---|---|---|---|
بلابهای EIP-4844 | آفچین | ضمانت اتریوم برای حدود 18 روز(opens in a new tab) | فقط هش موجود است | |
دادهی فراخوانی (calldata) | آفچین | تضمین اتریوم برای همیشه (بخشی از بلاکچین) | فقط در صورت نوشته شدن در قرارداد و در آن معامله در دسترس است | |
خارج از زنجیره ولی بهره گرفته از مکانیزم بلاکچین لایه 1 | آفچین | تضمین "یک تایید کننده صادق" در طول دوره چالش | فقط هش | تضمین شده توسط مکانیسم چالش، فقط در طول دوره چالش |
کد قرارداد | آنچین یا آفچین | تضمین اتریوم برای همیشه (بخشی از بلاکچین) | بله | نوشته شده در یک آدرس "تصادفی"، نمی تواند با "0xEF" شروع شود |
رویدادها | آنچین | تضمین اتریوم برای همیشه (بخشی از بلاکچین) | خیر | |
ذخیرهسازی | آنچین | تضمین اتریوم برای همیشه (بخشی از بلاکچین و وضعیت فعلی تا زمانی که بازنویسی شود) | بله |