ძირითადი საკითხიდან: ისტორია იმისა, თუ როგორ დაიწყო „პატარა ჰობის პროექტის“ ბიბლიოთეკა, რომელიც გადაიქცა ერთ-ერთ ყველაზე უსაფრთხოების კრიტიკულ კოდის გზად მრავალტრილიონიანი აქტივის დასაცავად. ბიტკოინერებს შორის გავრცელებული ფრაზებია „ნუ ენდობი, გადაამოწმე“ ან „არა შენი გასაღებები, არა შენი მონეტები“, ზოგჯერ კი ამტკიცებენ, რომ ის „მათემატიკით არის გამყარებული“. მაგრამ რას ნიშნავს საბოლოოდ ეს ანდაზები და როგორ ხორციელდება ეს მათემატიკა პრაქტიკაში? მკითხველთა უმეტესობამ, რა თქმა უნდა, იცის, რომ ბიტკოინის დიზაინის ფუნდამენტური ინგრედიენტია საჯარო გასაღების კრიპტოგრაფია და უფრო კონკრეტულად ციფრული ხელმოწერები, რომლებიც აუცილებელია საკუთრების დასამტკიცებლად ცენტრალური ერთეულის საჭიროების გარეშე. ალბათ ნაკლებად ცნობილია, თუ რომელი პროგრამული უზრუნველყოფაა გამოყენებული იმ ელიფსური მრუდის მათემატიკის მუშაობისთვის და რა ძალისხმევაა საჭირო იმისათვის, რომ ეს მოხდეს ყველაზე უსაფრთხო და მაღალეფექტური გზით, მუდმივი გაუმჯობესებებით. მოდით ჩავუღრმავდეთ „libsecp256k1“-ის საინტერესო ისტორიასა და ევოლუციას, ბიბლიოთეკის, რომელიც დაიწყო როგორც პატარა ჰობის პროექტი და წლების განმავლობაში გადაიქცა კონსენსუსის წესების არსებით ნაწილად, რომელიც იცავს მრავალტრილიონიან აქტივს. მიზეზების გამო, რომლებიც ზუსტად არ ვიცით, სატოშიმ აირჩია ელიფსური მრუდი სახელწოდებით „secp256k1“ ბიტკოინში ციფრული ხელმოწერების შესაქმნელად და გადასამოწმებლად. ბიტკოინის კლიენტის საწყისი ვერსია გამოვიდა ფართოდ გავრცელებული OpenSSL ბიბლიოთეკის გამოყენებით ტრანზაქციების ხელმოწერისა და გადამოწმებისთვის. მესამე მხარის ბიბლიოთეკაზე დაყრდნობა გონივრულ მიდგომად ჟღერს პროგრამული ინჟინერიის პერსპექტივიდან (მით უმეტეს, თუ ეს ისეთი დომენ-სპეციფიკური და რთულია, როგორიცაა ელიფსური მრუდის კრიპტოგრაფია), მაგრამ ეს არჩევანი მოგვიანებით პრობლემური აღმოჩნდა ხელმოწერის პარსინგის კოდში არსებული შეუსაბამობების გამო. უარეს შემთხვევაში, ამან შეიძლება გამოიწვიოს ჯაჭვის გაუთვალისწინებელი გაყოფა. იმ პერიოდის ერთ-ერთი გაკვეთილი იყო ის, რომ OpenSSL არ არის შესაფერისი ბიბლიოთეკა კონსენსუს-კრიტიკული სისტემისთვის, როგორიცაა ბიტკოინი. ეს საკითხი მოგვიანებით გამოსწორდა BIP66-ის მიერ, რომელმაც უზრუნველყო ECDSA ხელმოწერების მკაცრი კოდირება. ამის შემდეგ, OpenSSL-ის დამოკიდებულება შეიცვალა libsecp256k1-ით Bitcoin Core v0.12-ში, რომელიც გამოვიდა 2016 წლის დასაწყისში.1 მაგრამ თუ უკან დავიხევთ, libsecp256k1 პროექტის დაწყების საწყისი მოტივაცია ძირითადად პოტენციური დაჩქარებისადმი ცნობისმოყვარეობა იყო. 2012 წელს, Bitcoin Core-ის დეველოპერმა პიტერ ვილემ, იგივე „სიპამ“, წააწყდა Hal Finney-ის (ცნობილია, როგორც 2009 წელს სატოშისგან პირველი ბიტკოინის ტრანზაქციის მიმღები) bitcointalk-ის თემას. სათაურით „ხელმოწერის გადამოწმების დაჩქარება“, პოსტში განხილული იყო ოპტიმიზაცია, რომელიც გამოიყენებდა ე.წ. „ენდომორფიზმს“ (უფრო კონკრეტულად ე.წ. GLV-მეთოდს, Gallant-Lambert-Vanstone), რასაც მხოლოდ გარკვეული ელიფსური მრუდები იძლევა, secp256k1 კი მოხერხებულად ერთ-ერთი მათგანია. ჰალ ფინიმ თავად განახორციელა ის OpenSSL პრიმიტივების გამოყენებით, მოგვიანებით კი ის Bitcoin Core-ში PR-ის სახითაც კი იქნა წარდგენილი.2 მიუხედავად იმისა, რომ მან აჩვენა მყარი ~20% დაჩქარება, ის საბოლოოდ არასოდეს გაერთიანებულა კოდის სირთულის გაზრდის და იმის გარანტიის არარსებობის გამო, რომ გამოყენებული კრიპტოგრაფია უსაფრთხოა. პიტერ ვილემ გადაწყვიტა ახალი ბიბლიოთეკის შექმნა ნულიდან, „secp256k1“ რეპოზიტორიის საწყისი კომიტით, რომელიც 2013 წლის 5 მარტით თარიღდება. მხოლოდ ერთი კვირის შემდეგ ბიბლიოთეკამ შეძლო სრული ბლოკჩეინის გადამოწმება (ბლოკის სიმაღლე იმ დროს ~225000), კიდევ ერთი კვირის განმავლობაში კი ხელმოწერის ფუნქციონალი იქნა დანერგილი. კიდევ გარკვეული დრო და ტესტირება დასჭირდა, სანამ ბიბლიოთეკა მზად იქნებოდა Bitcoin Core-ში OpenSSL-ის შემცვლელად გამოსაყენებლად, ჯერ საფულეში ხელმოწერისთვის (გამოშვება v0.10, 2015), და საბოლოოდ ECDSA ხელმოწერის გადამოწმებისთვის კონსენსუსში (გამოშვება v0.12, 2016). ძალისხმევა აბსოლუტურად ღირდა: Core-ში PR-ის აღწერის მიხედვით, libsecp256k1-ის გამოყენება ხელმოწერის გადამოწმებისთვის იყო „2.5-დან 5.5-ჯერ უფრო სწრაფი“. ირონიულია, რომ ეს ჯერ კიდევ არ მოიცავდა ადრე ნახსენებ ენდომორფიზმის ოპტიმიზაციას, რადგან ის ნაგულისხმევად არ იყო ჩართული პატენტის დარღვევის შესახებ შეშფოთების გამო. ის მხოლოდ 2020 წელს გააქტიურდა, პატენტის ვადის გასვლის შემდეგ (ჩართული იყო v0.20 გამოშვებაში), რამაც გამოიწვია კიდევ ერთი მყარი დაჩქარება დაახლოებით 16%-ით. დროთა განმავლობაში, პროექტმა რამდენიმე სხვა კონტრიბუტორი მიიზიდა. ეს ბუნებრივად მოიცავდა ადამიანებს, რომლებიც თავიდანვე მჭიდროდ მუშაობდნენ პიტერთან Blockstream-ში, კერძოდ, მაშინდელ CTO გრეგორი მაქსველს და მკვლევარ ენდრიუ პოლსტრას. 2015 წელს შეუერთდნენ იონას ნიკი და რამდენიმე წლის შემდეგ ტიმ რაფინგი, ორივე დასაქმებული Blockstream-ში მკვლევარებად და ახლა უკვე რამდენიმე წელია libsecp256k1-ის შემნახველების როლს ასრულებენ. რადგან ისინი პასუხისმგებელნი არიან როგორც ახალი კრიპტოგრაფიული პროტოკოლების სპეციფიკაციაზე (დეტალური უსაფრთხოების მტკიცებულებების ჩათვლით), ასევე მათ პრაქტიკაში დანერგვაზე განხორციელებითა და განხილვით, ძალიან მიზანშეწონილია მათ ვუწოდოთ „ფულ-სტეკ კრიპტოგრაფები“, როგორც ტიმ რაფინგს მოსწონს საკუთარი თავის აღწერა. ზოგჯერ ბიტკოინის სივრცის გარეთ მყოფმა კრიპტოგრაფებმაც კი შეიტანეს წვლილი libsecp256k1-ში. ამის ერთ-ერთი თვალსაჩინო მაგალითია პიტერ დეტმანი, რომელიც ცნობილია C#/Java კრიპტოგრაფიული ბიბლიოთეკა BouncyCastle-ის ერთ-ერთი შემნახველის როლით, რომელიც დღემდე დროდადრო ჩნდება სხვადასხვა შესრულების გაუმჯობესების წინადადებებით. მისი ერთ-ერთი მთავარი წვლილი იყო მოდულარული ინვერსიის დანერგვა „safegcd“ ალგორითმის გამოყენებით 2021 წელს უსაფრთხოდ გასაუმჯობესებლად, დანიელ ჯ. ბერნშტეინისა და ბო-იინ იანგის ნაშრომის მიხედვით. libsecp256k1-ის მიზანია უზრუნველყოს უმაღლესი ხარისხის ბიბლიოთეკა კრიპტოგრაფიული ოპერაციებისთვის secp256k1 მრუდზე, ძირითადი მიზნით, რომ იყოს სასარგებლო ბიტკოინის ფართო ეკოსისტემაში – Bitcoin Core უბრალოდ მისი მთავარი კლიენტია. libsecp256k1-ის API შექმნილია იმისთვის, რომ იყოს მტკიცე და ძნელად ბოროტად გამოსაყენებელი, რათა მომხმარებლებმა არ შეასრულონ არაუსაფრთხო ოპერაციები (მაგ., საკუთარი კრიპტოგრაფიული სქემების შექმნით), რამაც უარეს შემთხვევაში შეიძლება გამოიწვიოს სახსრების დაკარგვა. მხოლოდ ერთ ელიფსურ მრუდზე ფოკუსირებით და მისი ფუნქციონალობის ბიტკოინთან დაკავშირებულ ოპერაციებზე შეზღუდვით (ანუ, ძირითადად ტრანზაქციების ხელმოწერა და გადამოწმება), კოდი შეიძლება იყოს როგორც უფრო სწრაფი, ასევე უფრო მარტივი განსახილველი, რაც იწვევს მოვლის უფრო დაბალ ტვირთს და უფრო მაღალ საერთო ხარისხს სხვა იმპლემენტაციებთან შედარებით. libsecp256k1 დაწერილია C-ზე და არ აქვს დამოკიდებულება სხვა ბიბლიოთეკებზე, ამიტომ ის იყენებს მხოლოდ პროექტისთვის სპეციალურად დაწერილ შიდა კოდს. როგორც ასეთი, ის შექმნილია იმისთვის, რომ იმუშაოს შეზღუდულ მოწყობილობებზე, როგორიცაა მიკროკონტროლერები, რომლებიც ხშირად გამოიყენება აპარატურულ საფულეებში. თავიდანვე, libsecp256k1-ს ჰქონდა ძლიერი ფოკუსირება ხარისხის უზრუნველყოფაზე, რომელიც წლების განმავლობაში მუდმივად უმჯობესდებოდა და იხვეწებოდა. ახლა მას აქვს ტესტირების კოდის დაფარვა თითქმის 100%-ით, და ახალ მოდულებს შერწყმის შანსი მხოლოდ იმ შემთხვევაში აქვთ, თუ ეს ზღვარი კვლავ დაკმაყოფილებულია. გარდა ამისა, არსებობს უზრუნველყოფის სპეციალური ფორმა, რომელსაც „ამომწურავი ტესტირება“ ეწოდება. ძირითადი იდეაა ბიბლიოთეკის ფუნქციონალობის შემოწმება მრუდზე შესაძლო მნიშვნელობების მთელი სივრცისთვის. რადგან ეს შეუძლებელი იქნებოდა რეალურ secp256k1 მრუდზე, რომელიც შედგება ~2^256 წერტილისგან, სპეციალური