პულები 18
მაინერები N/A
ვორკერები N/A

< ყველა სტატია

Ravencoin-ის KAWPOW ხარვეზი: ბლოკის სათაური, რომელმაც შემოწმება თავად აირჩია

Ravencoin-ის ბლოკმა, რომელიც 4 487 776 სიმაღლეზე მოიპოვეს, საკუთარ სათაურში უფრო დაბალი სიმაღლე ჩაწერა. რადგან ეს რიცხვი ბოლო საკონტროლო წერტილზე (2 383 550) დაბლა იყო, ვალიდაციამ ენდო სათაურში უკვე არსებულ mix_hash-ს და მეხსიერებაზე მძიმე სრული შემოწმება არ გაუშვა.

აგვისტოს მეორე კვირაში Ravencoin-მა თავისი ჯაჭვი დაახლოებით სამი დღით უკან დააბრუნა. მიზეზი არ ყოფილა მაინერების კარტელი, საფულის ექსპლოიტი ან გატეხილი ჰეშ-ფუნქცია. ეს იყო ბლოკის სათაურის ერთი ველი, რომელსაც ნოდი ენდობოდა, რათა გაეგო, სამუშაოს მტკიცებულების ორი შემოწმებიდან რომელი გაეშვა. ქვემოთ ციტირებული კოდის ყველა ფრაგმენტი წაკითხულია თავად Ravencoin-ის კონსენსუსის კოდიდან და არა განცხადებიდან, ხოლო სადაც განცხადებები ამბობენ იმას, რასაც კოდი არ აჩვენებს, ეს სტატია ამას პირდაპირ ამბობს და არ ვარაუდობს.

რას შეიცავს KAWPOW სათაური

KAWPOW არის Ravencoin-ის სამუშაოს მტკიცებულება, ProgPoW-ის ვარიანტი, რომელზეც ჯაჭვი 2020 წლის მაისში გადავიდა, რათა მონეტა ჩვეულებრივ GPU-ებზე დარჩენილიყო. ამ გადასვლამ ბლოკის სათაური შეცვალა. აქტივაციის დრომდე სათაური მთავრდება ჩვეულებრივი 32-ბიტიანი nonce-ით, რომელსაც Bitcoin-დან წარმოებული ყველა ჯაჭვი იყენებს. მის შემდეგ სერიალიზატორი ამ ადგილას სამ ველს წერს, ამ თანმიმდევრობით: nHeight, შემდეგ nNonce64, შემდეგ mix_hash.

ამათგან ორი არაფრით გამორჩეულია. nNonce64 უბრალოდ უფრო ფართო nonce-ია. mix_hash არის ალგორითმის მეხსიერებაზე მძიმე ნაწილის შუალედური შედეგი, რომელიც სათაურშია, რათა შემმოწმებელს ჰქონდეს მნიშვნელობა შესადარებლად და არა გამოთვლა ნულიდან გასამეორებლად. საინტერესო მესამეა. nHeight არის ბლოკის მიერ საკუთარ სათაურში გაკეთებული განცხადება, რომელ სიმაღლეზე მიაჩნია, რომ იმყოფება.

ბლოკის რეალური პოზიცია ჯაჭვში აზრის საკითხი არ არის. მას hashPrevBlock განსაზღვრავს: რომელ ბლოკზეც აშენებთ, ის წყვეტს, სად აღმოჩნდებით, და ამაზე ტყუილით ჯაჭვის წვერს ვერ მიუერთდებით. nHeight არის იმავე ფაქტის მეორე, ჩასაწერი ასლი, ხოლო ფაქტის ასლი ზუსტად იმდენი ღირს, რამდენიც შემოწმება, რომელიც მას ორიგინალს ადარებს.

ორი ჰეშ-ფუნქცია, რომელთაგან ერთი არაფერს ამოწმებს

