إن تشغيل مزرعة تعدين (Mining Farm) بقدرة 50 كيلوواط يمثل السيناريو الحدودي الفاصل بين مقبس كهرباء منزلي عادي ومركز بيانات تجاري متكامل. من جهة، لا يزال بإمكانك إدخال حمل نشط بقدرة 50 كيلوواط إلى مساحة تجارية صغيرة أو منشأة خاصة تحتوي على محطة تحويل كهربائية (Transformer) خاصة بها. ومن جهة أخرى، نحن نتحدث هنا عن نحو 14 إلى 15 جهاز ASIC حديث، يولد كل منها ما يصل إلى 3.5 كيلوواط من الحرارة، ويسحب ما بين 15 إلى 16 أمبير على الفازة الواحدة، ويتطلب تدفق هواء يتراوح بين 600 إلى 800 متر مكعب في الساعة.
يقدم هذا الدليل تفصيلاً هندسياً عملياً حول التصميم، وشراء المعدات، والتمديدات الكهربائية، وأنظمة التبريد، والأتمتة لمزرعة تعدين بقوة 50 كيلوواط. بدون حشو، أو نظريات مجردة، أو أسلوب أكاديمي بحت؛ مجرد أرقام جافة، عتاد صلب، كابلات حقيقية، دراسات للموقع، وسكريبتات مراقبة جاهزة للإنتاج الفعلي.
1. المعلمات الأساسية والبنية التحتية الكهربائية
أساس أي مشروع تعدين يكمن في تكلفة الكيلواط-ساعة وموثوقية المحطة الفرعية. بالنسبة لحمل مستمر بقوة 50 كيلوواط يعمل على مدار الساعة طوال أيام الأسبوع (24/7)، يجب حساب تيار قواطع الحماية الرئيسية مع هامش أمان بنسبة 20% (وفقاً لمعايير NFPA/IEC للأحمال المستمرة).
I_total = P / (√3 · U · cosφ) = 50000 / (√3 · 380 · 0.95) ≈ 79.8 A
مع أخذ معامل الأمان 1.25 بعين الاعتبار، يجب أن يكون القاطع الرئيسي مصمماً لتحمل ما لا يقل عن 100 أمبير (ثلاثي الطور / 3-phase).
مواصفات لوحة التوزيع الكهربائية الرئيسية (MDB 50 kW)
- القاطع الرئيسي: 3P 100A (منحنى C، قدرة قطع لا تقل عن 10 kA، مثل Schneider Electric Acti9 أو ABB S200).
- توزيع الأحمال على الأطوار: الأطوار الثلاثة L1، L2، L3 موزعة بالتساوي الصارم بواقع 5 أجهزة لكل فازة (في حال وجود 15 جهازاً) لمنع عدم اتزان الأطوار والتيار الزائد في خط التعادل (Neutral).
- خط الكابل من المحطة إلى اللوحة الرئيسية: كابل نحاسي U1000 R2V 4x25 mm² أو ألمنيوم 4x50 mm² عند المد في خنادق (مع مراعاة ألا يتجاوز هبوط الجهد 2% على مسافة 50 متراً).
- حماية الخطوط الفرعية: لكل جهاز ASIC قاطع مستقل 2P 20A (منحنى C) + كابل نحاسي مقاوم للحريق بعزل مزدوج 3x2.5 mm².
- نظام التأريض (Earthing): شبكة تأريض بنظام TN-S أو TN-C-S بمقاومة لا تزيد عن 4 أوم (تتكون من 3 قضبان نحاسية بطول 2.5 متر مثبثة على شكل مثلث وملحومة بشريط فولاذي مسطح 40x4 mm).
2. اختيار العتاد والنفقات الرأسمالية (CAPEX)
لإجراء الحسابات، سنعتمد المعيار الذهبي في الصناعة: سلسلة Bitmain Antminer S19k Pro / S21 أو MicroBT Whatsminer M50/M60. لتحقيق حمولة متوازنة تماماً بقوة 50 كيلوواط، فإن الخيار الأمثل هو نشر 14 وحدة من جهاز Antminer S21 (بقوة 200 TH/s) باستهلاك قياسي يبلغ حوالي 3500 واط للجهاز الواحد.
- إجمالي الـ Hashrate: 14 · 200 TH/s = 2800 TH/s = 2.8 PH/s
- إجمالي الاستهلاك: 14 · 3500 W = 49 كيلوواط (يندمج تماماً ضمن حد ال50 كيلوواط مع ترك هامش لأنظمة التهوية).
جدول النفقات الرأسمالية (CAPEX)
| بند المصروفات | المواصفات / التفاصيل | الكمية | السعر الفردي ($) | الإجمالي ($) |
|---|---|---|---|---|
| أجهزة التعدين ASIC | Antminer S21 200 TH/s (3500W) | 14 وحدة | 3,800 | 53,200 |
| لوحة التوزيع الرئيسية (MDB) | قواطع ABB/SE، كونتاكتورات، أجهزة قياس الجهد، حماية من الصواعق (SPD) | طقم واحد | 1,200 | 1,200 |
| التمديدات الكابلية | كابلات 3x2.5، مجاري كابلات (Trays)، وحدات توزيع طاقة PDU C19 (16A) | 14 خطاً | 70 | 980 |
| التبريد / التهوية | مروحة محورية صناعية (12,000 m³/h) + انفرتر تردد (VFD) | وحدتان | 850 | 1,700 |
| فلترة الهواء الخارجي | إطار، فلاتر G4/F7 (إزالة الغبار)، فتحات تهوية (Louvers) | طقم واحد | 600 | 600 |
| بنية الشبكة التحتية | سويتش مدار Mikrotik 24-port، راوتر 4G/WAN، مزود طاقة لاقطاعي (UPS) | طقم واحد | 550 | 550 |
| نظام التأريض | عدة تأريض، تركيب، قياسات المفقودات | طقم واحد | 350 | 350 |
| أعمال التركيب والتجهيز | تجميع الرفوف (Racks)، التمديدات الكهربائية، التشغيل التجريبي (Commissioning) | - | - | 1,500 |
| إجمالي النفقات الرأسمالية (CAPEX) | $60,080 |
3. التبريد والتهوية: الحسابات الديناميكية الحرارية
الخطأ الأكبر الذي يقع فيه المبتدئون هو تركيب مكيف هواء منزلي. فالمكيف يعمل على إزالة الرطوبة وخفض الحرارة عبر دورة الفريون، ولكن لحمل حراري بقوة 50 كيلوواط ستعتاز إلى مكيف بقدرة 150,000 BTU والذي سيستهلك بدوره ما بين 15 إلى 18 كيلوواط إضافية من الكهرباء.
يتم تبريد مزارع التعدين حصرياً عبر أنظمة التهوية الميكانيكية ذات الدفق المستمر (سحب وطرد الهواء القسري).
حساب حجم تدفق الهواء المطلوب
معادلة تدفق الهواء اللازم:
Q = P_dissip / (ρ · c_p · ΔT)
حيث:
- P_dissip = 49000 واط (الحرارة المنبعثة)
- ρ = 1.2 كغ/م³ (كثافة الهواء عند درجة حرارة 20 مئوية)
- c_p = 1005 J/(kg·K) (السعة الحرارية النوعية للهواء)
- ΔT = 15 درجة مئوية (الفرق المقبول في ارتفاع الحرارة بين المدخل والمخرج)
Q = 49000 / (1.2 · 1005 · 15) ≈ 2.708 m³/s = 9750 m³/h
مع أخذ مقاومة فلاتر تنقية الهواء الخشنة (G4) في الاعتبار، يجب تصميم مراوح بسعة إجمالية لا تقل عن 12,000 إلى 14,000 متر مكعب في الساعة.
فصل المناطق (الممرات الساخنة والباردة - Hot/Cold Aisle)
- الممر البارد: يتم إدخال الهواء الخارجي من خلال جدران الفلترة، ويكون الضغط الجوي هنا أعلى قليلاً (Positive Pressure).
- الممر الساخن: يتم تثبيت أجهزة ASIC داخل حاجز محكم الإغلاق (رفوف مزودة بموجهات هواء/Shrouds). تقوم مراوح الأجهزة ذاتها بدفع الهواء الساخن مباشرة إلى غرفة معزولة، ومن هناك تقوم مروحة الطرد الصناعية بطرده خارج المبنى.
4. النفقات التشغيلية (OPEX) والحسابات الشهرية
تتكون المصاريف التشغيلية من ثلاثة عناصر رئيسية: استهلاك الكهرباء، إيجار الموقع، خطوط الإنترنت، والصيانة الدورية.
لنفترض أن متوسط تكلفة الكهرباء التجارية هو 0.07 دولار لكل كيلوواط-ساعة.
حساب استهلاك الكهرباء الشهري
- الاستهلاك بالساعة: 49 كيلوواط (للمعدات) + 1.5 كيلوواط (للتهوية والشبكة) = 50.5 كيلوواط
- الاستهلاك اليومي: 50.5 · 24 = 1212 كيلوواط-ساعة
- الاستهلاك الشهري (30.5 يوماً): 1212 · 30.5 = 36,966 كيلوواط-ساعة
- تكلفة الكهرباء شهرياً: 36,966 · 0.07 دولار = $2,587.62
المصاريف الثابتة الشهرية (OPEX)
| بند التكلفة | الوصف | المبلغ ($) |
|---|---|---|
| الكهرباء | 36,966 كيلوواط-ساعة بسعر 0.07 دولار/كيلوواط-ساعة | 2,587.62 |
| إيجار المكان | مساحة صناعية / مستودع 20-30 متر مربع | 300.00 |
| الاتصالات والإنترنت | الخط الأساسي (ألياف ضوئية - Fiber) + خط احتياطي (4G) | 40.00 |
| صندوق الصيانة / قطع الغيار | استبدال مراوح الأجهزة، تنظيف الفلاتر، المستهلكات | 150.00 |
| إجمالي النفقات التشغيلية شهرياً (OPEX) | $3,077.62 |
5. توقعات الأرباح، فترة الاسترداد (ROI)، والنموذج المالي
لحساب الإيرادات، سنعتمد على مؤشرات صعوبة شبكة البيتكوين ومكافأة الكتلة الحالية لعام 2026. لنفترض أن 1 TH/s يدر حوالي 0.042 دولار يومياً (بدون خصم تكلفة الكهرباء، وعند سعر بيتكوين يبلغ حوالي 65,000 دولار).
حساب الإيرادات (Revenue)
- إجمالي الـ Hashrate: 2800 TH/s
- الإيرادات اليومية: 2800 · 0.042 دولار = $117.60
- الإيرادات الشهرية (30.5 يوماً): 117.60 دولار · 30.5 = $3,586.80
صافي الربح (EBITDA / Net Profit)
- Net Profit/mo = الإيرادات ($3,586.80) - النفقات التشغيلية ($3,077.62) = $509.18 (يرتفع هذا الرقم كلما زادت ربحية الـ TH/s، ومع ارتفاع سعر البيتكوين إلى 90,000 دولار ينمو الربح بشكل طردي).
ملاحظة هامة حول حساسيات العائد على الاستثمار (ROI) لتغيرات السوق وأسعار الكهرباء:
إذا انخفضت تكلفة الكهرباء إلى 0.05 دولار / كيلوواط-ساعة، ستنخفض نفقات التشغيل الخاصة بالطاقة إلى $1,848.30، بينما سيرتفع صافي الربح إلى $1,248.50 شهرياً. وهذا يقلص فترة استرداد رأس المال من أرقام كارثية إلى فترة معقولة تتراوح بين 35 إلى 40 شهراً. أما التعدين باستخدام شريحة كهرباء تجارية تتجاوز 0.065–0.07 دولار لكل كيلوواط-ساعة بدون موجة صعود (Bull Run) أو عتاد عالي الكفاءة، فيضعك مباشرة في منطقة المخاطر العالية.
6. الأتمتة والتحكم: سكربت بايثون للمراقبة (CGMiner / CGMiner API)
المهندس الحقيقي لا يضيع وقته في النقر يدويًا على واجهات الويب الخاصة بـ 14 جهازًا. تدعم جميع أجهزة التعدين الحديثة (Antminer, Whatsminer) بروتوكول CGMiner API (المعتمد على JSON عبر مقابس TCP).
إليك سكربت بايثون جاهز للإنتاج لمراقبة تجمع التعدين الخاص بك (Farm Pool). يقوم السكربت بالاستعلام عن جميع الأجهزة الـ 14 عبر الشبكة المحلية، وجمع معدل التجزئة (Hashrate) درجات حرارة الرقاقات، وإرسال تنبيه فوري عبر تيليجرام في حال انخفاض الأداء أو ارتفاع الحرارة.
#!/usr/bin/env python3
"""
مراقبة مزرعة معدني ASIC عبر بروتوكول CGMiner API (المنفذ 4028).
المميزات:
* استعلام عن جميع الأجهزة بشكل متوازٍ؛
* دعم Antminer (المفتاح "command") و Whatsminer (المفتاح "cmd") — يتم تحديد النوع في MINERS؛
* التنبيهات: غير متصل، انخفاض معدل التجزئة، ارتفاع الحرارة، عدم العثور على حقول الحرارة؛
* منع التكرار (Deduplication): عدم إرسال نفس الحدث بشكل متكرر أكثر من REPEAT_MINUTES؛
* إشعار استعادة الوضع الطبيعي عند زوال المشكلة؛
* تأكيد المشكلة عبر CONFIRM_CYCLES من الاستعلامات المتتالية (حماية ضد الإنذارات الكاذبة؛
* يتم تخزين الحالة في ملف لضمان العمل الصحيح سواء في حلقة تكرار أو عبر cron (--once).
الإعداد عبر متغيرات البيئة:
TG_BOT_TOKEN, TG_CHAT_ID — إجبارية
TEMP_THRESHOLD (افتراضي 85) — حد حرارة الرقاقات، °C
HASHRATE_WARN_TH (افتراضي 170) — الحد الأدنى لمعدل التجزئة، TH/s
POLL_INTERVAL_SEC (افتراضي 60) — فترة الاستعلام في وضع الحلقة التكرارية
REPEAT_MINUTES (افتراضي 60) — تكرار نفس التنبيه
CONFIRM_CYCLES (افتراضي 2) — عدد الاستعلامات المتتالية المطلوبة لتأكيد المشكلة
طريقة التشغيل:
python3 asic_monitor.py # حلقة لاتهائية
python3 asic_monitor.py --once # تشغيل لمرة واحدة (لـ cron / systemd timer)
هام: يجب أن يكون المنفذ 4028 متاحًا فقط من شبكة Local Area Network الداخلية.
لا تقم أبدًا بنشره على الإنترنت العام.
"""
import json
import logging
import os
import socket
import sys
import time
from concurrent.futures import ThreadPoolExecutor
import requests
# --------------------------------------------------------------------------
# الإعدادات
# --------------------------------------------------------------------------
# (ip, النوع): "antminer" أو "whatsminer"
MINERS = [(f"192.168.1.{i}", "antminer") for i in range(101, 115)] # .101 - .114
# مثال لمزرعة مختلطة:
# MINERS[0] = ("192.168.1.101", "whatsminer")
API_PORT = 4028
SOCKET_TIMEOUT = 3.0
TG_BOT_TOKEN = os.environ.get("TG_BOT_TOKEN", "")
TG_CHAT_ID = os.environ.get("TG_CHAT_ID", "")
TEMP_THRESHOLD = float(os.environ.get("TEMP_THRESHOLD", "85"))
HASHRATE_WARN_TH = float(os.environ.get("HASHRATE_WARN_TH", "170"))
POLL_INTERVAL_SEC = int(os.environ.get("POLL_INTERVAL_SEC", "60"))
REPEAT_MINUTES = int(os.environ.get("REPEAT_MINUTES", "60"))
CONFIRM_CYCLES = int(os.environ.get("CONFIRM_CYCLES", "2"))
STATE_FILE = os.environ.get("STATE_FILE", "asic_monitor_state.json")
# بادئات مفاتيح حرارة الرقاقات لأجهزة Antminer في استجابة `stats`.
# تحقق منها مع البرمجيات الثابتة (Firmware) الخاصة بك: نفذ أمر `stats` وتفقد المفاتيح الفعلية.
ANTMINER_TEMP_PREFIXES = ("temp2_", "temp_chip")
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s %(levelname)s %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
)
log = logging.getLogger("asic_monitor")
# --------------------------------------------------------------------------
# تيليجرام (Telegram)
# --------------------------------------------------------------------------
def send_telegram(text: str) -> bool:
"""يرسل رسالة بدون parse_mode (النص الديناميكي لا يكسر التنسيق).
يعيد True فقط إذا قَبِل تيليجرام الرسالة بنجاح."""
if not TG_BOT_TOKEN or not TG_CHAT_ID:
log.error("TG_BOT_TOKEN / TG_CHAT_ID غير معرّفين، لم يتم إرسال التنبيه: %s", text)
return False
url = f"https://api.telegram.org/bot{TG_BOT_TOKEN}/sendMessage"
try:
r = requests.post(url, json={"chat_id": TG_CHAT_ID, "text": text}, timeout=10)
if not r.ok:
log.error("أعاد تيليجرام الرمز %s: %s", r.status_code, r.text[:200])
return r.ok
except requests.RequestException as e:
log.error("خطأ في إرسال الرسالة إلى تيليجرام: %s", e)
return False
# --------------------------------------------------------------------------
# التعامل مع CGMiner API
# --------------------------------------------------------------------------
def query_miner(ip: str, kind: str, command: str) -> dict:
"""يرسل أمرًا إلى CGMiner API. يعيد {"error": "..."} في حال الفشل."""
key = "cmd" if kind == "whatsminer" else "command"
try:
with socket.create_connection((ip, API_PORT), timeout=SOCKET_TIMEOUT) as s:
s.settimeout(SOCKET_TIMEOUT)
s.sendall(json.dumps({key: command}).encode("utf-8"))
chunks = []
while True:
chunk = s.recv(4096)
if not chunk:
break
chunks.append(chunk)
text = b"".join(chunks).decode("utf-8", errors="ignore").replace("\x00", "")
# بعض إصدارات البرمجيات الثابتة تعيد "}{" بدون فاصلة بين الكائنات
text = text.replace("}{", "},{")
return json.loads(text)
except Exception as e: # شبكة، مهلة منتهية، JSON غير صالح
return {"error": f"{type(e).__name__}: {e}"}
def to_float(value):
"""رقم أو نص يمثل رقم -> float، وإلا None."""
try:
return float(value)
except (TypeError, ValueError):
return None
def get_hashrate_th(summary: dict, kind: str):
"""معدل التجزئة بـ TH/s أو None إذا لم يتم العثور على الحقل."""
try:
s = summary["SUMMARY"][0]
except (KeyError, IndexError, TypeError):
return None
if kind == "whatsminer":
# MH/s -> TH/s. المتوسط لـ 5 دقائق إن توفر، وإلا متوسط الجلسة الكاملة.
for key in ("MHS 5m", "MHS av"):
v = to_float(s.get(key))
if v is not None:
return v / 1_000_000.0
return None
# Antminer: GH/s -> TH/s. نتجنب استخدام "GHS 5s" لأنه غير مستقر (شديد التذبذب).
for key in ("rate_30m", "GHS av"):
v = to_float(s.get(key))
if v is not None:
return v / 1000.0
return None
def get_max_chip_temp(ip: str, kind: str, summary: dict):
"""أقصى حرارة للرقاقات أو None إذا لم يتم العثور على الحقول."""
if kind == "whatsminer":
try:
s = summary["SUMMARY"][0]
except (KeyError, IndexError, TypeError):
return None
temps = [to_float(s.get(k)) for k in ("Chip Temp Max", "Temperature")]
temps = [t for t in temps if t]
return max(temps) if temps else None
stats = query_miner(ip, kind, "stats")
try:
info = stats["STATS"][1]
except (KeyError, IndexError, TypeError):
return None
temps = []
for k, v in info.items():
if k.startswith(ANTMINER_TEMP_PREFIXES):
t = to_float(v)
if t: # 0 = اللوحة لا تعيد قيمة
temps.append(t)
return max(temps) if temps else None
# --------------------------------------------------------------------------
# فحص جهاز واحد
# --------------------------------------------------------------------------
def check_miner(ip: str, kind: str) -> dict:
"""يعيد {issue_key: alert_text} للمشاكل النشطة."""
issues = {}
summary = query_miner(ip, kind, "summary")
if "error" in summary:
# غير متصل: الفحوصات الأخرى تصبح عديمة الفائدة
return {"offline": f"⚠️ {ip}: واجهة برمجة التطبيقات API لا تستجيب ({summary['error']})"}
th = get_hashrate_th(summary, kind)
if th is None:
issues["parse"] = f"❌ {ip}: فشل استخراج معدل التجزئة من الملخص summary (تحقق من البرمجيات الثابتة/النوع)"
elif th < HASHRATE_WARN_TH:
issues["hashrate"] = f"📉 {ip}: معدل التجزئة انخفض إلى {th:.1f} TH/s (الحد الأدنى {HASHRATE_WARN_TH:.0f})"
temp = get_max_chip_temp(ip, kind, summary)
if temp is None:
issues["temp_keys"] = f"❓ {ip}: لم يتم العثور على حقول الحرارة، تحقق من المفاتيح في stats"
elif temp > TEMP_THRESHOLD:
issues["temp"] = f"🔥 {ip}: سخونة مفرطة، حرارة الرقاقات {temp:.0f}°C (الحد الأقصى {TEMP_THRESHOLD:.0f})"
return issues
# --------------------------------------------------------------------------
# الحالة ومنع التكرار (State & Deduplication)
# --------------------------------------------------------------------------
def load_state() -> dict:
try:
with open(STATE_FILE, encoding="utf-8") as f:
return json.load(f)
except (OSError, ValueError):
return {"sent": {}, "streak": {}}
def save_state(state: dict) -> None:
try:
tmp = STATE_FILE + ".tmp"
with open(tmp, "w", encoding="utf-8") as f:
json.dump(state, f)
os.replace(tmp, STATE_FILE)
except OSError as e:
log.error("فشل حفظ الحالة: %s", e)
def run_cycle(state: dict) -> None:
sent, streak = state["sent"], state["streak"]
now = time.time()
with ThreadPoolExecutor(max_workers=len(MINERS)) as pool:
results = list(pool.map(lambda m: (m[0], check_miner(*m)), MINERS))
for ip, issues in results:
# 1) المشاكل النشطة
for key, text in issues.items():
sid = f"{ip}|{key}"
streak[sid] = streak.get(sid, 0) + 1
if streak[sid] < CONFIRM_CYCLES:
continue
last = sent.get(sid)
if last is None or now - last >= REPEAT_MINUTES * 60:
if send_telegram(text):
sent[sid] = now
# 2) المشاكل التي تم حلها
prefix = f"{ip}|"
for sid in [s for s in list(streak) if s.startswith(prefix)]:
key = sid[len(prefix):]
if key in issues:
continue
streak.pop(sid, None)
if sid in sent: # يتم إرسال إشعار العودة للوضع الطبيعي فقط إذا تم إرسال تنبيه مسبقًا
if send_telegram(f"✅ {ip}: تم حل المشكلة «{key}»"):
sent.pop(sid, None)
ok = sum(1 for _, i in results if not i)
log.info("اكتمل الفحص: %d/%d تعمل بشكل سليم", ok, len(results))
save_state(state)
# --------------------------------------------------------------------------
def main() -> None:
state = load_state()
state.setdefault("sent", {})
state.setdefault("streak", {})
if "--once" in sys.argv:
run_cycle(state)
return
log.info("بدء المراقبة: %d جهاز، الفترة الزمنية %d ثانية", len(MINERS), POLL_INTERVAL_SEC)
while True:
try:
run_cycle(state)
except Exception:
log.exception("خطأ غير معالج في حلقة الاستعلام")
time.sleep(POLL_INTERVAL_SEC)
if __name__ == "__main__":
main()7. قائمة التحقق قبل التشغيل (الاعتماد الهندسي)
- 1. اختبار الحمل الكهربائي: قم بتشغيل مدفأة صناعية بقوة 50 كيلوواط لمدة 4 ساعات قبل تركيب أجهزة التعدين. افحص سخونة مجموعات التلامس (Contact Groups) على القاطع الرئيسي وقضبان التوصيل (Busbars) باستخدام مقياس الحرارة البيروميتر. يجب ألا تتجاوز حرارة نقاط التلامس 65°C.
- 2. قياس التأريض: استدعِ مختبرًا كهربائيًا لقياس معاوقة حلقة الطور-المحايد (Phase-Neutral Loop) ومقاومة تبديد نظام التأريض (يجب أن تكون < 4 أوم).
- 3. فحص تدفق الهواء: تأكد من أن مقاومة ضغط مرشح الهواء G4 لا تخلق تفريغًا هوائيًا (فراغًا/Vacuum) داخل الغرفة (يجب أن تفتح باب الممر البارد بسهولة دون الحاجة لقوة كبيرة أثناء عمل مراوح العادم).
- 4. إعداد نظام المراقبة Watchdog: قم بتفعيل ميزات إعادة التشغيل التلقائي للأجهزة (Hardware Auto-Reboot) المدمجة في البرمجيات الثابتة لأجهزة التعدين (LUXOS, VNISH, أو Stock) كخط دفاع أخير ضد انقطاع الاتصال بالتجمع أو ضياع عنوان IP.
التشغيل:
export TG_BOT_TOKEN="..." TG_CHAT_ID="..."
python3 asic_monitor.py8. الإطار القانوني، اتفاقية شراء الطاقة (PPA)، المحاسبة المالية الدولية
تشغيل منشأة بقدرة 50 كيلوواط في أي ولاية قضائية يتطلب الحصول على صفة مستهلك تجاري رسمي. التنقيب "تحت السلم" أو بالطرق غير الرسمية عبر مقبس كهرباء منزلي عادي سيعرضك حتماً لإنذارات من شركة الكهرباء، وغرامات مالية ضخمة لتجاوز حدود استهلاك الطاقة، وتهم الاستخدام غير القانوني للشبكة.
الهيكل القانوني وتأسيس الشركة
- تأسيس الكيان التشغيلي (LLC / FZ-LLC / Inc.): يتم تسجيل المنشأة تحت كيان تجاري قانوني ذو مسؤولية محدودة. هذا الإجراء إلزامي لتوقيع عقد إيجار مساحي تجاري واتفاقيات ربط البنية التحتية بالشبكة الكهربائية بشكل قانوني.
- اتفاقية شراء الطاقة (PPA): المستند الأساسي للمنشأة هو عقد تجاري لتوريد الطاقة الكهربائية (PPA) مع مزود الطاقة المعتمد أو مالك المحطة الفرعية (TS). يحدد العقد بوضوح:
- القدرة النشطة المخصصة: 50 كيلوواط ضمن فئة موثوقية الطاقة III (مع السماح بحمل مستمر على مدار الساعة طوال أيام الأسبوع).
- نقطة الفصل وتحديد الملكية: عند جهد 0.4 كيلوواط على أطراف الجهد المنخفض للمحول.
- هيكل التعريفة: تكلفة ثابتة لكل كيلوواط/ساعة (المستهدف < 0.065–0.07 دولار).
- استيراد الأجهزة (رمز النظام المنسق HS Code 8471): يتم شراء أجهزة تعدين ASIC عبر عقود تجارية مباشرة (B2B). رمز النظام المنسق الدولي (HS Code) للمعدات هو 8471 50 000 0 (وحدات المعالجة). عند التخليص الجمركي النظامي، يتم سداد ضريبة القيمة المضافة للاستيراد (VAT) والرسوم الجمركية، وتحصل على بيانات التصدير/الاستيراد الجمركية (customs declarations) والفواتير التجارية التي تثبت مصدر الأصول الرأسمالية قانونياً.
- المحاسبة المالية والتسييل (Off-ramping): يتم توليد أرباح التعدين بعملة البيتكوين (BTC) مباشرة على التجمع (Pool). لتغطية المصاريف التشغيلية الشهرية (OPEX: كهرباء، إيجار)، يتم استخدام حساب مؤسسي (Corporate Account) على منصة تداول عملات رقمية أو عبر مكتب OTC مع استكمال إجراءات التحقق المؤسسي (KYB - Know Your Business). يتم تحويل العوائد النقدية المقبوضة إلى الحساب المصرفي التجاري للشركة عبر حوالة مصرفية سلكية لتسوية فواتير الكهرباء بانتظام.
9. الخدمات اللوجستية وفحص استلام المعدات
يبلغ الوزن الإجمالي لـ 14 وحدة Antminer S21 في عبوتها الأصلية من المصنع حوالي 230–250 كجم.
بروتوكول فحص الجودة الواردة (QC عند الاستلام)
- 1. الفحص البصري للتغليف: التحقق من سلامة ملصقات الأمان ضد العبث (Tamper-evident seals) وخلو الصناديق من أي تلفيات.
- 2. اختبار الاهتزاز (Shake Test لفحص المشتتات): أثناء الشحن الدولي، يمكن أن تؤدي الاهتزازات القوية إلى فك براغي التثبيت أو انفصال مشتتات الحرارة الفردية للشرائح (خاصة في المعدات المستعملة). يُهز الجهاز برفق — ويجب ألا يصدر أي صوت لأجزاء مفككة أو متطايرة من الداخل.
- 3. اختبار المقاومة على البارد (Cold Test): قبل توصيل التيار بجهد 220 فولت، يتم استخدام الملتيميتر (Multimeter) للتحقق من عدم وجود قصر كهربائي (Short circuit) على مسارات تغذية لوحات التعدين (يجب أن تتوافق مقاومة خط VDD مع المواصفات الفنية للشركة المصنعة، في حدود عشرات الأوم).
- 4. منصة الاختبار التجريبي (لمدة 15 دقيقة): التشغيل التتابعي ضمن دائرة كهربائية معزولة. مراقبة الوصول إلى معدل الهاش المستهدف (200 TH/s)، استجابة جميع اللوحات الثلاث (3/3 Boards detected)، والتأكد من خلوها من الشرائح التالفة (أخطاء الأجهزة HW Errors < 0.5%).
10. الأمان وعزل الشبكة
تعتبر مزرعة بحجم 50 كيلوواط هدفاً جذاباً لكل من السرقة الفعلية والهجمات السيبرانية (اعتراض حركة بيانات Stratum، وزرع برمجيات التعدين الخبيثة).
هيكلية طوبولوجيا الشبكة:
[ الإنترنت (WAN) ]
&│
[ 4G/LTE احتياطي ]
&│
┌───────┴────────┐
│ Router / WAF │ (MikroTik / OPNsense)
│ Firewall │ ── WireGuard VPN (لإدارة التحكم عن بُعد فقط)
└───────┬────────┘
│ (شبكة VLAN معزولة 10.0.10.0/24)
┌────────┼─────────────────┬─────────────────┐
│ │ │ │
[ASIC 1] [ASIC 2] ... [ASIC 14] [عقدة السكريبت]
10.0.10.101 10.0.10.102 10.0.10.114 10.0.10.250 (Python Watchdog)
معايير قطاع الشبكة
- العزل التام عن شبكة الإنترنت العامة (WAN): تتواجد أجهزة ASIC داخل قطاع شبكة افتراضية (VLAN) مغلق تماماً بدون عناوين IP عامة مكشوفة.
- إغلاق المنفذ 4028 (CGMiner API): الوصول إلى منفذ سحب المقاييس والبيانات مسموح حصرياً لعنوان IP الخاص بخادم المراقبة الداخلي فقط.
- تشفير Stratum/TLS: توجيه حركة البيانات إلى مجمع التعدين (Stratum V2 أو Stratum over TLS) يلغي تماماً احتمالية هجمات رجل在中 (MitM) لتعديل عنوان المحفظة على مستوى مزود خدمة الإنترنت.
11. خلاصة المهندس (قائمة التحقق قبل الإطلاق - Deployment Checklist)
- 1. التمديدات الكهربائية: تحقق من مقطع الكابلات VVGng-LS 3x2.5 مم² لكل مقبس C19، وقم بإحكام ربط جميع أطراف التوصيل في لوحة التوزيع الرئيسية (MDP) بمفتاح عزم الدوران (Torque wrench) بعد مرور 48 ساعة من التشغيل تحت الحمل الكامل.
- 2. التهوية: قم بقياس فرق درجات الحرارة بين الهواء الداخل (Intake) والهواء الخارج (Exhaust). عندما يكون الفرق $\Delta T > 18^\circ\text{C}$، يتم رفع سرعة مراوح الطرد إلى تردد أعلى عبر محولات التردد (VFD).
- 3. المراقبة: تشغيل سكريبت المراقبة الآلي لأجهزة ASIC مع تفعيل نظام الإنذار الفوري حال انخفاض معدل الهاش عن 170 TH/s.
- 4. إدارة المخاطر المالية: حساب نقطة التعادل (Break-even) مع الأخذ في الاعتبار النمو المحتمل لصعوبة شبكة التعدين بنسبة تتراوح بين 15% إلى 20% سنوياً.