برنامه نویسی

تأیید قرارداد هوشمند در مورد Etherscan از طریق API: راهنمای گام به گام؟

تأیید قرارداد هوشمند در Etherscan: یک راهنمای گام به گام

تأیید قراردادهای هوشمند خود در مورد Etherscan ، BSCAN ، Polyscan یا هرگونه blockchain سازگار با EVM برای ایجاد اعتماد و شفافیت ، به ویژه در معاملات مالی بسیار مهم است. به تازگی ، مشتری درخواست تأیید قراردادهای هوشمند در مورد اترسان را هنگام ایجاد نشانه های ERC20 ، ERC721 یا ERC1155 از طریق bulksendtokens.xyz.

سوال مشتری

من موافقت کردم که این یک ایده عالی است و تصمیم گرفتم آن را پیاده سازی کنم.

در این راهنما ، من شما را در طی مراحل تأیید قرارداد هوشمندانه در مورد اترسکان با استفاده از هاردهات و یک کلاس TypeScript سفارشی می کنم.

در اینجا معماری پروژه قراردادهای هوشمند:

نشانه ERC20


مرحله 1: قرارداد هوشمند خود را کامپایل کنید

بیایید فرض کنیم که توکن ERC20 خود را با استفاده از Hardhat ساخته اید. برای تأیید آن ، به استحکام ورودی JSON ورودی فایل تولید شده در هنگام تدوین.

دستور زیر را برای تدوین قرارداد خود اجرا کنید:

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

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

پس از تدوین ، پرونده ورودی JSON را در artifacts پوشه این پرونده شامل ابرداده مورد نیاز برای تأیید است.

چگونه می توان ورودی json استاندارد استحکام را دریافت کرد؟

مرحله 2: کلاس تأیید کننده Etherscan را ایجاد کنید

یک کلاس Typescript ایجاد کنید (etherscan.ts) برای رسیدگی به روند تأیید. این کلاس از API Etherscan برای ارسال قرارداد برای تأیید استفاده می کند.

import axios, { AxiosResponse } from "axios";
import FormData from "form-data";
import { ethers } from "ethers";

export class EtherscanVerifier {
    private apiKey: string;
    private apiUrl: string;

    constructor(apiKey: string, apiUrl: string) {
        this.apiKey = apiKey;
        this.apiUrl = apiUrl;
    }

    /**
     * ABI-encodes constructor arguments
     * @param abi - Contract ABI (Application Binary Interface)
     * @param constructorArgs - Array of constructor arguments
     * @returns ABI-encoded constructor arguments
     */
    private encodeConstructorArgs(abi: any[], constructorArgs: any[]): string {
        const iface = new ethers.Interface(abi);
        return iface.encodeDeploy(constructorArgs).slice(2); // Remove "0x" prefix
    }

    /**
     * Verifies a smart contract on Etherscan
     * @param chainId - Chain ID of the network (e.g., 1 for Ethereum Mainnet, 11155111 for Sepolia)
     * @param contractAddress - Address of the deployed contract
     * @param sourceCode - Source code of the contract in Standard JSON Input format
     * @param contractName - Name of the contract (e.g., "contracts/tokens/ERC20.sol:ERC20Token")
     * @param compilerVersion - Version of the Solidity compiler used (e.g., "v0.8.26+commit.8a97fa7a")
     * @param abi - ABI of the contract
     * @param constructorArgs - Constructor arguments (if any)
     * @param optimizationUsed - Whether optimization was used during compilation (default: true)
     * @param runs - Number of optimization runs (default: 200)
     */
    public async verifyContract(
        chainId: number,
        contractAddress: string,
        sourceCode: string,
        contractName: string,
        compilerVersion: string,
        abi: any[],
        constructorArgs: any[] = [],
        optimizationUsed: boolean = true,
        runs: number = 200
    ): Promise<void> {
        console.log("Verifying contract...");

        // Encode constructor arguments if any
        const encodedConstructorArgs = constructorArgs.length > 0
            ? this.encodeConstructorArgs(abi, constructorArgs)
            : "";

        const formData = new FormData();
        formData.append("chainId", chainId);
        formData.append("codeformat", "solidity-standard-json-input");
        formData.append("sourceCode", sourceCode); // Standard JSON Input
        formData.append("constructorArguments", encodedConstructorArgs);
        formData.append("contractaddress", contractAddress);
        formData.append("contractname", contractName);
        formData.append("compilerversion", compilerVersion);
        formData.append("optimizationUsed", optimizationUsed ? "1" : "0");
        formData.append("runs", runs.toString());

        try {
            const response = await axios.post(
                `${this.apiUrl}?module=contract&action=verifysourcecode&apikey=${this.apiKey}`,
                formData,
                {
                    headers: {
                        "Content-Type": "multipart/form-data",
                    },
                }
            );
            console.log("Verification Response:", response.data);
        } catch (error) {
            console.error("Error verifying contract:", error);
        }
    }
}
حالت تمام صفحه را وارد کنید

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


