قراردادهای هوشمند طبقهای از نرم افزارها هستند که برای مدیریت مالکیت داراییهای باارزش طراحی شدهاند. در حالی که محیطهای برنامه نویسی (programming) موجود تا حدودی میتوانند مالکیت داراییها را پیگیری کنند، اما آنها این مالکیت را انعکاس میدهند و مستقیما به تعریف آن نمیپردازند.
این در حالی است که قراردادهای هوشمند ارزشی را که ارائه میدهند، اغلب به طور مستقیم در آن وضعیت تجسم مییابد. مکانیزم ارائه مالکیت با ظهور بلاک چین تکامل پیدا کرد. بیت کوین با استفاده از مدل مالکیتی ساخته شده بود که توسط خروجیهای تراکنش خرجنشده یا UTXO تعریف میشد.
این مدل بیت کوین اگرچه بسیار کارآمد است، اما پیچیده است و ممکن است سبب مشکلاتی شود. به همین خاطر بود که اتریوم از مدل دفتر کل سادهتری استفاده کرد. زمانی که بلاک چین لیبرا اعلام شد، قضیه جنبه سیاسی به خود گرفت و مشکلاتی در این خصوص برای فیسبوک پیش آمد، اما آنهایی که به بررسی فنی و عمیق این پروژه پرداختند، متوجه ایدههای جدید و جالبی در آن شدند.
تیم لیبرا یک مدل برنامه نویسی جدید را تعریف کردند و این مدل در حول و حوش یک مدل مالکیت جدید بود که توسط Linear Types=Resources الهام شده بود.
Resources روشی جدید برای ارائه مالکیت داراییها به طور مستقیم در زبان برنامه نویسی است. مهندسان وقتی که از اصطلاح مالکیت استفاده میکنند، به طور مجازی و برای پیگیری کد مسئول برای مدیریت ساختار داده یا منبع سیستم آن را به کار میبرند.
این روش، مجاز در محیطهایی رایج است که مدیریت حافظه به طور کامل از حیطه کار برنامهنویس کنار زده نمیشود و وقتی که گفته میشود که کد مالک یک شیء است، به این معنی است که کد مجبور به مدیریت و آزاد کردن حافظه اختصاص داده شده به آن شی است.
Resources این ایده را توسعه میدهد و ما میتوانیم از بعضی از مکانیزمها در زبانهای برنامه نویسی قبلی برای مدیریت مالکیت مجازی استفاده کنیم.
ویژگی اساسی Move توانایی تعریف انواع منبع سفارشی است. این منابع برای کدگذاری ایمن داراییهای دیجیتال با برنامه نویسی غنی مورد استفاده قرار میگیرند.
سیستم نوع Move ضمانتهای امنیتی خاصی برای منابع فراهم میآورد. این ضمانتها به صورت استاتیک توسط ماشین مجازی Move اعلام میشوند.
ارز لیبرا به صورت نوعی منبع پیاده شده و وضعیت خاصی در آن زبان ندارد. همه منابع Move دارای محافظتهای مشابهی هستند.
Resources در فضای برنامه نویسی بلاک چین چیست؟
آسانترین روش برای تجسم Resources، استفاده از مثال یک توکن غیرقابلتعویض مانند کریپتوکیتی (CryptoKitty) است که غیر قابل تقسیم و بدون کپی است و میتواند یک مالک مستقیم خاص داشته باشد. این به طور مستقیم با ساختار برنامه نویسی Resource تطابق دارد.
در یک مدل دفتر کل مانند اتریوم، همه توکنهای CryptoKitties در داخل یک قرارداد هوشمند خاص به عنوان یک لیست عظیم ذخیره میشوند.
مالکیت هر kitty با ذخیره اکانت آی دی هر مالک در یک دفتر کل مرکزی پیگیری میشود و تنها راه تغییر این مالکیت تماس با دفتر کل مرکزی است و باید از آن دفتر کل تقاضا کنیم که آی دی اکانت مربوطه را بهروز رسانی کند.
Kitty در این مدل به عنوان شی Resource ارائه میشود و مستقیما در اکانتی که مالک آن است، ذخیره میشود. برای این که متوجه شوید که آیا مالک چیزی هستید یا نه، لازم نیست به دفتر کل مرکزی نگاه کنید، زیرا اگر مالک چیزی باشید در اکانت شما ذخیره میشود.
به طور خلاصه میتوان گفت وقتی چیزی را به عنوان Resource برچسب میزنیم، این به محیط برنامه نویسی نشان میدهد که این ساختار داده ارائهدهنده چیزی دارای ارزش فیزیکی است و همه کدهایی که با آن ساختار داده تعامل دارند، باید از یک سری قوانین خاص تبعیت کنند. اما این قوانین خاص چه هستند؟
- هر Resource در هر زمانی دقیقا در یک مکان قرار دارد.
- مالکیت یک resource توسط جایی که در آن ذخیره شده است، تعریف میشود.
- دسترسی به روشهای یک Resource محدود به مالک است.
چرا Resource اهمیت دارد؟
همانطور که قبلا بیان شد، قراردادهای هوشمند به طور خاص برای مدیریت مالکیت داراییهای باارزش مناسب هستند؛ این در حالی است که اکثر زبانهای برنامه نویسی گزارههایی بومی برای مدیریت مالکیت ندارند. اگر بتوان یک گزاره را در سطح پروتکل وارد کرد، این قطعا موفقیت بزرگی است.
استفاده از Resource منافع دیگری هم دارد که بسیار مهم هستند. از جمله این منافع میتوان موارد زیر را نام برد:
کرایه وضعیت (State rent)
پلتفرمهای قرارداد هوشمند مقیاسپذیر، نیاز به روشی برای مطالبه کرایه وضعیت دارند، بنابراین یا برای دادههای ذخیره شده در بلاک چین هزینه پرداخت میشود و یا این دادهها از مجموعه کاری برداشته میشوند.
در مدل دفتر کل، شناخت فردی که باید این کرایه را پرداخت کند بسیار مشکل است.
با استفاده از مدل مالکیت مستقیم از طریق Resource types، مسئولیت افراد پرداختکننده برای انبار مشخص میشود و به راحتی معلوم میشود که چه کسی باید پرداخت کند. علاوه بر این، کاربران فردی میتوانند داراییهای غیرعادی را آرشیو کنند تا هزینه و بار آنها را بر روی شبکه کاهش دهند.
مالکیت انعطافپذیر
استفاده از مدل دفتر کل برای مالکیت، انواع روابط موجود مالک را محدود میکند؛ اما مدل مالکیت مستقیم به هر دارایی که از resource Types استفاده کرده باشد، اجازه میدهد که به طور ایمن در جایی در سیستم ذخیره شود. همه ضمانتهای ارزشی و امنیتی توسط چنین سیستمی حفظ میشود و این در حالی است که انعطافپذیری زیادی را برای توسعهدهندهها به ارمغان میآورد و پیچیدگی غیرضروری هم نخواهد داشت.
امنیت مبتنی بر ظرفیت
Resource Types همه ضمانتهای مورد نیاز برای پیادهسازی مفهوم Capabilities از مدل امنیت مبتنی بر ظرفیت را فراهم میآورد. Capabilities مکانیزم قدرتمندی برای تعریف سیستمهای ایمن است و پایبندی به اصل Principle of Least Privilege را بسیار آسانتر میکند. این اصل یکی از بهترین اقدامات رایج در سیستمهای امنیتی است.
مدلهای امنیت مبتنی بر ظرفیت، امنیت را به شیوه خاصی تقویت میکنند و در عین حال، انعطافپذیری بیشتری را نیز ممکن میکنند.
حذف خطاهای بازگشت مجدد
مشهورترین خطا در کل تاریخ قراردادهای هوشمند اتریوم، مشکل بازگشت مجدد بوده است و توسعهدهندگان Solidity باید همیشه مراقب حملات بازگشت مجدد باشند.
خوشبختانه روشهای تعریف شده در اشیای Resource، قربانی چنین بهرهبرداریهایی نمیشوند. این ادعایی گستاخانه در محیط برنامه نویسی به نظر میرسد، اما صحت آن با توجه به نحوه تعریف Resource مشخص میشود. هر Resource دارای یک مالک خاص است و تنها مالک میتواند روشهای آن را فراخوانی کند.
اگر یک روش Resource بر روی آرایه باشد، ما میدانیم که آن ارجاع مالکیت خاص به آن شیء از قبل مورد استفاده قرار گرفته است. معلوم است که امکان ندارد با هر کدی به یک ارجاع دوم از آن شیء دست یابیم و روش بازگشت مجدد را فرا بخوانیم.
البته کار کردن مستقیم با وضعیت اشتراک جهانی میتواند کدی را ایجاد کند که نسبت به خطاهای بازگشت مجدد آسیبپذیر باشد. به همین خاطر است که Cadence Style برای همه وضعیت اشتراک از Resource استفاده میکند. نویسندگان قرارداد هوشمندی که از Resources استفاده میکنند، هرگز لازم نیست که در مورد خطاهای بازگشت مجدد فکر کنند.
زبان برنامه نویسی تیم Flow
تیم توسعه Flow در سال گذشته مشغول بررسی استفاده از Linear types در فضای بلاک چینها بود، و این در ادامه یک تحقیق آکادمیک در مورد زبانهای قرارداد هوشمند بهتر بود.
زبان برنامه نویسی Flow که Cadence نام دارد از Resource Types استفاده میکند. Resource گزینههای ساختاری غنی و مناسبی را فراهم میآورد که تناسبی کامل برای داراییهای دیجیتال هستند.
زبان Cadence بسیار آسان است و اشتباهات را به حداقل میرساند. در نتیجه، یادگیری و بازرسی این زبان نیز آسان است و در نهایت بسیار سازندهتر از گزینههای دیگر است.