Ravencoin-ის hash.cpp განსაზღვრავს KAWPOW-ის ორ შესასვლელ წერტილს და მათი სიგნატურები ამბის უმეტესობას ჰყვება, სანამ რომელიმეს სხეულის ერთ სტრიქონს წაიკითხავთ. პირველია uint256 KAWPOWHash(const CBlockHeader& blockHeader, uint256& mix_hash). მეორეა uint256 KAWPOWHash_OnlyMix(const CBlockHeader& blockHeader).

პირველი mix_hash-ს გამომავალ პარამეტრად იღებს, რადგან მას აწარმოებს. ის მონაცემთა ნაკრებს ირჩევს ethash::get_epoch_number(blockHeader.nHeight)-ით, აგებს ამ ეპოქის კონტექსტს, თუ ის უკვე არ აქვს, და შემდეგ მასზე უშვებს progpow::hash-ს. დაბრუნებული mix სამუშაოს შესრულების თანმდევი პროდუქტია. ეს მეხსიერებაზე მძიმე გზაა, ხოლო მეხსიერებაზე სიმძიმე არის სწორედ ის მიზეზი, რის გამოც KAWPOW არსებობს და არა უბრალო ჰეში.

მეორე ასეთ პარამეტრს არ იღებს, რადგან არაფერს აწარმოებს. ის იყენებს სათაურში უკვე არსებულ mix-ს progpow::hash_no_verify(blockHeader.nHeight, header_hash, to_hash256(blockHeader.mix_hash.GetHex()), blockHeader.nNonce64)-ის მეშვეობით. ზედა ბიბლიოთეკამ ამ ფუნქციას hash_no_verify უწოდა და სახელი ზუსტია. ის ასრულებს შერევის ბოლო ნაბიჯს გადაცემულ მნიშვნელობაზე და პასუხს აბრუნებს. ის მონაცემთა ნაკრებს არასდროს აგებს, ამიტომ არასდროს ადგენს, რომ გადაცემული მნიშვნელობა მხოლოდ სამუშაოს შესრულებით შეიძლებოდა მიღებულიყო.

არცერთი ფუნქცია შეცდომა არ არის. იაფი ფუნქცია კარგი მიზეზით არსებობს: ნოდს, რომელიც მილიონობით ძველ ბლოკს ასინქრონებს და რომლებიც მყარად ჩაწერილმა საკონტროლო წერტილმა უკვე დაადასტურა, არ უნდა მოუწიოს მრავალგიგაბაიტიანი ნაკრების აგება ყოველ ეპოქაზე, რათა ხელახლა დაადასტუროს ისტორია, რომელსაც არავინ ედავება. ერთადერთი კითხვა, რომელსაც ასეთმა დიზაინმა უნდა უპასუხოს, ისაა, რომელ ბლოკებს აქვთ მისი გამოყენების უფლება.

კარიბჭე და ის, რასაც ენდობოდა

ამ კითხვას პასუხობს CheckBlockHeader ფაილში validation.cpp, ხოლო პასუხის ზემოთ მდებარე კომენტარი განზრახვას პირდაპირ აცხადებს: "If we are checking a KAWPOW block below a know checkpoint height. We can validate the proof of work using the mix_hash". განზრახვა სწორია. იმპლემენტაცია კი კარიბჭეს აგებს პირობაზე block.nHeight <= (uint32_t)pcheckpoint->nHeight, ხოლო block.nHeight არის რიცხვი, რომელიც ბლოკმა საკუთარ თავზე დაწერა.

ქვედა სტრიქონი იძახებს ზოგად CheckProofOfWork(uint256 hash, unsigned int nBits, const Consensus::Params&)-ს. შეხედეთ, რას არ შეიცავს ეს სიგნატურა. არც mix, არც nonce, არც სათაური. ის იღებს მზა ჰეშს და სამიზნეს, ადარებს მათ და არანაირად არ შეუძლია გაიგოს, ორი ფუნქციიდან რომელმა აწარმოა მიღებული რიცხვი. KAWPOW ბლოკისთვის CBlockHeader::GetHash() აბრუნებს KAWPOWHash_OnlyMix(*this)-ს, ამიტომ მიღებული რიცხვი იაფია.

