zecd — خادم محفظة يبدأ بالمعاملات المحمية
zecd هو خادم محفظة يبدأ بالمعاملات المحمية لـ Zcash، مبني على librustzcash ومكشوف عبر لهجة JSON-RPC الخاصة بـ Bitcoin Core. يوفّر للمطورين ومتكاملي المدفوعات واجهة API مألوفة ومتوافقة مع Bitcoin للتفاعل مع Zcash — مع جعل Orchard (أكثر مجمّعات الخصوصية) الخيار الافتراضي. طوّرته zec.rocks، وصُمّم zecd ليحل محل وظائف المحفظة في zcashd ضمن البيئات الحديثة الأصلية للسحابة.
الإصدار الحالي: 0.5.0-rc3 (13 يوليو 2026) — مع دعم Ironwood (NU6.3). ثبّته عبر cargo install zecd أو استخدم صورة Docker الرسمية.
الخلاصة
- zecd هو daemon (خادم) للمحفظة — وليس عقدة كاملة. يتولى المفاتيح، والمسح، والإثبات، وRPC من دون التحدث ببروتوكول Zcash P2P.
- يتحدث لهجة JSON-RPC الخاصة بـ Bitcoin Core: نفس أسماء الدوال، وأشكال الحقول، والمصادقة، ورموز الأخطاء — كثير من عملاء Bitcoin RPC يعملون مع Zcash مباشرة.
- عناوين Orchard (المحمية) هي الافتراضية؛ أما دعم العناوين الشفافة (t-address) وSapling فيتطلب تفعيلًا صريحًا لكل محفظة.
- يتصل بـ عقدة كاملة مستضافة ذاتيًا من Zebra عبر JSON-RPC محلي — ولا يحتاج إلى lightwalletd.
- عديم الحالة بطبيعته: يمكن استعادة المحفظة كاملة من عبارة الاسترداد وحدها، ما يجعل دليل البيانات قابلًا للاستغناء عنه.
- ليس بديلًا مباشرًا لـ zcashd: ينفّذ فقط مجموعة فرعية من دوال Zcash RPC، مع اختلافات تصميمية مقصودة للخصوصية والأمان.
- تتبع الرسوم ZIP-317 (حساب حتمي للرسوم)؛ وتُرفض الرسوم التي يحددها المستخدم.
- يدعم المذكرات المحمية (ZIP-302) عبر واجهة Bitcoin RPC المألوفة.
ما المشكلة التي يحلها zecd؟
كان zcashd العقدة والمحفظة الأصليتين لـ Zcash معًا — وقد تفرّع من قاعدة شيفرة Bitcoin المكتوبة بـ ++C عام 2016. ومع الوقت، أدى ذلك إلى احتكاك: فالشيفرة صعبة الصيانة، والمحفظة مقترنة بإحكام بالعقدة، كما تُعرض العناوين الشفافة كخيارات أساسية إلى جانب العناوين المحمية.
يفصل zecd مسؤولية المحفظة عن الإجماع. فهو طبقة محفظة مخصصة تقع بين التطبيقات وعقدة Zebra كاملة، وتوفّر:
- تنفيذًا حديثًا ونظيفًا بلغة Rust مبنيًا على librustzcash (وهي نفس المكتبة التي تشغّل Zodl وZingo)
- تصميم خصوصية-افتراضيًا (عناوين Orchard ما لم يُضبط خلاف ذلك)
- واجهة RPC متوافقة مع Bitcoin تزيل الحاجة إلى تعلّم أدوات خاصة بـ Zcash
- بنية عديمة الحالة قابلة للاستعادة من العبارة الأولية ومناسبة للنشر بالحاويات وفي السحابة
البنية
يعمل zecd وفق نموذج ثلاثي الطبقات:
Code-highlight
تطبيقك / عميل Bitcoin RPC
↓ JSON-RPC
zecd
(المفاتيح، المسح، الإثبات، RPC)
↓ JSON-RPC (محلي فقط)
Zebra
(عقدة كاملة — الإجماع، mempool، بيانات السلسلة)
يتواصل zecd مع Zebra حصريًا عبر JSON-RPC محلي — من دون شبكات نظير-إلى-نظير، أو مفهرسات خارجية، أو lightwalletd. واتصال Zebra مصمم عمدًا ليكون محليًا فقط: سيرفض zecd إرسال بيانات الاعتماد إلى مضيف يمكن توجيهه عالميًا ما لم يُضبط صراحة لاستخدام نفق مؤمّن خارج النطاق (مثل WireGuard أو SSH).
الميزات الرئيسية
محمي أولًا، وOrchard افتراضيًا
يستخدم zecd عناوين Orchard Unified Addresses كنوع العنوان الافتراضي. أما مجمّعات Sapling والعناوين الشفافة (t-address) فتتطلب إعدادًا صريحًا لكل محفظة. يقلّل هذا التصميم خطر الإرسال الشفاف غير المقصود — وهو من مشكلات الخصوصية الشائعة في أدوات Zcash الأقدم.
يمكن ضبط سياسة الخصوصية لكل استدعاء أو عالميًا في [spend] privacy_policy:
| السياسة | السلوك |
|---|
AllowRevealedRecipients (افتراضي) | يسمح بالإرسال إلى مستلمين شفافين؛ ويكشف المبلغ والمستلم على السلسلة |
AllowRevealedAmounts | يسمح بالإرسال بين المجمّعات (Sapling↔Orchard) لكنه يرفض المستلمين الشفافين |
FullPrivacy | يسمح فقط بالإرسال المحمي بالكامل داخل مجمّع واحد؛ ويرفض المستلمين الشفافين والإرسال بين المجمّعات |
AllowFullyTransparent | يسمح أيضًا بإرسالات t→t المموّلة من UTXOs شفافة |
التوافق مع Bitcoin Core RPC
ينفذ zecd لهجة JSON-RPC الخاصة بـ Bitcoin Core مع توافق يشمل:
- أسماء الدوال (مثل
getblockchaininfo, getbalance, getnewaddress, listtransactions, sendtoaddress, sendmany)
- أسماء الحقول وأنواعها في الاستجابات
- بنية غلاف JSON-RPC 1.0
- Basic auth، ومدخلات
rpcauth، ومصادقة ملف cookie
- رموز الأخطاء وربطها بحالات HTTP (HTTP 500 مع جسم الخطأ، ودلالات 401)
وهذا يعني أن كثيرًا من مكتبات مدفوعات Bitcoin الحالية، وتكاملات البورصات، وأدوات المراقبة يمكنها التفاعل مع Zcash عبر zecd مع تغييرات طفيفة أو من دون تغييرات في الشيفرة.
تعمل مجموعة اختبارات التوافق (أكثر من 140 فحصًا) على كل PR أمام daemon regtest حي، كما جرى التحقق منها أيضًا على testnet العام.
المذكرات المحمية (ZIP-302)
يكشف zecd ميزة المذكرات المحمية في Zcash عبر واجهة Bitcoin RPC المألوفة — وهو أمر غير متاح في أدوات Bitcoin القياسية:
- يقبل
sendtoaddress مذكرة hex اختيارية كمعامل إضافي أخير (حتى 512 بايت؛ وتُرفض للمستلمين الشفافين)
- تتضمن إدخالات سجل المعاملات من
listtransactions وgettransaction الحقلين memo (hex) وmemoStr (النص المفكوك) عندما يحمل أحد المخرجات مذكرة
- تُدعم الإرسالات ذات المبلغ الصفري إلى مستلم محمي لحالات الاستخدام المعتمدة على المذكرات فقط (نمط
z_sendmany المسمى "memo-only-send")
وهذا يجعل zecd مناسبًا للتطبيقات التي تحتاج إلى رسائل خاصة على السلسلة إلى جانب المدفوعات.
عديم الحالة بطبيعته
لا يحتفظ zecd بأي حالة خارج السلسلة لا يمكن لإعادة الاستعادة من العبارة الأولية وحدها إعادة بنائها. فقاعدة بيانات المحفظة (data.sqlite) كلها قابلة للاشتقاق من عبارة الاسترداد — تُستعاد الأموال المحمية دون قيد؛ وتُستعاد الأموال الشفافة حتى حد الفجوة المهيأ.
لاستعادة محفظة من العبارة الأولية:
Code-highlight
zecd init --restore --birthday <block-height>
وهذا يجعل دليل البيانات قابلًا للاستغناء عنه: فالحاوية التي لا تحتوي على volume دائم، وتُعاد بناؤها من العبارة الأولية عند كل تشغيل، لا تفقد شيئًا حرجًا. ويتحمّل المشغّلون مسؤولية تتبع العناوين التي يوزعونها — إذ لا يتذكر zecd العناوين إلا بعد أن تتلقى أموالًا على السلسلة.
الملصقات غير موجودة عمدًا. ولأن الملصقات ليس لها مصدر على السلسلة ولا يمكن إعادة بنائها من العبارة الأولية، فإن zecd ببساطة لا يدعمها. ويؤدي استدعاء دوال الملصقات إلى خطأ method-not-found (-32601).
عدم الاعتماد على lightwalletd
يشتق zecd الكتل المدمجة، وحالة الشجرة، ورؤية mempool مباشرة من JSON-RPC الخاص بـ Zebra. لا حاجة إلى تشغيل lightwalletd أو صيانته — مما يقلل التعقيد التشغيلي في بيئات الاستضافة الذاتية.
نشرات أصلية للسحابة ومعتمدة على الحاويات
صُمّمت بنية zecd العديمة الحالة لبيئات Docker وKubernetes:
- حزمة Docker Compose كاملة (
zebra → zecd) متاحة في المستودع
- نقطة فحص صحة على المنفذ
9233 مع مجسات readiness قابلة للضبط (synced أو connected)
- خيار تسجيل JSON منظّم لخطوط تجميع السجلات
- رسوم ZIP-317 حتمية — بلا oracle للرسوم أو إعداد يدوي للرسوم
bootstrap_from_keys (مفعّل افتراضيًا): دليل بيانات فارغ بجانب keys.toml يعيد بناء المحفظة تلقائيًا عند الإقلاع — انشر عبر ربط Secret واحد والبدء مع PVC فارغ
نماذج الحفظ
يدعم zecd ثلاثة نماذج لحفظ المفاتيح، تناسب متطلبات نشر وأمان مختلفة:
1. غير مشفّر (افتراضي — فتح تلقائي)
تُغلّف عبارة الاسترداد في keys.toml داخل ملف هوية age هو (identity.txt). ومع الإعداد الافتراضي auto_unlock = true، تُفك العبارة الأولية إلى الذاكرة عند الإقلاع بحيث تكون الإرسالات غير مراقبة ولا حاجة إلى استدعاء walletpassphrase.
الأفضل لـ: معالجات المدفوعات الآلية، والمحافظ الساخنة للبورصات، وبيئات المطورين.
Code-highlight
zecd init --datadir ./data --wallet default --account-name primary
خزّن identity.txt خارج دليل البيانات على mainnet — فأي شخص يقرأ الملفين معًا يملك سلطة الإنفاق.
2. مشفّر (محمي بعبارة مرور)
تُغلّف العبارة الأولية بعبارة مرور (age scrypt) بدلًا من ملف هوية. تبدأ المحفظة مقفلة؛ ويقوم walletpassphrase "<pass>" <timeout> بفتحها للمدة المحددة ثم تعود للإقفال تلقائيًا عند انتهاء المهلة — بما يطابق سلوك المحفظة المشفرة في Bitcoin Core.
الأفضل لـ: المحافظ الساخنة التي لا تتطلب سلطة إنفاق غير مراقبة؛ وسير عمل المشغّل التفاعلي.
Code-highlight
zecd init --datadir ./data --encrypt
# later: walletpassphrase "my-passphrase" 300
3. للمراقبة فقط (UFVK — من دون مفتاح إنفاق)
تُهيأ باستخدام Unified Full Viewing Key (UFVK) مُصدَّر من محفظة أخرى. يمكنها الاستلام، والمسح، والإبلاغ عن الأرصدة — لكنها لا تستطيع توقيع المعاملات. وهي مثالية للمراقبة، وإصدار الفواتير، أو عُقد التدقيق المنفصلة عن محفظة التوقيع.
Code-highlight
# On the signing wallet's host:
zecd export-ufvk
# On the watch-only host:
zecd init --datadir ./data-watch --ufvk "uview1..." --birthday <height>
النسخ الاحتياطي والاستعادة
يمكن استعادة الأموال من العبارة الأولية وحدها. وكل ما عدا ذلك مجرد cache.
| العنصر | الموقع | ما الذي يحميه | هل يجب نسخه احتياطيًا؟ |
|---|
| العبارة الأولية المكونة من 24 كلمة | تُعرض مرة واحدة عند zecd init | الأموال — فقدانها = فقدان دائم | نعم — دون اتصال (ورق/HSM) |
keys.toml | <wallet dir>/keys.toml | العبارة الأولية المشفرة + birthday + الشبكة | نعم — كـ Secret |
identity.txt | [keys] age_identity | يفك تشفير keys.toml (سلطة الإنفاق) | نعم — بشكل منفصل عن keys.toml |
| ارتفاع birthday | داخل keys.toml | يجعل الاستعادة سريعة (أي ارتفاع قبل أول tx) | سجّله مع العبارة الأولية |
data.sqlite | <wallet dir>/data.sqlite | cache المحفظة — يُعاد بناؤه من العبارة الأولية عند الاستعادة | لا — يمكن الاستغناء عنه |
blocks/ | |
يجب أن يكون دليل البيانات محليًا على المضيف. فقفل zecd أحادي النسخة (<datadir>/.lock) هو قفل استشاري على مستوى نظام التشغيل — ولا يمتد عبر المضيفين. لا تشارك أبدًا دليل بيانات بصلاحية قراءة-كتابة بين الأجهزة (NFS أو ReadWriteMany في Kubernetes) — إذ ستفسد نسختان من zecd قاعدة بيانات المحفظة. استخدم volumes من نوع ReadWriteOnce في Kubernetes.
قائمة سماح دوال RPC
في النشرات التي يكون فيها تسرب بيانات الاعتماد كارثيًا، يدعم zecd تقييد سطح RPC إلى مجموعة مختارة من الدوال:
Code-highlight
[rpc]
allowed_methods = ["getblockchaininfo", "getbalance", "getnewaddress", "listtransactions"]
أي دالة ليست ضمن القائمة تُرجع -32601 (HTTP 404) — بشكل لا يمكن تمييزه عن دالة غير موجودة أصلًا، بحيث لا يكشف الخادم المُحكم شيئًا عمّا عطّله. ويمكن لخادم فواتير للاستقبال فقط تعطيل sendtoaddress وsendmany وstop لتقليل نطاق الضرر إذا اختُرق العميل.
الفروقات الرئيسية عن Bitcoin Core RPC
ينبغي للمطورين المنتقلين من أدوات Bitcoin أو zcashd الانتباه إلى هذه الاختلافات المقصودة:
| السلوك | Bitcoin Core | zecd |
|---|
| تنسيق العنوان | 1... / bc1... | u1... (Orchard Unified Address) — لا يمكن لعملاء التحليل النصي اعتباره عنوان Bitcoin |
| الملصقات | مخزن ملصقات كامل | غير منفذ — setlabel وlistlabels وغيرها تعيد -32601 |
| الرسوم | يحددها المستخدم؛ وسوق رسوم | حتمية وفق ZIP-317 فقط؛ وتُرفض settxfee وfee_rate وsubtractfeefromamount مع -8 |
| المذكرات | غير مدعومة | sendtoaddress يقبل مذكرة hex؛ والسجل يحوي الحقلين memo وmemoStr |
| التأكيدات اللازمة للإنفاق | 1 | 3 (الفكة الخاصة) / 10 (لأطراف ثالثة) — قابلة للضبط عبر trusted_confirmations / untrusted_confirmations |
listsinceblock عند إعادة التنظيم | يتراجع حتى نقطة التفرع | يعيد (Block not found) إذا أزيل المؤشر بسبب إعادة التنظيم — أعد ضبط الأساس باستدعاء بلا معاملات |
بدء سريع
المتطلبات المسبقة: تشغيل Zebra محليًا مع rpc.listen_addr = 127.0.0.1:18234 (testnet).
التثبيت من crates.io (0.4.3+):
Code-highlight
cargo install zecd
أو البناء من المصدر:
Code-highlight
git clone https://github.com/zecrocks/zecd && cd zecd
cargo build --release
Code-highlight
# 1. تهيئة محفظة testnet (تنشئ عبارة أولية من 24 كلمة وحسابًا)
zecd --datadir ./data --testnet init --wallet default --account-name primary
# 2. تشغيل daemon (يُجري المزامنة في الخلفية ويخدم JSON-RPC على المنفذ 18232)
zecd --datadir ./data --testnet \
--rpcuser zec --rpcpassword secret --rpcbind 127.0.0.1 --rpcport 18232
التفاعل عبر curl:
Code-highlight
curl -s --user zec:secret --data-binary \
'{"jsonrpc":"1.0","id":"1","method":"getblockchaininfo","params":[]}' \
-H 'content-type: text/plain;' http://127.0.0.1:18232/
التفاعل عبر Python (باستخدام مكتبة Bitcoin RPC):
Code-highlight
from bitcoinrpc.authproxy import AuthServiceProxy
rpc = AuthServiceProxy("http://zec:secret@127.0.0.1:18232")
print(rpc.getblockchaininfo())
addr = rpc.getnewaddress() # returns a u1... Orchard Unified Address
print(rpc.getbalance())
print(rpc.listtransactions("*", 20))
# Send with a shielded memo
rpc.sendtoaddress(addr, 0.001, "", "", False, "48656c6c6f205a6563617368") # hex memo
الاستعادة من العبارة الأولية:
Code-highlight
zecd --datadir ./data init --restore --birthday 2500000
# paste your 24-word mnemonic when prompted
المنافذ الافتراضية
| الشبكة | zecd RPC | Zebra RPC (الخلفية) | الصحة |
|---|
| Mainnet | 8232 | 8234 | 9233 |
| Testnet | 18232 | 18234 | 9233 |
zecd مقابل zcashd مقابل Zaino
| zcashd | Zaino | zecd |
|---|
| الدور | عقدة كاملة + محفظة | مفهرس (يستبدل lightwalletd) | خادم محفظة فقط |
| اللغة | C++ | Rust | Rust |
| الحالة | متوقف تدريجيًا | نشط | نشط (v0.5.0-rc3، يوليو 2026) |
| المجمّع الافتراضي | شفاف | N/A | Orchard (محمي) |
| لهجة RPC | خاصة بـ zcashd | gRPC (lightwalletd) | Bitcoin Core JSON-RPC |
| يتطلب عقدة كاملة | نعم (ذاتيًا) | Zebra أو zcashd | Zebra |
| استعادة عديمة الحالة | لا | N/A | نعم (بالعبارة الأولية فقط) |
| المذكرات المحمية | نعم (z_sendmany) | N/A | نعم (واجهة Bitcoin RPC) |
| للمراقبة فقط (UFVK) |
صفحات ذات صلة
- عقدة Zebra الكاملة — العقدة الكاملة التي يتصل بها zecd
- مفهرس Zaino — مقاربة مفهرس بديلة (تستبدل lightwalletd)
- عقدة Zakura — تنفيذ آخر لعقدة كاملة (fork من Zebra)
- Viewing Keys — كيف يقوم zecd بمسح السلسلة باستخدام مفاتيح عرض الحساب
- المحافظ — نظرة عامة على منظومة المحافظ
الموارد