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

تأیید قرارداد هوشمند در Etherscan: یک راهنمای گام به گام
تأیید قراردادهای هوشمند خود در مورد Etherscan ، BSCAN ، Polyscan یا هرگونه blockchain سازگار با EVM برای ایجاد اعتماد و شفافیت ، به ویژه در معاملات مالی بسیار مهم است. به تازگی ، مشتری درخواست تأیید قراردادهای هوشمند در مورد اترسان را هنگام ایجاد نشانه های ERC20 ، ERC721 یا ERC1155 از طریق bulksendtokens.xyz.
من موافقت کردم که این یک ایده عالی است و تصمیم گرفتم آن را پیاده سازی کنم.
در این راهنما ، من شما را در طی مراحل تأیید قرارداد هوشمندانه در مورد اترسکان با استفاده از هاردهات و یک کلاس TypeScript سفارشی می کنم.
در اینجا معماری پروژه قراردادهای هوشمند:
مرحله 1: قرارداد هوشمند خود را کامپایل کنید
بیایید فرض کنیم که توکن ERC20 خود را با استفاده از Hardhat ساخته اید. برای تأیید آن ، به استحکام ورودی JSON ورودی فایل تولید شده در هنگام تدوین.
دستور زیر را برای تدوین قرارداد خود اجرا کنید:
npx hardhat compile
پس از تدوین ، پرونده ورودی JSON را در artifacts
پوشه این پرونده شامل ابرداده مورد نیاز برای تأیید است.
مرحله 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 هستید ، تأیید یک گام مهم در اطمینان از یکپارچگی قراردادهای هوشمند شما است.
احساس راحتی کنید که این عملکرد را در پروژه های خود ادغام کنید و بازخورد خود را به اشتراک بگذارید! اگر سوالی دارید ، آنها را در نظرات زیر رها کنید.
برنامه نویسی مبارک! 🚀