ერთად თუ შევკრებთ, ბლოკი, რომელმაც საკმარისად დაბალი nHeight განაცხადა, მოწმდებოდა მხოლოდ იმ კითხვით, ეცემოდა თუ არა მისივე mix ჰეშიდან მიღებული მნიშვნელობა სამიზნის ქვემოთ. ამ გზაზე არაფერი კითხულობდა, საიდან მოვიდა mix, და არაფერი ადარებდა განცხადებულ სიმაღლეს იმ პოზიციას, რომელიც ბლოკს რეალურად ეკავა.

რამდენად დაბალი იყო საკმარისად დაბალი, სულაც არ არის დახვეწილი საკითხი. გამოშვებული mainnet ჯაჭვის პარამეტრებში ყველაზე მაღალი საკონტროლო წერტილია 2 383 550. პირველი გაყალბებული ბლოკი იყო 4 487 776-ზე. მის სათაურს უნდა განეცხადებინა პოზიცია, რომელიც რეალურზე დაახლოებით 2,1 მილიონი ბლოკით უკან იყო, ხოლო ასე არჩეული განშტოება ამ სხვაობას არასდროს უყურებდა.

რა მოიტანა და რა არ მოიტანა მალსახმობმა

აქ სიზუსტე ღირს, რადგან გაშუქების უმეტესობა ამას ზედაპირულად ეკიდებოდა, ზედაპირული ვერსია კი ხარვეზს რეალურზე უფრო მარტივადაც და უცნაურადაც აჩენს.

მალსახმობს სირთულე არ შეუმცირებია. nBits მოწმდება იმის მიხედვით, რას მოითხოვს რეალური წინა ბლოკი, ხოლო რეალურ წინა ბლოკს hashPrevBlock ირჩევს, რომლის გაყალბებაც თავდამსხმელს წვერზე დაჯდომის შენარჩუნებით არ შეუძლია. გაყალბებულ ბლოკს ზუსტად იგივე სამიზნე უნდა გადაელახა, რაც იმავე წუთში მოპოვებულ პატიოსან ბლოკს.

შეიცვალა ერთი მცდელობის ფასი. პატიოსანი მაინერი ყოველ მცდელობაში იხდის გიგაბაიტებით გაზომილი მონაცემთა ნაკრების სრული გავლით, რაც მეხსიერებაზე მძიმე ალგორითმის მთელი აზრია და მიზეზი, რის გამოც KAWPOW ექვსი წელია ASIC-ებს Ravencoin-ისგან შორს იჭერს. მალსახმობი ღირს სათაურის ერთი ჰეში და შერევის ერთი ბოლო ნაბიჯი თავდამსხმელის მიერ თავისუფლად არჩეულ მნიშვნელობაზე. იგივე ლატარია, ყოველ ბილეთზე იგივე შანსი, ბილეთები კი რიგებით იაფი. 2Miners-მა შედეგებს თითქმის ნულოვანი სამუშაოს ბლოკები უწოდა და იმასთან შედარებით, რაც KAWPOW-ს უნდა ღირდეს, ეს სამართლიანი აღწერაა.

რა მოხდა ქსელში

პირველი ცნობილი არავალიდური ბლოკია 4 487 776, დროის ნიშნულით 2026-08-07 15:44:01 UTC. ექსპლუატაცია 10 აგვისტოს საგანგებო გამოშვებამდე გაგრძელდა. 2 089 ბლოკის ერთ შესწავლილ მონაკვეთში 2Miners-მა 96 დაზარალებული ბლოკი დაითვალა, ამიტომ გაყალბებული ბლოკები განშტოებაშია მიმოფანტული და არა ერთ მწკრივად, რის გამოც გამოსავალი რეორგანიზაცია უნდა ყოფილიყო და არა წერტილოვანი ამოღება.

