در جلسه هفتم دوره برنامه نویسی قرارداد هوشمند ابتدا مباحث باقی مانده از جلسه ششم تدریس میشود. در ابتدا نوع داده استراکچر و مپینگ توضیح داده میشود. انواع حافظه های در برنامه نویسی قرارداد هوشمند بررسی میشود و با هم مقایسه میشوند. در انتهای مباحث فصل ششم در مورد inline assembly و فایل ABI توضیحاتی ارائه میگردد.
در شروع جلسه هفتم باهم یک قرارداد کوچک را می نویسیم و اجرا میکنیم.در مورد فراخوانی بین قراردادی صحبت میکنیم و با کد سالیدیتی و در محیط ریمیکس فراخوانی را تست میکنیم.
کدوم بهتره برا کانترکت حالا به صورت جدا از هم از نظر اقتصادی و امنیتی که call باشه یا delegate call ؟
وآیا در فرخوانی کانترکت های دیگه ای که توسط دیگران درست شده از همین روش فراخوانی می شود ؟
اینکه کدوم بهتره بستگی داره شما درون کدتون به کدومش نیاز دارید.
از لحاظ امنیتی هم باید هنگام استفاده از delegatecall بیشتر حواستون باشه چون دسترسی به state variable های کانترکت اصلی ایجاد میشه
راجب سوال دومتون هم میتونید داخل گیت هاب برنامه نویس های دیگه کد هاشون رو بخونید. نحوه فراخونی بسته به نیاز شما هنگام انجام پروژه فرق داره.
فرقشون اینه در setBaseNum شما مستقیما کانترکت Base رو فراخونی کردی و از اون یک object ساختی
ولی در callSetNum با استفاده از آدرس کانترکت Base اون رو فراخونی کردی
در مورد delegatecall هم باید کانترکت رو طوری بنویسید که به غیر از مالک کانترکت شخص دیگری نتونه ادرس دلخواهش رو بده و کانترکت دلخواهش رو delegatecall کنه
سلام و خسته نباشین، در جلسه هفتم خانم @Aysha یه کدی رو داخل remix کپی میکنن. (برای نشون دادن call کردن)
اگه امکانش هست اون دستوری که تو کادر مشخص کردم رو سادهتر توضیح بدین چون اصلا با syntax دستور آشنا نیستم و متوجه نمیشم چه اتفاقی میفوته
ما با اجرای فانکشن getBaseX یه ورودی به اسم baseAddress میدیم بعدش
با دستور Base baseContract میایم یه متغیر داخل کانترکت Base تعریف میکنیم؟ یا از جنس کانترکت؟ یا چی؟
و در ادامه دستور Base(baseAddress) چیکار میکنه؟ با نوشتن اسم یه متغیر داخل پرانتز و نام کانترکت بیرون پرانتز چه اتفاقی می افته؟
…
در اینجا شما یک object (نمونه یا شئ) از کانترکت Base درست میکنید و با baseAddress آدرس کانترکت Base ای که میخوای ازش یه ابجکت بسازی رو مشخص میکنی.
baseContract یک ابجکت از کانترکت Base است
سلام
تو بازی 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 باشه؟
مرسی
ممنون دوست عزیز بابت توضیحاتت
پس ما در واقع یک object ساختیم از کانترکت B، این object چه ویژگی هایی رو از کانترکت B داره؟
و اینکه چرا برابر قرارش میدیم با Base(baseAddress) چرا برابر قرار نمیگیره با خود baseAddress؟
هنگامی که به صورت بالا استفاده میکنید mynumber اشاره گری به numbers[2] است
که با تغییر mynumber مقدار numbers[2] روی بلاکچین تغییر میکنه
اما وقتی به صورت زیر تعریف میکنی
uint memory mynumber = numbers[2];
mynumber = 34;
mynumber در واقع یک کپی از numbers[2] است که زمانی شما mynumber رومقدار میدی تغییری در مقدار numbers[2] ایجاد نمیشه و فقط مقدار mynumber تغییر میکنه
و اینکه مقدار mynumber درون memory کپی شده و بعد از اتمام تابع از بین میره.
باسلام
خیلی ممنون از پاسختون @Mohammadd
من بحث اخر جلسه در مورد اپدیت کانترکت ها (توضیحات دکتر اسکندری) رو متوجه نشدم . مقاله ای هست کامل توضیح داده باشه این موضوع رو؟
ممنون
خیلی ممنون از مقاله
فقط من یه نکته رو متوجه نشدم چطور می شه ما هر دفعه ادرس کانترکت جدید رو توی اون رجیستری کانترکت رجیستر می کنیم ؟ منظورم اینه کانترکت ها مگه غیر قابل تغییر نبودن؟
ادرس contract جدید یه value است که توسط مالک اون کانترکت داده میشه و میتونه عوض کنه
منظور از غیر قابل تغییر بودن کد های کانترکت غیر قابل تغییر هستند
ولی متغیر هارو میتونید مقدار جدید بهشون بدید مانند متغیری که ادرس کانترکت رو ذخیره میکنه