RSA ausaz blockchain-en

Arazo bat dago: zaila da sare deszentralizatu batean ausazko zenbaki bat sortzea. Blockchain ia guztiek dagoeneko topatu dute. Izan ere, erabiltzaileen artean konfiantzarik ez dagoen sareetan, ausazko zenbaki ukaezina sortzeak arazo asko konpontzen ditu.

Artikulu honetan arazoa nola konpontzea lortu dugun esaten dizugu jokoak adibide gisa erabiliz. Horietako lehena izan zen Olatuak Gabonetako Zuhaitza. Garapenerako, ausazko zenbaki-sorgailu bat behar genuen.

RSA ausaz blockchain-en

Hasieran, blockchain-eko informazioan oinarritutako zenbaki bat sortzea aurreikusi genuen. Hala ere, orduan argi geratu zen: zenbakia manipulatu zitekeen, hau da, irtenbidea ez da egokia.

Konponbide bat asmatu genuen: erabili commit-expand eskema. Zerbitzariak 1etik 5era arteko zenbaki bat asmatu zuen, gatz bat gehitu zion eta, ondoren, hash egin zuen emaitza erabiliz. Keccak funtzioak. Zerbitzariak kontratu adimenduna zabaldu zuen aurrez gordetako zenbakiarekin. Ematen du jokoa erabiltzaileak hashak ezkutatzen duen zenbakia asmatzean datza.

Jokalariak apustu bat egin zuen, eta zerbitzariak ezkutuko zenbakia eta "gatza" bidali zizkion smart contractari. Termino sinpleetan, txartelak agerian utzi zituen. Horren ostean, zerbitzariak zenbakiak egiaztatu eta erabiltzaileak irabazi ala galdu erabaki zuen.

Zerbitzariak egiaztatzeko zenbakirik edo "gatza" bidali ez bazuen, erabiltzaileak irabazi zuen. Kasu honetan, joko bakoitzerako beharrezkoa zen aldez aurretik kontratu adimenduna hedatzea eta balizko irabaziak bertan sartzea. Desegokia, denbora asko eta garestia izan zen. Garai hartan ez zegoen beste irtenbide segururik.

Duela gutxi, Tradisys taldeak Waves protokoloari funtzio bat gehitzea proposatu zuen rsaEgiaztatu(). RSA sinaduraren baliozkotasuna egiaztatzen du gako publiko eta pribatuan oinarrituta. Ondorioz, eginbidea gehitu zen.

Hiru joko garatu ditugu: Dadoen arrabola, Txanpon irauli ΠΈ Ride On Waves. Bakoitzak ausazko zenbakien teknologia ezartzen du. Ikus dezagun nola funtzionatzen duen.

RSA ausaz blockchain-en

Ikus dezagun ausazko zenbaki bat sortzea Ride on Waves adibide gisa erabiliz. Kontratu adimenduna aurki daiteke Hemen.

Joan fitxara Script eta hautatu Deskonpilatua. Kontratu adimendunaren kodea ikusiko duzu (aka scripta).

RSA ausaz blockchain-en

Kontratu adimendunaren kodeak funtzio multzo bat dauka. @Callable gisa markatutakoak erabiliz abiarazi daitezke Deialdi-eragiketak. Bi funtzio interesatzen zaizkigu: apustuak ΠΈ Erretiratzea:

  • funtzio apustua (playerChoice)
  • funtzio kendu (gameId, rsaSign)

1. Erabiltzaileak segmentuaren luzera eta apustuaren tamaina hautatzen ditu.

RSA ausaz blockchain-en

2. Bezeroak apustu funtzio bat sortzen du. Goiko irudiarentzat izango litzateke apustua ("50").

3. Bezeroak Invocation transakzio bat bidaltzen du kontratu adimendunaren helbidera (Broadcast InvocationTx). Transakzioak apustu funtzioa dauka dei-parametro gisa. Horrek esan nahi du Invocation transakzioak apustu funtzioa (aukera: String) exekutatzen duela kontratu adimendunean.

RSA ausaz blockchain-en

4. Demagun apustu funtzioa:

@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)))
                    }
    }

Funtzioak joko berri bat idazten du kontratu adimendunaren egoeran. Alegia:

  • Joko berri baten identifikatzaile bakarra (jokoaren ID)
  • Jokoaren egoera = BIDALTU
  • Jokalariaren aukera (segmentuaren luzera 50)
  • Gako publikoa
  • Balizko irabaziak (jokalariaren apustuaren arabera)

RSA ausaz blockchain-en

Hau da blockchain-eko datu-erregistro bat (gako-balioa):

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

"Gakoa" (gakoa) - jokoaren id joko berria. Gainerako datuak "balioa" eremuko lerroan daude. Sarrera hauek fitxan gordetzen dira Data kontratu adimenduna:

RSA ausaz blockchain-en

RSA ausaz blockchain-en

5. Zerbitzariak kontratu adimenduna "begiratzen" du eta bidalitako transakzioa (joko berria) aurkitzen du blockchain Api erabiliz. Joko berriaren ID-a bloke-katean grabatuta dago jada, eta horrek esan nahi du ezin dela gehiago aldatu edo eragin

6. Zerbitzariak kentzeko funtzio bat sortzen du (gameId, rsaSign). Adibidez, honela:

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

7. Zerbitzariak Invocation transakzio bat bidaltzen dio kontratu adimendunari (Broadcast InvocationTx). Transakzioak eratutako kentzeko funtzioari dei bat dauka (gameId, rsaSign):

RSA ausaz blockchain-en

Funtzioak dauka jokoaren id joko berria eta gako pribatu batekin identifikatzaile esklusibo bat RSA sinatzearen emaitza. Sinaduraren emaitza ez da aldatu.

Zer esan nahi du horrek?

Balio bera hartzen dugu (jokoaren id) eta RSA sinadura metodoa aplikatzen diogu. Emaitza bera lortuko dugu beti. Horrela funtzionatzen du RSA algoritmoak. Azken zenbakia ezin da manipulatu, jokoaren IDa eta RSA aplikatzearen emaitza ez baitira ezagutzen. Zenbaki bat hautatzea ere alferrikakoa da.

8. Blockchain-ek transakzioa onartzen du. Erretiratze funtzioa exekutatzen du (gameId, rsaSign)

9. Erretiratze funtzioaren barruan, erretiratzea gertatzen da GenerateRandInt funtzioak (gameId, rsaSign). Hau ausazko zenbaki-sorgailu bat da

# @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 - eta ausazko zenbaki bat dago.

Lehenik eta behin, katea hartzen da, hau da, RSA sinaduraren emaitza jokoaren id gako pribatua (rsaSign). Ondoren SHA-256 (sha256(rsaSign)).

Ezin dugu sinaduraren eta ondorengo hashingaren emaitza aurreikusi. Beraz, ezinezkoa da ausazko zenbaki baten sorreran eragitea. Tarte jakin bateko zenbaki bat lortzeko (adibidez, 1etik 100era), erabili toInt bihurketa funtzioa eta % 100 (en antzekoa). mod).

Artikuluaren hasieran funtzioa aipatu dugu rsaEgiaztatu(), RSA sinadura baten baliozkotasuna egiaztatzeko aukera ematen duena gako pribatu bat erabiliz, publiko batekin. Hona hemen GenerateRandInt(gameId,rsaSign) zatia:

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

RSAPUBLIC gako publikoa eta rsaSign katea sarrerara pasatzen dira. Sinadura baliozkotasuna egiaztatzen da. Zenbakia sortzen da egiaztapena arrakastatsua bada. Bestela, sistemak uste du sinadura ez dela baliozkoa (RSA sinadura baliogabea).

Zerbitzariak jokoaren IDa gako pribatu batekin sinatu behar du eta baliozko Rsa sinadura bidali behar du 2880 bloke barru. Parametroa kontratu adimenduna zabaltzean konfiguratzen da. Emandako denboran ezer gertatzen ez bada, erabiltzaileak irabaziko du. Kasu honetan, saria zuk zeuk bidali beharko da zure helbidera. Ematen du "zerbitzariak iruzurra egitea ez dela errentagarria", horrek galera ekartzen duelako. Jarraian adibide bat dago.

RSA ausaz blockchain-en

Erabiltzailea jolasten ari da Dadoen arrabola. Kuboaren 2 aldeetatik 6 aukeratu ditut, apustua 14 OLATU da. Zerbitzariak ez badu baliozko RSA sinadurarik bidaltzen kontratu adimendunari zehaztutako denboran (2880 bloke), erabiltzaileak 34.44 WAVES hartuko ditu.

Jolasetan zenbakiak sortzeko, orakulu bat erabiltzen dugu, kanpoko sistema ez-blockchain bat. Zerbitzariak jokoaren IDaren RSA sinadura bat egiten du. Kontratu adimendunak sinaduraren baliozkotasuna egiaztatzen du eta irabazlea zehazten du. Zerbitzariak ez badu ezer bidaltzen, erabiltzaileak automatikoki irabaziko du.

Hau belaunaldi zintzoko metodoa da, manipulazioa teknikoki ezinezkoa delako. Tradisys joko guztiek deskribatutako algoritmoan oinarrituta funtzionatzen dute. Horrela funtzionatzen dute blockchain jokoek. Dena gardena eta egiaztagarria da. Ez dago sistema horren analogorik beste edozein bloke-katetan. Hau ausazko arrazoizko bat da.

Iturria: www.habr.com

Gehitu iruzkin berria