ნოდების ოპერატორებისთვის ხილული სიმპტომი უფრო უარესი იყო, ვიდრე არავალიდური ბლოკის ჩუმი მიღება. ნოდები ამ ბლოკებზე ვარდებოდა, გადატვირთვის შემდეგ კი სინქრონიზაციას წყვეტდა. Tron Black-მა მას შემდეგ ეს მექანიზმი აღწერა და ეს თანმდევი ზიანის სუფთა მაგალითია. ბლოკების ინდექსი ინახავს სიმაღლეს, რომელზეც ბლოკი რეალურად დგას, და არა სათაურში განცხადებულს. გადატვირთვისას ნოდი ყოველ სათაურს ინდექსიდან აღადგენს და მის ჰეშს თავიდან ითვლის, ამიტომ გაყალბებული ბლოკისთვის ჰეშავს რეალურ სიმაღლეს იქ, სადაც სათაურს ყალბი ეწერა. ჰეში აღარ ემთხვევა, სამუშაოს მტკიცებულების შემოწმება ვერ გადის და LoadBlockIndexGuts წყვეტს მუშაობას. ბლოკი ერთხელ მიიღეს, შემდეგ კი მისი ჩატვირთვა შეუძლებელი გახდა, რის გამოც მეორე სიმპტომმა პირველს გადააჭარბა.

რამდენიმე ბირჟამ RVN-ის შეტანა და გატანა შეაჩერა, სანამ განშტოება გადაუწყვეტელი იყო. ეს ჩვეულებრივი და სწორი რეაქციაა ჯაჭვზე, რომლის ბოლო ისტორიაც თავიდან უნდა დაიწეროს, და ამის მოლოდინი უნდა გქონდეთ და არა მონეტაზე განაჩენად აღქმა.

პაჩი და საიდან მოვიდა ის

პირველი გამოსწორება 10 აგვისტოს გამოვიდა, ვერსიად 4.6.1.1-hf1, და ის მოვიდა 2Miners-ისგან, მაინინგ-პულისგან, და არა Ravencoin-ის პროექტისგან. მან ზიანი შეაჩერა ყველასთვის, ვინც ის დააყენა. ერთი დღის შემდეგ ის ჩანაცვლდა.

ვერსია 4.8.0, რომელიც 11 აგვისტოს Ravencoin-ის რეპოზიტორიაში გამოქვეყნდა, არის გამოშვება, რომელიც უნდა გაუშვათ. ნაკლებს ნუ დასჯერდებით. ის 4 487 776-დან მოყოლებული უარყოფს ბლოკებს, რომელთა სათაურში განცხადებული სიმაღლე მათ რეალურ პოზიციას არ ემთხვევა, 4 487 775-ს ბოლო სუფთა ბლოკად აფიქსირებს საკონტროლო წერტილით, დაზიანებულ ჯაჭვის მდგომარეობას ავტომატურად აღადგენს გაჩერების ნაცვლად და მოიცავს აქტივების გადაცემის გადავსების გამოსწორებას, რომელიც საგანგებო პაჩში არ იყო, სხვა ზედა სამუშაოებთან ერთად.

ამათგან მხოლოდ პირველია შეკეთება. უარყავით ბლოკი, რომლის განცხადებული სიმაღლე არ ემთხვევა იმას, სადაც რეალურად დგას, და კარიბჭე იკეტება. საკონტროლო წერტილი და ავტომატური აღდგენა აღდგენის ღონისძიებებია, ხოლო საკონტროლო წერტილი განსაკუთრებით უხეში იარაღია: ეს მყარად ჩაწერილი მტკიცებაა, რომ ერთი კონკრეტული ბლოკი სწორია, რაც ჯაჭვს რაც შეიძლება ნაკლებად სჭირდება. ის აქ იმიტომ არის, რომ პატიოსანი განშტოება უფრო სწრაფად უნდა გამყარებულიყო, ვიდრე ამას მხოლოდ ჰეშრეიტი შეძლებდა.

