آموزش منطق و مقدمات برنامه نویسی به همراه الگوریتم و فلوچارت آموزش منطق و مقدمات برنامه نویسی به همراه الگوریتم و فلوچارت
021-88146330
021-88146323
0

سبد خرید شما خالی است!

هم سو با آینده

اخبار فناوری و هوش مصنوعی

ورود / ثبت‌نام

ورود کاربر جدید هستید؟ ثبت نام کنید
دسته بندی
زبان برنامه‌نویسی سالیدیتی

آموزش نوشتن قراردادهای هوشمند با زبان سالیدیتی Solidity

آموزش نوشتن قراردادهای هوشمند با زبان سالیدیتی Solidity

مقدمه

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

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

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

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

سالیدیتی چیست

سالیدیتی چیست سالیدیتی، رویکردی جذاب برای نوشتن کد است که با استفاده از اصولی مانند SOLID، کد را ساده‌تر، قابل نگهداری‌تر و انعطاف‌پذیرتر می‌کند، بدون اینکه بیش از حد پیچیده شود.

سالیدیتی (Solidity)، زبان برنامه‌نویسی اصلی برای نوشتن قراردادهای هوشمند است که بر روی بلاکچین‌ها مانند اتریوم اجرا می‌شوند. این زبان که در ابتدا توسط گاوین وود، یکی از بنیان‌گذاران اتریوم، معرفی شد، به منظور ایجاد یک محیط برنامه‌نویسی استاندارد برای اجرای قراردادهای خودکار بر روی بلاکچین طراحی شده است.

چرا سالیدیتی مهم است؟

سالیدیتی با ارائه ساختاری شبیه به زبان‌های مدرن برنامه‌نویسی مانند JavaScript و C++, برنامه‌نویسان را قادر می‌سازد تا بدون نیاز به یادگیری مفاهیم پیچیده بلاکچین، قراردادهای هوشمند پیچیده‌ای بنویسند. این قراردادها می‌توانند کارهایی از قبیل انتقال دارایی‌ها، رأی‌گیری‌ها و ثبت قراردادهای خودکار را انجام دهند.

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

  • امنیت بالا: با استفاده از ساختارهای نوع داده‌ای قوی و قراردادهای قابل تست، امنیت قراردادهای هوشمند افزایش می‌یابد.
  • مدیریت دارایی‌ها: قابلیت مدیریت دارایی‌های دیجیتالی و انجام تراکنش‌های مالی بدون نیاز به واسطه.
  • شفافیت: تمامی کد‌ها و تراکنش‌ها بر روی بلاکچین ذخیره و قابل ردیابی هستند، بنابراین اعتماد و شفافیت در سیستم‌ها افزایش می‌یابد.

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

تعریف قرارداد هوشمند

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

این قرارداد هوشمند به این صورت کار می‌کند:

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

کاربردها و مزایای قرارداد هوشمند

  • شفافیت: تمام قوانین و تراکنش‌ها علنی و قابل رویت برای همه طرفین هستند.
  • امنیت: تراکنش‌ها توسط فناوری بلاکچین ایمن شده‌اند، که تقریباً غیرقابل تغییر و هک هستند.
  • کارآمدی: از بین بردن نیاز به واسطه‌ها و خودکارسازی فرایندها، هزینه‌ها و زمان لازم را کاهش می‌دهد.
  • مالی: خودکارسازی قراردادهای وام، بیمه و سایر محصولات مالی.
  • زنجیره تامین: ردیابی محصولات از تولید تا مصرف به صورت شفاف و بدون تقلب.
  • انتخابات الکترونیکی: ایجاد سیستم رأی‌گیری که شفاف و غیرقابل تقلب است.

نحوه نوشتن و توسعه قرارداد هوشمند با Solidity

