RSA naključno na blockchainu

Obstaja težava - v decentraliziranem omrežju je težko ustvariti naključno število. S tem so se že srečale skoraj vse verige blokov. Dejansko v omrežjih, kjer med uporabniki ni zaupanja, ustvarjanje nespornega naključnega števila reši številne težave.

V tem članku vam povemo, kako nam je uspelo rešiti težavo na primeru iger. Prvi med njimi je bil Valovi božično drevo. Za razvoj smo potrebovali generator naključnih števil.

RSA naključno na blockchainu

Sprva smo načrtovali ustvarjanje številke na podlagi informacij iz verige blokov. Vendar je potem postalo jasno: s številko je mogoče manipulirati, kar pomeni, da rešitev ni ustrezna.

Našli smo rešitev: uporabite shemo commit-expand. Strežnik je uganil število od 1 do 5, mu dodal sol in nato rezultat zgostil z uporabo Funkcije Keccak. Strežnik je vnaprej namestil pametno pogodbo z že shranjeno številko. Izkazalo se je, da se igra zmanjša na to, da uporabnik ugiba število, ki ga skriva zgoščena vrednost.

Igralec je sklenil stavo, strežnik pa je poslal skrito številko in »sol« v pametno pogodbo. Preprosto povedano, razkril je karte. Nato je strežnik preveril številke in se odločil, ali je uporabnik zmagal ali izgubil.

Če strežnik ni poslal številke ali "soli" za preverjanje, je uporabnik zmagal. V tem primeru je bilo treba za vsako igro vnaprej razviti pametno pogodbo in vanjo vključiti potencialne dobitke. Izkazalo se je, da je neprijetno, dolgotrajno in drago. Takrat ni bilo druge varne rešitve.

Pred kratkim je ekipa Tradisys predlagala dodajanje funkcije v protokol Waves rsaVerify(). Preverja veljavnost podpisa RSA na podlagi javnega in zasebnega ključa. Posledično je bila funkcija dodana.

Razvili smo tri igre: Kocke Roller, Coin Flip и Vožnja po valovih. Vsak izvaja tehnologijo naključnih števil. Ugotovimo, kako deluje.

RSA naključno na blockchainu

Oglejmo si ustvarjanje naključnega števila na primeru Ride on Waves. Pametno pogodbo je mogoče najti tukaj.

Pojdite na zavihek Script in izberite Dekompilirano. Videli boste kodo pametne pogodbe (ali skript).

RSA naključno na blockchainu

Koda pametne pogodbe vsebuje nabor funkcij. Tiste, ki so označeni kot @Callable, je mogoče zagnati z uporabo Priklicne transakcije. Zanimata nas dve funkciji: stavil и umaknejo:

  • func stava (playerChoice)
  • func dvig(gameId,rsaSign)

1. Uporabnik izbere dolžino segmenta in višino stave.

RSA naključno na blockchainu

2. Stranka ustvari stavno funkcijo. Za zgornjo sliko bi bilo stava ("50").

3. Stranka pošlje transakcijo Invocation na naslov pametne pogodbe (broadcast InvocationTx). Transakcija vsebuje stavno funkcijo kot klicni parameter. To pomeni, da transakcija Invocation sproži izvedbo stavne funkcije (izbira: niz) na pametni pogodbi.

RSA naključno na blockchainu

4. Razmislite o stavni funkciji:

@Callable(i)
func bet (playerChoice) = {
    let newGameNum = IncrementGameNum()
    let gameId = toBase58String(i.transactionId)
    let pmt = extract(i.payment)
    let betNotInWaves = isDefined(pmt.assetId)
    let feeNotInWaves = isDefined(pmt.assetId)
    let winAmt = ValidateBetAndDefineWinAmt(pmt.amount, playerChoice)
    let txIdUsed = isDefined(getString(this, gameId))
    if (betNotInWaves)
        then throw ("Bet amount must be in Waves")
        else if (feeNotInWaves)
            then throw ("Transaction's fee must be in Waves")
            else if (txIdUsed)
                then throw ("Passed txId had been used before. Game aborted.")
                else {
                    let playerPubKey58 = toBase58String(i.callerPublicKey)
                    let gameDataStr = FormatGameDataStr(STATESUBMITTED, playerChoice, playerPubKey58, height, winAmt, "")
                    ScriptResult(WriteSet(cons(DataEntry(RESERVATIONKEY, ValidateAndIncreaseReservedAmt(winAmt)), cons(DataEntry(GAMESCOUNTERKEY, newGameNum), cons(DataEntry(gameId, gameDataStr), nil)))), TransferSet(cons(ScriptTransfer(SERVER, COMMISSION, unit), nil)))
                    }
    }

Funkcija zapiše novo igro v stanje pametne pogodbe. namreč:

  • Enolični identifikator za novo igro (id igre)
  • Stanje igre = ODDANO
  • Izbira igralca (dolžina segmenta 50)
  • Javni ključ
  • Potencialni dobitek (odvisno od igralčeve stave)

RSA naključno na blockchainu

Takole izgleda zapis podatkov v verigi blokov (ključ-vrednost):

{
    "type": "string",
    "value": "03WON_0283_448t8Jn9P3717UnXFEVD5VWjfeGE5gBNeWg58H2aJeQEgJ_06574069_09116020000_0229",
    "key": "2GKTX6NLTgUrE4iy9HtpSSHpZ3G8W4cMfdjyvvnc21dx"
  }