თავად აღდგენის წერტილი შეფასების საკითხი იყო და არა აშკარა არჩევანი. Tron Black-მა დაწერა, რომ პულებს სთხოვა, განეხილათ უფრო ახალი წერტილი, რათა რეორგანიზაცია უფრო ზედაპირული ყოფილიყო, ხოლო გაყალბებული ბლოკები გამონაკლისის წესით დამუშავებულიყო. მათ უარი თქვეს და ყველაზე სუფთა ხაზი აირჩიეს. სამუშაოს მტკიცებულების სისტემაში ასეთი დავა თავისით წყდება: როცა პატიოსანი ჰეშრეიტის უმრავლესობა ისტორიაზე უარს ამბობს, ეს ისტორია მარცხდება, ხოლო ორ უდიდეს პულს ერთად უმრავლესობა ჰქონდა.

რას ნიშნავს რეალურად სამდღიანი რეორგი

რადგან მოწყვლადმა ნოდებმა გაყალბებული ბლოკები მიიღეს, მათ შემცველ განშტოებაზე ნამდვილი ჯაჭვი დაგროვდა. მისი გადაგდება რეორგანიზაციას ნიშნავს, ხოლო Ravencoin-ის ერთწუთიანი ბლოკის სამიზნით მონაკვეთი 4 487 776-დან პაჩამდე დაახლოებით სამი დღის ბლოკებია.

თუ RVN გაქვთ, პრაქტიკული მნიშვნელობა ისაა, რომ გადაგდებულ განშტოებაზე დადასტურებული ტრანზაქციები აღარ არის დადასტურებული. მათი უმეტესობა mempool-ში ბრუნდება და გადარჩენილ ჯაჭვზე ხელახლა მოიპოვება, მაგრამ ეს გარანტირებული არ არის და მათი ერთი კლასი საერთოდ ვერ დაბრუნდება. ტრანზაქცია, რომელმაც გადაგდებული ბლოკის coinbase დახარჯა, ხარჯავს მონეტებს, რომლებიც გადარჩენილ ჯაჭვზე აღარ არსებობს, და ასევე ყველაფერი, რაც მასზეა აშენებული. ისინი უბრალოდ არავალიდურია და არა მოლოდინში. სწორედ ამიტომ იყო ბირჟების შეჩერება სწორი გადაწყვეტილება და არა გადაჭარბებული რეაქცია, და სწორედ ამიტომ საჭიროებდა სიფრთხილეს 4 487 775-ის შემდგომი აქტივობა, სანამ ერთი წვერი არ დადგინდა.

ერთი დეტალის ცოდნა ღირს, თუ იმ კვირაში უყურებდით, როგორ არ მოძრაობდა ნოდი. Ravencoin-ის ნოდებს აქვთ გრძელი რეორგის აკრძალვის წესი, რომელიც არსებობს, რათა მოულოდნელმა უმრავლესობის შეტევამ ღრმა ისტორია არ გადაწეროს. უწყვეტად მომუშავე ძველი ნოდების უმეტესობა საბოლოოდ ჩამოვიდა იმ პირების რაოდენობაზე დაბლა, რომელზეც ეს წესი დამოკიდებულია, და შემდეგ, დიზაინის მიხედვით, გრძელი ჯაჭვი მიიღო. რამდენიმე ასე არ მოიქცა, რადგან საკმარისი პირი არასდროს დაკარგა და რადგან დაწერილი წესების მიხედვით არაფერი დარღვეულა. ეს დაცვაა, რომელიც ზუსტად სპეციფიკაციის მიხედვით მუშაობს პრობლემაზე, რისთვისაც არასდროს შექმნილა. გაყოფა ვალიდაციის ხარვეზმა გამოიწვია და არა უმრავლესობის შეტევამ, ხოლო წესს მათი გარჩევა არ შეუძლია.

რა გააკეთოთ, თუ RVN-ს მაინინგს უწევთ

