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

مراحل طراحی سیستم Referral

1. تعریف قرارداد

در ابتدا، قرارداد را تعریف می‌کنیم که شامل اطلاعات مربوط به کاربران و معرفی‌ها باشد.

2. نوشتن کد

در زیر یک مثال ساده از قرارداد referral آورده شده است:

// SPDX-License-Identifier: MIT
pragma solidity ^.8.;

contract ReferralSystem {
    struct User {
        address referrer; // آدرس معرف
        uint256 referralCount; // تعداد معرفی‌ها
        uint256 rewards; // پاداش‌ها
    }

    mapping(address => User) public users; // نگهداری اطلاعات کاربران
    mapping(address => bool) public isRegistered; // بررسی ثبت‌نام کاربر
    address public owner; // مالک قرارداد

    event Registered(address indexed user, address indexed referrer);
    event RewardPaid(address indexed user, uint256 rewardAmount);

    constructor() {
        owner = msg.sender; // تنظیم مالک به آدرس ایجادکننده
    }

    // تابع برای ثبت‌نام کاربر با معرف
    function register(address _referrer) public {
        require(!isRegistered[msg.sender], "شما قبلاً ثبت‌نام کرده‌اید.");
        require(_referrer != msg.sender, "نمی‌توانید به خودتان ارجاع دهید.");

        users[msg.sender] = User({
            referrer: _referrer,
            referralCount: ,
            rewards: 
        });

        isRegistered[msg.sender] = true;
        emit Registered(msg.sender, _referrer);
    }

    // تابع برای پرداخت پاداش به معرف
    function payReward(address _user) public {
        require(isRegistered[_user], "این کاربر ثبت‌نام نکرده است.");
        require(msg.sender == owner, "فقط مالک می‌تواند پاداش پرداخت کند.");

        address referrer = users[_user].referrer;
        users[referrer].referralCount += 1;
        users[referrer].rewards += 1 ether; // فرض بر این است که پاداش 1 آدرس اتر است

        emit RewardPaid(referrer, 1 ether);
    }

    // تابع برای برداشت پاداش
    function withdrawRewards() public {
        uint256 rewardAmount = users[msg.sender].rewards;
        require(rewardAmount > , "هیچ پاداشی برای برداشت وجود ندارد.");

        users[msg.sender].rewards = ; // تنظیم مجدد پاداش
        payable(msg.sender).transfer(rewardAmount);
    }

    // تابع fallback برای پذیرش اتر
    receive() external payable {}
}

آموزش سالیدیتی

توضیحات عملکرد کد

  1. ساختار کاربر (User): اطلاعات کاربر شامل آدرس معرف، تعداد معرفی‌ها و پاداش‌ها است.

  2. نگهداری اطلاعات کاربران:

    • users: برای ذخیره‌سازی اطلاعات مربوط به کاربران.
    • isRegistered: برای بررسی اینکه آیا کاربر قبلاً ثبت‌نام کرده یا نه.
  3. ثبت‌نام کاربر: تابع register کاربران را با مشخص کردن آدرس معرف ثبت‌نام می‌کند. اجازه نمی‌دهد کاربر به خود ارجاع دهد.

  4. پرداخت پاداش: تابع payReward توسط مالک برای پرداخت پاداش به معرف کاربر فراخوانی می‌شود و پاداش را به آدرس معرف اضافه می‌کند.

  5. برداشت پاداش: تابع withdrawRewards به کاربران اجازه می‌دهد تا پاداش‌های خود را برداشت کنند.

  6. پذیرش اتر: تابع receive برای پذیرش اتر به قرارداد اضافه شده است.

نتیجه‌ گیری

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