<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های سارا باوی فرد</title>
        <link>https://virgool.io/feed/@sarabavifard</link>
        <description>علاقمند به DLT</description>
        <language>fa</language>
        <pubDate>2026-06-17 16:12:25</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/38563/avatar/U72FSZ.jpeg?height=120&amp;width=120</url>
            <title>سارا باوی فرد</title>
            <link>https://virgool.io/@sarabavifard</link>
        </image>

                    <item>
                <title>لایه‌ها در سیستم‌های بلاکچینی</title>
                <link>https://virgool.io/@sarabavifard/%D9%84%D8%A7%DB%8C%D9%87-%D9%87%D8%A7-%D8%AF%D8%B1-%D8%A8%D9%84%D8%A7%DA%A9%DA%86%DB%8C%D9%86-avmx444y1v9k</link>
                <description>لایه‌ها در بلاکچیندر سیستم‌های بلاکچین و فناوری می‌توانیم کل سیستم را به سه لایه: لایه اول، لایه دوم و لایه اپلیکیشن تقسیم کنیم. زبانی که این سیستم‌ها اجرا می‌کنند پروتکل نامیده می‌شود. پروتکل‌ها به سیستم‌های مختلف در لایه اول و همچنین سیستم‌های مختلف در لایه اپلیکیشن کمک می‌کنند تا با یکدیگر تعامل داشته باشند.لایه اول، لایه فناوری پایه را تشکیل می‌دهد. لایه دوم معمولاً مشکلات مقیاس پذیری در لایه اول را حل می‌کند. لایه‌ اپلیکیشن محل استفاده از برنامه‌های خاص هستند. لایه‌های اول و دوم مانند سیستم عامل‌های iOS یا Android در گوشی شما هستند. لایه اپلیکیشن برنامه‌های مختلفی هستند که می‌توانید از App Store یا Google Play بارگیری کنید.?در نظر بگیرید لایه اول  انگلیسی صحبت می‌کند:هر سیستم گروهی از کشورها مانند انگلستان، هند، ایالات متحده، استرالیا، نیوزلند و سنگاپور است. زبان انگلیسی به این کشورها در برقراری ارتباط و تجارت با یکدیگر و ارسال اطلاعات به یکدیگر کمک می‌کند. به جای تجارت بین المللی، سیستم‌ها، داده‌ها را از طریق پروتکل‌ها ارسال می‌کنند تا سیستم‌ها بتوانند با یکدیگر صحبت کنند.?در نظر بگیرید لایه دوم انگلیسی را با کمی پیچیدگی صحبت می‌کند:این لایه می‌تواند شامل سنگاپور با زبان Singlish، جامائیکا با انگلیسی جامائیکایی، اسکاتلند با انگلیسی اسکاتلندی، ایرلند با انگلیسی ایرلندی باشد. در نهایت، با وجود اینکه همه آن‎‌ها انگلیسی هستند و از گرامر و ساختار جمله مشابه استفاده می‌کنند. با این حال، نحوه بیان آنها می‌تواند با انگلیسی بریتیش متفاوت باشد.?در نظر بگیرید اپلیکیشن‌های غیر متمرکز (DApps) به اسپانیایی صحبت می‌کنند:این لایه می‌تواند گروهی از کشورهای اسپانیایی شامل اسپانیا باشد. آنها می‌توانند با استفاده از یک زبان با یکدیگر ارتباط برقرار کرده و تجارت کنند.علاوه بر این میدانیم که زبان انگلیسی و اسپانیایی را می‌توان از یکی به دیگری ترجمه کرد. فقط به تلاش بیشتر و مترجم نیاز دارد. این مترجم چیزی است که ما آن را قابلیت همکاری (interoperability) می‌نامیم. این قابلیت اجازه می‌دهد تا پروتکل‌ها با یکدیگر صحبت کنند.چرا؟ زیرا در واقعیت، کل فضای دیجیتال پیچیده‌تر از داشتن دو زبان است. زبان‌های مختلف در لایه اول و زبان‌های مختلف در لایه دوم وجود دارد. اگر می‌خواهیم اطلاعات یا داده‌ها را در تمام پروتکل‌ها و لایه‌ها مبادله و ارسال کنیم، باید به نیاز به مترجم پی ببریم. که راه حل، قابلیت همکاری (interoperability) است.</description>
                <category>سارا باوی فرد</category>
                <author>سارا باوی فرد</author>
                <pubDate>Sat, 16 Oct 2021 01:05:14 +0330</pubDate>
            </item>
                    <item>
                <title>تغییرات سالیدیتی در ورژن 0.8.8</title>
                <link>https://virgool.io/Soliditylang-fa/%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1%D8%A7%D8%AA-%D8%B3%D8%A7%D9%84%DB%8C%D8%AF%DB%8C%D8%AA%DB%8C-%D8%AF%D8%B1-%D9%88%D8%B1%DA%98%D9%86-088-vhvbqy6kqwkc</link>
                <description>سالیدیتی در ورژن 0.8.8سالیدیتی ورژن 0.8.8 انواع مقادیر تعریف شده توسط کاربر (user defined value type) را به عنوان یک ویژگی اصلی معرفی می‌کند. کلمه کلیدی override در حال حاضر برای توابع اینترفیس اختیاری است، متغیرهای تغییر ناپذیر را می‌توان در constructor خواند، پشتیبانی از بازیابی کوچکترین و بزرگترین مقدار enum وجود دارد، می‌توانید مشخص کنید دایرکتوری‌ها و اینترفیس‌های خط فرمان پاک شود. علاوه بر این، چندین اشکال را برطرف کردیم و SMTCheckerپوشش زبان را بهبود بخشیده است.سلام دوستان ??  من سارا هستم و در این پست تغییراتِ جدیدی که زبان سالیدیتی در ورژن 0.8.8 اعمال کرده و در بلاگ سالیدیتی گزارش داده رو ترجمه کردم.  امیدوارم بتونید از این پست استفاده کنید. خوشحال میشم نظرات و انتقادات شما رو بدونم. sarabavifard@gmail.com   پی نوشت سارا: برای اینکه مطالب راستچین بمونن در ابتدای بعضی از بولت‌‌ها حرف &quot;آ&quot; رو قراردادم.ویژگی‌های جدید قابل توجهانواع مقادیر تعریف شده توسط کاربریک نوع مقدار تعریف شده توسط کاربر اجازه می‌دهد تا یک انتزاع با هزینه صفر (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 &quot;@packagename/contracts/x.sol&quot;; استفاده می‌کنید، پس فراخوانی کامپایلر به شرح زیر باید تمام ایمپورت را بدون کار بیشتر به درستی حل کند (base path و include paths اضافه خواهند شد به  &quot; مسیرهای مجاز &quot;، برای مثال):solc contract.sol --base-path . --include-path node_modules/گزینه --base-path قبلاً مسیری را ارائه می‌دهد که ابتدا جستجو در آن انجام می‌شود. در صورت عدم موفقیت، مسیرهای شامل فایل جستجو می‌شود.باعث ناامیدی است که کامپایلر سالیدیتی مسیر کامل یک فایل منبع را به عنوان بخشی از فراداده ذخیره می‌کند، که گاهی اوقات بازتولید یک مجموعه را در صورت عدم استفاده از حالت  standard-jsonدشوارتر می‌کند.اگر از --base-path و --include-path استفاده ‌کنید، تنها مسیرهای وابسته به فایل‌هایی که درون آنها قرار دارد در فراداده ذخیره می‌شوند و بنابراین باید کامپایل مجدد قراردادها را دقیقاً به یک فایل باینری در سیستم‌های مختلف بسیار آسان تر کرد.از سوی دیگر، اگر فایل‌هایی را برای کامپایل کردن در خط فرمان ارائه دهید که نه در  base pathو نه در  include path وجود دارند، این فایل‌ها با مسیر دقیق خود در سیستم شما نامگذاری می‌شوند و بنابراین در فراداده‌ها به این شکل به پایان می‌رسند.در حال حاضر، برخی از پروژه‌ها از remappingsبرای حل وابستگی‌ها استفاده می‌کنند و ما معتقدیم که ویژگی &quot;مسیر ایمپورت&quot; راه بهتری برای حل مشکل مشابه است. 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 &quot;a.sol&quot; از نام اصلی نماد استفاده می‌کند و نه نام مستعار.بهینه ساز 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&#x60; not valid when actually.length&#x60;&#x60; استفاده شده را تصحیح کنید.آType Checker: اظهارات و تعاریف اصلاح کننده (modifier) را در اینرفیس‌ها مجاز نکنید.آYul Optimizer: تصادف را در LoadResolverبرطرف کنید، وقتی keccak256  دارای آرگومان‌های غیر شناسایی کننده خاصی است.منبع</description>
                <category>سارا باوی فرد</category>
                <author>سارا باوی فرد</author>
                <pubDate>Wed, 29 Sep 2021 21:12:46 +0330</pubDate>
            </item>
                    <item>
                <title>انواع مقدار تعریف شده توسط کاربر در سالیدیتی</title>
                <link>https://virgool.io/Soliditylang-fa/%D8%A7%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D8%B1%D8%B2%D8%B4-%D8%AA%D8%B9%D8%B1%DB%8C%D9%81-%D8%B4%D8%AF%D9%87-%D8%AA%D9%88%D8%B3%D8%B7-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1-%D8%AF%D8%B1-%D8%B3%D8%A7%D9%84%DB%8C%D8%AF%DB%8C%D8%AA%DB%8C-uelxnwwqfwxa</link>
                <description>انواع مقدار تعریف شده توسط کاربر در سالیدیتیسالیدیتی ورژن 0.8.8 انواع مقادیر تعریف شده توسط کاربر (user defined value types)  را به عنوان ابزاری برای ایجاد abstractionهایی با هزینه صفر بر روی یک نوع مقدار اولیه معرفی می‌کند که همچنین ایمنی نوع را افزایش داده و خوانایی را بهبود می‌بخشد.انگیزهیک مشکل در مورد انواع مقادیر اولیه این است که آنها بسیار توصیفی نیستند: آنها فقط نحوه ذخیره داده‌ها را مشخص می‌کنند و نحوه تفسیر آنها را مشخص نمی‌کنند. به عنوان مثال، ممکن است بخواهید از uint128 برای ذخیره قیمت برخی اجسام و همچنین مقدار موجود استفاده کنید. برای جلوگیری از درهم آمیختن دو مفهوم متفاوت، داشتن قوانین نوع سختگیرانه بسیار مفید است. به عنوان مثال، ممکن است بخواهید که مقدار را به قیمت اختصاص دهید یا برعکس.یکی از گزینه‌های حل این مسئله استفاده از ساختارها است. به عنوان مثال، قیمت و مقدار را می‌توان به صورت ساختار به شرح زیر خلاصه کرد:struct Price { uint128 price; }
struct Quantity { uint128 quantity; }
function toPrice(uint128 price) returns(Price memory) {
returnPrice(price);
}
function fromPrice(Price memory price) returns(uint128) {
returnprice.price;
}
function toQuantity(uint128 quantity) returns(Quantity memory) {
returnQuantity(quantity);
}
function fromQuantity(Quantity memory quantity) returns(uint128) {
returnquantity.quantity;
}با این حال، struct یک نوع مرجع است و بنابراین همیشه به یک مقدار در  memory ، calldata یا storage اشاره می‌کند. این بدان معناست که abstraction  فوق دارای سربار زمان اجرا است، یعنی گَس اضافی در مقایسه با استفاده از فقط uint128 برای نشان دادن مقدار زیرین. به طور خاص، توابع toPrice و  toQuantity شامل ذخیره مقدار در memory می‌شوند. به طور مشابه، توابع fromPrice و fromQuantity مقدار مربوطه را از memory می‌خوانند. با هم، این توابع مقدار stack -&gt; memory -&gt; stack را که memory  را هدر می‌دهد و هزینه زمان اجرا را متحمل می شود، منتقل می‌کنند. این مسئله با انواع مقادیر تعریف شده توسط کاربر، که abstractionای از انواع مقادیر اولیه هستند (مانند uint8 یا آدرس)، بدون هیچ گونه هزینه اضافی برای زمان اجرا، حل می‌شود.سینتکس برای انواع ارزش تعریف شده توسط کاربرنوع مقدار تعریف شده توسط کاربر با استفاده از type C is V; تعریف می‌شود ؛ جایی که C نام نوع تازه معرفی شده است و V باید یک نوع مقدار داخلی باشد (&quot;نوع اصلی&quot;). آنها می توانند در داخل یا خارج از قرارداد (از جمله کتابخانه ها و رابط ها) تعریف شوند. تابع C.wrap برای تبدیل از نوع اصلی (underlying type) به نوع سفارشی (custom type) استفاده می‌شود. به طور مشابه، تابع C.unwrapبرای تبدیل از نوع سفارشی به نوع اصلی استفاده می‌شود.با بازگشت به مشکل از بخش انگیزش، می‌توان ساختارها را با موارد زیر جایگزین کرد:pragma solidity ^0.8.8;
type Price is uint128;
type Quantity is uint128;توابع toPriceو toQuantityرا می‌توان به ترتیب با Price.wrap و Quantity.wrap جایگزین کرد. به طور مشابه، توابع fromPrice و fromQuantity به ترتیب می‌توانند با Price.unwrap و Quantity.unwrap جایگزین شوند.نمایش داده‌های (data-representation) مقادیر این نوع‌ها از نوع اصلی به ارث می‌رسد و نوع اصلی نیز در ABIاستفاده می‌شود. این بدان معناست که دو تابع transfer زیر یکسان هستند، یعنی دارای تابع انتخاب کننده ( function selector) یکسان و رمزگذاری و رمزگشایی ABI یکسانی هستند. این اجازه می‌دهد تا از انواع مقدار تعریف شده توسط کاربر به شیوه‌ای سازگار با گذشته استفاده کنید.pragma solidity ^0.8.8;
type Decimal18 is uint256;
interface MinimalERC20 {
function transfer(address to, Decimal18 value) external;
}
interface AnotherMinimalERC20 {
function transfer(address to, uint256 value) external;
}در مثال بالا توجه داشته باشید که چگونه کاربر نوع Decimal18را تعریف می‌کند، مشخص می‌کند که یک مقدار باید 18 عدد دسیمال را نشان دهد.مثالمثال زیر یک نوع سفارشی UFixed را نشان می‌دهد که نشان دهنده یک نوع نقطه ثابت اعشاری با 18 اعشار و یک کتابخانه حداقل برای انجام عملیات حسابی بر روی نوع است.// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.8;
// Represent a 18 decimal, 256 bit wide fixed point type
// using a user defined value type.
type UFixed is uint256;
/// A minimal library to do fixed point operations on UFixed.
library FixedMath {
uint constant multiplier = 10**18;
/// Adds two UFixed numbers. Reverts on overflow,
/// relying on checked arithmetic on uint256.
function add(UFixed a, UFixed b) internal pure returns (UFixed) {
return UFixed.wrap(UFixed.unwrap(a) + UFixed.unwrap(b));
}
/// Multiplies UFixed and uint256. Reverts on overflow,
/// relying on checked arithmetic on uint256.
function mul(UFixed a, uint256 b) internal pure returns (UFixed) {
return UFixed.wrap(UFixed.unwrap(a) * b);
}
/// Take the floor of a UFixed number.
/// @return the largest integer that does not exceed `a`.
function floor(UFixed a) internal pure returns (uint256) {
return UFixed.unwrap(a) / multiplier;
}
/// Turns a uint256 into a UFixed of the same value.
/// Reverts if the integer is too large.
function toUFixed(uint256 a) internal pure returns (UFixed) {
return UFixed.wrap(a * multiplier);
}
}توجه داشته باشید که چگونه UFixed.wrap و FixedMath.toUFixed دارای امضای یکسانی هستند اما دو عملیات بسیار متفاوت را انجام می‌دهند: تابع UFixed.wrap یک UFixedرا باز می‌گرداند که نمایش داده‌های مشابه ورودی را دارد، در حالی که toUFixed  یک UFixed را که مقدار عددی یکسانی دارد برمی‌گرداند. تنها با استفاده از توابع wrap و unwrap  در فایلی‌ که نوع را مشخص می‌کند، می‌توان به فرمی از نوع کپسوله سازی (type-encapsulation) اجازه داد.اپراتورها و قوانین نوعتبدیل صریح و ضمنی به  انواع و از انواع دیگر ممنوع است.در حال حاضر، هیچ نوع عملگر برای انواع مقادیر تعریف شده توسط کاربر تعریف نشده است. به طور خاص، حتی اپراتور == تعریف نشده است. با این حال، در حال حاضر اجازه دادن به اپراتورها در حال بحث است. برای ارائه یک چشم انداز کوتاه در مورد برنامه های کاربردی، ممکن است بخواهید یک نوع عدد صحیح جدید را معرفی کنید که همیشه محاسبه wrapping را به شرح زیر انجام می دهد:/// Proposal on defining operators on user defined value types
/// Note: this does not fully compile on Solidity 0.8.8; only a concept.
type UncheckedInt8 is int8;
function add(UncheckedInt8 a, UncheckedInt8 b) pure returns(UncheckedInt8) {
unchecked {
return UncheckedInt8.wrap(UncheckedInt8.unwrap(a) + UncheckedInt8.unwrap(b));
}
}
function addInt(UncheckedInt8 a, uint b) pure returns(UncheckedInt8) {
unchecked {
return UncheckedInt8.wrap(UncheckedInt8.unwrap(a) + b);
}
}
using {add as +, addInt as +} for UncheckedInt8;
contract MockOperator {
UncheckedInt8 x;
function increment() external {
// This would not revert on overflow when x = 127
x = x + 1;
}
function add(UncheckedInt8 y) external {
// Similarly, this would also not revert on overflow.
x = x + y;
}
}</description>
                <category>سارا باوی فرد</category>
                <author>سارا باوی فرد</author>
                <pubDate>Wed, 29 Sep 2021 21:09:28 +0330</pubDate>
            </item>
                    <item>
                <title>تغییرات سالیدیتی در ورژن 0.8.7 برای سازگاری با EIP-1559 و EIP-3198</title>
                <link>https://virgool.io/Soliditylang-fa/httpsvirgooliosarabavifardsolidity-087-release-boxnji29bqbz</link>
                <description>ورژن 0.8.7 سالیدیتیسالیدیتی در ورژن0.8.7، برای پشتیبانی از آپدیت لندن تغییراتی را ارائه داده‌است، این ورژن شامل بهبودهای مختلف برای SMTChecker، تبدیل Yul به کد EVM  و رفع برخی از باگ‌ها می‌باشد.سلام دوستان ?? من سارا هستم و در این پست تغییراتِ جدیدی که زبان سالیدیتی در ورژن 0.8.7 اعمال کرده و در بلاگ سالیدیتی گزارش داده رو ترجمه کردم. امیدوارم بتونید از این پست استفاده کنید. خوشحال میشم نظرات و انتقادات شما رو بدونم. sarabavifard@gmail.com  پی نوشت سارا: برای اینکه مطالب راستچین بمونن در ابتدای بعضی از بولت‌‌ها حرف &quot;آ&quot; رو قراردادم.پشتیبانی از آپدیت لندنسالیدتی پشتیبانی از آپکد BASEFEE (EIP-3198و EIP-1559) را افزایش می‌دهد که هزینه پایه بلاک را نشان ‌می‌دهد. از طریق block.basefee جهانی یا با استفاده از ()basefee در اسمبلی داخلی یا Yul قابل دسترسی است.قرارداد زیر یک نمونه را نشان می‌دهد:contract Basefee {
functionbasefee_global() external view returns (uint) {
returnblock.basefee;
      }
functionbasefee_inline_assembly() external view returns (uint ret) {
assembly{
ret := basefee()
              }
      }
}SMTCheckerآ SMTChecker اکنون همه گزارشات اثبات نشده تارگت را در یک پیام واحد جمع می‌کند، خروجی ابزار را از بین می‌برد و خوشبختانه هرگونه اطلاعات مهم را بیشتر نمایان می کند. گزینه خط فرمان --model-checker-show-unprovedو گزینه settings.modelChecker.showUnproved=true می‌تواند برای لیست تمام تارگت‌های اثبات نشده استفاده شود.کدگذاری SMT عملیات تقسیم و باقیمانده در واقع از کدگذاری معادل با ضرب و متغیرهای slack برای عملکرد حل کننده استفاده می‌کند. با این حال، برخی از حل کننده‌های غیر پیش فرض با کدگذاری دقیق این عملیات بهتر کار می‌کنند. گزینه خط فرمان --model-checker-div-mod-no-slacksو گزینه settings.modelChecker.divModNoSlacksبه کاربر اجازه می‌دهند تا کدگذاری دقیق را برای تقسیم و باقیمانده انتخاب کند. انتظار می‌رود این گزینه فقط در هنگام استفاده از حل کننده‌های دیگر به غیر از z3 مفید باشد.در نهایت، اهداف underflow  و  overflow به طور پیش فرض دیگر بررسی نمی‌شوند. این به دنبال استفاده گسترده از چک‌های تولید شده توسط کامپایلر است که انتظار می‌رود در Solidity&gt; = 0.8.0 رخ دهد. همچنان می‌توان با انتخاب آنها از طریق گزینه خط فرمان--model-checker-targets یا تنظیماتsettings.modelChecker.targetsچک‌های Underflow و  overflowرا انجام داد.لطفاً برای اطلاعات بیشتر در مورد این مسئله و سایر گزینه‌های بررسی مدل، مستند SMTCheckerرا در مستند سالیدیتی ببینید.تغییرات کاملویژگی‌های زبان: برای بازیابی هزینه پایه بلوک فعلی،block.basefee جهانی را معرفی کنید. یول: برای بازیابی هزینه پایه بلوک فعلی ()basefeeرا معرفی کنید.ویژگی‌های کامپایلر:ویژگی‌های کامپایلر:آ AssemblyStack: هنگام کامپایل کد یول، بهینه ساز مبتنی بر آپکد را نیز اجرا کنید. رابط خط فرمان: گزینه --pretty-json با --standard--jsonنیز کار می کند.آ EVM: نسخه EVM پیش فرض را روی &quot;London&quot; تنظیم کنید.آ SMTChecker: به طور پیش فرض underflow و  overflowرا بررسی نکنید.آ SMTChecker: تارگت‌های اثبات نشده به طور پیش فرض پنهان هستند و SMTCheckerفقط تعداد تارگت‌های اثبات نشده را بیان می‌کند. آنها را می‌توان با استفاده از گزینه خط فرمان ----model-checker-show-unprovedیا گزینه  settings.modelChecker.showUnproved لیست کرد.آ SMTChecker: تنظیم جدید برای فعال/غیرفعال کردن رمزگذاری تقسیم و باقیمانده با متغیرهای slack. گزینه خط فرمان--model-checker-div-mod-slacksو گزینه settings.modelChecker.divModWithSlacksاست.آ Yul EVM Code Transform: همچنین اسلات‌های استفاده نشده از آرگومان را برای توابع بدون متغیرهای برگشتی (تحت محدودیت‌های مشابه برای توابع با متغیرهای بازگشتی) باز کنید.آ Yul EVM Code Transform: از اسلات پشته‌ای که بلافاصله غیرقابل دسترسی می‌شوند استفاده نکنید.آ Yul Optimizer: آرگومان‌های تابع را جابجا کرده و متغیرها را با Stack Limit Evader (که به طور پیش فرض فعال نیست) به مِمُوری بازگردانید.رفع باگ‌ها:آ Code Generator: هنگام ارسال یک لیترالِ رشتهِ خالی به bytes.concat()، خرابی را برطرف کنید.کد ساز: هنگام فراخوانی توابع محدود به ساختارها و آرایه های calldata، خطای کامپایلر داخلی را برطرف کنید.آ Code Generator: هنگام انتقال یک هگز لیترالِ 32 بیتی یا یک لیترال صفر  به bytes.concat() با جلوگیری از چنین لیترال‌هایی، خطای کامپایلر داخلی را رفع کنید. رابط خط فرمان: گزینهoptimizer-runs-- را در حالت اسمبلی / یول اعمال کنید.رابط خط فرمان: هنگام انتقال مسیر دایرکتوری به --standard-json ، خرابی را برطرف کنید.رابط خط فرمان: زمانی که --standard-json ، -را به عنوان نام فایل دریافت می‌کند، JSON را از ورودی استاندارد بخوانید.استاندارد JSON: شامل مکان منبع برای خطاها در فایل‌هایی با نام خالی.آ Type Checker: خطای داخلی را برطرف کرده و از فراخوانی‌های استاتیک با اصلاح کننده‌های اجرا نشده جلوگیری کنید.آ Yul Code Generator: خطای کامپایلر داخلی را هنگام استفاده از کلمه طولانی با bitwise نفی برطرف کنید.آ Yul Code Generator: مکان رفرنس‌های منبع را برای فراخوانی با توابع داخلی ثابت کنید.آ Yul Parser: مکان رفرنس‌های منبع را برای دستورات ifبرطرف کنید.نسخه جدید سالیدیتی را از اینجا بارگیری کنید.منبع</description>
                <category>سارا باوی فرد</category>
                <author>سارا باوی فرد</author>
                <pubDate>Thu, 12 Aug 2021 00:57:19 +0430</pubDate>
            </item>
                    <item>
                <title>تغییرات جدید ریمیکس برای سازگاری با هارد فورک لندن</title>
                <link>https://virgool.io/Soliditylang-fa/%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1%D8%A7%D8%AA-%D8%AC%D8%AF%DB%8C%D8%AF-%D8%B1%DB%8C%D9%85%DB%8C%DA%A9%D8%B3-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B3%D8%A7%D8%B2%DA%AF%D8%A7%D8%B1%DB%8C-%D8%A8%D8%A7-%D9%87%D8%A7%D8%B1%D8%AF-%D9%81%D9%88%D8%B1%DA%A9-%D9%84%D9%86%D8%AF%D9%86-cc3jals9vm72</link>
                <description>ریمیکسهمراه با هارد فورک لندن سیاست‌های جدید قیمت گذاری گَس با EIP 1159 ارائه شده است.ورژن جدید ریمیکس 0.16.0 ، از گَس با سیاست‌های هارد فورک لندن پشتیبانی می‌کند. در این ورژن ریمیکس یک سری تغییرات زیرساختی برای سازگاری با هاردفورک لندن انجام داده است تا پارامترهای جدید گَس را در خود جای دهد.  آپدیت modal تغییری است که در UI ریمیکس اتفاق افتاده و در زمان دیپلوی قرارداد بر روی mainnet ظاهر میشود: در این modal، ریمیکس ورودی‌های جدید را درخواست می‌کند: حداکثر هزینه اولویت (Max Priority fee) و حداکثر هزینه (Max fee).اما به یاد داشته باشید که حداکثر هزینه (Max fee) باید بیشتر از هزینه پایه (base fee) باشد. اگر مقدار Max fee کمتر باشد، خطایی دریافت خواهید کرد:و اگر چیزی در حداکثر هزینه (Max fee) قرار ندهید، خطایی مبنی بر نیاز به وارد کردن یک عدد دریافت خواهید کرد:اما برای شما که هرگز این modal را ندیده‌اید، modal فقط در هنگام دیپلوی در mainnet ظاهر می شود.اما کاربرانی که در متامسک به دنبال گزینه‌های گَس لندن هستند:متامسک افزونه مرورگر خود را به روز نکرده است:  بنابراین تا زمانی که این کار انجام نشود، نمی توانید پارامترهای گَس جدید را اضافه کنید.دیپلوی در Testnetsفورک لندن در اکثر شبکه های آزمایشی و نه همه آنها اجرا می‌شود. اما برای دسترسی به این ویژگی‌های جدید، باید به testnets با Web3provider دسترسی پیدا کنید.منبع: ریمیکس</description>
                <category>سارا باوی فرد</category>
                <author>سارا باوی فرد</author>
                <pubDate>Fri, 06 Aug 2021 23:52:27 +0430</pubDate>
            </item>
                    <item>
                <title>ورژن 0.8.6 سالیدیتی</title>
                <link>https://virgool.io/Soliditylang-fa/%D9%88%D8%B1%DA%98%D9%86-086-%D8%B3%D8%A7%D9%84%DB%8C%D8%AF%DB%8C%D8%AA%DB%8C-vmpcjbq4omna</link>
                <description>سالیدیتیسلام دوستان من سارا هستم، امروز سالیدیتی مجدداً ورژن جدیدش یعنی 0.8.6 رو معرفی کرد و یه سری باگ‌ها رو اصلاح کرده و در گیت هابش اطلاع رسانی کرد.امیدوارم بتونید از این پست استفاده کنید و خوشحال میشم انتقادات و نظرات شما رو بدونم. sarabavifard@gmail.com پی نوشت سارا: حرف آ در اول بعضی بولت‌ها بخاطر این هستش که تمام بولت‌ها راستچین بمونن.سالیدیتی در ورژن  0.8.6 برخی از باگ‌های غیر حیاتی اما آزار دهنده، خصوصاً هشدار مربوط به کد غیرقابل دسترسی که در واقع قابل دسترسی هستن را بر طرف کرده است. برای جزئیات بیشتر، لطفاً به اطلاعیه انتشار مراجعه کنید.ویژگی های زبان:آ Yul: معنای خاص شیء داده &quot;.metadata&quot; در شی  Yul.رفع باگ‌ها:گراف کنترل جریان: کدِ غیرقابل دسترسیِ گزارش شدهِ اشتباه را برطرف کنید.آ Solc-Js: هنگام اجرای solcjs بدون --optimize flag ، به جای حذف کلید، از settings.optimizer.enabled = false در استاندارد JSON استفاده کنید.آ JSON استاندارد: حذف تنظیمات.optimizer.enabled برابر با تنظیم نادرست آن نیست. این به معنای غیرفعال کردن بهینه ساز peepholeو jumpdest Remover است که به طور پیش فرض هنوز با enabled = falseاجرا می‌شود.</description>
                <category>سارا باوی فرد</category>
                <author>سارا باوی فرد</author>
                <pubDate>Tue, 22 Jun 2021 22:08:39 +0430</pubDate>
            </item>
                    <item>
                <title>سالیدیتی ورژن 0.8.5</title>
                <link>https://virgool.io/Soliditylang-fa/%D8%B3%D8%A7%D9%84%DB%8C%D8%AF%DB%8C%D8%AA%DB%8C-%D9%88%D8%B1%DA%98%D9%86-085-imlxfdfxh02v</link>
                <description>سالیدیتی ورژن 0.8.5سالیدیتی ورژن 0.8.5ورژن   v0.8.5 سالیدیتی امکان تبدیل از bytes به مقادیر bytesNN را فراهم می‌کند، تابع verbatim را برای تزریق بایت کد (bytecode) دلخواه در Yul اضافه و چندین باگ کوچکتر را برطرف کرده‌است.سلام من سارا هستم و در این پست تغییرات جدیدی که زبان سالیدیتی  ورژن 0.8.5 اعمال کرده و در بلاگ سالیدیتی گزارش داده رو ترجمه کردم. امیدوارم بتونید از این پست استفاده کنید و اگه ایرادی هست بهم اطلاع بدین، خوشحال میشم انتقادات و نظرات شما رو بدونم.sarabavifard@gmail.comپی نوشت سارا: حرف آ اول بعضی بولت‌ها بخاطر این هستش که تمام بولت‌ها راستچین بمونن.فیچرهای های قابل توجه جدیدتبدیل بایت (Bytes Conversion)داکیومنت کامل فیچرها را در اینجا می‌توانید پیدا کنید.این نسخه توانایی تبدیل بایت‌ها و برش‌های بایت‌ها (bytes slices) به تایپ‌های fixed bytes مثل bytes1/… / bytes32 را معرفی می کند. در حالی که تبدیل بین تایپ‌های بایت با طول ثابت همیشه امکان پذیر بوده‌است، اکنون امکان تبدیل تایپ‌های بایت با اندازه پویا به تایپ‌های بایت با طول ثابت نیز وجود دارد.در صورتی که آرایه بایت از تایپِ بایتِ ثابتِ هدف طولانی تر باشد، در پایان کوتاه می شود:function f(bytes calldatac) public view returns (bytes8) {
	// If c is longer than 8 bytes, truncation happens
	return bytes8(c); 
}فراخوانی (&quot;12345678&quot;)f مقدار &quot;12345678&quot; را برمیگرداند، همانطور فراخوانی (&quot;123456780&quot;)f. اگر آرایه از تایپِ ثابتِ هدف (target fixed type) کوتاه‌تر باشد، در صورت پایان با صفر پر می‌شود، بنابراین با فراخوانی (&quot;1234&quot;)f مقدار &quot;1234&quot; برگرداننده خواهد شد.یک مثال خوب برای استفاده از ویژگی تبدیل بایت، کاربرد آن در پروکسی ها است:// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.5;
contract Proxy {
	/// @dev Address of the client contract managed by this proxy
	address client;
	constructor(address _client) {
		client = _client;
	}
	/// Forwards all calls to the client but performs additional checks for calls to &amp;quotsetOwner(address)&amp;quot.
	function forward(bytes calldata _payload) external {
		require(_payload.length &gt;= 4);
		bytes4 sig = bytes4(_payload[:4]);
		if (sig == bytes4(keccak256(&amp;quotsetOwner(address)&amp;quot))) {
			address owner = abi.decode(_payload[4:], (address));
			require(owner != address(0), &amp;quotAddress of owner cannot be zero.&amp;quot);
		}
		(bool status,) = client.delegatecall(_payload);
		require(status, &amp;quotForwarded call failed.&amp;quot);
	}
}قبلاً امکان انجام bytes4 sig = bytes4 (_payload [: 4]) وجود نداشت؛ در عوض مجبور بودید از موارد زیر استفاده کنید:bytes4 sig =
	_payload[0] |
	(bytes4(_payload[1]) &gt;&gt; 8) |
	(bytes4(_payload[2]) &gt;&gt; 16) |
	(bytes4(_payload[3]) &gt;&gt; 24);تابع Verbatim  در Yulداکیومنت کامل فیچرها را در اینجا پیدا کنید.این نسخه مجموعه‌ای از توابع verbatim را برای Yul معرفی می‌کند که به شما امکان می‌دهد بایت کد دلخواه را به باینری تزریق کنید. این کار در حال حاضر فقط از طریق pure Yul در دسترس است، یعنی از طریق اسمبلی درون خطی قابل دسترسی نیست.اساساً دو مورد کاربردی (use-cases) وجود دارد (موارد بیشتر در زیر موجود است):1. استفاده از آپکدهای ناشناخته برای Yul (بخاطر اینکه فقط پیشنهاد شده اند یا اینکه شما یک زنجیره ناسازگار با EVM را هدف قرار داده اید).2. ایجاد توالی های خاص بایت کد (bytecode) که توسط بهینه ساز اصلاح نشده است.توضیح آپکدتوابع  verbatim&lt;n&gt;i_&lt;m&gt;o(&quot;&lt;data&gt;&quot;, ...) هستند، کجای که ...حرف n یک عدد دسیمال (decimal) بین 0 تا 99 است که تعداد اسلات ها / متغیرهای ورودی پشته را مشخص می کند،حرف m عدد دسیمال (decimal) بین 0 تا 99 است که تعداد اسلات ها / متغیرهای پشته خروجی را مشخص می کند،داده یا data یک رشته لیترال (string literal) است که شامل توالی بایت است.توجه داشته باشید که هنگام استفاده از verbatim برخی از هشدارها وجود دارد. جزئیات مربوط به آن را می توان در داکیومنت یافت.استفاده از آپکد جدیدبه عنوان یک مثال عملی، می توان از این مثال برای تزریق آپکد EVM که به تازگی پیشنهاد شده است به باینری استفاده کرد. از آپکد BASEFEE پیشنهادی (در 0x48) استفاده کنید (به EIP-3198 و EIP-1559 مراجعه کنید) ، از آنجا که کامپایلر سالیدیتی در حال حاضر از این آپکد پشتیبانی نمی کند، می توان از verbatim برای اجرای آن در Yul استفاده کرد.{
	function basefee() -&gt; out {
		out := verbatim_0i_1o(hex&amp;quot48&amp;quot)
	}

	sstore(0, basefee())
}در اینجا مثال دیگری وجود دارد که دارای پارامتر ورودی برای verbatim است.let x := calldataload(0)
// The hex&amp;quot600202&amp;quot corresponds to EVM instructions:
// PUSH 02 MUL
// That is, it multiplies x by 2.
let double := verbatim_1i_1o(hex&amp;quot600202&amp;quot, x)کد فوق منجر به آپکد dup1 برای بازیابی x می شود (بهینه ساز ممکن است مستقیماً از نتیجه آپکد calldataload استفاده کند) به طور مستقیم 600202 دنبال می شود. سپس کامپایلر کدی تولید می کند تا اسلات پشته ای را برای double اختصاص دهد و نتیجه را در آنجا ذخیره کند.موردکاربردی برای Optimismمورد کاربردی دوم  می تواند برای راه حل‌های لایه 2 مانند Optimism مفید باشد، اما همچنین راه حل‌های دیگری مانند تجزیه و تحلیل بایت کد یا دیباگ کردن به ذهن خطور می کند. Optimism در حال حاضر از یک کامپایلر سالیدیتی سفارشی استفاده می کند، زیرا آنها یک قرارداد هوشمند را شبیه سازی می کنند که در آن هر تغییر در حالت (storage ، فراخوانی های خارجی و غیره) به طور مستقیم اجرا نمی شود، اما با فراخوانی مدیر قرارداد جایگزین می شود که تغییر را برای تأیید ذخیره می کند. مشکل در این مورد بررسی اینکه  قرارداد با این محدودیت ها مطابقت دارد یا خیر (به عنوان مثال برای به طور دقیق با فراخوانی مدیر قرارداد برای هر تغییر)، خصوصاً اینکه این کار باید توسط مکانیزم تشخیص تقلب در زنجیره (the on-chain fraud detection mechanism) انجام شود. کاری که آنها انجام می دهند این است که بررسی می کنند هیچ یک از آپکدهای تغییر-حالت (state-changing opcodes) توسط قرارداد استفاده نشده باشد، به استثناء آپکدی که مدیر قرارداد را فراخوانی می‌کند. برای اینکه این استثناء به درستی تشخیص داده شود، توالی آپکدها منجر به این آپکدِ فراخوانی باید دارای فرم خاصی باشد و معمولاً بهینه ساز سالیدیتی (Solidity optimizer) مرتب سازی مجدد انجام می دهد و این فرم را از بین می برد. خوشبختانه، verbatim می تواند این مشکل را حل کند به گونه ای که Optimism دیگر نیازی به اتکا به یک کامپایلر سالیدیتی سفارشی ندارد و می تواند از تمام نسخه های بعدی کامپایلر سالیدیتی بدون تغییر استفاده کند.کامپایلر optimism می تواند کدYul  تولید شده توسط کامپایلر سالیدیتی را بگیرد، توابع کمکی Yul زیر را ضمیمه کرده و به صورت نوشتاری (syntactically)  کلیه‌ی تابع داخلی تغییر-حالت را که با ovm_-counterparts  فراخوانی می‌شوند، جایگزین کند. به عنوان مثال، تمام فراخوانی‌های sstore(x, y) با فراخوانی ovm_sstore(x, y)جایگذین می‌شود. پس از این جایگزینی، بهینه ساز Yul حتی می تواند دوباره اجرا شود. (این کد فقط sstore را نشان می‌دهد.)/// Generic call to the manager contract.
function ovm_callManager(arguments, arguments_size, output_area, output_area_size) {
	verbatim_4i_0o(
		hex&amp;quot336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b&amp;quot,
		arguments,
		arguments_size,
		output_area,
		output_area_size
	)
}

// Call a manager function with two arguments
function ovm_kall_2i(signature, x, y) {
	// Store touched memory in locals and restore it at the end.
	let tmp_a := mload(0x00)
	let tmp_b := mload(0x20)
	let tmp_c := mload(0x40)
	mstore(0, signature)
	mstore(4, x)
	mstore(0x24, y)
	ovm_callManager(0, 0x44, 0, 0)
	mstore(0x00, tmp_a)
	mstore(0x20, tmp_b)
	mstore(0x40, tmp_c)
}

// Replace all calls to ``sstore(x, y)`` by ``ovm_sstore(x, y)``
function ovm_sstore(x, y) {
	// The hex code is the selector of
	// the sstore function on the manager contract.
	ovm_kall_2i(hex&amp;quot22bd64c0&amp;quot, x, y)
}گزارش کامل تغییراتفیچر‌های زبان:اجازه تبدیل از bytes و bytes slices به بایت bytes1 /… / bytes32.آ Yul: افزودن تابع داخل verbatim  برای تزریق بایت کد دلخواه.ویژگی های کامپایلر:تولید کننده کد: قراردادن توابع کمکی برای panic codes به جای خطی کردن غیرشرطی (inlining unconditionally). اگر panics (checks) بیشتری قراردهید، این کار می‌تواند هزینه‌ها را کاهش دهد. اما در جایی که panics کمتری استفاده شود هزینه ها افزایش پیدا می‌کند.آ EVM: نسخه پیش فرض EVM را روی &quot;Berlin&quot; تنظیم کنید.آ SMTChecker: تعریف تابع را می توان با برچسب سفارشی Natspec  نوشت.custom:smtchecker abstract-function-nondetهنگامی که  این تابع فراخوانی می شود با یک مقدار نامعین خلاصه می‌شود.استاندارد JSON / JSON ترکیبی: مصنوع جدید &quot;functionDebugData&quot; که حاوی آفست‌های بایت‌کد از نقاط ورودی توابع و اطلاعات بیشتر در آینده.بهینه ساز Yul : ارزیابی keccak256(a, c) ، وقتی مقدار a در محل حافظه مِمُوری در زمان کامپایل مشخص شده باشد و c یک constant &lt;= 32 باشد.رفع باگ‌هاآ AST: اگر رشته UTF-8 معتبر نباشد، از مقدار Yul لیترال خروجی نمیگیرد.تولید کننده کد: خطای داخلی را هنگامی که تابع آرایه ها به متغییر های Storage اختصاص داده می‌شوند، برطرف می‌کند و نوع توابع می‌تواند به صورت ضمنی تبدیل شود اما یکسان نمی‌شوند.وقتی آرایه های تابع به متغیرهای storage اختصاص داده می شوند و اشکال داخلی را می توان ضمنی تبدیل کرد اما این تبدیل‌ ها یکسان نیستند، خطای داخلی را برطرف می‌کند.گراف کنترل جریان: تصور می‌کند که اصلاح کننده های غیر اجرا شده از یک placeholder استفاده می‌کنند.گراف کنترل جریان: با توابعی که همیشه برای گزارش متغیرهای استفاده نشده یا متغیر‌های unassigned  به اکانت برمیگردند فراخوانی داخلی انجام می‌دهد.گراف فراخوانی تابع: خطای داخلی متصل به circular constant references را برطرف می‌کند.آ Name Resolver: در صورت عدم دسترسی مستقیم به shadowing name، هشدار shadowing صادر نمی‌کند.آ Natspec: اجازه‌ی برچسب چندگانه return@ در متغیر حالت عمومی در داکیومت.آ SMTChecker: رفع خطای داخلی در تبدیل از بایت به بایت ثابت.آ SMTChecker: رفع خطای داخلی در فراخوانی‌های های خارجی constructor.آ SMTChecker: رفع خطای داخلی struct constructor با عضو ثابت بایت که با رشته لیترال مقداردهی اولیه شده‌است.مکان‌های منبع: تنظیم دقیق مکان منبعِ بلاک‌های محدود شدهاستاندارد JSON : به طور دقیق اجازه تنظیمات درون خطی را تحت settings.optimizer.details می‌دهد.آ ype Checker: خطای کامپایلر داخلی مربوط به داشتن انواع mapping در پارامتر constructor را برای قراردادهای انتزاعی برطرف می‌کند.آ ype Checker: هنگام تلاش برای استفاده از یک نوع تابع خارجی نامعتبر در EVM های قبل از بیزانسی، خطای کامپایلر داخلی را برطرف می‌کند.تایپ Checker: خطای کامپایلر داخلی را در هنگام جایگزینی تابع دریافت (receive) اتر با یکی از پارامترهای مختلف در طول ارث بری برطرف می‌کند.تایپ Checker: ایجاد خطا در مورد نوع mapping (تودرتو) در پارامتر event یا error در خطاهای نوع fatal.تغییرات AST:افزودن عضو  hexValue برای رشته های Yul و لیترال hex.سلام من سارا هستم و در این پست تغییرات جدیدی که زبان سالیدیتی  ورژن 0.8.5 اعمال کرده و در بلاگ سالیدیتی گزارش داده رو ترجمه کردم. امیدوارم بتونید از این پست استفاده کنید و اگه ایرادی هست بهم اطلاع بدین، خوشحال میشم انتقادات و نظرات شما رو بدونم.</description>
                <category>سارا باوی فرد</category>
                <author>سارا باوی فرد</author>
                <pubDate>Sun, 13 Jun 2021 20:39:13 +0430</pubDate>
            </item>
            </channel>
</rss>