თუ საკუთარ Ravencoin ნოდს მართავთ, გაუშვით 4.8.0 და კონკრეტულად არა რომელიმე ადრეული გამოშვება, რომელიც ამის მხოლოდ ნაწილს აგვარებდა. გააჩერეთ ნოდი, შეცვალეთ ბინარული ფაილი, ხელახლა გაუშვით. reindex არ არის საჭირო და არც ხელით ნაბიჯი: პროგრამა საჭიროს თავად აღადგენს. საგანგებო პაჩიდან გადმოსული ნოდი სწრაფად ირთვება. გამოუსწორებელი პროგრამიდან გადმოსულ ნოდს ხელახლა გავლა და აღდგენა სჭირდება, რაც ჩვეულებრივ აპარატურაზე რამდენიმე საათია, ხოლო bad-blk-height შეცდომები ამ პერიოდში პაჩის მუშაობაა და არა მისი ხარვეზი.

თუ პულის მეშვეობით მაინინგს ეწევით, თქვენს მხარეს შესაცვლელი არაფერია. არც ახალი მისამართი, არც ახალი პორტი, არც მაინინგის პროგრამის განახლება. თავად KAWPOW აქ პრობლემა არასდროს ყოფილა: ალგორითმმა ზუსტად ის გააკეთა, რისთვისაც შეიქმნა, ხარვეზი კი იყო კოდში, რომელიც წყვეტდა, როდის გაეშვა იგი. ჰეშრეიტი, რომელიც ძველ განშტოებაზე მიმართეთ, რეალური სამუშაო იყო. ის უბრალოდ მოხვდა ბლოკებზე, რომლებიც გადააგდეს მათ შორის მიმოფანტულ გაყალბებულ ბლოკებთან ერთად.

არსებობს ერთსტრიქონიანი გზა იმის დასადასტურებლად, რომ სწორ ჯაჭვზე აღმოჩნდით, და ამის გაკეთება ღირს და არა ვარაუდი. შეამოწმეთ 4 494 143 ბლოკის ჰეში. კანონიკურ ჯაჭვზე ის მთავრდება 4c67d6a4-ით, ხოლო Ravencoin-ის დამოუკიდებელი ექსპლორერები ყველა იმავე ჯაჭვს აჩვენებდა, როცა პროექტმა ქსელი აღდგენილად გამოაცხადა.

ხარვეზის ფორმა

თუ კონკრეტიკას მოვაშორებთ, რჩება ფორმა, რომელიც მუდმივად მეორდება, ჯაჭვებშიც და მათ გარეთაც. გარედან მოსული მნიშვნელობა გამოიყენეს იმის გადასაწყვეტად, რამდენად ყურადღებით შემოწმდებოდა იგივე მნიშვნელობა. სათაურმა საკუთარი სიმაღლე განაცხადა და ნოდმა ეს განცხადება გამოიყენა იმის ასარჩევად, სამუშაოს მტკიცებულების რომელი შემოწმება უნდა გაევლო შემდეგ სათაურს.

სწორი ვერსია რთული არ არის და პაჩი არსებითად მისი ერთი სტრიქონია: შეადარეთ განცხადებული სიმაღლე იმ პოზიციას, რომელიც ბლოკს რეალურად უკავია, სანამ მას რაიმეს გადაწყვეტის უფლებას მისცემთ. რატომ აკლდა ეს, უფრო საინტერესო ნაწილია. მალსახმობი დაიწერა უკვე სანდო ბლოკებისთვის და ამ დაშვების ფარგლებში კარიბჭე ფაქტის კონსტატაციად იკითხება და არა კითხვად, რომელსაც ვინმემ შეიძლება არაპატიოსნად უპასუხოს. ის ასე აღარ იკითხება იმ წამიდან, როცა არასანდო ბლოკს ველის შევსების უფლება ეძლევა, ხოლო კოდში არაფერი აღნიშნავდა მომენტს, როცა ეს შეიცვალა.

