برنامه نویسی

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

برای توسعه دهندگان که به دنبال ساختن بر روی blockchain Aptos هستند ، درک ساختار و توانایی های حرکت فقط مفید نیست بلکه کاملاً ضروری است. این دو مفهوم همان بستر است که بر روی آن هر ماژول حرکتی ساخته شده است ، به خصوص هنگام ایجاد دارایی های دیجیتالی مانند توکن ها ، از جمله آنهایی که مطابق با استاندارد دارایی قارچ مدرن (FA) در APTO هستند.

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

ذاتاً مرتبط با ساختارها توانایی هایی هستند. اینها کلمات کلیدی هستند که خصوصیات و رفتارهای اساسی انواع داده های سفارشی شما را دیکته می کنند. توانایی ها چگونگی استفاده از ساختار ، کپی ، ذخیره شده یا کاهش یافته را تعریف می کنند و به عنوان نگهبان های مهم برای تضمین های ایمنی منابع مشهور APTOS حرکت می کنند. هر ساختاری که شما تعریف می کنید ذاتاً از این توانایی ها برخوردار خواهد بود ، و به طور مستقیم بر نحوه تعامل آن در ماژول شما و در سراسر وضعیت جهانی blockchain تأثیر می گذارد.

این راهنما ساختارها و توانایی ها را ساده می کند و بدون آنکه دقت فنی را فنی کند ، آنها را قابل اعتماد و آسان می کند. ما بررسی خواهیم کرد که چگونه ساختارها تعریف می شوند ، هر توانایی نشان می دهد و به طور مهم ، نحوه همکاری آنها برای فعال کردن مدیریت ایمن و کارآمد دارایی های دیجیتال. شما می آموزید که چگونه این مفاهیم زیربنای ایجاد نشانه ها هستند ، جایی که دارایی ها اغلب به عنوان ساختارهای ویژه ای به نام “منابع” نشان داده می شوند: انواع داده های منحصر به فرد که نمی توانند کپی یا به طور ضمنی دور ریخته شوند. در پایان ، شما می توانید درک خوبی از نحوه استفاده از ساختارها و توانایی های برای نوشتن قراردادهای هوشمند ایمن ، سازنده و کارآمد در APTOS داشته باشید ، و به شما در ساخت DAPP های قانع کننده و تعریف دارایی های دیجیتال ارزشمند خود کمک می کنید. بیایید وارد شویم!

ساختار: طرح های داده های سفارشی شما

همانطور که گفته شد ، یک ساختار در حال حرکت مانند یک طرح سفارشی یا الگویی برای ایجاد انواع داده های خود است. این امکان را به شما می دهد تا اطلاعات مرتبط با آن را به نام “زمینه ها” به یک واحد واحد و سازمان یافته گروه بندی کنید. این شبیه سازه ها به زبان های دیگر مانند Rust یا C است ، اما با محدودیت های قوی تر در حال حرکت به دلیل مدل منبع گرا آن است.

ما چهار مرحله را طی خواهیم کرد:

  1. هیچ توانایی ای برای استفاده بیشتر در دنیای واقعی کامپایل نخواهد شد
  2. اضافه کردن قطره → می تواند دور شود
  3. اضافه کردن فروشگاه → می تواند در ذخیره جهانی ذخیره شود
  4. اضافه کردن کلید → می تواند در زیر حساب منتشر شود

حداقل Token struct – بدون توانایی

بیایید با یک ساختار ساده و بدون توانایی شروع کنیم: تعریف یک ساختار توکن. توجه داشته باشید که یک ساختار باید در داخل یک ماژول تعریف شود

module my_address::token_copy {
    use std::signer;
    use std::string::{Self, String};

    struct Token {
        name: String,
        supply: u64,
    }
    //functions go here
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در این مثال:

struct Token { ... } ساختار جدیدی را به نام اعلام می کند Tokenبشر آن را نگه می دارد name، که نام توکن است ، و supply: u64، که کل عرضه توکن را به عنوان یک عدد صحیح 64 بیتی امضا نمی کند.

هر زمان که نمونه ای از آن ایجاد کنید Token، به طور مداوم این دو قسمت را خواهد داشت ، اطمینان حاصل می کند که داده های شما همیشه به خوبی ساختار یافته است.

توانایی ها: مجوزها و قدرت داده های شما

اگر ساختارها طرح داده های شما هستند ، توانایی ها قوانین یا مجوزهایی هستند که نشان می دهد که چگونه می توان نمونه های این ساختارها را توسط MoveVM اداره کرد. آنها برای حرکت مدل امنیتی ، به ویژه ضمانت های “ایمنی منابع” آن اساسی هستند. هر ساختاری که تعریف می کنید با یک یا چند از چهار توانایی اصلی می توان اعلام کرد.

چهار توانایی اصلی

در drop توانایی

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

این فقط برای مدیریت حافظه در هنگام اجرای استفاده می شود … مربوط به انتشار یا ذخیره سازی نیست.

آنچه با VS بدون قطره اتفاق می افتد

ابتدا ، ما ایجاد/فوری خواهیم کرد Token ساختار بدون drop امکان مشاهده چگونگی اجرای حرکت صریح ارزش گذاری

module my_address::token_drop {
    use std::signer;
    use std::string::{Self, String};

