A blokklánc alapú projektek egyik fő célja az adatok ellenőrzése. Élő példákért nézze meg a digitális személyazonosságot és az online dokumentumok tárolását és ellenőrzését. Valójában ezen esetek bármelyike megköveteli a művelet/tranzakció kezdeményezőjének ellenőrzését a személy vagy az entitás megerősítéséhez. Például, ha a személy rendelkezik digitális formájú személyazonosító okmánnyal, akkor döntő fontosságú a tulajdonjog biztosítása. Így kiváló példa az adatok ellenőrizhetőségének problémájára. Tekintsük át a megoldás legegyszerűbb formáját – a digitális aláírást, amelynek tesztelése az okosszerződés-fejlesztés egyik döntő pontja.
A megközelítés egyszerű:
1) a rendszer üzenetet generál a mindenki számára ismert szabályok szerint
2) az aláíró megkapja az üzenetet, és hozzáad egy meghatározott szimbólumkészletet – digitális aláírást, az üzenetből privát kulccsal összeállított kódot
3) a generált aláírás most elküldésre kerül a szerződésbe, ahol lebontásra kerül az aláíró címének lekéréséhez.
A Solidity az ECDSA algoritmust kínálja az aláírás generálásához és további bontásához. Nem kell mélyen belemerülnünk magába az algoritmusba (megtalálhatja a szükséges információkat a megfelelő forrásokban). Csak annyit kell tudnunk, hogy az ECDSA egy példa az aszimmetrikus kriptográfiára, ahol az első felhasználó aláírást hoz létre a privát kulcsával, a második felhasználó pedig egy szabványos algoritmust alkalmaz az aláíró nyilvános kulcsának lekérésére. Így ellenőrizni tudja az aláírás forrását. Ehelyett koncentráljunk a gyakorlati részre – az aláírások használatára és tesztelésére.
Először is fel kell ismernünk egy problémát. Például a szerződésnek végre kell hajtania valamilyen műveletet, mondjuk el kell tárolnia a hívó fél címét. Bár a szerződés csak akkor végezzen tárolást, ha a hívó igazolva van, biztosnak kell lennünk abban, hogy senki sem használhatja a címét engedély nélkül. A hiteles hívó visszakereséséhez valamilyen üzenetet kell generálnunk, alá kell írnunk, és a szerződésen belül le kell bontanunk.
Itt található a szabványos megoldást a Solidity dokumentációjában (például, az 0.8.4-ban — a cikk pillanatában a legújabb stabil verzió). A dokumentumok felajánlják nekünk a szerződést, amelyhez a következő beépített funkciókra volt szükség: üzenetgenerálás, aláírás felosztása és összeállítási kód az aláíró lekéréséhez. A példa bemutatja az összes szükséges módszert, és elég egyértelmű, bár két hátránya van: hiányzik belőle az univerzalitás, és nincs jó példa a megoldástesztelésre. Ezért adom meg a kód saját verzióját és (a tényleges célt) – a szerződés tesztelési stratégiáját.
Persze, használhatod a szabványos OpenZeppelin könyvtár az ECDSA műveleteihez, de ismét ugyanazokkal a problémákkal kell szembenéznie – a rugalmasság és a tesztelési megközelítések hiánya. Szóval, merüljünk el az aláírás-alapú logikára vonatkozó példámban. Megtalálható a teljes működő példa a GitHubon, de kevés helyen szeretnék teljes egészében megmutatni.
Először is elkészítjük az üzenetet. Amint látja, két csomagolt és kivonatolt pénztárcacímből áll:
A második fontos kódrészlet az üzenet kivonatolása a szabványos Ethereum üzenettel:
Azt mutatja, hogy az üzenetet az Ethereum hálózaton belül küldték el, és hossza 32 bájt, ami nem véletlen szám. A korábbi műveletek után megvan a hash, amelynek hossza 32 bájt. Lényeges, hogy a kiegészítő hash funkció ilyen formában legyen, az indoklásról kicsit később lesz szó.
A többi kódrészlet meglehetősen szabványos. Az aláírás felosztásának funkciója a következő:
és itt van a funkció az aláíró lekéréséhez:
A külső felülethez az egyéni funkciót fogjuk használni, amely megkapja az aláírást és a szükséges argumentumokat, ellenőrzi, hogy a felhasználó már regisztrálva van-e, kialakítja az üzenetet, és ellenőrzi az aláírást:
Először az aláírandó üzenetet utánozzuk. Használni fogjuk ethers.js könyvtár, amely (együtt web3) a leggyakrabban használt és kényelmes könyvtár. Mivel ez egy nyílt forráskódú könyvtár, szabadon felfedezheti kódja és dokumentumai. Ezenkívül ez a könyvtár tökéletes felületet biztosít számunkra a következő üzenet létrehozásához:
Mindkettő egyik hátránya web3 és a éterek A könyvtárak nem rendelkeznek a helyi Ganache környezet összes funkciójával, mivel mindkét könyvtár teljes Ethererum csomópontokkal működik. Ennek ellenére létezik egy megközelítés a helyi tesztelésre web3-fiók funkció. Habár létre kell hoznia egy további fiókot, amely megvalósítja az énekes funkciót, és kapcsolatot biztosít a jelenlegi web3 szolgáltatóval:
Tehát most elkészült és aláírtuk az üzenetet. De ez még nem minden; van még néhány dolog, amiről beszélni kell. Mindkét könyvtár (web3 és éterek) a motorháztető alatt további kivonatolást biztosít az üzenethez az aláírás létrehozása előtt. Ezenkívül az üzenet nem csak kivonatolt, hanem kombinálva van a korábban látott szabványos Ethereum üzenettel:
És ezért adtuk hozzá a kiegészítő módszert a szerződéshez. Tehát, ha egyéni üzeneteket szeretne használni, kihagyni a további kivonatolást stb., létre kell hoznia az aláírási funkció egyéni verzióját. Az okot fentebb tárgyaltuk – mindkét szabványos könyvtár a tipikus megközelítést alkalmazza az üzenet aláírására, amely csak a funkcionalitás felülbírálásával módosítható.
Utolsó lépésként futtassuk le a tesztet, és ellenőrizzük, hogy megfelelően működik-e:
Teszteltük az aláírás generálását, a generált üzenetet, az aláírás jóváhagyását és az elutasítást. Tehát ez egy meglehetősen teljes tesztkészlet az ellenőrzési funkcióhoz.
- Fiók
- Akció
- További
- algoritmus
- Minden termék
- érvek
- cikkben
- Hiteles
- Bit
- esetek
- Ellenőrzések
- kód
- szerződés
- kriptográfia
- Jelenlegi
- dátum
- Fejlesztés
- digitális
- digitális identitás
- dokumentumok
- Környezet
- Ethereum
- ethereum hálózat
- Arc
- vezetéknév
- Rugalmasság
- Összpontosít
- forma
- Ingyenes
- Tele
- funkció
- jó
- hash
- tördelő
- HTTPS
- ia
- Identitás
- információ
- IP
- IT
- Kulcs
- legutolsó
- könyvtár
- helyi
- közepes
- hálózat
- csomópontok
- ajánlat
- Ajánlatok
- online
- nyitva
- nyílt forráskódú
- Művelet
- magán
- magánkulcs
- projektek
- nyilvános
- nyilvános kulcs
- Kritika
- futás
- készlet
- Egyszerű
- So
- szilárdság
- osztott
- tárolás
- tárolni
- Stratégia
- rendszer
- teszt
- Tesztelés
- tesztek
- The Source
- us
- Igazolás
- pénztárca
- Wikipedia
- belül
- Munka
- művek