برای نوشتن قرارداد هوشمند، باید یک زبان برنامه‌نویسی مخصوص بلاکچین ،مانند Solidity را یاد بگیرید. که شامل مراحل زیر است:

  1. یادگیری زبان Solidity: برای نوشتن قرارداد، ابتدا باید سینتکس و قواعد زبان Solidity را یاد بگیرید.
  2. طراحی و نوشتن کد: این فرایند با طراحی دقیق قرارداد شروع می‌شود. برنامه‌نویسان با استفاده از زبان‌هایی مانند Solidity کد قرارداد را می‌نویسند.
  3. کامپایل کد: پس از نوشتن کد، قراردادها کامپایل می‌شوند تا اطمینان حاصل شود که بدون خطا هستند و بهینه‌سازی‌های لازم اعمال شده‌اند.
  4. تست و دیباگ: قبل از مستقر کردن در بلاکچین، قراردادها باید به طور کامل تست شوند. این تست‌ها شامل تست‌های واحد، تست‌های یکپارچگی و شبیه‌سازی‌های کاربر می‌شوند.
  5. مهاجرت و دیپلوی: پس از تست، قراردادها در شبکه بلاکچین مستقر می‌شوند. این فرایند در محیط‌های تست مانند Ganache یا شبکه‌های تست اتریوم انجام می‌شود.
  6. نظارت و به‌روزرسانی: پس از مهاجرت، لازم است قراردادها به طور مداوم نظارت و در صورت نیاز به‌روزرسانی شوند. به دلیل طبیعت غیرمتمرکز بلاکچین، به‌روزرسانی‌ها می‌توانند چالش‌برانگیز باشند.
سالیدیتی، زبان برنامه‌نویسی اصلی برای توسعه قراردادهای هوشمند در بلاکچین است. این قراردادها، کدی هستند که اجرای خودکار دارند و بدون دخالت انسان اطلاعات و معاملات را در بلاکچین ثبت و انجام می‌دهند. به طور ساده، این قراردادها این امکان را فراهم می‌کنند که معاملات الکترونیکی بدون نیاز به واسطه‌گری انجام شوند. به این ترتیب، با استفاده از سالیدیتی و قراردادهای هوشمند، بدون نیاز به اعتماد به طرف سومی می‌توانید معاملاتی امن، شفاف و بدون واسطه را انجام دهید.

آموزش برنامه نویسی قرارداد های هوشمند سیستم رأی‌گیری با زبان سالیدیتی

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

ابزارهای مورد استفاده:

  1. Solidity: زبان برنامه‌نویسی استاندارد برای نوشتن قراردادهای هوشمند در بلاکچین اتریوم.
  2. Truffle: چارچوب توسعه‌ای که امکاناتی چون کامپایل، مهاجرت، و تست قراردادها را فراهم می‌آورد.
  3. Ganache:شبکه بلاکچین محلی که تست و دیباگ قراردادها را بدون هزینه‌های تراکنش واقعی امکان‌پذیر می‌سازد.

مرحله 1: نصب ابزارهای مورد نیاز

1.نصب Node.js

Node.js یک محیط اجرایی است که اجازه می‌دهد جاوا اسکریپت خارج از مرورگر اجرا شود. npm ، مدیر بسته Node.js، ابزاری حیاتی برای مدیریت کتابخانه‌ها و ابزارهای مورد نیاز برای توسعه قراردادهای هوشمند است. استفاده از Node.js و npm دلایل زیر را دارد:

  • مدیریت پکیج: npm اجازه می‌دهد به راحتی کتابخانه‌هایی مانند Truffle و Ganache-cli را نصب و مدیریت کنید.
  • اجرای اسکریپت‌ها: Node.js اجرای اسکریپت‌های توسعه و تست را امکان‌پذیر می‌سازد.
  • سازگاری: بسیاری از ابزارهای توسعه بلاکچین بر پایه جاوا اسکریپت هستند و Node.js اجرای آن‌ها را تسهیل می‌بخشد.

به [وب‌سایت Node.js] رفته و آخرین نسخه را برای سیستم عامل خود دانلود و نصب کنید.

نصب nodejs nodejs را از این سایت دانلود و نصب کنید

2.نصب: Truffle

Truffle یک چارچوب توسعه قراردادهای هوشمند (محبوب برای اتریوم )است که ابزارهایی برای کامپایل، مهاجرت و تست قراردادهای هوشمند را در اختیار توسعه‌دهندگان قرار می‌دهد. این چارچوب به تسریع فرایند توسعه و اطمینان از کیفیت برنامه کمک می‌کند. با استفاده از خط فرمان (Command Line) دستور زیر را اجرا کنید:

npm install -g truffle
npm install truffle اجرای دستور npm install truffle

3.دانلود و نصب Ganache

Ganache یک شبکه بلاکچین محلی (شخصی) است که تست و دیباگ قراردادهای هوشمند را بدون هزینه‌های تراکنش واقعی ممکن می‌سازد. با Ganache، می‌توانید سریع‌تر تست کنید و خطاها را به سهولت برطرف نمایید.از وب‌سایت [Ganache] آن را دانلود و نصب کنید.

