Obrazloženje Kompaktne Reprezentacije Digitalnih Potpisa (EIP2098)

Optimalan Pristup ECDSA / Secp256k1 Digitalnim Potpisima

Marko Lazić
NIMA
4 min readApr 15, 2024

--

Uvod

U narednim redovima, objasnićemo značaj kompaktne reprezentacije digitalnih potpisa ECDSA/Sec256k1 u blockchain tehnologijama (pre svega Ethereum-u i njegovim pametnim ugovorima), i prikazaćemo tehničke atribute potpisa koji omogućavaju ovakav vid reprezentacije.

Prikazane tehnike odnose se pre svega na Ethereum (i njegove pametne ugovore), ali, kombinacija algoritma ECDSA sa krivom Sec256k1, često je u upotrebi i u drugim blockchain tehnologijama (na primer Bitcoin), budući da je u pitanju spoj koji omogućava sažete, sigurne i komputacijski jeftine digitalne potpise.

Dodatno: Vidna razlika između podataka Ethereum i Bitcoin blockchain-a, uprkos korišćenju istog algoritma za digitalne potpise i krive, potiče iz razlike u izboru algoritma za enkodiranje/dekodiranje (Ethereum koristi algoritam RLP, a Bitcoin, algoritam DER).

Vrednost Kompaktne Reprezentacije - EIP2098

Vrednost kompaktne reprezentacije možemo uvideti posmatranjem načina postavljanja digitalnih potpisa kao ulaznih argumenata funkcije pametnih ugovora u programskom jeziku Solidity:

  1. Korišćenje dinamičkog parametra
    Zauzima 160 bajtova - bytes calldata/memory signature
    (96 za potpis i 64 za meta-podatke dinamickog tipa)
  2. Podela potpisa na tri statička parametara
    Zauzima 96 bajtova - uint8 v, bytes32 r, bytes32 s
    (iako je tip uint8 veličine jednog bajta, u okviru ulaznih podataka zauzima 32 bajta tj. celu jednu memorijsku reč)
  3. Svođenje potpisa na dva parametra (kompaktna reprezentacija)
    Zauzima 64 bajta - bytes32 r, bytes32 vs

Korišćenje drugog načina umesto prvog već predstavlja značajnu optimizaciju — treba pribegavati korišćenju statičkih tipova kad god je moguće, međutim, treći način predstavlja optimalan pristup i ima nezanemarljiv uticaj na smanjenje memorijskog zauzeća i pojeftinjenje cene izvedbe transakcije.

Ovaj pristup je ostvariv iz razloga što vrednost v, poznata i kao yParity / recovery id, zahteva samo jedan bit za skladištenje.

Slika 1 - Primer Krive Projektovane na Beskonačno Polje

Skoro svaka koordinata x u krivoj ima više odgovarajućih y koordinata (slika 1), a vrednost v definiše koja od njih odgovara našoj nasumičnoj tački (koja je odabrana u svrhu kreiranja potpisa). Ukoliko pomenuta vrednost nije prisutna u potpisu, i dalje je moguće verifikovati potpis bez nje — isprobavanjem svih potencijalno odgovarajućih y koordinata (u najvećem broju slučajeva pred nama će biti samo dve opcije).

Ovim možemo zaključiti da je vrednost v služi za optimizaciju procesa i da nije obavezan element potpisa u širem smislu.

Dodatno: Postoji više od dve opcije za iznos vrednosti v, ali su one statistički neostvarive (~0% sanse), pa nisu uzete u obzir prilikom verifikacije potpisa.

Prvi bit vrednosti s je uvek 0, jer on inicijalno predstavlja znak celobrojne vrednosti (+ ili -). Pošto se uneta vrednost, uvek pretvara u pozitivnu vrednost (u okviru kanonskih operacija digitalnih potpisa), u okviru kompaktne reprezentacije možemo komotno postaviti vrednost v u taj bit.

Ovakav pristup umanjuje veličinu pozivnih podataka za čitavu jednu reč tj. 32 bajta, jer se vrednost v u okviru ulaznih podataka reprezentuje pomoću cele reči iako njen tip zauzima samo jedan bajt — pri čemu informacija zauzima zapravo samo jedan bit.

Pomoću jednostavnih bitovskih operacija, moguće je spojiti parametrev i s, kao i izdvojiti v i s iz vs:

  • Spajanje v i s u vs: (v << 255) | s
  • Izdvajanje v iz vs: (vs >> 255)
  • Izdvajanje s iz vs: vs & ((1 << 255) - 1)

Primer

U slučajevima prikazanim na slici 2 možemo uvideti da je prvi bajt heksadekadnog stringa s u prvom slučaju 0x2e tj.00101110, dok je u drugom slučaju 0x6b tj. 01101011. U drugom slučaju, pošto v ima vrednost 1, koja će biti smeštena u prvi bit vrednosti vs, prvi karakter heksadekadnog stringa prethodno pomenute vrednosti će postati e:

0x6b | 0x80 => 0xeb tj. 01101011 | 10000000 => 11101011

Ovu promenu možemo lako uočiti na prethodno pomenutoj slici 👇

Slika 2 - Primeri Digitalnih Potpisa sa Različitim Vrednostima V i Vidljivom Promenom na VS

Demonstracija Kompaktne Reprezentacije Potpisa

U donjem bloku, prikazan je programski kod koji na jednostavan način omogućava kreiranje digitalnog potpisa i spajanje vrednosti v i s u vs. Priloženi kod, pisan u TS, možete iskoristiti kao početnu tačku za isprobavanje različitih operacija na digitalnim potpisima — poput verifikacije.

Prilikom izvršavanja obratite pažnju na ispisane vrednosti (a višestruko pokretanje koda, omogućiće vam bolje razumevanje prethodno obrađene teme kroz različite primere).

Potrebni paketi i njihove verzije👇
"@noble/curves": "1.4.0",
"@noble/hashes": "1.4.0"

On-chain Verifikacija Kompaktno Reprezentovanog Potpisa

Poput potpisa koji su reprezentovani na druge načine (koji su češće viđeni), kompaktno reprezentovani potpisi se mogu verifikovati pomoću biblioteke OpenZeppelin ECDSA - koju možemo na jednostavan način upotrebiti u okviru pametnog ugovora koji verifikuje kompaktne potpise potpise.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.0.0/contracts/utils/cryptography/ECDSA.sol";

contract Verifikator {
// Funkcija će proveriti da li je `hash` potpisan od strane prosleđenog potpisnika
function proveriPotpis(address potpisnik, bytes32 hash, bytes32 r, bytes32 sv) external pure returns (bool) {
return potpisnik == ECDSA.recover(hash, r, sv);
}
}

Verifikator možete najlakše isprobati kroz Remix IDE.

Završna Reč

Kompaktna reprezentacija digitalnih potpisa omogućava optimizaciju veličine ulaznih podataka transakcije kao i smanjenje kompleksnosti operacija obrade istih (iako nije neophodna, definitivno predstavlja profesionalniji pristup).

Takođe, nije na odmet spomenuti da prikazani vid optimizacije može da bude od velike koristi pri susretu sa greškom “Stack too deep” u okviru vašeg procesa verifikacije potpisa.

Dodatni Resursi

O Kompaniji

Kompanija NIMA Enterprises se bavi istraživanjem i razvojem u svetu blockchain-a.

Naš tim, koji se konstantno širi, posvećen je razvoju naprednih i inovativnih aplikacija - sa fokusom na pružanju maksimalne bezbednosti i optimalnog korisničkog iskustva.

Za više informacija posetite sajt: https://nima.enterprises/

--

--