RSA nasibu kwenye blockchain

Kuna tatizo - ni vigumu kuzalisha nambari nasibu katika mtandao uliogatuliwa. Karibu blockchains zote tayari zimekutana na hii. Hakika, katika mitandao ambapo hakuna uaminifu kati ya watumiaji, kuunda nambari isiyoweza kuepukika ya nambari hutatua shida nyingi.

Katika makala hii tunakuambia jinsi tulivyoweza kutatua tatizo kwa kutumia michezo kama mfano. Wa kwanza wao alikuwa Mawimbi ya Mti wa Krismasi. Kwa maendeleo, tulihitaji jenereta ya nambari isiyo ya kawaida.

RSA nasibu kwenye blockchain

Hapo awali, tulipanga kutoa nambari kulingana na habari kutoka kwa blockchain. Hata hivyo, basi ikawa wazi: nambari inaweza kudanganywa, ambayo inamaanisha kuwa suluhisho haifai.

Tulikuja na suluhisho: tumia mpango wa upanuzi wa kujitolea. Seva ilikisia nambari kutoka 1 hadi 5, ikaongeza chumvi kwake, kisha ikaharakisha matokeo kwa kutumia Kazi za Keccak. Seva ilituma mkataba mahiri na nambari ambayo tayari imehifadhiwa mapema. Inabadilika kuwa mchezo unaanzia kwa mtumiaji kubahatisha nambari iliyofichwa na heshi.

Mchezaji aliweka dau, na seva ikatuma nambari iliyofichwa na "chumvi" kwa mkataba mzuri. Kwa maneno rahisi, alifunua kadi. Baada ya hapo, seva ilikagua nambari na kuamua ikiwa mtumiaji alishinda au alipoteza.

Ikiwa seva haikutuma nambari au "chumvi" kwa uthibitishaji, mtumiaji alishinda. Katika kesi hii, kwa kila mchezo ilihitajika kupeleka mkataba mzuri mapema na kujumuisha ushindi unaowezekana ndani yake. Ilibadilika kuwa isiyofaa, inayotumia wakati na ya gharama kubwa. Wakati huo hapakuwa na suluhisho lingine salama.

Hivi majuzi, timu ya Tradisys ilipendekeza kuongeza kazi kwenye itifaki ya Waves rsaVerify(). Hukagua uhalali wa sahihi ya RSA kulingana na ufunguo wa umma na wa faragha. Matokeo yake, kipengele kiliongezwa.

Tumetengeneza michezo mitatu: Kete Roller, Pesa ya Sarafu ΠΈ Panda Juu ya Mawimbi. Kila moja hutumia teknolojia ya nambari bila mpangilio. Hebu tujue jinsi inavyofanya kazi.

RSA nasibu kwenye blockchain

Wacha tuangalie kutengeneza nambari nasibu kwa kutumia Ride on Waves kama mfano. Mkataba mzuri unaweza kupatikana hapa.

Nenda kwenye kichupo Script na uchague Imetenganishwa. Utaona msimbo wa mkataba mzuri (aka hati).

RSA nasibu kwenye blockchain

Msimbo mahiri wa mkataba una seti ya vitendakazi. Zile zilizowekwa alama kama @Callable zinaweza kuzinduliwa kwa kutumia Shughuli za ombi. Tunavutiwa na kazi mbili: bet ΠΈ kutoa:

  • func dau (playerChoice)
  • func ondoa(gameId,rsaSign)

1. Mtumiaji huchagua urefu wa sehemu na saizi ya dau.

RSA nasibu kwenye blockchain

2. Mteja huunda kipengele cha dau. Kwa picha hapo juu itakuwa dau("50").

3. Mteja hutuma muamala wa Ombi kwa anwani mahiri ya mkataba (matangazo ya InvocationTx). Muamala una kipengele cha dau kama kigezo cha simu. Hii ina maana kwamba shughuli ya Ombi huanzisha utekelezaji wa chaguo la dau (chaguo: Mfuatano) kwenye mkataba mahiri.

RSA nasibu kwenye blockchain

4. Zingatia utendaji wa kamari:

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

Chaguo hili linaandika mchezo mpya kwa hali ya mkataba mzuri. Yaani:

  • Kitambulisho cha kipekee cha mchezo mpya (kitambulisho cha mchezo)
  • Hali ya mchezo = IMEWASILISHWA
  • Chaguo la mchezaji (urefu wa sehemu 50)
  • Ufunguo wa umma
  • Ushindi unaowezekana (kulingana na dau la mchezaji)

RSA nasibu kwenye blockchain

Hivi ndivyo rekodi ya data kwenye blockchain inavyoonekana (thamani ya ufunguo):

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

"Ufunguo" (ufunguo) - kitambulisho cha mchezo mchezo mpya. Data iliyobaki iko kwenye mstari wa shamba la "thamani". Maingizo haya yanahifadhiwa kwenye kichupo Data mkataba wa busara:

RSA nasibu kwenye blockchain