نصب Ganache Ganache را از این وبسایت دانلود کنید

مرحله 2: ایجاد پروژه Truffle

1. یک پوشه جدید برای پروژه ایجاد کنید: این دستورات یک پوشه جدید برای پروژه ایجاد کرده و Truffle را در آن اولیه‌سازی می‌کند.

mkdir VotingApp
    cd VotingApp
    
ایجاد پروژه Truffle ایجاد پروژه Truffle

2. پروژه Truffle را ایجاد کنید:

   truffle init
 truffle init اجرای دستورtruffle init

این دستور ساختار پایه‌ای پروژه را ایجاد می‌کند که شامل پوشه‌های contracts، migrations، tests و فایل truffle-config.js است.

 contracts، migrations، tests ایجاد فولدرهای برای قرارداد هوشمند

مرحله 3: نوشتن قرارداد هوشمند

در پروژه‌های Truffle، پوشه contracts یکی از پوشه‌های اصلی است که نقش مهمی در ساختار پروژه دارد. این پوشه محل قرارگیری تمام قراردادهای هوشمند نوشته شده به زبان Solidity است. در مورد پروژه سیستم رأی‌گیری که در حال توسعه آن هستیم، Voting.sol فایل اصلی است که در این پوشه قرار دارد و شامل منطق اصلی برنامه‌ی ما می‌باشد.

1. در پوشه contracts، فایل جدیدی به نام Voting.sol ایجاد کنید.

2. کد قرارداد هوشمند را به این شکل بنویسید:

    // SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Voting {
    // ایجاد یک نگاشت برای نگهداری تعداد آراء دریافتی هر نامزد
    mapping (string => uint256) public votesReceived;
    
    // لیستی از نام‌های نامزدها
    string[] public candidateList;

    // کانستراکتور برای دریافت و ذخیره لیست نامزدها
    constructor(string[] memory candidates) {
        candidateList = candidates;
    }

    // تابع برای اجازه رأی دادن به نامزد مورد نظر
    function voteForCandidate(string memory candidate) public {
        require(validCandidate(candidate), unicode"نامزد مورد نظر وجود ندارد.");
        votesReceived[candidate]++;
    }

    // تابع برای بررسی وجود نامزد در لیست نامزدها
    function validCandidate(string memory candidate) public view returns (bool) {
        for (uint i = 0; i < candidateList.length; i++) {
            if (keccak256(abi.encodePacked(candidateList[i])) == keccak256(abi.encodePacked(candidate))) {
                return true;
            }
        }
        return false;
    }
}




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

توضیح ساده شده کد قرارداد هوشمند رأی‌گیری

در این بخش، قرار است نحوه عملکرد قرارداد هوشمند رأی‌گیری را با استفاده از زبان Solidity به زبان ساده شرح دهیم. این قرارداد شامل چندین مؤلفه اصلی است که هر کدام وظیفه خاصی دارند:

متغیرها و توابع قرارداد:

  1. votesReceived: این یک نگاشت (mapping) است که هر نام نامزد را به تعداد آراء دریافتی آن نامزد مرتبط می‌کند. به این ترتیب، هر بار که کسی به نامزدی رأی می‌دهد، تعداد آراء ثبت شده برای آن نامزد افزایش می‌یابد.
  2. candidateList: این آرایه‌ای از رشته‌ها است که نام‌های نامزدها را نگهداری می‌کند. نام‌های نامزدها در زمان ایجاد قرارداد به آن اضافه می‌شوند و به عنوان ورودی به قرارداد داده می‌شوند.
  3. تابع constructor: این تابع زمانی که قرارداد برای اولین بار بر روی بلاکچین استقرار می‌یابد فراخوانی می‌شود. این تابع لیست نامزدها را دریافت می‌کند و در متغیر candidateList ذخیره می‌کند.
  4. تابع voteForCandidate: این تابع به کاربران اجازه می‌دهد به نامزد مورد نظر خود رأی دهند. برای اطمینان از اینکه نامزدی که رأی داده می‌شود در لیست وجود دارد، از تابع require استفاده می‌شود که وجود نامزد را تأیید می‌کند. اگر نامزد موجود نباشد، تراکنش با خطا مواجه می‌شود.
  5. تابع validCandidate: این تابع بررسی می‌کند که آیا نام داده شده متعلق به یکی از نامزدهای موجود در لیست است. این بررسی با مقایسه هش‌های نام‌ها انجام می‌شود، که روشی برای تأیید هویت بدون نیاز به مقایسه مستقیم است.

