RSA ar hap ar blockchain

Mae yna broblem - mae'n anodd cynhyrchu rhif ar hap mewn rhwydwaith datganoledig. Mae bron pob cadwyn bloc eisoes wedi dod ar draws hyn. Yn wir, mewn rhwydweithiau lle nad oes ymddiriedaeth rhwng defnyddwyr, mae creu rhif hap diymwad yn datrys llawer o broblemau.

Yn yr erthygl hon rydyn ni'n dweud wrthych chi sut rydyn ni wedi llwyddo i ddatrys y broblem gan ddefnyddio gemau fel enghraifft. Y cyntaf ohonynt oedd Coeden Nadolig Tonnau. Ar gyfer datblygiad, roedd angen generadur rhif ar hap arnom.

RSA ar hap ar blockchain

I ddechrau, roeddem yn bwriadu cynhyrchu rhif yn seiliedig ar wybodaeth o'r blockchain. Fodd bynnag, daeth yn amlwg: gallai'r rhif gael ei drin, sy'n golygu nad yw'r ateb yn addas.

Fe wnaethon ni feddwl am ateb: defnyddiwch y cynllun ymrwymo-ehangu. Dyfalodd y gweinydd rif o 1 i 5, ychwanegu halen ato, ac yna stwnsio'r canlyniad gan ddefnyddio Swyddogaethau Keccak. Defnyddiodd y gweinydd y contract smart gyda'r rhif a gadwyd eisoes ymlaen llaw. Mae'n ymddangos bod y gêm yn dibynnu ar y defnyddiwr yn dyfalu'r rhif sydd wedi'i guddio gan yr hash.

Gosododd y chwaraewr bet, ac anfonodd y gweinydd y rhif cudd a'r “halen” i'r contract smart. Yn syml, datgelodd y cardiau. Ar ôl hynny, gwiriodd y gweinydd y niferoedd a phenderfynodd a oedd y defnyddiwr wedi ennill neu golli.

Os na anfonodd y gweinydd rif neu “halen” i'w ddilysu, enillodd y defnyddiwr. Yn yr achos hwn, ar gyfer pob gêm roedd angen defnyddio contract smart ymlaen llaw a chynnwys enillion posibl ynddo. Trodd allan i fod yn anghyfleus, yn cymryd llawer o amser ac yn ddrud. Ar y pryd nid oedd unrhyw ateb diogel arall.

Yn ddiweddar, cynigiodd tîm Tradisys ychwanegu swyddogaeth at brotocol Waves rsaGwirio(). Mae'n gwirio dilysrwydd y llofnod RSA yn seiliedig ar yr allwedd gyhoeddus a phreifat. O ganlyniad, ychwanegwyd y nodwedd.

Rydym wedi datblygu tair gêm: Rholer dis, Fflip Coin и Marchogaeth Ar Donnau. Mae pob un yn gweithredu technoleg rhif ar hap. Gadewch i ni ddarganfod sut mae'n gweithio.

RSA ar hap ar blockchain

Gadewch i ni edrych ar gynhyrchu rhif ar hap gan ddefnyddio Ride on Waves fel enghraifft. Gellir dod o hyd i'r contract smart yma.

Ewch i'r tab Sgript a dewis Dadgrynhoi. Fe welwch y cod contract smart (aka sgript).

RSA ar hap ar blockchain

Mae'r cod contract smart yn cynnwys set o swyddogaethau. Gellir lansio'r rhai sydd wedi'u marcio fel @Callable gan ddefnyddio Trafodion galwedigaeth. Mae gennym ddiddordeb mewn dwy swyddogaeth: bet и tynnu'n ôl:

  • bet swyddogaeth (playerChoice)
  • tynnu'n ôl func(gameId, rsaSign)

1. Mae'r defnyddiwr yn dewis hyd y segment a maint y bet.

RSA ar hap ar blockchain

2. Mae'r cleient yn creu swyddogaeth bet. Ar gyfer y ddelwedd uchod byddai bet ("50").

3. Mae'r cleient yn anfon trafodiad Invocation i'r cyfeiriad contract smart (darlledu InvocationTx). Mae'r trafodiad yn cynnwys y swyddogaeth bet fel paramedr galwad. Mae hyn yn golygu bod y trafodiad Invocation yn sbarduno gweithrediad y swyddogaeth bet (dewis: Llinynnol) ar y contract smart.

RSA ar hap ar blockchain

4. Ystyriwch y swyddogaeth bet:

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

Mae'r swyddogaeth yn ysgrifennu gêm newydd i gyflwr y contract smart. sef:

  • Dynodwr unigryw ar gyfer gêm newydd (ID gêm)
  • Cyflwr gêm = CYFLWYNWYD
  • Dewis y chwaraewr (hyd segment 50)
  • Allwedd gyhoeddus
  • Enillion posib (yn dibynnu ar bet y chwaraewr)

RSA ar hap ar blockchain

Dyma sut olwg sydd ar gofnod data yn y blockchain (gwerth allweddol):

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

"Allwedd" (allwedd) - id gêm gêm newydd. Mae'r data sy'n weddill wedi'i gynnwys yn llinell y maes “gwerth”. Mae'r cofnodion hyn yn cael eu storio yn y tab Dyddiad contract smart:

RSA ar hap ar blockchain

