أتمتة نشر العقود (Deployment): كتابة سكربت لرفع العقد إلى شبكة Ethereum و Polygon

دقائق القراءة: 6

أتمتة نشر العقود (Deployment): كتابة سكربت لرفع العقد إلى شبكة Ethereum و Polygon

عندما ينتقل المطور من التجارب اليدوية داخل محرر Remix IDE: كتابة ونشر أول عقد ذكي (Smart Contract) على المتصفح مباشرة إلى بيئة احترافية، تصبح أتمتة النشر خطوة أساسية وليست مجرد رفاهية. فبدلاً من إدخال الإعدادات يدوياً في كل مرة، يمكننا كتابة deployment script يرفع العقد الذكي إلى أكثر من شبكة بدقة وسرعة وقابلية للتكرار.

في هذا المقال سنبني مسار نشر عملي باستخدام Hardhat وEthers.js لنشر عقد على شبكتي Ethereum وPolygon. وسنغطي البنية البرمجية، إدارة المتغيرات السرية، تمرير معاملات المُنشئ، وتسجيل عنوان العقد الناتج بشكل منظم لتسهيل الدمج لاحقاً مع الواجهة الأمامية أو أدوات التحقق.

إذا كنت قد أنهيت سابقاً الانتقال إلى بيئة العمل الاحترافية: تثبيت إطار عمل Hardhat باستخدام Node.js وإعداد مشروع Hardhat وكتابة أول سكربت JavaScript لترجمة (Compile) العقد الذكي فستكون الخطوات التالية امتداداً طبيعياً لبناء دورة نشر احترافية وآمنة.

لماذا نستخدم سكربت للنشر بدلاً من النشر اليدوي؟

النشر اليدوي مناسب للتعلّم الأولي، لكنه يصبح هشاً مع تعدد الشبكات وكثرة الإصدارات. أي خطأ في اختيار RPC أو نسيان constructor arguments قد يكلّف وقتاً ومالاً.

أما سكربت النشر فيمنحك مزايا عملية واضحة:

  • تكرار نفس خطوات النشر بشكل موثوق.
  • إمكانية النشر على شبكات متعددة بأمر واحد.
  • فصل الإعدادات الحساسة عن الشيفرة المصدرية.
  • تجهيز البنية لخطوات لاحقة مثل التحقق verification أو الاختبارات الآلية.

المتطلبات الأساسية قبل كتابة سكربت النشر

قبل تنفيذ أي نشر فعلي، تأكد من تجهيز البيئة بشكل سليم. هذا يشمل إعداد المحفظة، الشبكة، ومفاتيح الوصول إلى مزود الخدمة. وإذا لم تُكمل هذه المرحلة بعد، راجع إعداد بيئة التطوير: تثبيت محفظة MetaMask والاتصال بشبكات الاختبار (Testnets) ثم الحصول على عملات تجريبية مجانية (Faucet) للبدء في نشر واختبار العقود الذكية.

  1. تثبيت مشروع Hardhat.
  2. امتلاك private key لمحفظة النشر.
  3. الحصول على رابط RPC URL لشبكات Ethereum Sepolia وPolygon Amoy أو الشبكات الرئيسية لاحقاً.
  4. وجود رصيد كافٍ لتغطية التكاليف (Gas Fees): كيف يحسب البلوكتشين تكلفة تنفيذ الأكواد؟.

لا تضع private key أو عناوين API مباشرة داخل الملفات المرفوعة إلى GitHub. استخدم ملف .env مع تجاهله عبر .gitignore لتفادي اختراق المحفظة أو استنزاف الرصيد.

إنشاء عقد ذكي بسيط للنشر