مرحله 4: کامپایل و مهاجرت قرارداد

کامپایل

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

دلایل کلیدی برای کامپایل قرارداد عبارتند از:

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

مهاجرت قرارداد

مهاجرت به فرایند دیپلوی کردن قرارداد هوشمند در بلاکچین گفته می‌شود. این مرحله مستلزم هزینه‌هایی است که به عنوان Gas در شبکه اتریوم پرداخت می‌شود. Gas هزینه‌ی مورد نیاز برای اجرای تراکنش‌ها و قراردادهای هوشمند در شبکه اتریوم است که به عنوان پاداش به معدنگران پرداخت می‌شود.

اهمیت مهاجرت در موارد زیر خلاصه می‌شود:

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

ادامه پروژه ،مرحله کامپایل:

1. قرارداد را با استفاده از دستور زیر کامپایل کنید:

truffle compile
 مرحله کامپایل مرحله کامپایل

این دستور قراردادهای هوشمند نوشته شده در Solidity را به بایت‌کد تبدیل می‌کند که قابل اجرا بر روی EVM (ماشین مجازی اتریوم) است. EVM محیطی است که در آن قراردادهای هوشمند اجرا می‌شوند و این بایت‌کد‌ها به صورت دستورالعمل‌های ماشین مجازی تفسیر می‌شوند.

2. یک فایل مهاجرت در پوشه migrations ایجاد کنید (مثلا 2_deploy_contracts.js) و کد زیر را بنویسید:

    const Voting = artifacts.require("Voting");

module.exports = function(deployer) {
    // فرض بر این است که نامزدهای رأی‌گیری شامل علی, رضا, و حسین هستند.
    deployer.deploy(Voting, ["علی", "رضا", "حسین"]);
};

 ایجاد فایل مهاجرت در پوشه migrations ایجاد فایل مهاجرت در پوشه migrations
مدیریت و به‌روزرسانی قراردادهای هوشمند با استفاده از قرارداد Migrations

در دنیای بلاکچین و قراردادهای هوشمند، مدیریت نسخه‌های مختلف و اطمینان از به‌روز بودن قراردادها حیاتی است. برای این منظور، ابزاری به نام قرارداد Migrations وجود دارد که در پلتفرم‌های توسعه مانند Truffle استفاده می‌شود. این قرارداد به عنوان یک ابزار کنترل نسخه برای قراردادهای هوشمند عمل می‌کند و امکان مدیریت مهاجرت‌های مختلف قراردادها را فراهم می‌آورد. در ادامه به شرح ساده‌شده‌ای از این قرارداد و کارکرد آن می‌پردازیم:

  1. تعریف مالکیت: هنگامی که قرارداد Migrations برای اولین بار استقرار می‌یابد، مالکیت آن به فردی که قرارداد را استقرار داده، اختصاص می‌یابد. این امر اطمینان می‌دهد که تنها فرد مجاز قادر به انجام تغییرات در قرارداد خواهد بود.
  2. محدودیت دسترسی: برای جلوگیری از دخالت‌های ناخواسته یا مخرب، قرارداد دارای یک تابع اصلاحی (modifier) به نام restricted است. این تابع تضمین می‌کند که فقط مالک قرارداد قادر به فراخوانی توابع حساس خواهد بود.
  3. به‌روزرسانی قرارداد: در صورت نیاز به ارتقاء یا به‌روزرسانی قرارداد، Migrations امکان مهاجرت به یک آدرس قرارداد جدید را فراهم می‌کند. این به ما امکان می‌دهد تا کد قرارداد را بدون از دست دادن داده‌های قبلی به‌روز نگه داریم.
  4. ردیابی مهاجرت‌ها: قرارداد Migrations شماره آخرین مهاجرت انجام شده را ذخیره می‌کند. این ویژگی به توسعه‌دهندگان کمک می‌کند تا بدانند کدام نسخه از قرارداد در حال حاضر فعال است و آخرین به‌روزرسانی‌ها چه بوده‌اند.

