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
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
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:
Gadewch i ni edrych ar gynhyrchu rhif ar hap gan ddefnyddio Ride on Waves fel enghraifft. Gellir dod o hyd i'r contract smart
Ewch i'r tab Sgript a dewis Dadgrynhoi. Fe welwch y cod contract smart (aka sgript).
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.
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.
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)
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:
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):
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
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.
Mae'r defnyddiwr yn chwarae
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