Truffle ،Hardhat و Brownie

truffle vs brownie vs hardhat

مقایسه مختصری از سه چارچوب توسعه قرارداد هوشمند

در این مقاله سه مورد از معروف ترین چارچوب های توسعه قرارداد هوشمند را بررسی خواهیم کرد. قرار است یک قرارداد هوشمند ساده به نام “Greeter.sol” را ایجاد کنیم و آن را روی هر فریمورکی کامپایل و آزمایش کنیم.

مقدمه

Truffle و Hardhat هر دو مبتنی بر جاوا اسکریپت هستند. Truffle مدت ها است که برای استقرار قراردادهای هوشمند در شبکه های بلاکچینی استفاده می شد، اما امروزه چارچوب دیگری برای توسعه قراردادهای هوشمند به نام Hardhat معرفی شده است که همانند ترافل از جاوا اسکریپت استفاده می کند. البته در مقایسه با ترافل از برخی ویژگی های اضافی و تنظیمات ساده تر برخوردار است. نامزد سوم برای توسعه قراردادهای هوشمند Brownie است که از پایتون استفاده و پشتیبانی می کند.

Hardhat

اکنون زمان آن رسیده است که قرارداد هوشمند خود را با استفاده از این چارچوب ها مستقر و تست کنیم.

نکته: ابتدا باید Node را نصب کنید. برای نصب node می توانید به مستندات ما در ارتباط با شبکه بسو مراجعه کنید.

با اجرای دستور زیر در ترمینال خود hardhat را نصب کنید:

npm install — save-dev hardhat

اکنون یک پروژه نمونه ایجاد می کنیم:

npx hardhat

با اجرای دستور بالا از شما سؤال پرسیده می شود که باید از بین گزینه های زیر، یکی را انتخاب کنید:

What do you want to do? …

❯ Create a sample project

  Create an empty hardhat.config.js

  Quit

“ایجاد یک پروژه نمونه (Create a sample project)” را انتخاب کنید. از شما می خواهد چند بسته را نصب کنید. اگر کار نکرد، می‌ توانید با تایپ کردن موارد زیر در ترمینال آن‌ ها را نیز نصب کنید:

npm install — save-dev @nomiclabs/hardhat-waffle ethereum-waffle chai @nomiclabs/hardhat-ethers ethers

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

در ادامه کد قرارداد هوشمند Greeter.sol را مشاهده می کنید:

//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;
import "hardhat/console.sol";
contract Greeter {
    string greeting;
    constructor(string memory _greeting) {
        console.log("Deploying a Greeter with
 greeting:",_greeting);
        greeting = _greeting;
    }
    function greet() public view returns (string memory) {
        return greeting;
    }
    function setGreeting(string memory _greeting) public {
        console.log("Changing greeting from '%s' to '%s'",
 greeting, _greeting);
        greeting = _greeting;
    }
}

توجه داشته باشید که جاوا اسکریپت در فایل Solidity نوشته شده است. این دقیقا ویژگی است که شما در Truffle نخواهید داشت.

برای تست این کد، به فایل تست sample-test.js مراجعه کنید.

const { expect } = require("chai");
describe("Greeter", function () {
    it("Should return the new greeting once it's changed",
 async function () {
        const Greeter = await
 ethers.getContractFactory("Greeter");
        const greeter = await Greeter.deploy("Hello, world!");
        await greeter.deployed();
        expect(await greeter.greet()).to.equal("Hello, 
world!");
        const setGreetingTx = await greeter.setGreeting("Hola, 
mundo!");
        // wait until the transaction is mined
        await setGreetingTx.wait();
        expect(await greeter.greet()).to.equal("Hola,
 mundo!");
    });
});

برای استقرار قرارداد، یک فایل در پوشه Scripts به نام Sample-Script.js وجود دارد.

const hre = require("hardhat");
async function main() {
    const Greeter = await 
hre.ethers.getContractFactory("Greeter");
    const greeter = await Greeter.deploy("Hello, Hardhat!");
    await greeter.deployed();
    console.log("Greeter deployed to:", greeter.address);
}
main()
    .then(() => process.exit(0))
    .catch((error) => {
    console.error(error);
    process.exit(1);
});

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

npx hardhat compile

این، قراردادهای هوشمند را در پوشه قراردادها کامپایل می کند.

استقرار قرارداد:

npx hardhat run scripts/sample-script.js

بیایید اکنون قرارداد را تست کنیم:

npx hardhat test

خروجی شما به صورت زیر است:

    Greeter
Deploying a Greeter with greeting: Hello, world!
Changing greeting from 'Hello, world!' to 'Hola, mundo!'
    ✓ Should return the new greeting once it's changed (868ms)
1 passing (873ms)

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

Truffle

ابتدا ترافل را به کمک دستور زیر نصب می کنیم.

نکته: باید Node را برای Truffle نیز نصب کنید.

npm install -g truffle

اکنون برای مقداردهی اولیه poiler plate، دستور زیر را اجرا می کنیم:

truffle init

چند فایل و پوشه شبیه به Hardhat ایجاد می کند. فایل Greeter.sol را در پوشه contracts و فایل sample-test.js را در پوشه تست قرار دهید. اما به جای پوشه اسکریپت ها، در ترافل یک پوشه migration داریم. در آن پوشه یک فایل 1_initial_migration.js وجود دارد.

این فایل را با فایل زیر جایگزین کنید:

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

module.exports = function (deployer) {

    deployer.deploy(Greeter, "Hello, World!");

};

همچنین باید به Truffle بگوییم که از Solidity نسخه 0.8.0 استفاده می کنیم. می توانید این کار را در فایل “truffle-config.js” انجام دهید.

تنها کاری که باید انجام دهید این است که نسخه solc را در زیر کامپایلرها لغو کرده و آن را روی “0.8.0” قرار دهید.

...

compilers: {

    solc: {

        version: "0.8.0",    // Fetch exact version from solc-

bin (default: truffle's version)

....

فایل های تست برای اجرا روی ترافل نیاز به تغییراتی دارند. تغییرات زیر را در فایل sample-test.js اعمال کنید:

const { expect } = require("chai");

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

describe("Greeter", function () {

    it("Should return the new greeting once it's changed"

, async function () {

        const greeter = await Greeter.new("Hello, world!");

        expect(await greeter.greet()).to.equal("Hello,

world!");

        await greeter.setGreeting("Hola, mundo!");

        expect(await greeter.greet()).to.equal("Hola,

 mundo!");

    });

});

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

truffle compile

اکنون دستور زیر را تایپ کنید:

truffle compile

این دستور به شما امکان می دهد با Truffle CLI تعامل داشته باشید. (می توانید با تایپ کردن .exit از کنسول ترافل خارج شوید)

migrate یا make migrations را تایپ کنید و برای اجرای یک تست، به سادگی truffle test را تایپ کنید. باید همان خروجی که با استفاده از hardhat دیده بوید را مجدد مشاهده کنید.

Brownie

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

نکته: برای نصب Brownie باید pip را نصب کنید.

دستور زیر را تایپ کنید:

pip install eth-brownie

اگر Brownie را نصب کرده اید می توانید با تایپ کردن دستور زیر یک پروژه ایجاد کنید:

brownie init

خواهید دید که ساختار پروژه تقریباً مشابه ساختار Truffle و Hardhat است. پوشه هایی که بیشتر به آن ها نگاه خواهیم کرد قراردادها، اسکریپت ها و تست ها هستند. آن ها هدف یکسانی دارند یعنی قراردادها و تست ها به ترتیب شامل قراردادهای هوشمند نوشته شده به زبان Solidity و تست های نوشته شده به زبان پایتون هستند. پوشه اسکریپت (Scripts) استقرار را ذخیره می کند.

فایل Greeter.sol را در پوشه contracts قرار داده و اجرا می کنیم:

brownie compile

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

حالا یک فایل deploy.py در پوشه اسکریپت ایجاد کنید و کد زیر را در آن قرار دهید:

from brownie import accounts, Greeter

def main():

    deployer_account = accounts[0]

    greeter = Greeter.deploy("Hello, World!", {'from':

deployer_account})

    print("Deployed at: ", greeter.address)

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

brownie run scripts/deploy.py

یک تست ساده در پایتون می نویسیم. یک فایل جدید greeter_test.py در پوشه tests ایجاد کرده و کد زیر را در آن قرار می دهیم:

import pytest

from brownie import Greeter, accounts

@pytest.fixture

def greeter():

    return accounts[0].deploy(Greeter, "Hello, World!")

    # Check if the contract was deployed with the correct

Greeting

    def test_greeter(greeter):

        assert greeter.greet() == "Hello, World!"

    # Check if the greeting changes

    def test_set_greeting(greeter):

        greeter.setGreeting("Hola, mundo!")

        assert greeter.greet() == "Hola, mundo!"

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

brownie test

پاسخ خروجی به صورت زیر است:

You’ll see 2 tests pass.

این مقدمه مختصر به شما این امکان را می دهد تا نگاهی گذرا به سه چارچوب اصلی توسعه قرارداد هوشمند بیندازید و امیدواریم به شما کمک کند تصمیم بگیرید کدام یک را برای پروژه خود انتخاب کنید.

محمد امیدی
ارسال دیدگاه

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