این قرارداد ساده اما بسیار کاربردی، یک ابزار ضروری برای هر توسعه‌دهنده قرارداد هوشمند است که به دنبال مدیریت و نظارت دقیق بر پروژه‌های خود است. با استفاده از Migrations، توسعه‌دهندگان می‌توانند از ثبات و امنیت قراردادهای هوشمند خود اطمینان حاصل کنند و به راحتی تغییرات لازم را برای بهبود پیوسته اعمال کنند.

نام‌گذاری فایل مهاجرت

برای ایجاد فایل مهاجرتی که قرارداد Voting را مهاجرت می‌دهد، می‌توانید فایلی به نام 2_deploy_contracts.js ایجاد کنید. این نام‌گذاری براساس فرضیه است که یک فایل مهاجرت با نام 1_initial_migration.js از قبل وجود دارد که معمولاً هنگام اجرای دستور truffle init به صورت خودکار ایجاد می‌شود.

این کد ماژول Voting را فراخوانی می‌کند، و deployer.deploy را با فهرستی از نامزدها فراهم می‌کند تا قرارداد با این اولیه‌سازی‌ها به شبکه مهاجرت کند. فهرست نامزدها به کانستراکتور Voting ارسال می‌شود که در قرارداد Solidity تعریف شده است.اگر پس از اجرای truffle init در پروژه‌تان فایل initial_migration.js موجود نیست، احتمالاً مشکلی در فرآیند اولیه‌سازی وجود داشته است. برای حل این مسئله و اطمینان از اینکه مهاجرت‌های لازم برای مدیریت وضعیت مهاجرت‌های پروژه‌تان در دسترس هستند، می‌توانید به صورت دستی فایل initial_migration.js را ایجاد کنید. در ادامه نحوه انجام این کار را توضیح می‌دهم:

گام 1: ایجاد فایل initial_migration.js

در پوشه migrations پروژه‌تان، فایل جدیدی به نام 1_initial_migration.js ایجاد کنید.

 ایجاد فایل initial-migration-js ایجاد فایل initial-migration.js

محتویات زیر را درون فایل قرار دهید:

    const Migrations = artifacts.require("Migrations");

module.exports = function(deployer) {
  deployer.deploy(Migrations);
};

گام 2: بررسی و ایجاد فایل Migrations.sol:اطمینان حاصل کنید که فایل Migrations.sol در پوشه contracts موجود است. اگر این فایل وجود ندارد، باید آن را نیز ایجاد کنید.محتویات زیر را در فایل Migrations.sol قرار دهید:

 ایجاد فایل initial migration ایجاد فایل initial migration
    // SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

contract Migrations {
    address public owner;
    uint public last_completed_migration;

    constructor() public {
        owner = msg.sender;
    }

    modifier restricted() {
        // استفاده از unicode برای پشتیبانی از کاراکترهای فارسی
        require(msg.sender == owner, unicode"فقط مالک قرارداد می‌تواند این تابع را فراخوانی کند.");
        _;
    }

    function setCompleted(uint completed) public restricted {
        last_completed_migration = completed;
    }

    function upgrade(address new_address) public restricted {
        Migrations upgraded = Migrations(new_address);
        upgraded.setCompleted(last_completed_migration);
    }
}



ادامه پروژه:

3. Ganache را باز کنید و مطمئن شوید که در حال اجرا است.

4. قرارداد را به شبکه محلی Ganache مهاجرت دهید:

truffle migrate
 truffle migrate مهاجرت قرارداد با استفاده از دستور truffle migrate

مرحله 5: نوشتن و اجرای تست‌ها

1. در پوشه test، فایل تستی به نام VotingTest.js ایجاد کنید و کد زیر را بنویسید:

    const Voting = artifacts.require("Voting");

contract("Voting", accounts => {
    it("allows a user to cast a vote", async () => {
        const voting = await Voting.deployed();
        const candidateName = "علی";
        const candidateHash = web3.utils.soliditySha3(candidateName);

        // رأی دادن به نامزد با استفاده از هش نام
        await voting.voteForCandidate(candidateName, { from: accounts[0] });

        // استخراج تعداد آرا با استفاده از هش نام
        const votes = await voting.votesReceived(candidateHash);
        assert.equal(votes.toNumber(), 1, "علی should have one vote");
    });
});

بیایید کد تستی را که برای قرارداد هوشمند سیستم رأی‌گیری خود نوشتیم، به صورت ساده‌تر توضیح دهیم. هدف این کد تست اطمینان حاصل کردن از این است که قرارداد ما به درستی کار می‌کند، یعنی امکان رأی دادن به نامزدها و شمردن این آراء وجود دارد.

