تغییرات سالیدیتی در ورژن 0.8.8

سالیدیتی در ورژن 0.8.8
سالیدیتی در ورژن 0.8.8


سالیدیتی ورژن 0.8.8 انواع مقادیر تعریف شده توسط کاربر (user defined value type) را به عنوان یک ویژگی اصلی معرفی می‌کند. کلمه کلیدی override در حال حاضر برای توابع اینترفیس اختیاری است، متغیرهای تغییر ناپذیر را می‌توان در constructor خواند، پشتیبانی از بازیابی کوچکترین و بزرگترین مقدار enum وجود دارد، می‌توانید مشخص کنید دایرکتوری‌ها و اینترفیس‌های خط فرمان پاک شود. علاوه بر این، چندین اشکال را برطرف کردیم و SMTCheckerپوشش زبان را بهبود بخشیده است.

سلام دوستان ??
من سارا هستم و در این پست تغییراتِ جدیدی که زبان سالیدیتی در ورژن 0.8.8 اعمال کرده و در بلاگ سالیدیتی گزارش داده رو ترجمه کردم.
امیدوارم بتونید از این پست استفاده کنید. خوشحال میشم نظرات و انتقادات شما رو بدونم. sarabavifard@gmail.com
پی نوشت سارا: برای اینکه مطالب راستچین بمونن در ابتدای بعضی از بولت‌‌ها حرف "آ" رو قراردادم.

ویژگی‌های جدید قابل توجه

انواع مقادیر تعریف شده توسط کاربر

یک نوع مقدار تعریف شده توسط کاربر اجازه می‌دهد تا یک انتزاع با هزینه صفر (zero-cost-abstraction) بر یک نوع مقدار اولیه ایجاد کنید که همچنین ایمنی نوع را افزایش داده و خوانایی را بهبود می‌بخشد. جزئیات را می‌توانید در این پست پیدا کنید.

آ Override برای توابع اینترفیس وجود ندارد

تابعی که فقط یک تابع اینترفیس را نادیده می‌گیرد، نیازی به تعیین کننده override ندارد.

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.8;
interface IMinimalERC20 {
function transfer(address to, uint value) external;
}
contract MinimalERC20 is IMinimalERC20 {
// Before version 0.8.8, this function declaration required
// specifying the override keyword, i.e.,
// `function transfer(address to, uint value) external override ...`
function transfer(address to, uint value) external {
// ...
}
}

آmin و max برای Enums

کوچکترین و بزرگترین مقدار یک نوع enumبه ترتیب با استفاده از type(E).min و type(E).maxقابل دسترسی است.

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.8;
enum AuctionState {Created, InProgress, Completed}
// returns AuctionState.Created
function min() pure returns (AuctionState) {
return type(AuctionState).min;
}
// returns AuctionState.Completed
function max() pure returns (AuctionState) {
return type(AuctionState).max;
}

خواندن از متغیرهای تغییر ناپذیر

متغیرهای تغییر ناپذیر را می‌توان در زمان construction پس از راه اندازی اولیه خواند.

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.8;
interface IMockInterface {
function getValue() external returns(uint);
}
contract ImmutableExample {
uint immutable value;
event setValue(uint);
constructor(IMockInterface mockContract) {
// Sets the immutable variable.
value = mockContract.getValue();
// Reads the immutable variable.
emit setValue(value);
}
}

همانطور که احتمالاً می‌دانید، می‌توان متغیرهای تغییر ناپذیر را در زمان اعلام آنها مقداردهی کرد، برای مثال uint immutable deployTime = block.timestamp; . از آنجا که ترتیب مقداردهی اولیه همیشه آشکار نیست، چنین متغیرهای تغییر ناپذیری تنها پس از اجرای constructor در نظر گرفته می‌شوند. این بدان معناست که می‌توانید از چنین متغیرهایی در داخل constructor بخوانید اما نمی‌توانید از آنها برای راه اندازی دیگر متغیرهای تغییر ناپذیر در زمان اعلان آنها استفاده کنید.