"Ključ" (ključ) – id igre nova igra. Preostali podatki so v vrstici polja "vrednost". Ti vnosi so shranjeni v zavihku datum pametna pogodba:

RSA naključno na blockchainu

RSA naključno na blockchainu

5. Strežnik "pogleda" pametno pogodbo in najde poslano transakcijo (nova igra) z uporabo blockchain Api. Game ID nove igre je že zabeležen v blockchainu, kar pomeni, da ga ni več mogoče spremeniti ali nanj vplivati

6. Strežnik ustvari funkcijo dviga (gameId, rsaSign). Na primer takole:

withdraw ("FwsuaaShC6DMWdSWQ5osGWtYkVbTEZrsnxqDbVx5oUpq", "base64:Gy69dKdmXUEsAmUrpoWxDLTQOGj5/qO8COA+QjyPVYTAjxXYvEESJbSiCSBRRCOAliqCWwaS161nWqoTL/TltiIvw3nKyd4RJIBNSIgEWGM1tEtNwwnRwSVHs7ToNfZ2Dvk/GgPUqLFDSjnRQpTHdHUPj9mQ8erWw0r6cJXrzfcagKg3yY/0wJ6AyIrflR35mUCK4cO7KumdvC9Mx0hr/ojlHhN732nuG8ps4CUlRw3CkNjNIajBUlyKQwpBKmmiy3yJa/QM5PLxqdppmfFS9y0sxgSlfLOgZ51xRDYuS8NViOA7c1JssH48ZtDbBT5yqzRJXs3RnmZcMDr/q0x6Bg==")

7. Strežnik pošlje transakcijo Invocation pametni pogodbi (broadcast InvocationTx). Transakcija vsebuje klic oblikovane funkcije dviga (gameId, rsaSign):

RSA naključno na blockchainu

Funkcija vsebuje id igre nova igra in rezultat RSA podpisovanja edinstvenega identifikatorja z zasebnim ključem. Rezultat podpisa je nespremenjen.

Kaj to pomeni?

Vzamemo isto vrednost (id igre) in zanjo uporabimo metodo podpisa RSA. Vedno bomo dosegli enak rezultat. Tako deluje algoritem RSA. Končne številke ni mogoče spreminjati, saj ID igre in rezultat uporabe RSA nista znana. Tudi izbiranje številke je nesmiselno.

8. Blockchain sprejme transakcijo. Izvaja funkcijo dviga (gameId, rsaSign)

9. Znotraj funkcije umika pride do umika Funkcije GenerateRandInt (gameId, rsaSign). To je generator naključnih števil

# @return 1 ... 100
func GenerateRandInt (gameId,rsaSign) = {
   	# verify RSA signature to proof random
    let rsaSigValid = rsaVerify (SHA256, toBytes(gameId), rsaSign, RSAPUBLIC)
    if (rsaSigValid)
        then {
            let rand = (toInt(sha256(rsaSign)) % 100)
            if ((0 > rand))
                then ((-1 * rand) + 1)
                else (rand + 1)
            }
        else throw ("Invalid RSA signature")
    }

rand - in tam je naključno število.

Najprej se vzame niz, ki je rezultat podpisa RSA id igre zasebni ključ (rsaSign). Nato zgoščeno s SHA-256 (sha256(rsaSign)).

Ne moremo predvideti izida podpisa in kasnejšega zgoščevanja. Zato je nemogoče vplivati ​​na generiranje naključnega števila. Če želite dobiti število v določenem obsegu (na primer od 1 do 100), uporabite funkcijo za pretvorbo vInt in %100 (podobno mod).

Na začetku članka smo omenili funkcijo rsaVerify(), ki omogoča preverjanje veljavnosti podpisa RSA z uporabo zasebnega ključa v primerjavi z javnim. Tukaj je del GenerateRandInt(gameId,rsaSign):

rsaVerify (SHA256, toBytes(gameId), rsaSign, RSAPUBLIC)

Javni ključ RSAPUBLIC in niz rsaSign sta posredovana vhodu. Preveri se veljavnost podpisa. Številka se ustvari, če je preverjanje uspešno. V nasprotnem primeru sistem meni, da podpis ni veljaven (Invalid RSA signature).

Strežnik mora podpisati ID igre z zasebnim ključem in poslati veljaven podpis Rsa v 2880 blokih. Parameter se konfigurira pri uvajanju pametne pogodbe. Če se v dodeljenem času ne zgodi nič, zmaga uporabnik. V tem primeru morate nagrado sami poslati na vaš naslov. Izkazalo se je, da "strežniku ni donosno goljufati", ker to vodi v izgubo. Spodaj je primer.

RSA naključno na blockchainu

Uporabnik igra Kocke Roller. Izbral sem 2 od 6 strani kocke, stava je 14 VALOV. Če strežnik v določenem času (2880 blokov) pametni pogodbi ne pošlje veljavnega podpisa RSA, bo uporabnik prevzel 34.44 WAVES.

Za generiranje števil v igrah uporabljamo orakelj – zunanji sistem brez blokovne verige. Strežnik izvede podpis RSA ID-ja igre. Pametna pogodba preveri veljavnost podpisa in določi zmagovalca. Če strežnik ne pošlje ničesar, potem uporabnik samodejno zmaga.

To je metoda poštene generacije, saj je manipulacija tehnično nemogoča. Vse igre Tradisys delujejo po opisanem algoritmu. Tako delujejo igre blockchain. Vse je transparentno in preverljivo. V nobeni drugi verigi blokov ni analogov takega sistema. To je pošteno naključje.

Vir: www.habr.com

Dodaj komentar