مسئله

ساخت وبلاگ

من معتقدم که اشتها برای تجدید نظر در معماری کتابخانه Web3. JS به یک نقطه مهم رسیده است.

  • armaniferrante: (توییت)
  • @0xcryptosheik: (توییت ، پیش نویس روابط عمومی)
  • jacobcreech (توییت)
  • JohnRees (توییت)

اینها برخی از مشکلاتی است که یک بازنویسی با هدف حل آن هدف قرار می دهد:

  1. طراحی یکپارچه فعلی بدان معنی است که این کتابخانه عملکرد عملکردی را در هر بایت ارائه می دهد. ما کاربران را وادار می کنیم تا کدی را بارگیری کنند که احتمالاً آنها هرگز به آن احتیاج ندارند و نمی توانند از بین بروند.
  2. یاران مات مانند SendTransaction باعث می شود که افراد شخصی سازی رفتار را برای افراد دشوار کنند. هر دوی آنها مسئولیت بیش از حد را بر عهده می گیرند (به عنوان مثال ، بیش از حد انجام دهید ، مانند واکشی های اخیر و امضای معاملات) و جهش ورودی های آنها (به عنوان مثال فراخوانی SendTransaction یک "blockhash اخیر" معامله را بازنویسی می کند).
  3. استفاده از کلاس های JavaScript برای محاصره دولت بهترین تلاش ما را برای ایجاد برنامه های Typesafe خنثی می کند. به عنوان مثال ، تفاوت بین معامله امضا شده ، یک معامله بدون امضا و یک معامله مبتنی بر مبتنی بر چیست؟در کتابخانه فعلی ، اینها فقط نمونه های معامله ای هستند که ممکن است در پیکربندی مورد نظر شما باشد یا نباشد ، و در صورت عدم وجود ممکن است خطاهای زمان اجرا را پرتاب کند.

راه حل پیشنهادی

این حتی ایده بدی نیست.

image

من در زمان خود بازنویسی های زمینی زیادی را تجربه کرده ام و رویکردی که من به طور مداوم به موفقیت می دانم این است:

  1. API ایده آل را ایجاد کنید.
  2. اجرای API موجود را با استفاده از مورد جدید در زیر کاپوت ، به صورت تدریجی جایگزین کنید.
  3. هنگامی که ثابت کردید که می توانید با استفاده از مدرن ، میراث API را مجدداً تکرار کنید ، توسعه را در API میراث یخ زده و بر روی دادن ابزار و آموزش به افراد برای مهاجرت به مدرن متمرکز شوید.

اصول

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

اصل 1: اجازه دهید داده ها داده شوند

مگر اینکه یک بسته از داده ها در پاسخ به وقایع نیاز به جهش خود داشته باشند ، آن را در کلاس JavaScript نپوشانید.

  1. ما باید درد و رنج کنیم تا داده ها را تغییر ناپذیر کنیم. استفاده از انواع readonly و readonlyarray را در TypeScript ترجیح دهید.
  2. عملیات بیش از داده ها باید ساختارهای داده غیرقابل تغییر را به عنوان ورودی و تولید ، به عنوان خروجی ، ساختار داده های تغییر ناپذیر که هرچه بیشتر ساختار با اصل دارند به اشتراک می گذارند.
  3. ساختار داده ها باید به خوبی تایپ شوند. نوع ساختار داده باید هر آنچه را که باید بدانید ، از نظر استاتیک ، به شما بگوید که در مورد کدام عملیات سازگار است.

اصل 2: با تبدیل داده ها با استفاده از توابع ، کار را انجام دهید

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

// به جای جهش وضعیت داخلی موارد کلاس JavaScript. محاصره کردن معامله = جدید معامله(/* . */); معامله.امضا کردن(/* . */); // انجام عملیات با تبدیل داده ها با استفاده از توابع. محاصره کردن معامله = ترانزیت(/* . */); محاصره کردن ترانزیت امضاء: isignedTransaction = ترانزیت(معامله, /* . */);

اصل 3: وارد کردن یک ماژول هرگز نباید عارضه جانبی ایجاد کند

سطح بالای یک esmodule "کارخانه ماژول" نامیده می شود.

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

  1. این امر اطمینان حاصل می کند که کتابخانه کاملاً قابل لرزش است (یعنی کد استفاده نشده را می توان با یک کامپایلر بهینه سازی حذف کرد)
  2. این باعث می شود که کتابخانه "تنبل" تر شود ، به این معنی که کد به جای اینکه وارد شود ، کامپایل و اجرا می شود.

اصل 4: برای تضمین قراردادهای زمان اجرا از انواع مات استفاده کنید

پس از ادعاهای خاص در مورد یک مقدار ، آن را به صورت ابتدایی ترین شکل خود برگردانید اما به یک نوع مات تبدیل می شود

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