ایمپورت کردن Include Paths

ما گزینه خط فرمان جدید --include-pathرا اضافه کردیم که امیدواریم بتوانیم پروژه‌های پیچیده‌تر را با استفاده از چندین کتابخانه کامپایل کنیم. --include-path در solcjsو solcدر حالت قدیمی و standard-json موجود است. می‌توانید از آن برای تعیین دایرکتوری‌هایی استفاده کنید که در صورت برطرف شدن دستورات import، فایل‌های منبع در آنها جستجو می‌شود. اگر از npmبرای نصب بسته‌های سالیدیتی استفاده می‌کنید، آنها معمولاً در ساب دایرکتوری زیر node_modulesقرار می‌گیرند. اگر از ایمپورت فرم import X from "@packagename/contracts/x.sol"; استفاده می‌کنید، پس فراخوانی کامپایلر به شرح زیر باید تمام ایمپورت را بدون کار بیشتر به درستی حل کند (base path و include paths اضافه خواهند شد به " مسیرهای مجاز "، برای مثال):

solc contract.sol --base-path . --include-path node_modules/

گزینه --base-path قبلاً مسیری را ارائه می‌دهد که ابتدا جستجو در آن انجام می‌شود. در صورت عدم موفقیت، مسیرهای شامل فایل جستجو می‌شود.

باعث ناامیدی است که کامپایلر سالیدیتی مسیر کامل یک فایل منبع را به عنوان بخشی از فراداده ذخیره می‌کند، که گاهی اوقات بازتولید یک مجموعه را در صورت عدم استفاده از حالت standard-jsonدشوارتر می‌کند.

اگر از --base-path و --include-path استفاده ‌کنید، تنها مسیرهای وابسته به فایل‌هایی که درون آنها قرار دارد در فراداده ذخیره می‌شوند و بنابراین باید کامپایل مجدد قراردادها را دقیقاً به یک فایل باینری در سیستم‌های مختلف بسیار آسان تر کرد.

از سوی دیگر، اگر فایل‌هایی را برای کامپایل کردن در خط فرمان ارائه دهید که نه در base pathو نه در include path وجود دارند، این فایل‌ها با مسیر دقیق خود در سیستم شما نامگذاری می‌شوند و بنابراین در فراداده‌ها به این شکل به پایان می‌رسند.

در حال حاضر، برخی از پروژه‌ها از remappingsبرای حل وابستگی‌ها استفاده می‌کنند و ما معتقدیم که ویژگی "مسیر ایمپورت" راه بهتری برای حل مشکل مشابه است. Remappingsدر واقع فقط به منظور تغییر دیدگاه کامپایلر در سیستم فایل داخلی خود است و به عنوان مثال. اجازه می‌دهد دو نسخه مختلف از یک کتابخانه در یک قرارداد یا پروژه استفاده شود.

تغییرات کامل

ویژگی‌های زبان:

  • وراثت: تابعیکه فقط یک تابع اینترفیس را نادیده بگیرد نیازی به تعیین کننده override ندارد.
  • تایپ سیستم: پشتیبانی type(E).minو type(E).maxبرای enums.
  • نوع تعریف شده توسط کاربر: امکان ایجاد یک abstraction هزینه صفر بر روی یک نوع مقدار با الزامات نوع دقیق تر را فراهم می‌کند.