    struct Token {
        name: String,
        supply: u64,
    }

    public entry fun initialize(admin: &signer, name: String, supply: u64) {
        let token = Token {
            name,
            supply,
        };
    }

}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

بدون قطره ، Token نمی توان با پایان یافتن عملکرد ، از این رو خطای زیر را دور ریخت. شما باید مالکیت را منتقل کنید یا صریحاً آن را نابود کنید.

پیام خطای تلفیقی که کد نشان می دهد بدون توانایی افت در APTOS حرکت نمی کند

برای رفع این مسئله ، باید اضافه کنیم drop توانایی ساختار توکن.

module my_address::token_drop {
    use std::signer;
    use std::string::{Self, String};

    struct Token has drop {
        name: String,
        supply: u64,
    }

    public entry fun initialize(admin: &signer, name: String, supply: u64) {
        let token = Token {
            name,
            supply,
        };
    }

}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در حالت ایده آل ، یک نشانه نباید قابل قطره باشد.

این با نتیجه زیر کامپایل می شود:

کد با توانایی افت با موفقیت کامپایل می کند

در copy توانایی

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

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

چه اتفاقی می افتد با VS بدون copy

در زیر نمونه ای از کد بدون توانایی کپی آورده شده است.

module my_address::token_copy {
    use std::signer;
    use std::string::{Self, String};

    struct Token has drop {
        name: String,
        supply: u64,
    }

    fun consume_token(t: Token){}

    public entry fun initialize(admin: &signer, name: String, supply: u64) {
        let token = Token {
            name,
            supply,
        };

        consume_token(token);
        consume_token(token);
    }

}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

پس از Token نیست copyقادر ، تماس consume_token(token) مقدار را حرکت می دهد. بعد از این تماس ، token نمی توان دوباره استفاده کرد زیرا مالکیت آن منتقل شده است.

تلاشی برای عبور token دوباره به خطا منجر می شود و کامپایل نمی شود.

پیام خطا را اینجا ببینید:

پیام خطای تلفیقی که نشان می دهد کد بدون توانایی کپی در APTOS Move کار نمی کند

حالا بیایید اضافه کنیم copy توانایی نشانه گذاری

module my_address::token_copy {
    use std::signer;
    use std::string::{Self, String};

    struct Token has drop, copy {
        name: String,
        supply: u64,
    }

    public entry fun initialize(admin: &signer, name: String, supply: u64) {
        let token = Token {
            name,
            supply,
        };

        consume_token(token);
        consume_token(token);
    }

     fun consume_token(t: Token){}
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در حالت ایده آل ، یک نشانه نباید کپی شود.

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

همچنین می توانید با نوشتن عملیات کپی را صریح دهید consume_token(copy token)، که نشان می دهد token مقدار باید قبل از انتقال به عملکرد کپی شود.

در key توانایی

در APTOS Move ، یک ساختار هنگامی که توانایی اصلی را داشته باشد (و به طور معمول ذخیره می شود) به یک منبع تبدیل می شود. این ترکیب ساختار را به عنوان یک نوع داده پایدار و مداوم حساب می کند که می تواند در ذخیره جهانی ذخیره شود. در اینجا توضیحات قطعی آورده شده است:

struct Token has key, store {  // this is a resource
    name: String,
    supply: u64
}

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

اگر یک ساختار توانایی اصلی را داشته باشد ، به طور خودکار توانایی فروشگاه را دارد ، حتی اگر صریحاً اعلام نشده باشد.

در key توانایی به معنای ساختار است ، در این حالت Token، می تواند در ذخیره جهانی ذخیره شود و از همان قابل دسترسی است. این باعث می شود Token یک منبع

ویژگی های اصلی منابع:

انباره جهانی

عملیات پیرامون ذخیره جهانی برای عملکرد key توانایی

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

اپراتورهای ذخیره جهانی

تصویر از اسناد APTOS که اپراتورهای مختلف ذخیره سازی جهانی را نشان می دهد
منبع تصویر: اسناد APTOS

این اپراتورها همه با آنها کار می کنند key توانایی

نمونه

module my_address::token_key {
    use std::signer;
    use std::string::{Self, String};