کد تست برای قرارداد رأی‌گیری

این کد در واقع یک سناریوی معمولی را تست می‌کند که در آن یک کاربر به نامزد مشخصی رأی می‌دهد و سپس می‌بینیم که آیا آراء به درستی ثبت شده است یا خیر.

    const Voting = artifacts.require("Voting");

contract("Voting", accounts => {
    it("allows a user to cast a vote", async () => {
        const voting = await Voting.deployed();
        const candidateName = "علی"; // نام فارسی نامزد
        const candidateHash = web3.utils.soliditySha3({type: 'string', value: candidateName});

        // رأی دادن به نامزد با استفاده از نام فارسی
        await voting.voteForCandidate(candidateName, { from: accounts[0] });

        // استخراج تعداد آرا با استفاده از هش نام
        const votes = await voting.votesReceived(candidateHash);
        assert.equal(votes.toNumber(), 1, "علی باید یک رأی داشته باشد");
    });
});

توضیح ساده کد:

  1. تعریف قرارداد و نامزدها: ابتدا قرارداد Voting که قبلاً نوشته‌ایم را فراخوانی می‌کنیم و می‌گوییم که می‌خواهیم با نامزدی به نام "علی" کار کنیم.
  2. رأی دادن به نامزد: سپس یک کاربر (که نشانی‌اش در accounts[0] ذخیره شده) به "علی" رأی می‌دهد. این کار با فراخوانی تابع voteForCandidate انجام می‌شود.
  3. بررسی تعداد آراء: پس از آن، کد بررسی می‌کند که آیا تعداد آراء ثبت شده برای "علی" به درستی یک رأی است. این کار با خواندن داده‌ها از قرارداد و مقایسه آن با مقدار انتظاری (یک رأی) انجام می‌شود.

2. تست‌ها را با دستور زیر اجرا کنید:

truffle test

خروجی:

    Using network 'development'.

Compiling your contracts...
===========================
> Compiling ./contracts/Voting.sol
> Artifacts written to C:\Users\A.Refua\build\contracts
> Compiled successfully using:
   - solc: 0.8.0+commit.c7dfd78e.Emscripten.clang

  Contract: Voting
    √ should deploy the contract (79ms)
    √ allows a user to cast a vote (137ms)

  2 passing (250ms)

توضیح این کد:

  • Using network 'development': نشان می‌دهد که تست‌ها بر روی شبکه development اجرا شده‌اند.
  • Compiling your contracts...: نشان می‌دهد که قراردادهای شما با موفقیت کامپایل شده‌اند.
  • Contract: Voting: عنوان قراردادی که تست مربوط به آن اجرا شده است.
  • should deploy the contract (79ms)√: نشان می‌دهد که تست مربوط به استقرار قرارداد با موفقیت اجرا شده است و زمان مورد نیاز برای اجرا نیز نمایش داده شده است.
  • allows a user to cast a vote (137ms)√: نشان می‌دهد که تست مربوط به رای‌گیری کاربر با موفقیت اجرا شده است و زمان مورد نیاز برای اجرا نیز نمایش داده شده است.
  • passing 2(250ms): تعداد تست‌هایی که با موفقیت اجرا شده‌اند و زمان کلی که برای اجرای آن‌ها لازم بوده است.

اگر خروجی شما مشابه این باشد، این بدان معناست که تست‌های شما با موفقیت اجرا شده‌اند. اما اگر هر یک از تست‌ها با مشکل مواجه شده باشد، جزئیات مربوط به هر تست و خطاها در خروجی نمایش داده می‌شوند که می‌تواند به شما کمک کند تا مشکل را شناسایی و رفع کنید.

نتیجه‌گیری:

شما با موفقیت یک سیستم رأی‌گیری بسیار ساده را با استفاده از سالیدیتی و Truffle توسعه داده‌اید. این سیستم قادر است رأی‌ها را به صورت دیجیتالی ثبت و تأیید کند، که نشان‌دهنده قدرت و انعطاف‌پذیری قراردادهای هوشمند در بلاکچین است. این پروژه پایه‌ای برای ساخت سیستم‌های پیچیده‌تر رأی‌گیری یا سایر برنامه‌های کاربردی مبتنی بر قراردادهای هوشمند است.

جمع‌بندی:

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

نظرات شما

برای ارسال سوال لازم است، ابتدا وارد سایت شوید.