माइनिंग
RandomX के साथ proof of work, उसी प्रोसेसर पर जो पहले से आपके कंप्यूटर में है। मुक़ाबले के लिए न कोई ASIC फ़ार्म, न कोई premine — कॉइन माइनिंग से आते हैं और कहीं से नहीं।
पूरा सार#
# A payout address. The node never sees the key behind it.
zcd wallet new --out miner.json
# Mine to it.
zycordd --testnet --dir ./testnet \
--mine --payout $(zcd wallet address --key miner.json)
सार्वजनिक testnet पर और mainnet पर वे -randomx बाइनरी हैं —
zcd-randomx और zycordd-randomx। बिना tag के बनी बाइनरी विकास इंजन पर लौटने के
बजाय शुरू होने से मना कर देती है।
इंस्टॉलेशन देखें।
जब चाहें तब शुरू करें#
जो नोड अपने नेटवर्क के पहले ब्लॉक के नियत समय से पहले शुरू किया जाए वह जल्दी माइन नहीं करता और उसे नियत घंटे पर दोबारा शुरू करने की ज़रूरत नहीं पड़ती। वह ऐसा ब्लॉक बनाने से मना कर देता है जिसकी टाइमस्टैम्प तक उसकी अपनी घड़ी नहीं पहुँची है, इंतज़ार करता है, और ख़ुद ही शुरू हो जाता है। इंतज़ार के दौरान वह यह बताता भी है, उस समय के साथ जिसका वह इंतज़ार कर रहा है और कितना बाक़ी है:
waiting to mine: the next block cannot be dated before 2026-10-01T00:00:01Z
(unix 1790812801), and this node's clock reads 2026-09-30T20:12:31Z - 3h47m30s
to wait. Leave this running: mining starts on its own and there is nothing to
restart or reconfigure.
यह माइन करने से इनकार है, चलने से नहीं: नोड पूरे समय पीयर बनाता है, सिंक करता है और अपनी RPC परोसता है। संदेश हर दस मिनट में दोहराया जाता है ताकि लंबा इंतज़ार अटकाव जैसा न लगे।
इंतज़ार इसी मशीन की घड़ी के हिसाब से गिना जाता है, इसलिए दिनों पीछे सेट की गई घड़ी दिनों तक इंतज़ार कराती है। कुछ और जाँचने से पहले इसे जाँचें।
वही इनकार यह भी वजह है कि शुरुआती समय प्रकाशित करना सुरक्षित है। उसके बिना माइनर अपने हेडर की तारीख़ आगे
बढ़ाकर median फ़र्श पर रख देता था, जो genesis से पहले ख़ुद genesis_time ही होता है
— इसलिए जल्दी की गई शुरुआत एक ऐसी निजी चेन बनाती थी जिसे कोई और परख नहीं सकता था, और चूँकि कठिनाई का
नियम घोषित समाधान-समय मापता है, ऐसी चेन जिसका लक्ष्य हर ब्लॉक पर उन अंतरालों के हिसाब से कठोर होता
जाता था जिनका बीते असली समय से कोई लेना-देना नहीं था। इसके लिए किसी को बेईमान होने की ज़रूरत नहीं थी; रात भर
चलता छोड़ देने से यही होता था।
भुगतान पता persistent होना चाहिए#
यह एक persistent (0x02) पता होना चाहिए — zcd wallet
address डिफ़ॉल्ट रूप से ऐसा ही एक छापता है — और zycordd चेतावनी देने के बजाय
किसी और को अस्वीकार कर देता है। नोड उस कुंजी को कभी नहीं देखता जो इसे नियंत्रित करती है, और
चाहकर भी इनाम खर्च नहीं कर सकता।
एक one-shot (0x01) भुगतान पता तब तक ठीक से माइन करता है जब तक आप उससे एक बार खर्च न कर लें।
वह डेबिट पते को हमेशा के लिए खर्च-शुदा चिह्नित कर देता है, और fold उसी ब्लॉक से आगे उस पते पर आने वाला हर
पकता हुआ इनाम जला देता है — maturity रिंग ब्लॉक के सर्टिफिकेट उतरने के बाद घूमती है, इसलिए खर्च ढोने
वाला ब्लॉक ही पहला ऐसा ब्लॉक होता है जो पैसा गँवाता है, और आपके पिछले coinbase_maturity ब्लॉकों
में से जो कुछ अब भी रिंग में है वह भी उसके साथ चला जाता है।
कोई त्रुटि नहीं आती। इसका इकलौता निशान उस नोड की अपनी ब्लॉक पंक्ति पर होता है:
matured=0, जो एक साधारण ख़ाली रिंग slot भी छापता है, और एक ऐसा
burned= जो सामान्य रूप से बताए जाने वाले आधार और skip शुल्क के साथ-साथ उत्पादक का पूरा
हिस्सा चुपचाप सोख चुका होता है। इनमें से कोई फ़ील्ड "coinbase" नहीं कहता। persistent पता spent registry
में कभी जा ही नहीं सकता, इसलिए यह विफलता कम नहीं होती बल्कि हट जाती है —
वॉलेट नियम 3 देखें।
Coinbase maturity#
इनाम coinbase_maturity ब्लॉकों के बाद पकते हैं — mainnet और सार्वजनिक testnet दोनों पर
100। तब तक वे स्टेट में दिखते हैं पर खर्च नहीं हो सकते, और बिना premine वाली चेन पर पहली
जमा राशियाँ इसी से बनती हैं: लगभग पहले सौ ब्लॉकों तक केवल माइनर ही लेन-देन कर सकते
हैं।
mainnet पर कोई faucet नहीं है और न होगा, इसलिए mainnet पर वही ढलान पूरा वितरण है: खेलने के लिए माइन करें। सार्वजनिक testnet पर एक faucet है, जो उस पर मौजूद हर चीज़ की तरह माइनिंग से ही भरता है, क्योंकि जिस नेटवर्क के कॉइन का कोई मूल्य नहीं, वह किसी को माइनर आज़माने से पहले वॉलेट आज़माने देने में कुछ नहीं गँवाता।
इसे चलाने की लागत#
work फ़ंक्शन एक consensus पैरामीटर है, कोई सेटिंग नहीं। zcd
params उसे छापता है:
proof of work randomx-v1 (re-keyed every 2048 blocks, 64-block lag)
मेमोरी#
सत्यापन को प्रति रखे गए key epoch लगभग 256 MiB चाहिए, और तालिका दो रखती है ताकि किसी key सीमा के आर-पार हुआ reorg हर ब्लॉक पर एक नया न बनाए। उस तालिका से ज़्यादा का बजट रखें, क्योंकि तालिका ही सीमा नहीं है। कैश आवंटित होते ही मेमोरी में रहता है और उसे महँगा बनाने वाला Argon2 भराव उसके बाद आता है — इसलिए बनते समय दो और जीवित रह सकते हैं — और जो प्रविष्टि तब हटाई जाए जब कोई उसे अब भी इस्तेमाल कर रहा हो, वह उस उपयोगकर्ता के छोड़ने तक अपना सब कुछ थामे रखती है, और माइनर dataset भराव के दौरान यही करता है।
| भूमिका | बजट | क्यों |
|---|---|---|
| सत्यापन करने वाला नोड | इंजन के लिए ~1 GiB | दो-प्रविष्टि वाली तालिका के विरुद्ध शिखर कैश दोनों प्रभाव एक साथ होने पर 1280 MiB मापा गया — न कि 512 MiB जो तालिका से लगता है। |
| माइनिंग करने वाला नोड | ~3.3 GiB | इसके अतिरिक्त ~2 GiB का dataset आवंटित करता है, और यही वह स्थिति है जो भराव के दौरान एक उधार लेने वाले को थामे रखती है। |
जो मशीन आराम से सत्यापन कर सकती है वह ज़रूरी नहीं कि माइन भी कर सके।
थ्रेड#
--mine-threads डिफ़ॉल्ट रूप से प्रति कोर एक होता है। इससे वैधता में कुछ नहीं बदलता; यह इतना भर
तय करता है कि यह नोड समाधान कितनी तेज़ी से ढूँढ़ता है।
key बदलने पर क्या होता है#
work फ़ंक्शन हर randomx_key_interval ब्लॉक पर दोबारा कुंजीबद्ध होता है। माइनिंग करने वाला नोड
तब ~2 GiB का dataset दोबारा बनाता है और उस दौरान माइनिंग रोक देता है — क़रीब
दस सेकंड, जो मशीन पर निर्भर है; अपनी मशीन का समय लॉग में पहली सीमा से मापें।
वह पूरे समय सत्यापन करता रहता है, और कोई पुनर्निर्माण उसे अटका नहीं सकता: जिस key epoch की
माइनिंग हो रही है उसके अलावा किसी भी epoch का हेडर उसी epoch के अपने 256 MiB कैश पर सत्यापित होता है, जिसे
dataset छूता तक नहीं। दोनों एक जैसे digest निकालते हैं, इसलिए पुनर्निर्माण से सत्यापन में केवल गति का फ़र्क़
पड़ता है। अगले epoch का कैश epoch के आख़िरी randomx_key_lag ब्लॉकों में गरम कर लिया जाता है।
| नेटवर्क | randomx_key_interval | माइनिंग ठहराव, लगभग |
|---|---|---|
| mainnet | 2048 ब्लॉक | हर ~17 घंटे में एक |
| सार्वजनिक testnet | 512 ब्लॉक | हर ~4 घंटे में एक |
testnet का छोटा अंतराल जानबूझकर है: उस सीमा का ज़्यादा बार अभ्यास करना उसी का हिस्सा है जिसे मापने के लिए यह नेटवर्क मौजूद है। अगले epoch का dataset पहले से बनाना संभव है — कुंजी ऊँचाई से आती है, इसलिए वह सीमा से काफ़ी पहले पता होती है — और जानबूझकर ऐसा नहीं किया जाता: इसका मतलब होगा दो को एक साथ, यानी 4 GiB, थामे रखना, सिर्फ़ उस ठहराव को बचाने के लिए जो माइनर को दिन में कुछ सेकंड की पड़ती है।
माइनिंग नोड को रोकना#
SIGTERM (या Ctrl-C) उसे रोक देता है, और वह तुरंत रुकता है: एक ही संकेत
हर लूप तक पहुँचता है, न कि सिर्फ़ उस लूप तक जो संयोग से चैनल पर इंतज़ार कर रहा हो।
key बदलने के दौरान आया रोकने का आदेश dataset भराव पूरा होने का इंतज़ार करता है
— इंजन ~2 GiB का बफ़र तब तक नहीं छोड़ेगा जब तक hash कॉल उसे पढ़ रही हों, और यह C में एक
use-after-free होता जिसकी सूचना कोई Go उपकरण नहीं देता। यह एक निश्चित घटना का इंतज़ार करने वाला ठहराव है, न
कि उससे दौड़ लगाने वाला: दस बार चलाकर मापा गया, संकेत चाहे कितना भी जल्दी आया हो, बाहर निकलने का क्षण नहीं
हिला, जबकि इंतज़ार 4.5 s से घटकर 0.7 s रह गया, और कोई SIGSEGV नहीं हुआ।
इसलिए रोकने का टाइमआउट अपनी मशीन के भराव समय से ऊपर रखें। दूसरा SIGTERM
इंतज़ार नहीं करता — पहला संकेत को ऑपरेटिंग सिस्टम को लौटा देता है, इसलिए उस ठहराव के दौरान
दोबारा Ctrl-C दबाने से प्रक्रिया तुरंत मर जाती है।
पूल, और वे क्यों नहीं हैं#
लॉन्च पर कोई मौजूद नहीं है और कोई आधिकारिक नहीं है। नोड बॉक्स से निकलते ही अकेले माइन करता है, और genesis कठिनाई पर यही समझदारी भरा रास्ता है। अगर पूल सामने आएँ तो वे तीसरे पक्ष हैं; वही संदेह बरतें जो आप कहीं और बरतेंगे।
बॉटनेट, नकारे नहीं बल्कि नाम लेकर#
CPU माइनिंग उन्हें न्योता देती है। हर CPU से माइन होने वाले कॉइन ने उनसे लड़ाई लड़ी है और यह परियोजना अपवाद होने की उम्मीद नहीं रखती। यह सौदा आँखें खोलकर किया गया है: बॉटनेट से तिरछा हुआ वितरण भी किसी बिक्री में तय हुए वितरण से चौड़ा होता है, और आपके पास पहले से मौजूद लैपटॉप को प्रतिस्पर्धी बनाए रखना ही RandomX के होने का पूरा कारण है।
इसे काम करते देखना#
testnet explorer हर ब्लॉक और हर सर्टिफिकेट दिखाता है,
जिसमें वह पृष्ठ भी शामिल है जिसे किसी और चेन का explorer दिखा नहीं सकता: हर सर्टिफिकेट लागू हुआ, या
skip होकर बिल हुआ, और कौन-सा घोषित read टिकना बंद हो गया। आपका अपना नोड इन्हीं प्रश्नों का उत्तर
/status, /head और /metrics पर देता है —
केवल-पठन सतह देखें।