Jednym z głównych celów, jakie mają osiągnąć projekty oparte na blockchainie, jest weryfikacja danych. Aby zobaczyć przykłady na żywo, możesz przyjrzeć się przechowywaniu i sprawdzaniu tożsamości cyfrowej oraz dokumentów online. Rzeczywiście, każdy z tych przypadków wymaga weryfikacji inicjatora działania/transakcji w celu potwierdzenia osoby lub podmiotu. Na przykład, jeśli dana osoba posiada dokument tożsamości w formie cyfrowej, kluczowe znaczenie ma zapewnienie własności. Jest to zatem doskonały przykład problemu sprawdzalności danych. Przyjrzyjmy się najprostszej formie rozwiązania — podpisowi cyfrowemu, którego testowanie jest jednym z kluczowych punktów podczas tworzenia inteligentnego kontraktu.
Podejście jest proste:
1) system generuje komunikat według znanych wszystkim reguł
2) podpisujący otrzymuje wiadomość i dodaje określony zestaw symboli — podpis cyfrowy, kod skonstruowany z wiadomości za pomocą klucza prywatnego
3) wygenerowany podpis jest teraz wysyłany do umowy, gdzie jest rozkładany w celu uzyskania adresu podpisującego.
Solidity oferuje algorytm ECDSA do generowania podpisów i dalszej dekompozycji. Nie musimy zagłębiać się w sam algorytm (niezbędne informacje można znaleźć w odpowiednich źródłach). Jedyne, co musimy wiedzieć, to to, że ECDSA jest przykładem kryptografii asymetrycznej, w której pierwszy użytkownik tworzy podpis przy użyciu swojego klucza prywatnego, a drugi użytkownik stosuje standardowy algorytm w celu odzyskania klucza publicznego osoby podpisującej. Dzięki temu może zweryfikować źródło podpisu. Zamiast tego skupmy się na części praktycznej — używaniu i testowaniu podpisów.
Przede wszystkim musimy rozpoznać problem. Na przykład kontrakt musi wykonać jakąś akcję, powiedzmy zapisać adres dzwoniącego. Chociaż umowa powinna zapewniać przechowywanie tylko wtedy, gdy osoba dzwoniąca zostanie zweryfikowana, musimy mieć pewność, że nikt nie będzie mógł użyć jego adresu bez pozwolenia. Aby odzyskać autentycznego rozmówcę, musimy wygenerować jakąś wiadomość, podpisać ją i rozłożyć na części w ramach umowy.
Możesz znaleźć standardowe rozwiązanie w dokumentacji Solidity (na przykład, w 0.8.4 — najnowsza stabilna wersja w momencie publikacji artykułu). Dokumenty oferują nam umowę, która wymagała następujących wbudowanych funkcji: generowanie wiadomości, dzielenie podpisu i kod asemblera w celu odzyskania osoby podpisującej. Przykład pokazuje wszystkie niezbędne metody i jest dość prosty, chociaż ma dwie wady: brakuje mu uniwersalności i nie ma dobrego przykładu testowania rozwiązań. Dlatego podaję moją wersję kodu i (faktyczny cel) — strategię testowania kontraktu.
Jasne, możesz użyć standardowa biblioteka OpenZeppelin dla operacji ECDSA, ale ponownie napotkacie te same problemy – brak elastyczności i podejścia do testowania. Przejdźmy więc do mojego przykładu logiki opartej na sygnaturach. Można znaleźć komplet działający przykład w moim GitHubie, ale jest kilka miejsc, które chcę pokazać w pełni.
Na początek przygotujemy wiadomość. Jak widać, składa się on z dwóch spakowanych i zahaszowanych adresów portfeli:
Drugim ważnym fragmentem kodu jest mieszanie wiadomości ze standardową wiadomością Ethereum:
Pokazuje, że wiadomość została wysłana w obrębie sieci Ethereum i ma długość 32 bajtów, co nie jest liczbą losową. Po poprzednich operacjach otrzymujemy skrót o długości 32 bajtów. Niezbędne jest, aby dodatkowa funkcja mieszająca miała taką postać, a uzasadnienie omówimy nieco później.
Inne fragmenty kodu są dość standardowe. Funkcja podziału podpisu jest następująca:
a oto funkcja umożliwiająca pobranie osoby podpisującej:
Dla interfejsu zewnętrznego wykorzystamy niestandardową funkcję, która pobiera podpis i niezbędne argumenty, sprawdza, czy użytkownik jest już zarejestrowany, formułuje wiadomość i weryfikuje podpis:
Najpierw imitujemy wiadomość, którą należy podpisać. Użyjemy ethers.js biblioteka, która jest (wraz z web3) najczęściej używana i wygodna biblioteka. Ponieważ jest to biblioteka typu open source, możesz ją swobodnie eksplorować jego kod i dokumentacja. Ponadto ta biblioteka zapewnia nam doskonały interfejs do konstruowania następującej wiadomości:
Jedna z wad obu web3 i etery bibliotek polega na tym, że nie posiadają one wszystkich funkcji lokalnego środowiska Ganache, ponieważ obie biblioteki są przeznaczone do pracy z pełnymi węzłami Ethererum. Niemniej jednak istnieje podejście do testowania lokalnego funkcjonalność konta web3. Chociaż musisz utworzyć dodatkowe konto, które zaimplementuje funkcjonalność piosenkarza i zapewni połączenie z obecnym dostawcą web3:
Mamy więc wygenerowaną i podpisaną wiadomość. Ale to nie wszystko; zostało jeszcze kilka rzeczy do omówienia. Obie biblioteki (web3 i ethers) pod maską zapewniają dodatkowe mieszanie wiadomości przed utworzeniem podpisu. Ponadto wiadomość nie jest po prostu zahaszowana, ale jest połączona ze standardową wiadomością Ethereum, którą widzieliśmy wcześniej:
I dlatego do umowy dodaliśmy dodatkową metodę. Jeśli więc chcesz używać niestandardowych wiadomości, pominąć dodatkowe hashowanie itp., musisz utworzyć niestandardową wersję funkcji podpisywania. Powód omówiliśmy powyżej — obie standardowe biblioteki implementują typowe podejście do podpisywania wiadomości, które można zmienić jedynie poprzez nadpisanie funkcjonalności.
W ostatnim kroku uruchommy test i sprawdźmy, czy działa poprawnie:
Przetestowaliśmy generowanie podpisu, wygenerowaną wiadomość, zatwierdzenie podpisu i jego odrzucenie. Jest to więc całkiem kompletny zestaw testów sprawdzających funkcjonalność.
- Konto
- Działania
- Dodatkowy
- algorytm
- Wszystkie kategorie
- argumenty
- artykuł
- Autentyczny
- Bit
- Etui
- Wykrywanie urządzeń szpiegujących
- kod
- umowa
- kryptografia
- Aktualny
- dane
- oprogramowania
- cyfrowy
- tożsamość cyfrowa
- dokumenty
- Środowisko
- ethereum
- sieć ethereum
- Twarz
- i terminów, a
- Elastyczność
- Skupiać
- Nasz formularz
- Darmowy
- pełny
- funkcjonować
- dobry
- haszysz
- mieszanie
- HTTPS
- ia
- tożsamość
- Informacja
- IP
- IT
- Klawisz
- firmy
- Biblioteka
- miejscowy
- średni
- sieć
- węzły
- oferta
- Oferty
- Online
- koncepcja
- open source
- operacje
- prywatny
- Klucz prywatny
- projektowanie
- publiczny
- Klucz publiczny
- przeglądu
- run
- zestaw
- Prosty
- So
- solidność
- dzielić
- przechowywanie
- sklep
- Strategia
- system
- test
- Testowanie
- Testy
- Źródło
- us
- Weryfikacja
- Portfel
- Wikipedia
- w ciągu
- Praca
- działa