مرحله 3: با API تأیید تماس بگیرید

یک بار EtherscanVerifier کلاس تنظیم شده است ، می توانید از آن برای تأیید قرارداد خود استفاده کنید. در اینجا مثالی از نحوه تماس با API آورده شده است:

const verifier = new EtherscanVerifier(
    process.env.NEXT_PUBLIC_ETHERSCAN_API, // Your Etherscan API Key
    "https://api-sepolia.etherscan.io/api" // Etherscan API URL (Sepolia Testnet)
);

var result = await verifier.verifyContract(
    chainId, // Chain ID (e.g., 11155111 for Sepolia)
    address, // Deployed contract address
    JSON.stringify(ERC20.content), // Standard JSON Input
    "contracts/tokens/ERC20.sol:ERC20Token", // Contract name
    "v0.8.26+commit.8a97fa7a", // Compiler version
    [...ERC20.abi], // Contract ABI
    [tokenName, tokenSymbol, tokenDecimals, totalSupply] // Constructor arguments
);
حالت تمام صفحه را وارد کنید

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

شما دریافت خواهید کرد data در نتیجه با جزئیات زیر:

{
پیام: “خوب”
نتیجه: “67CJTM6PTDSRIKYEF35BCG6PKJEZZGNH5EURHCWPFMTYQJEPB”
وضعیت: “1”
}

می توانید وضعیت تأیید را در این مورد بررسی کنید:

شما باید دریافت کنید:

نتیجه تأیید

مستندات برای پارامترهای API

در زیر ، تجزیه و تحلیل پارامترهای مورد استفاده در درخواست API Etherscan ، همانطور که در مستندات API Etherscan مستند شده است:

پارامتر شرح
chainId شناسه زنجیره ای شبکه (به عنوان مثال ، 1 برای Ethereum Mainnet ، 11155111 برای سپولیا)
codeformat قالب کد منبع (solidity-standard-json-input برای ورودی JSON)
sourceCode کد منبع قرارداد در قالب ورودی استاندارد JSON
constructorArguments آرگومان های سازنده رمزگذاری شده ABI (در صورت وجود)
contractaddress آدرس قرارداد مستقر
contractname نام قرارداد (به عنوان مثال ، contracts/tokens/ERC20.sol:ERC20Token)
compilerversion نسخه کامپایلر استحکام مورد استفاده
optimizationUsed اینکه آیا بهینه سازی در طول تدوین استفاده شده است (1 برای درست ، 0 نادرست است)
runs تعداد بهینه سازی اجرا می شود (پیش فرض: 200)

پایان

با دنبال کردن این راهنما ، می توانید به راحتی قراردادهای هوشمند خود را در مورد Etherscan یا هر blockchain سازگار با EVM تأیید کنید. این فرآیند نه تنها شفافیت را تقویت می کند بلکه باعث ایجاد اعتماد به کاربران شما می شود. این که آیا شما در حال استفاده از نشانه های ERC20 ، ERC721 یا ERC1155 هستید ، تأیید یک گام مهم در اطمینان از یکپارچگی قراردادهای هوشمند شما است.

احساس راحتی کنید که این عملکرد را در پروژه های خود ادغام کنید و بازخورد خود را به اشتراک بگذارید! اگر سوالی دارید ، آنها را در نظرات زیر رها کنید.

برنامه نویسی مبارک! 🚀

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

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

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

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