سنستخدم عقداً بسيطاً يحتوي على مالك ورسالة أولية، مع حدث يسهّل تتبع التهيئة الأولى. الفكرة هنا ليست تعقيد منطق العقد، بل التركيز على آلية الأتمتة. وإذا أردت تعميق فهم البنية الأساسية للعقد، فراجع أساسيات لغة Solidity: أنواع البيانات والمتغيرات (State Variables) والدوال (Functions) في Solidity: من يمكنه قراءة وتعديل بيانات العقد؟.

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

contract DeploymentDemo {
    address public owner;
    string public message;

    event ContractInitialized(address indexed owner, string message);
    event MessageUpdated(string oldMessage, string newMessage);

    constructor(string memory _message) {
        owner = msg.sender;
        message = _message;
        emit ContractInitialized(owner, _message);
    }

    function updateMessage(string memory _newMessage) external {
        require(msg.sender == owner, "Only owner can update");
        string memory old = message;
        message = _newMessage;
        emit MessageUpdated(old, _newMessage);
    }
}

يستخدم العقد constructor لاستقبال النص الأولي عند النشر. كما يعتمد على require لحماية التعديل، وهو نفس النمط الذي تم شرحه في التعامل مع الأخطاء وإرجاع الأموال: استخدام require, assert, revert.

تهيئة ملف الإعدادات لشبكتي Ethereum و Polygon

ملف الإعدادات هو القلب الذي يربط مشروعك بالشبكات المختلفة. داخله نُعرّف المترجم، ثم نضيف الشبكات مع روابط RPC والمفاتيح الخاصة.

require("@nomicfoundation/hardhat-toolbox");
require("dotenv").config();

const { SEPOLIA_RPC_URL, AMOY_RPC_URL, PRIVATE_KEY } = process.env;

module.exports = {
  solidity: "0.8.20",
  networks: {
    sepolia: {
      url: SEPOLIA_RPC_URL,
      accounts: [PRIVATE_KEY]
    },
    amoy: {
      url: AMOY_RPC_URL,
      accounts: [PRIVATE_KEY]
    }
  }
};

رغم أن الملف أعلاه مكتوب بلغة JavaScript، إلا أن وظيفته في دورة النشر محورية: فهو يجعل المشروع قادراً على التبديل بين الشبكات بدون تعديل الشيفرة الداخلية للعقد.

كتابة سكربت النشر الآلي

الآن نصل إلى الجزء الأهم: سكربت النشر نفسه. هذا السكربت يقوم بتحميل العقد، تمرير وسيطات المُنشئ، انتظار اكتمال النشر، ثم طباعة العنوان النهائي.

const hre = require("hardhat");

async function main() {
  const initialMessage = "Hello from automated deployment";

  const DeploymentDemo = await hre.ethers.getContractFactory("DeploymentDemo");
  const deploymentDemo = await DeploymentDemo.deploy(initialMessage);

  await deploymentDemo.waitForDeployment();

  const contractAddress = await deploymentDemo.getAddress();
  const network = hre.network.name;

  console.log("Network:", network);
  console.log("DeploymentDemo deployed to:", contractAddress);
  console.log("Constructor message:", initialMessage);
}

main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});

يعتمد السكربت على getContractFactory لإنشاء مصنع العقد، ثم يستخدم deploy لبدء معاملة النشر. بعد ذلك ننتظر تأكيد العملية بواسطة waitForDeployment حتى نتأكد أن العنوان الناتج صالح للاستخدام.

تشغيل السكربت على شبكة Ethereum

لنشر العقد على Sepolia مثلاً استخدم الأمر التالي:

npx hardhat run scripts/deploy.js --network sepolia

تشغيل السكربت على شبكة Polygon

أما للنشر على Amoy أو لاحقاً على الشبكة الرئيسية لـ Polygon:

npx hardhat run scripts/deploy.js --network amoy

بهذه الطريقة يصبح لديك نفس منطق النشر مع اختلاف البيئة فقط. هذا مفيد جداً عند إدارة مشاريع تتطلب نسخة على شبكة اختبار وأخرى على شبكة إنتاج.

