RSA handahófi á blockchain

Það er vandamál - það er erfitt að búa til handahófskennda tölu í dreifðu neti. Næstum allar blockchains hafa þegar lent í þessu. Reyndar, í netkerfum þar sem ekki er traust á milli notenda, leysir það mörg vandamál að búa til óneitanlega slembitölu.

Í þessari grein segjum við þér hvernig okkur tókst að leysa vandamálið með því að nota leiki sem dæmi. Sá fyrsti þeirra var Bylgjur jólatré. Til þróunar þurftum við slembitölugjafa.

RSA handahófi á blockchain

Upphaflega ætluðum við að búa til tölu byggt á upplýsingum frá blockchain. Hins vegar varð ljóst: hægt var að hagræða tölunni, sem þýðir að lausnin hentar ekki.

Við komum með lausn: notaðu commit-expand kerfið. Þjónninn giskaði á töluna frá 1 til 5, bætti salti við hana og hassaði síðan niðurstöðuna með því að nota Keccak aðgerðir. Miðlarinn notaði snjallsamninginn með númerinu sem þegar var vistað fyrirfram. Í ljós kemur að leikurinn snýst um að notandinn giskar á töluna sem hassið er falið.

Spilarinn lagði veðmál og þjónninn sendi falið númer og „salt“ í snjallsamninginn. Í einföldu máli afhjúpaði hann spilin. Eftir það athugaði þjónninn tölurnar og ákvað hvort notandinn vann eða tapaði.

Ef þjónninn sendi ekki númer eða „salt“ til staðfestingar vann notandinn. Í þessu tilviki, fyrir hvern leik, var nauðsynlegt að dreifa snjöllum samningi fyrirfram og innihalda hugsanlega vinninga í honum. Það reyndist óþægilegt, tímafrekt og dýrt. Á þeim tíma var engin önnur örugg lausn.

Nýlega lagði Tradisys teymið til að bæta aðgerð við Waves siðareglur rsaStaðfesta(). Það athugar gildi RSA undirskriftarinnar byggt á almennum og einkalykli. Fyrir vikið var eiginleikanum bætt við.

Við höfum þróað þrjá leiki: Teningakastari, Coin Flip и Ride On Waves. Hver og einn útfærir slembitölutækni. Við skulum reikna út hvernig það virkar.

RSA handahófi á blockchain

Við skulum skoða að búa til handahófskennda tölu með því að nota Ride on Waves sem dæmi. Snjallsamninginn er að finna hér.

Farðu í flipa Script og veldu Afsamlað. Þú munt sjá snjallsamningskóðann (aka handrit).

RSA handahófi á blockchain

Snjallsamningskóðinn inniheldur mengi aðgerða. Hægt er að ræsa þá sem eru merktir sem @Callable með því að nota Innköllunarviðskipti. Við höfum áhuga á tveimur aðgerðum: veðja и Afturkalla:

  • func veðmál (playerChoice)
  • func draga (gameId,rsaSign)

1. Notandinn velur lengd hlutans og veðmálsstærð.

RSA handahófi á blockchain

2. Viðskiptavinurinn býr til veðmálsaðgerð. Fyrir myndina hér að ofan væri það veðja ("50").

3. Viðskiptavinurinn sendir Invocation-færslu á snjallsamnings heimilisfangið (broadcast InvocationTx). Færslan inniheldur veðmálsaðgerðina sem kallfæribreytu. Þetta þýðir að Invocation viðskiptin kallar á framkvæmd veðmálsaðgerðarinnar (val: String) á snjallsamningnum.

RSA handahófi á blockchain

4. Íhugaðu veðmálsaðgerðina:

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

Aðgerðin skrifar nýjan leik í stöðu snjallsamningsins. Nefnilega:

  • Einstakt auðkenni fyrir nýjan leik (auðkenni leiks)
  • Staða leiks = SENT
  • Val leikmanns (lengd hluta 50)
  • Opinber lykill
  • Hugsanlegir vinningar (fer eftir veðmáli leikmannsins)

RSA handahófi á blockchain

Svona lítur gagnaskrá í blockchain út (lykilgildi):

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

"Lykill" (lykill) - auðkenni leiks nýr leikur. Gögnin sem eftir eru eru í línunni í reitnum „gildi“. Þessar færslur eru geymdar í flipanum Gögn snjall samningur:

RSA handahófi á blockchain

RSA handahófi á blockchain

5. Þjónninn „horfir“ á snjallsamninginn og finnur sendu viðskiptin (nýr leikur) með því að nota blockchain Api. Leikjaauðkenni nýja leiksins er þegar skráð í blockchain, sem þýðir að ekki er lengur hægt að breyta því eða hafa áhrif á það

6. Miðlarinn býr til afturköllunaraðgerð (gameId, rsaSign). Til dæmis, svona:

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

7. Miðlarinn sendir Invocation-færslu til snjallsamningsins (broadcast InvocationTx). Færslan inniheldur símtal í myndaða afturköllunaraðgerðina (gameId, rsaSign):

RSA handahófi á blockchain

Aðgerðin inniheldur auðkenni leiks nýr leikur og niðurstaða RSA undirritunar á einstöku auðkenni með einkalykli. Niðurstaða undirskriftarinnar er óbreytt.

Hvað þýðir þetta?

Við tökum sama gildi (leikjaauðkenni) og notum RSA undirskriftaraðferðina á það. Við munum alltaf fá sömu niðurstöðu. Svona virkar RSA reikniritið. Ekki er hægt að vinna með lokatöluna þar sem auðkenni leiksins og niðurstaðan af því að nota RSA eru ekki þekkt. Að velja tölu er líka tilgangslaust.

8. Blockchain samþykkir viðskiptin. Það keyrir afturköllunaraðgerðina (gameId, rsaSign)

9. Inni í afturköllunaraðgerðinni á sér stað afturköllun GenerateRandInt aðgerðir (gameId, rsaSign). Þetta er slembitöluframleiðandi

# @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 - og það er tilviljunarkennd tala.

Fyrst er strengurinn tekinn, sem er afleiðing RSA undirskriftarinnar auðkenni leiks einkalykill (rsaSign). Svo haslað með SHA-256 (sha256(rsaSign)).

Við getum ekki spáð fyrir um niðurstöðu undirskriftarinnar og síðari hashing. Þess vegna er ómögulegt að hafa áhrif á myndun slembitölu. Til að fá tölu á ákveðnu bili (til dæmis frá 1 til 100), notaðu toInt umreikningsfallið og %100 (svipað og unga fólkið).

Í upphafi greinarinnar minntum við á aðgerðina rsaStaðfesta(), sem gerir þér kleift að athuga gildi RSA undirskriftar með því að nota einkalykil á móti opinberum. Hér er GenerateRandInt(gameId,rsaSign) hluti:

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

Opinberi lykillinn RSAPUBLIC og rsaSign strengurinn eru sendar til inntaksins. Undirskriftin er skoðuð með tilliti til gildis. Númerið er búið til ef athugunin heppnast. Annars telur kerfið að undirskriftin sé ekki gild (Invalid RSA signature).

Miðlarinn verður að undirrita auðkenni leiksins með einkalykli og senda gilda Rsa undirskrift innan 2880 blokka. Færibreytan er stillt þegar snjallsamningurinn er notaður. Ef ekkert gerist innan tiltekins tíma vinnur notandinn. Í þessu tilviki verður að senda vinninginn sjálfur á heimilisfangið þitt. Það kemur í ljós að það er „ekki hagkvæmt fyrir netþjóninn að svindla“ vegna þess að þetta leiðir til taps. Hér að neðan er dæmi.

RSA handahófi á blockchain

Notandinn er að spila Teningakastari. Ég valdi 2 af 6 hliðum teningsins, veðmálið er 14 BYLGJUR. Ef þjónninn sendir ekki gilda RSA undirskrift til snjallsamningsins innan tilgreinds tíma (2880 blokkir) mun notandinn taka 34.44 BYLGAR.

Til að búa til tölur í leikjum notum við véfrétt - ytra kerfi sem er ekki blockchain. Miðlarinn framkvæmir RSA undirskrift á auðkenni leiksins. Snjallsamningurinn athugar gildi undirskriftarinnar og ákvarðar sigurvegarann. Ef þjónninn sendir ekki neitt, þá vinnur notandinn sjálfkrafa.

Þetta er heiðarleg kynslóðaraðferð, vegna þess að meðhöndlun er tæknilega ómöguleg. Allir Tradisys leikir vinna byggt á reikniritinu sem lýst er. Svona virka blockchain leikir. Allt er gagnsætt og sannanlegt. Það eru engar hliðstæður slíks kerfis í neinu öðru blockchain. Þetta er sanngjarnt tilviljun.

Heimild: www.habr.com

Bæta við athugasemd