تصور کنید که یک رشته قطعاً یک pubkey رمزگذاری شده Base58 است ، سپس آن را به یک نوع مات Base58EncodedPublickey TypeScript ریخته است. اکنون این ارزش با ضمانتی همراه است که می توانید آن را به آرایه ای که مطابق با نوع کلید عمومی است ، بازگردانید ، یا از آن به عنوان ورودی به تماس RPC استفاده کنید - و همه بدون استفاده از کلاس های JavaScript.

اصل 5: مدولار سازی شدید

کتابخانه را به همان اندازه ماژول های ES عملی کنید. آنها را به طور مستقل آزمایش کنید.

کاربران نهایی ممکن است یک سبک واردات یکپارچه سازگار با یک کامپایلر لرزش درخت را انتخاب کنند (به عنوان مثال واردات از '@solana/web3. js' ؛) یا ممکن است آنها با وارد کردن ماژول های ES مستقیماً یک ساخت و ساز سفارشی ایجاد کنند (به عنوان مثال واردات CreatePublickey از "@solana/web3. js/ماژول/createpublickey. js '؛)

اصل 6: بسته بندی های برنامه متعلق به بسته های خودشان هستند

هر جا ممکن باشد ، بسته بندی های برنامه Kick (به عنوان مثال برنامه رأی) به ماژول های NPM خودشان که به طور جداگانه آزمایش و منتشر می شوند.

  1. این باید زمان CI را در مواردی که فقط بسته تغییر یافته نیاز به تکرار مجدد دارد ، کاهش دهد.
  2. افرادی که از بسته بندی برنامه استفاده نمی کنند ، نیازی به بارگیری آن ندارند.

اصل 7: همه خطاها باید رمزگذاری شوند

هرگز با متن Freeform خطا نکنید. همیشه خطاهای تایپ شده یا رمزگذاری شده را پرتاب کنید ، تا افراد بتوانند ادعاهای محکم در مورد ماهیت آنچه در بلوک های صید خود اشتباه گرفته است ، بیان کنند.

اصل 8: کلیه عملیات و اشتراک های ناهمزمان باید قابل کاهش باشد

هرگز بدون ارائه راهی برای لغو آن ، یک عمل ناهمزمان ارائه ندهید.

  1. اشتراک ها همیشه باید یک دسته دفع را برگردانند.
  2. عملیات ناهمزمان همیشه باید به یک کنترل کننده سقط جنین بپذیرد و پاسخ دهد.
// بعداً می توانید برای لغو این اشتراک با "() () تماس بگیرید. محاصره کردن در معرض قرار دادن> = ساختار("حساب کاربری", /* . */); // در هر زمان می توانید با "abortController. Abort () تماس بگیرید تا این قول را لغو کنید. محاصره کردن متصدی کنترل کننده = جدید متصدی کنترل کننده(); در انتظار تسویه حساب(/* . */, متصدی کنترل کننده>);

اصل 9: در ورودی های عملکرد بیش از حد به حداقل برسانید

یک تابع باید استفاده از آرگومان های ورودی خود را تا حد امکان کارآمد کند. این بدان معناست که نباید به هر چیزی که از آن استفاده نمی کند ، نیاز داشته باشد.

به جای این:

عملکرد DOTHING (اتصال: اتصال // اطلاعات بیشتر از آنچه ما نیاز داریم.)
عملکرد عملکرد (تعهد: تعهد)

اصل 10: اشکال زدایی

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

if (__dev__)

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

اصل 11: از اعداد جاوا اسکریپت خودداری کنید

اعداد JavaScript می توانند مقادیر عدد صحیح را تا 2^53 - 1 بیان کنند. اگر می خواهید مقدار بالاتر از آن را بیان کنید ، باید آن را به عنوان یک bigint یا یک رشته بیان کنید.

  • هنگام برقراری ارتباط با API وب (به عنوان مثال JSON RPC) همیشه از رشته ها برای جلوگیری از کوتاه کردن استفاده می کنید
  • هنگام ذخیره و انجام حسابی بر روی مقادیر موجود در حافظه همیشه از BigInt استفاده کنید

متن با موفقیت به روز شد ، اما این خطاها با آن روبرو شدند:

نویسنده همکار استیلوشچر در 19 مه 2022 نظر داد

چه چیزی می تواند API Legacy را برای فراخوانی API ایده آل به ما کمک کند؟

هنگامی که رله کاملاً همه چیز را مجدداً اجرا می کرد ، این کتابخانه به "کلاسیک" ، "مدرن" و "سازگار" پرداخت.

این قطعاً به معنای محدود کردن یا نفخ های API جدید نیست. ما هنوز هم می توانیم کروفت قدیمی را پشت سر بگذاریم. به تدریج بازسازی API قدیمی با استفاده از API جدید به ما این امکان را می دهد تا از روز اول مورد جدید را در تولید قرار دهیم تا بتوانیم اطمینان حاصل کنیم که در حال ساختن چیزی هستیم که در واقع کار می کند.

Kevinheavey در 20 مه 2022 اظهار نظر کرد • ویرایش شده

من می خواهم اضافه کنم که اگر Web3. JS یک API مشابه با Rust SDK داشته باشد ، خوب است. در حال حاضر آن را شبیه به Rust SDK است ، و اجرای اصول 1 و 2 باعث می شود کمتر شبیه شود. آنها اصول خوبی هستند ، و Rust SDK احتمالاً باید آنها را نیز اتخاذ کند.

(سهم من در این مورد این است که من روی Solana-Py بسیار کار می کنم ، که بیشتر از Web3. js تقلید می کند ، و این که من قصد دارم یک بسته بندی پایتون را برای Rust SDK منتشر کنم.)

عضو Mvines در 20 مه 2022 اظهار نظر کرد

ساختن Solana-SDK برای WASM برای جلوگیری از نوشتن مجدد کلیه منطق بسته بندی معامله و غیره در Web3. js بسیار باشکوه خواهد بود. این یک رویای لوله از همیشه برای همیشه بوده است. ما واقعاً نزدیک هستیم

نویسنده همکار استیلوشچر در 21 مه 2022 نظر داد

ساختن Solana-SDK برای WASM برای جلوگیری از نوشتن مجدد کلیه منطق بسته بندی معامله و غیره در Web3. js بسیار باشکوه خواهد بود.

برای انجام دادن این موضوع متشکریم! من این را چند بار شنیده ام. من واقعاً نمی خواستم در مورد این صفحه وب خاص به آن بحث خاص بپردازم ، اما اینجا هستیم :)

من نگرانی های زیادی در مورد برنامه ترکیب متقابل WASM دارم. من نمی دانم که آنها تأسیس شده اند.

  1. من فکر می کنم که حمل و نقل یک باینری WASM واقعاً تلاش های ما را برای سازگاری Web3. js با بهینه سازی کامپایلرها خنثی می کند. این ممکن است ما را حتی از وضعیتی که در آن یک کامپایلر بهینه کننده می تواند قسمت هایی از Web3. js را که می توانیم از نظر آماری تعیین کنیم غیرقابل دستیابی است ، از بین ببرد زیرا DAPP از آنها استفاده نمی کند.
  2. در فیس بوک ما برای انجام برخی از دستکاری های تصویر در مرورگر ، باینری های WASM را حمل کردیم. بر اساس کار من در آنجا ، من نگران زمان کامپایل WASM هستم. حتی با API کامپایلر.
    • با WASM قبل از استفاده از هر یک از آن ، باید کل برنامه را کامپایل و اولیه کنید. Web3. JS اغلب در مسیر راه اندازی یک DAPP درگیر خواهد شد. من نمی خواهم شروع به راه اندازی برنامه در مورد هر چیزی که لازم نیست منتظر بمانم.
    • JavaScript Lazily Parses و JITS Code On Demand ، همانطور که از آن استفاده می کنید.
  3. من همچنین عمیقاً نگران حمل و نقل داده ها در مرز WASM/JS هستم. ویژگی اصلی جبهه های عملکردی (به عنوان مثال با استفاده از React) مدل سازی وضعیت جهان با استفاده از ساختارهای داده غیرقابل تغییر است. انجام این کار مسیری سریع به شما می دهد تا بدانید کدام قسمت از UI را دوباره ارائه می دهد ، و کدام قسمت ها می توانند به یاد داشته باشند. من می ترسم که مجبور شدن به داده های کشتی در مرز ممکن است توانایی ما در آزمایش برابری مرجع بین دو ساختار داده را تجزیه کند ، و یادآوری کارآمد UIS بسیار دشوار است.

عضو Mvines در 21 مه 2022 اظهار نظر کرد

به نظر می رسد قبل از تصمیم گیری برخی از تحقیقات لازم است

همکار Mschneider در 21 مه 2022 نظر داد

همچنین برنامه های وب را با استفاده از WASM در حال حاضر ارسال کرده و واقعاً ارزش آن را دارد ، اگر مشکلی دارید که به دلیل مشکلات عملکرد زمان اجرا در JS معمولی قابل حل نیست. معمولاً در نهایت نوشتن کد پلنگ زمان اجرا نیز در نهایت. کاملاً با سنجش استیو از اشکالاتی از WASM موافق نیست ، هیچ ناهار رایگان وجود ندارد.

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

DTMRC در 21 مه 2022 اظهار نظر کرد • ویرایش شده

"مانیفست" ، انتخاب عالی کلمه در آب و هوا و وضعیت فعلی. گزینه های باینری...

ما را در سایت گزینه های باینری دنبال می کنید

برچسب : نویسنده : هایده حائری بازدید : <-PostHit-> تاريخ : دوشنبه 12 تير 1402 ساعت: 18:34