ویژگی‌های کامپایلر:

  • اینترفیس خط فرمان: گزینه --include-path را برای تعیین دایرکتوری‌های اضافی که ممکن است حاوی کد ایمپورت باشند اضافه کنید (به عنوان مثال کتابخانه‌های شخص ثالث بسته بندی شده).
  • رابط خط فرمان: به طور ضمنی تولیدکننده بایت‌کد EVM را اجرا نکنید مگر اینکه برای خروجی درخواستی لازم باشد.
  • رابط خط فرمان: مسیرهای مشخص شده در خط فرمان را نرمالسازی کنید و آنها را برای فایل‌های واقع در base path و/یا include paths نسبی کنید.
  • متغیرهای تغییر ناپذیر را می‌توان در زمان ساخت پس از راه اندازی اولیه خواند.
  • آSMTChecker: محدودیت‌هایی را برای ارتباط بهتر address(this).balanceو msg.value اضافه کرده.
  • آSMTChecker: ثابت‌ها را از طریق ماژول‌ها پشتیبانی می‌کند.
  • آSMTChecker: از call‌های سطح پایین به عنوان فراخوانی‌های خارجی با کد ناشناخته پشتیبانی می‌کند.
  • آSMTChecker: از گزینه value برای فراخوانی‌های تابع خارجی پشتیبانی می‌کند.
  • آSMTChecker: انواع ارزش تعریف شده توسط کاربر را پشتیبانی می‌کند.

رفع باگ‌ها:

  • آCode Generator: آی سی ای (ICE) را در اختصاص ساختارهای calldata structs و آرایه های calldataبا اندازه ثابت (statically-sized calldata arrays) در مونتاژ داخلی ثابت کنید.
  • آCode Generator: از دستور منبع پایدار برای توابع ABIاستفاده کنید.
  • اینترفیس خط فرمان: گزینه --experimental-via-irرا در حالت های Standard JSON ، Assemblerو Linker مجاز نکنید.
  • اینترفیس خط فرمان: تصحیح وضوح مسیرهایی که با --allowed-paths در فهرست سفید قرار گرفته اند یا به طور ضمنی به دلیل base path ، remappings ها و فایل های در حال کامپایل هستند. مسیرهایی را که به دلیل نسبی، غیر عادی یا خالی بودن دقیقاً با ایمپورت مطابقت ندارند، به درستی اداره کنید.
  • رابط خط فرمان: گزینه‌های بهینه ساز را در حالت استاندارد JSONو پیوند دهنده به عنوان نادیده گرفتن آنها به عنوان نامعتبر گزارش کنید.
  • حل کننده نام (Name Resolver): ثابت کنید که هنگام ایمپورت کردن نماد مستعار با استفاده از import {AliasedName} from "a.sol" از نام اصلی نماد استفاده می‌کند و نه نام مستعار.
  • بهینه ساز Opcode: جلوگیری از اجرای چندین بار بهینه ساز برای جلوگیری از تفاوت احتمالی بایت کد برای کد مرجع.
  • تجزیه کننده(Parser): چندین شناسه مجوز SPDX را در کنار یکدیگر به درستی بررسی کرده و آنها را تأیید کنید.
  • آSMTChecker: رفع محدودیت های BMCدر مورد توابع داخلی.
  • آSMTChecker: رفع منفی کاذب (false negative) ناشی از push در مراجع آرایه ذخیره سازی (storage array references) که توسط توابع داخلی بازگردانده می‌شوند.
  • آSMTChecker: رفع مثبت کاذب (false positive) در فراخوانی های خارجی constructorها.
  • آSMTChecker: رفع خطای داخلی در استفاده از برخی منابع چندمنظوره abi.* ، توابع رمزنگاری و ثابت‌ها.
  • استاندارد JSON: خطاهای غیر مهلک (non-fatal errors) را در حالت یول که اگر توسط یک خطای مهلک دنبال شده باشند و کنار گذاشته شده‌اند، را برطرف کنید.
  • آType Checker: پیغام خطای اشتباه را در اسمبلی داخلی که برای شکایت از .slot یا .offset` not valid when actually.length`` استفاده شده را تصحیح کنید.
  • آType Checker: اظهارات و تعاریف اصلاح کننده (modifier) را در اینرفیس‌ها مجاز نکنید.
  • آYul Optimizer: تصادف را در LoadResolverبرطرف کنید، وقتی keccak256 دارای آرگومان‌های غیر شناسایی کننده خاصی است.
منبع