ساخت یک قرارداد مزایده (auction contract) در زبان سالیدیتی یک فرایند جالب و چالش‌برانگیز است. در این مقاله، ما به بررسی چگونگی ایجاد یک قرارداد مزایده ساده خواهیم پرداخت. در این قرارداد، کاربران می‌توانند پیشنهادات خود را برای خرید یک کالای خاص ارائه دهند، و در نهایت، بالاترین پیشنهاددهنده به عنوان برنده مزایده انتخاب می‌شود.

ویژگی‌ های قرارداد مزایده با سالیدیتی

قبل از نوشتن کد، بیایید برخی از ویژگی‌ها و عملکردهای قرارداد مزایده‌مان را تعیین کنیم:

  1. مالکیت: فقط مالک قرارداد می‌تواند مزایده را راه‌اندازی کند.
  2. پیشنهادات: کاربران می‌توانند پیشنهادات خود را برای خرید کالا ارائه دهند.
  3. پایان مزایده: مزایده پس از گذشت زمان مشخصی یا با دستور مالک پایان می‌یابد.
  4. برنده: پس از پایان مزایده، بالاترین پیشنهاددهنده به عنوان برنده معرفی می‌شود.

آموزش سالیدیتی + 5 پروژه عملی

نوشتن قرارداد

حال که ویژگی‌های مورد نظر را مشخص کردیم، بیایید کد سالیدیتی خود را بنویسیم:

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

contract Auction {
    address public owner;
    address public highestBidder;
    uint public highestBid;
    uint public auctionEndTime;
    bool public ended;

    event NewBid(address indexed bidder, uint amount);
    event AuctionEnded(address winner, uint amount);

    constructor(uint _biddingTime) {
        owner = msg.sender; // تنظیم مالک به آدرس ایجادکننده
        auctionEndTime = block.timestamp + _biddingTime; // زمان پایان مزایده
        ended = false;
    }

    function bid() public payable {
        require(block.timestamp < auctionEndTime, "مزایده پایان یافته است.");
        require(msg.value > highestBid, "پیشنهاد شما باید بالاتر از پیشنهاد قبلی باشد.");

        if (highestBid > ) {
            // بازگشت پول به پیشنهاد دهنده قبلی
            payable(highestBidder).transfer(highestBid);
        }

        highestBidder = msg.sender; // به‌روزرسانی بالاترین پیشنهاد دهنده
        highestBid = msg.value; // به‌روزرسانی بالاترین پیشنهاد

        emit NewBid(msg.sender, msg.value);
    }

    function endAuction() public {
        require(msg.sender == owner, "تنها مالک می‌تواند مزایده را پایان دهد.");
        require(block.timestamp >= auctionEndTime, "مزایده هنوز به پایان نرسیده است.");
        require(!ended, "مزایده قبلاً پایان یافته است.");

        ended = true;
        emit AuctionEnded(highestBidder, highestBid);
    }
}

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

  1. تعریف متغیرها: در ابتدا متغیرهایی برای مالک، بالاترین پیشنهاددهنده، بالاترین پیشنهاد، زمان پایان مزایده و وضعیت مزایده تعریف شده است.

  2. سازنده قرارداد: در سازنده، آدرس ایجادکننده به عنوان مالک ثبت می‌شود و زمان پایان مزایده محاسبه می‌گردد.

  3. تابع bid: کاربر می‌تواند با فراخوانی این تابع و پرداخت مبلغ مشخصی، پیشنهاد خود را ارائه دهد. این تابع حاوی بررسی‌هایی است که اطمینان حاصل می‌کند پیشنهاد جدید بالاتر از پیشنهاد قبلی باشد و در صورت وجود پیشنهاد قبلی، مبلغ آن به پیشنهاددهنده قبلی بازگردانده می‌شود.

  4. تابع endAuction: این تابع تنها می‌تواند توسط مالک قرارداد فراخوانی شود و اجازه می‌دهد تا مزایده به پایان برسد. در این حالت، وضعیت مزایده به حالت پایان یافته تغییر می‌کند و رویداد مربوطه ثبت می‌شود.

نتیجه‌ گیری

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