تحسين السكربت ليصبح أكثر احترافية

في المشاريع الجادة، لا يكفي طباعة العنوان داخل الطرفية. من الأفضل حفظ بيانات النشر داخل ملف JSON حتى تستهلكها واجهة المستخدم أو خدمات الخلفية لاحقاً.

const hre = require("hardhat");
const fs = require("fs");

async function main() {
  const initialMessage = "Hello from automated deployment";

  const DeploymentDemo = await hre.ethers.getContractFactory("DeploymentDemo");
  const deploymentDemo = await DeploymentDemo.deploy(initialMessage);
  await deploymentDemo.waitForDeployment();

  const contractAddress = await deploymentDemo.getAddress();
  const network = hre.network.name;

  const deploymentData = {
    network,
    contractName: "DeploymentDemo",
    contractAddress,
    constructorArgs: [initialMessage]
  };

  fs.writeFileSync(
    `deployments-${network}.json`,
    JSON.stringify(deploymentData, null, 2)
  );

  console.log(`Saved deployment data for ${network}`);
}

main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});

هذه الخطوة مهمة عند ربط العقد مع تطبيق React أو أي frontend يحتاج معرفة عنوان العقد النهائي ووسيطات التهيئة.

قبل النشر على الشبكات الحقيقية، نفّذ اختبارات محلية دقيقة للعقد باستخدام اختبار العقود الذكية محلياً: كتابة اختبارات الوحدة (Unit Tests) باستخدام Chai & Mocha. نشر عقد غير مختبر قد يؤدي إلى تجميد أموال، أخطاء صلاحيات، أو عيوب منطقية يصعب إصلاحها بعد تسجيله على البلوكتشين.

فروق مهمة بين النشر على Ethereum و Polygon

على الرغم من أن الشبكتين تعملان ضمن منظومة EVM، إلا أن هناك اختلافات عملية يجب أخذها بالحسبان:

  • تكلفة التنفيذ على Ethereum غالباً أعلى من Polygon.
  • زمن التأكيد وسلوك الرسوم قد يختلف حسب ازدحام الشبكة.
  • بعض المشاريع تضبط قيم gas limit وmaxFeePerGas بشكل مخصص لكل شبكة.
  • يجب التحقق من عنوان المستكشف المناسب بعد النشر مثل Etherscan أو Polygonscan.

إذا كان العقد يتضمن مصفوفات كبيرة، حلقات متكررة، أو تخزيناً كثيفاً في storage، فراجع تصميمه قبل النشر النهائي. تقليل الكتابات إلى التخزين واستخدام أنماط أبسط ينعكس مباشرة على خفض استهلاك الغاز، خاصة على شبكة Ethereum.

أفضل ممارسات أمنية عند أتمتة النشر

نجاح سكربت النشر لا يقاس فقط بوصول العقد إلى الشبكة، بل أيضاً بسلامة الإعدادات المحيطة به. من أبرز الممارسات المهنية:

كما يُستحسن كتابة سكربتات منفصلة للبيئات المختلفة، مثل staging وproduction، حتى لا يتم النشر على الشبكة الخطأ بسبب أمر واحد غير مقصود.

الخلاصة

أتمتة نشر العقود الذكية هي الجسر الحقيقي بين كتابة الكود وبين تشغيله بشكل احترافي داخل بيئة Web3. باستخدام Hardhat وEthers.js يمكنك تحويل النشر من عملية يدوية معرضة للأخطاء إلى مسار منظم، قابل للتوسع، وسهل الدمج مع الاختبارات والواجهات الأمامية.

ومع تكرار هذه المنهجية على شبكات مثل Ethereum وPolygon ستبني خط نشر أكثر موثوقية، وهو ما تحتاجه فعلاً قبل الانتقال إلى مشاريع أكبر مثل إطلاق ERC-20 أو NFT على شبكات حقيقية.

16 comments

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *