جلسه هفتم (اسلاید‌ها و بقیه منابع)

جلسه هفتم

در جلسه هفتم دوره برنامه نویسی قرارداد هوشمند ابتدا مباحث باقی مانده از جلسه ششم تدریس میشود. در ابتدا نوع داده استراکچر و مپینگ توضیح داده میشود. انواع حافظه های در برنامه نویسی قرارداد هوشمند بررسی میشود و با هم مقایسه میشوند. در انتهای مباحث فصل ششم در مورد inline assembly و فایل ABI توضیحاتی ارائه میگردد.

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


Youtube

در این جلسه قسمت دوم اسلایدهای جلسه ششم و در ادامه مطالب جلسه هفتم تدریس می شود.

11 پسندیده

ممنون ولی فکر کنم لینک سایر منابع به صفحه جلسه قبل وصل میشه

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

1 پسندیده

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

1 پسندیده

ممنون چون میخواستم الان بگم فایل پی دی اف اسلایدها هم مربوط به جلسه هفت نیست که شما گفتین همون فایل پی دی اف جلسه قبل هستش

سلام
State variable دقیقا تو اون مقایسه call و delegatecall چی هست که چطور بستگی داره به این پارامتر call ؟

کدوم بهتره برا کانترکت حالا به صورت جدا از هم از نظر اقتصادی و امنیتی که call باشه یا delegate call ؟
وآیا در فرخوانی کانترکت های دیگه ای که توسط دیگران درست شده از همین روش فراخوانی می شود ؟

و در قسمت مشخص شده تفاوتشون چیه چون انگاری در جلسه گفتید فرقی ندارند ولی در اولیه call وجود نداره و ساده تر به نظر میاد


و در delegatecall گفتید وقتی استفاده می کنیم که دوتا کانترکت رو خودمان نوشته باشیم خوب باز هم در این شرایط مشکل امنیتی دارد ؟

منظور از state variable متغیرهایی است که مقادیر آنها به طور دائمی در storage (فضای بلاکچین) ذخیره میشه

اینکه کدوم بهتره بستگی داره شما درون کدتون به کدومش نیاز دارید.
از لحاظ امنیتی هم باید هنگام استفاده از delegatecall بیشتر حواستون باشه چون دسترسی به state variable های کانترکت اصلی ایجاد میشه
راجب سوال دومتون هم میتونید داخل گیت هاب برنامه نویس های دیگه کد هاشون رو بخونید. نحوه فراخونی بسته به نیاز شما هنگام انجام پروژه فرق داره.

فرقشون اینه در setBaseNum شما مستقیما کانترکت Base رو فراخونی کردی و از اون یک object ساختی
ولی در callSetNum با استفاده از آدرس کانترکت Base اون رو فراخونی کردی
در مورد delegatecall هم باید کانترکت رو طوری بنویسید که به غیر از مالک کانترکت شخص دیگری نتونه ادرس دلخواهش رو بده و کانترکت دلخواهش رو delegatecall کنه

2 پسندیده

سلام و خسته نباشین، در جلسه هفتم خانم @Aysha یه کدی رو داخل remix کپی میکنن. (برای نشون دادن call کردن)
اگه امکانش هست اون دستوری که تو کادر مشخص کردم رو ساده‌تر توضیح بدین چون اصلا با syntax دستور آشنا نیستم و متوجه نمیشم چه اتفاقی میفوته
ما با اجرای فانکشن getBaseX یه ورودی به اسم baseAddress میدیم بعدش
با دستور Base baseContract میایم یه متغیر داخل کانترکت Base تعریف میکنیم؟ یا از جنس کانترکت؟ یا چی؟
و در ادامه دستور Base(baseAddress) چیکار میکنه؟ با نوشتن اسم یه متغیر داخل پرانتز و نام کانترکت بیرون پرانتز چه اتفاقی می افته؟

در اینجا شما یک object (نمونه یا شئ) از کانترکت Base درست میکنید و با baseAddress آدرس کانترکت Base ای که میخوای ازش یه ابجکت بسازی رو مشخص میکنی.
baseContract یک ابجکت از کانترکت Base است

3 پسندیده

سلام
تو بازی cryptozombies گفته شده ( We’re also providing instructions about where the _name variable should be stored- in memory . This is required for all reference types such as arrays, structs, mappings, and strings.)
یعنی اگر ما بخواهیم متغیری در تابع که از جنس arrays,structs,mapping, strings هست تعریف کنیم حتما باید محل ذخیره سازیش رو تعیین کنیم؟و اینکه باید memory باشه؟
مرسی

1 پسندیده

ممنون دوست عزیز بابت توضیحاتت
پس ما در واقع یک object ساختیم از کانترکت B، این object چه ویژگی هایی رو از کانترکت B داره؟
و اینکه چرا برابر قرارش میدیم با Base(baseAddress) چرا برابر قرار نمیگیره با خود baseAddress؟

خواهش میکنم

برای مثال میتونید از فانکشن های اون کانترکت استفاده کنید همونطور که در کد بالا از تابع getx استفاده کرده

استاندارد برنامه نویسی به این صورت تعریف شده

2 پسندیده

یه توضیح کلی میدم امیدوارم جواب سوالتون رو بگیرید
هنگام که مثلا ارایه ای دارید مانند زیر

uint[] numbers;

حالا داخل تابع میخواهید از خونه ای خاص از اون ارایه استفاده کنید

uint storage mynumber = numbers[2];
mynumber = 43;

هنگامی که به صورت بالا استفاده میکنید mynumber اشاره گری به numbers[2] است
که با تغییر mynumber مقدار numbers[2] روی بلاکچین تغییر میکنه
اما وقتی به صورت زیر تعریف میکنی

uint memory mynumber = numbers[2];
mynumber = 34;

mynumber در واقع یک کپی از numbers[2] است که زمانی شما mynumber رومقدار میدی تغییری در مقدار numbers[2] ایجاد نمیشه و فقط مقدار mynumber تغییر میکنه
و اینکه مقدار mynumber درون memory کپی شده و بعد از اتمام تابع از بین میره.

3 پسندیده

باسلام
خیلی ممنون از پاسختون @Mohammadd
من بحث اخر جلسه در مورد اپدیت کانترکت ها (توضیحات دکتر اسکندری) رو متوجه نشدم . مقاله ای هست کامل توضیح داده باشه این موضوع رو؟
ممنون

1 پسندیده

سلام مجدد میتونید این مقاله رو بخونید

2 پسندیده

خیلی ممنون از مقاله
فقط من یه نکته رو متوجه نشدم چطور می شه ما هر دفعه ادرس کانترکت جدید رو توی اون رجیستری کانترکت رجیستر می کنیم ؟ منظورم اینه کانترکت ها مگه غیر قابل تغییر نبودن؟

1 پسندیده

ادرس contract جدید یه value است که توسط مالک اون کانترکت داده میشه و میتونه عوض کنه
منظور از غیر قابل تغییر بودن کد های کانترکت غیر قابل تغییر هستند
ولی متغیر هارو میتونید مقدار جدید بهشون بدید مانند متغیری که ادرس کانترکت رو ذخیره میکنه

4 پسندیده