RSA nasibu kwenye blockchain

5. Seva "hutazama" mkataba mzuri na hupata shughuli iliyotumwa (mchezo mpya) kwa kutumia blockchain Api. Kitambulisho cha Mchezo cha mchezo mpya tayari kimerekodiwa kwenye blockchain, kumaanisha kuwa hakiwezi kubadilishwa au kuathiriwa tena.

6. Seva inazalisha kitendakazi cha kutoa (gameId, rsaSign). Kwa mfano, kama hii:

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

7. Seva hutuma muamala wa Ombi kwa mkataba mahiri (broadcast InvocationTx). Muamala una simu kwa kipengele cha kuondoa kilichoundwa (gameId, rsaSign):

RSA nasibu kwenye blockchain

Kitendaji kina kitambulisho cha mchezo mchezo mpya na matokeo ya kutia saini kwa RSA kwa kitambulisho cha kipekee kwa ufunguo wa faragha. Matokeo ya saini hayajabadilika.

Hii inamaanisha nini?

Tunachukua thamani sawa (kitambulisho cha mchezo) na kutumia mbinu ya sahihi ya RSA kwake. Tutapata matokeo sawa kila wakati. Hivi ndivyo algorithm ya RSA inavyofanya kazi. Nambari ya mwisho haiwezi kubadilishwa, kwa kuwa kitambulisho cha mchezo na matokeo ya kutumia RSA hayajulikani. Kuchukua nambari pia haina maana.

8. Blockchain inakubali shughuli. Inaendesha kazi ya kuondoa (gameId, rsaSign)

9. Ndani ya kazi ya kujiondoa, uondoaji hutokea Tengeneza kazi zaRandInt (Id ya mchezo, rsaSign). Hii ni jenereta ya nambari nasibu

# @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 - na kuna nambari ya nasibu.

Kwanza, kamba inachukuliwa, ambayo ni matokeo ya saini ya RSA kitambulisho cha mchezo ufunguo wa kibinafsi (rsaSign) Kisha fanya haraka kwa SHA-256 (sha256(rsaSign)).

Hatuwezi kutabiri matokeo ya saini na hashing inayofuata. Kwa hivyo, haiwezekani kushawishi kizazi cha nambari isiyo ya kawaida. Ili kupata nambari katika masafa fulani (kwa mfano, kutoka 1 hadi 100), tumia kitendakazi cha ubadilishaji toInt na %100 (sawa na mod).

Mwanzoni mwa makala tulitaja kazi rsaVerify(), ambayo hukuruhusu kuangalia uhalali wa saini ya RSA kwa kutumia ufunguo wa faragha dhidi ya ule wa umma. Hapa kuna sehemu ya GenerateRandInt(gameId,rsaSign):

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

Kitufe cha umma cha RSAPUBLIC na kamba ya rsaSign hupitishwa kwenye ingizo. Sahihi inakaguliwa ili kubaini uhalali. Nambari inatolewa ikiwa hundi imefanikiwa. Vinginevyo, mfumo unazingatia kuwa sahihi si sahihi (Sahihi batili ya RSA).

Seva lazima itie sahihi kitambulisho cha mchezo kwa kutumia ufunguo wa faragha na kutuma sahihi sahihi ya Rsa ndani ya vizuizi 2880. Kigezo huwekwa wakati wa kupeleka mkataba mahiri. Ikiwa hakuna kinachotokea ndani ya muda uliowekwa, mtumiaji atashinda. Katika kesi hii, zawadi lazima ipelekwe kwa anwani yako mwenyewe. Inabadilika kuwa "sio faida kwa seva kudanganya", kwa sababu hii inasababisha hasara. Chini ni mfano.

RSA nasibu kwenye blockchain

Mtumiaji anacheza Kete Roller. Nilichagua pande 2 kati ya 6 za mchemraba, dau ni MAWIMBI 14. Ikiwa seva haitatuma saini halali ya RSA kwa mkataba mahiri ndani ya muda uliowekwa (vitalu 2880), mtumiaji atachukua MAWIMBI 34.44.

Ili kuzalisha nambari katika michezo, tunatumia oracle - mfumo wa nje, usio wa blockchain. Seva huweka sahihi ya RSA ya kitambulisho cha mchezo. Mkataba mahiri hukagua uhalali wa sahihi na huamua mshindi. Ikiwa seva haitumi chochote, basi mtumiaji hushinda kiatomati.

Hii ni njia ya kizazi cha uaminifu, kwa sababu udanganyifu hauwezekani kitaalam. Michezo yote ya Tradisys hufanya kazi kulingana na algorithm iliyoelezewa. Hivi ndivyo michezo ya blockchain inavyofanya kazi. Kila kitu ni wazi na kinaweza kuthibitishwa. Hakuna analogi za mfumo kama huo katika blockchain nyingine yoyote. Hii ni bahati nasibu ya haki.

Chanzo: mapenzi.com

Kuongeza maoni