RSA ar hap ar blockchain

5. Mae'r gweinydd "yn edrych" ar y contract smart ac yn dod o hyd i'r trafodiad a anfonwyd (gêm newydd) gan ddefnyddio'r blockchain Api. Mae id Gêm y gêm newydd eisoes wedi'i gofnodi yn y blockchain, sy'n golygu na ellir ei newid na'i ddylanwadu mwyach

6. Mae'r gweinydd yn cynhyrchu swyddogaeth tynnu'n ôl (gameId, rsaSign). Er enghraifft, fel hyn:

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

7. Mae'r gweinydd yn anfon trafodiad Invocation i'r contract smart (darlledu InvocationTx). Mae'r trafodiad yn cynnwys galwad i'r swyddogaeth tynnu'n ôl ffurfiedig (gameId, rsaSign):

RSA ar hap ar blockchain

Mae'r swyddogaeth yn cynnwys id gêm gêm newydd a chanlyniad RSA yn llofnodi dynodwr unigryw gydag allwedd breifat. Nid yw canlyniad y llofnod wedi newid.

Beth yw ystyr hyn?

Rydym yn cymryd yr un gwerth (gêm id) ac yn cymhwyso'r dull llofnod RSA iddo. Byddwn bob amser yn cael yr un canlyniad. Dyma sut mae'r algorithm RSA yn gweithio. Ni ellir trin y rhif terfynol, gan nad yw'r rhif adnabod gêm a chanlyniad cymhwyso RSA yn hysbys. Mae dewis rhif hefyd yn ddibwrpas.

8. Mae Blockchain yn derbyn y trafodiad. Mae'n rhedeg y swyddogaeth tynnu'n ôl (gameId, rsaSign)

9. Y tu mewn i'r swyddogaeth tynnu'n ôl, mae tynnu'n ôl yn digwydd Swyddogaethau GenerateRandInt (gêmId, rsaSign). Mae hwn yn gynhyrchydd haprifau

# @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 - ac mae rhif ar hap.

Yn gyntaf, cymerir y llinyn, sef canlyniad y llofnod RSA id gêm allwedd breifat (rsaArwydd). Yna stwnsio gyda SHA-256 (sha256(rsaArwydd)).

Ni allwn ragweld canlyniad y llofnod a'r stwnsh dilynol. Felly, mae'n amhosibl dylanwadu ar gynhyrchu rhif ar hap. I gael rhif mewn ystod arbennig (er enghraifft, o 1 i 100), defnyddiwch y ffwythiant trosi toInt a % 100 (tebyg i mod).

Ar ddechrau'r erthygl soniasom am y swyddogaeth rsaGwirio(), sy'n eich galluogi i wirio dilysrwydd llofnod RSA gan ddefnyddio allwedd breifat yn erbyn un cyhoeddus. Dyma'r rhan GenerateRandInt (gameId, rsaSign):

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

Mae'r allwedd gyhoeddus RSAPUBLIC a'r llinyn rsaSign yn cael eu trosglwyddo i'r mewnbwn. Mae'r llofnod yn cael ei wirio am ddilysrwydd. Cynhyrchir y rhif os bydd y siec yn llwyddiannus. Fel arall, mae'r system yn ystyried nad yw'r llofnod yn ddilys (Llofnod RSA annilys).

Rhaid i'r gweinydd lofnodi id y gêm gydag allwedd breifat ac anfon llofnod Rsa dilys o fewn 2880 bloc. Mae'r paramedr wedi'i ffurfweddu wrth ddefnyddio'r contract smart. Os na fydd unrhyw beth yn digwydd o fewn yr amser a neilltuwyd, y defnyddiwr sy'n ennill. Yn yr achos hwn, rhaid anfon y wobr i'ch cyfeiriad eich hun. Mae'n ymddangos nad yw'n “proffidiol i'r gweinydd dwyllo”, oherwydd mae hyn yn arwain at golled. Isod mae enghraifft.

RSA ar hap ar blockchain

Mae'r defnyddiwr yn chwarae Rholer dis. Dewisais 2 o 6 ochr y ciwb, mae'r bet yn 14 TON. Os na fydd y gweinydd yn anfon llofnod RSA dilys i'r contract smart o fewn yr amser penodedig (2880 bloc), bydd y defnyddiwr yn cymryd 34.44 TONNAU.

I gynhyrchu niferoedd mewn gemau, rydym yn defnyddio oracl - system allanol, di-blockchain. Mae'r gweinydd yn perfformio llofnod RSA o'r id gêm. Mae'r contract smart yn gwirio dilysrwydd y llofnod ac yn pennu'r enillydd. Os nad yw'r gweinydd yn anfon unrhyw beth, yna mae'r defnyddiwr yn ennill yn awtomatig.

Mae hwn yn ddull cynhyrchu gonest, oherwydd mae'n dechnegol amhosibl ei drin. Mae holl gemau Tradisys yn gweithio yn seiliedig ar yr algorithm a ddisgrifir. Dyma sut mae gemau blockchain yn gweithio. Mae popeth yn dryloyw ac yn wiriadwy. Nid oes unrhyw analogau o system o'r fath mewn unrhyw blockchain arall. Mae hwn yn hap gweddol.

Ffynhonnell: hab.com

Ychwanegu sylw