მისი აღმოჩენის შესახებ ორი რამის ჩაწერა ღირს. Ravencoin-ის კოდს პროფესიონალური უსაფრთხოების აუდიტები ჰქონდა და მათ ვერ დაიჭირეს ვერც ეს, ვერც აქტივების გადავსება, რომელიც მასთან ერთად გამოსწორდა. Tron Black-მა დაწერა, რომ ძლიერ ეჭვობს, ორივე ხელოვნური ინტელექტის მოწინავე მოდელის უსაფრთხოების მიმოხილვამ გამოავლინა. ხელსაწყოს მიუხედავად, ეს ფორმას ერგება: ხარვეზი უხილავია, სანამ მალსახმობს მისივე პირობებით კითხულობთ, და ჩნდება მხოლოდ მაშინ, როცა იკითხავთ, ვინ ავსებს იმ ველს, რომელსაც მალსახმობი ენდობა.

ბოლოს ღირს იმის შემჩნევა, ვინ იმოქმედა და რა თანმიმდევრობით. მაინინგ-პულმა წაიკითხა ვალიდაციის გზა, გაიგო ის და საგანგებო ბინარული ფაილი სამ დღეში გამოუშვა. შემდეგ ორი უდიდესი პული შეთანხმდა ისეთი ჯაჭვის მაინინგზე, რომელიც მთელ შეტევის ფანჯარას აგდებდა, მოსახერხებელი წერტილის ნაცვლად, და როცა უფრო ზედაპირულის აღება სთხოვეს, უარი თქვეს. პროექტი ერთი დღის შემდეგ მიჰყვა გამოშვებით, რომელიც პაჩს ანაცვლებს და მეტს ასწორებს. ვინ იყო პირველი, ნაკლებად მნიშვნელოვანია იმაზე, რომ ორივე მოხდა, და რომ საქმე რეალურად გადაწყვიტა არა რომელიმე განცხადებამ, არამედ გაყოფის ერთ მხარეს დაგროვებული რეალური სამუშაოს წონამ. ასე გამოიყურება დეცენტრალიზაცია დღეს, როცა მას წონა უნდა ატაროს და არა თეთრ ფურცელზე იდოს.

საიდან არის ეს ციფრები

რათა ნებისმიერმა შეძლოს შემოწმება და არა ჩვენი სიტყვის რწმენა. სათაურის განლაგება, ორი ჰეშ-ფუნქცია და მათი სიგნატურები, ეპოქის არჩევა და ვალიდაციის განშტოება თავისი კომენტარით წაკითხულია თავად Ravencoin-ის კოდიდან, ფაილებში src/primitives/block.h, src/primitives/block.cpp, src/hash.cpp, src/hash.h, src/pow.h და src/validation.cpp. საკონტროლო წერტილების სია, მათ შორის 2 383 550 როგორც mainnet-ის ყველაზე მაღალი, წაკითხულია src/chainparams.cpp-დან. პირველი არავალიდური სიმაღლე და მისი დროის ნიშნული მოდის Ravencoin-ის პროექტის საკუთარი ქსელის შეტყობინებიდან. ბლოკების ინდექსის ვარდნის გზა, coinbase-ზე დამოკიდებული ტრანზაქციები, რომლებიც ვერ ბრუნდება, გრძელი რეორგის აკრძალვის ქცევა, უარყოფილი ზედაპირული აღდგენის წერტილი, აუდიტისა და ხელოვნური ინტელექტის მიმოხილვის შენიშვნები, 4.8.0-ის შემადგენლობა და 4 494 143-ის შემოწმება მოდის Tron Black-ის ანგარიშიდან Ravencoin-ის პროექტისთვის. საგანგებო პაჩის ვერსია და 2 089-დან 96 დაზარალებული ბლოკის რაოდენობა მოდის 2Miners-ის გამოშვებიდან და მის გარშემო გაშუქებიდან. ყველაფერი, რასაც წყაროები არ აცხადებენ, ამ სტატიიდან ამოღებულია და არა შევსებული.