    struct Token has key {
        name: String,
        supply: u64,
    }

    public entry fun initialize(admin: &signer, name: String, supply: u64) {
        let token = Token {
            name,
            supply,
        };

        move_to(admin, token); // move the token to the admin's account
    }   
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

کد فوق با موفقیت کامپایل می کند.

move_to(admin, token);
نشانه را تحت حساب مدیر در ذخیره جهانی ذخیره می کند. به همین دلیل است که Token به توانایی اصلی نیاز دارد.

بدست می آورد

در acquires کلمه کلیدی در Move برای بیان صریح استفاده می شود که یک تابع ممکن است به نوع منبع ذخیره شده در ذخیره جهانی دسترسی یا اصلاح کند. این یک ویژگی ایمنی است که تضمین می کند کامپایلر می داند با کدام منابع با چه عملکردی در ارتباط است.

  • این حاشیه نویسی به کامپایلر حرکت می گوید که این عملکرد به Resource از ذخیره جهانی

  • هر زمان که یک عملکرد باشد لازم است:

    • یک منبع را می خواند (Borrow_global)
    • یک منبع را اصلاح می کند (borrow_global_mut)
    • یک منبع را حذف می کند (move_from)

مثال با استفاده از acquires کلمه کلیدی توجه داشته باشید که این یک کد اساسی است.

module my_address::token_key {
    use std::signer;
    use std::string::{Self, String};

    struct Token has key {
        name: String,
        supply: u64,
    }

    public entry fun initialize(admin: &signer, name: String, supply: u64) {
        let token = Token {
            name,
            supply,
        };

        move_to(admin, token); // move the token to the admin's account
    }

//use acquires
    public fun get_balance(addr: address): u64 acquires Token {
        let token = borrow_global(addr);
        token.supply
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در کد بالا ، acquires اعطا می کند get_balance دسترسی عملکرد به منبع توکن.

در borrow_global(addr); یک مرجع تغییر ناپذیر به منبع توکن ذخیره شده در ADDR می شود ، مرجعی را باز می گرداند که به خواندن اجازه می دهد اما اصلاح نمی شود.

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

در store توانایی

و اکنون ، به store توانایی
با توجه به اسناد حرکت Aptos ،

در store توانایی اجازه می دهد تا مقادیر انواع با این توانایی در داخل یک ساختار (منبع) در ذخیره جهانی وجود داشته باشد ، اما لزوماً به عنوان یک منبع سطح بالا در ذخیره جهانی نیست. این تنها توانایی ای است که مستقیماً یک عملیات را به خود اختصاص نمی دهد. درعوض ، در هنگام استفاده از پشت سر هم ، وجود خود را در ذخیره جهانی دروازه می کند keyبشر

این ساده است.

module my_address::token_store {
    use std::signer;
    use std::string::{Self, String};

    struct Token has key, store {
        name: String,
        supply: u64,
    }

    struct Vault has key {
        token: Token,
    }

    /// initialize a Vault that wraps a Token and store it in the signer's account
    public entry fun initialize(admin: &signer, name: String, supply: u64) {
        let token = Token {
            name,
            supply,
        };

        let vault = Vault {
            token,
        };

        move_to(admin, vault); 
    }


    public fun get_token_supply(addr: address): u64 acquires Vault {
        let vault = borrow_global(addr);
        vault.token.supply
    }
}

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

اگر سعی کنیم این را بدون store توانایی در Token، کامپایلر خطایی را به وجود می آورد زیرا ذخیره یک مقدار در یک ساختار دیگر به آن نیاز دارد store توانایی برای دیدن خطای خودتان می توانید آن را از بین ببرید.

الزامات توانایی ساختار در APTOS حرکت می کند

قانون طلایی:

هنگامی که یک ساختار توانایی دارد ، تمام زمینه های آن باید داشته باشند:

یک نمودار ساده که رفتارهای متفاوتی از ساختارها با توانایی های مربوطه در Aptos را نشان می دهد

چرا این مهم است:

  • کپی+drop = داده های موقت

  • کلید+فروشگاه = منابع ذخیره سازی جهانی

  • از ترکیبات ناامن در زمان کامپایل جلوگیری می کند

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

چگونه این قوانین را در قرارداد هوشمند بعدی خود اعمال خواهید کرد؟

می توانید به نمونه های GitHub دسترسی پیدا کنید.

اکنون می توانید در توییتر به من برسید. X.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا