RSA każwali fuq blockchain

Hemm problema - huwa diffiċli li jiġi ġġenerat numru każwali f'netwerk deċentralizzat. Kważi l-blockchains kollha diġà ltaqgħu ma 'dan. Tabilħaqq, f'netwerks fejn m'hemm l-ebda fiduċja bejn l-utenti, il-ħolqien ta 'numru każwali innegabbli ssolvi ħafna problemi.

F'dan l-artikolu ngħidulek kif irnexxielna nsolvu l-problema billi tuża l-logħob bħala eżempju. L-ewwel wieħed minnhom kien Waves Xmas Tree. Għall-iżvilupp, kellna bżonn ġeneratur ta 'numru każwali.

RSA każwali fuq blockchain

Inizjalment, ippjanajna li niġġeneraw numru bbażat fuq informazzjoni mill-blockchain. Madankollu, allura deher ċar: in-numru jista 'jiġi manipulat, li jfisser li s-soluzzjoni mhix adattata.

Aħna ħriġna b'soluzzjoni alternattiva: uża l-iskema ta 'commit-expand. Is-server qassam numru minn 1 sa 5, żied melħ miegħu, u mbagħad qatgħet ir-riżultat bl-użu Funzjonijiet Keccak. Is-server uża l-kuntratt intelliġenti bin-numru diġà ssejvjat bil-quddiem. Jirriżulta li l-logħba jeħodna biex l-utent guessing-numru moħbi mill-hash.

Il-plejer għamel bet, u s-server bagħat in-numru moħbi u "melħ" lill-kuntratt intelliġenti. F'termini sempliċi, huwa żvela l-karti. Wara dan, is-server iċċekkja n-numri u ddeċieda jekk l-utent rebaħx jew tilifx.

Jekk is-server ma bagħatx numru jew "melħ" għall-verifika, l-utent rebaħ. F'dan il-każ, għal kull logħba kien meħtieġ li jiġi skjerat kuntratt intelliġenti minn qabel u jinkludi rebħ potenzjali fih. Irriżulta li kien inkonvenjenti, jieħu ħafna ħin u jiswa ħafna flus. Dak iż-żmien ma kienx hemm soluzzjoni oħra sigura.

Riċentement, it-tim Tradisys ippropona li żżid funzjoni mal-protokoll Waves rsaVerify(). Tiċċekkja l-validità tal-firma RSA bbażata fuq iċ-ċavetta pubblika u privata. Bħala riżultat, il-karatteristika ġiet miżjuda.

Żviluppajna tliet logħob: Jgħid Roller, Flip tal-Munita и Ride On Waves. Kull wieħed jimplimenta teknoloġija tan-numri bl-addoċċ. Ejja nsemmu kif taħdem.

RSA każwali fuq blockchain

Ejja nħarsu lejn il-ġenerazzjoni ta 'numru każwali billi tuża Ride on Waves bħala eżempju. Il-kuntratt intelliġenti jista 'jinstab hawn.

Mur fit-tab Script u agħżel Dekompilat. Se tara l-kodiċi tal-kuntratt intelliġenti (magħruf ukoll bħala skript).

RSA każwali fuq blockchain

Il-kodiċi tal-kuntratt intelliġenti fih sett ta 'funzjonijiet. Dawk immarkati bħala @Callable jistgħu jiġu mnedija bl-użu Transazzjonijiet ta' invokazzjoni. Aħna interessati f'żewġ funzjonijiet: bet и jirtiraw:

  • func bet (Għażla tal-plejer)
  • func irtira (gameId, rsaSign)

1. L-utent jagħżel it-tul tas-segment u d-daqs tal-imħatra.

RSA każwali fuq blockchain

2. Il-klijent joħloq funzjoni ta 'bet. Għall-immaġni ta 'hawn fuq ikun imħatra ("50").

3. Il-klijent jibgħat transazzjoni ta 'Invokazzjoni lill-indirizz tal-kuntratt intelliġenti (xandira InvocationTx). It-tranżazzjoni fiha l-funzjoni tal-imħatra bħala parametru tas-sejħa. Dan ifisser li t-tranżazzjoni ta 'Invokazzjoni tixpruna l-eżekuzzjoni tal-funzjoni tal-imħatra (għażla: String) fuq il-kuntratt intelliġenti.

RSA każwali fuq blockchain

4. Ikkunsidra l-funzjoni tal-imħatri:

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

Il-funzjoni tikteb logħba ġdida għall-istat tal-kuntratt intelliġenti. Jiġifieri:

  • Identifikatur uniku għal logħba ġdida (id tal-logħba)
  • L-istat tal-logħba = SUBMITTED
  • Għażla tal-plejer (tul tas-segment 50)
  • Ċavetta pubblika
  • Rebħ potenzjali (skond l-imħatra tal-plejer)

RSA każwali fuq blockchain

Dan huwa kif jidher rekord tad-dejta fil-blockchain (key-value):

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

"Ċavetta" (ċavetta) - logħba id logħba ġdida. Id-dejta li jifdal tinsab fil-linja tal-qasam "valur". Dawn l-entrati huma maħżuna fit-tab Data kuntratt intelliġenti:

RSA każwali fuq blockchain

RSA każwali fuq blockchain

5. Is-server "iħares" lejn il-kuntratt intelliġenti u jsib it-tranżazzjoni mibgħuta (logħba ġdida) billi tuża l-Api blockchain. L-id tal-logħba tal-logħba l-ġdida hija diġà rreġistrata fil-blockchain, li jfisser li ma tistax tibqa' tinbidel jew influwenzata

6. Is-server jiġġenera funzjoni ta' rtirar (gameId, rsaSign). Per eżempju, bħal dan:

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

7. Is-server jibgħat transazzjoni ta 'Invokazzjoni lill-kuntratt intelliġenti (xandira InvocationTx). It-tranżazzjoni fiha sejħa għall-funzjoni ta' rtirar iffurmata (gameId, rsaSign):

RSA każwali fuq blockchain

Il-funzjoni fiha logħba id logħba ġdida u r-riżultat tal-firma RSA ta 'identifikatur uniku b'ċavetta privata. Ir-riżultat tal-firma ma nbidilx.

Dak li jfisser dan?

Nieħdu l-istess valur (id tal-logħba) u napplikaw il-metodu tal-firma RSA għalih. Dejjem se niksbu l-istess riżultat. Dan huwa kif jaħdem l-algoritmu RSA. In-numru finali ma jistax jiġi manipulat, peress li l-id tal-logħba u r-riżultat tal-applikazzjoni tal-RSA mhumiex magħrufa. Il-ġbir ta 'numru huwa wkoll inutli.

8. Blockchain jaċċetta t-tranżazzjoni. Tmexxi l-funzjoni ta' rtirar (gameId, rsaSign)

9. Ġewwa l-funzjoni ta 'rtirar, iseħħ l-irtirar funzjonijiet GenerateRandInt (gameId, rsaSign). Dan huwa ġeneratur ta 'numru każwali

# @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 - u hemm numru każwali.

L-ewwel, tittieħed is-sekwenza, li hija r-riżultat tal-firma RSA logħba id ċavetta privata (rsaSign). Imbagħad hashed ma SHA-256 (sha256(rsaSign)).

Ma nistgħux inbassru r-riżultat tal-firma u l-hashing sussegwenti. Għalhekk, huwa impossibbli li tinfluwenza l-ġenerazzjoni ta 'numru każwali. Biex tikseb numru f'ċerta medda (pereżempju, minn 1 sa 100), uża l-funzjoni ta' konverżjoni toInt u % 100 (simili għal mod).

Fil-bidu tal-artiklu semmejna l-funzjoni rsaVerify(), li jippermettilek tiċċekkja l-validità ta’ firma RSA b’ċavetta privata kontra waħda pubblika. Hawnhekk hawn il-parti GenerateRandInt(gameId,rsaSign):

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

Iċ-ċavetta pubblika RSAPUBLIC u s-sekwenza rsaSign huma mgħoddija lill-input. Il-firma tiġi kkontrollata għall-validità. In-numru jiġi ġġenerat jekk il-kontroll jirnexxi. Inkella, is-sistema tqis li l-firma mhix valida (Firma RSA invalida).

Is-server għandu jiffirma l-id tal-logħba b'ċavetta privata u jibgħat firma Rsa valida fi żmien 2880 blokk. Il-parametru huwa kkonfigurat meta jiġi skjerat il-kuntratt intelliġenti. Jekk ma jiġri xejn fiż-żmien allokat, l-utent jirbaħ. F'dan il-każ, il-premju għandu jintbagħat fl-indirizz tiegħek innifsek. Jirriżulta li "mhux profittabbli għas-server li jqarraq", minħabba li dan iwassal għal telf. Hawn taħt hemm eżempju.

RSA każwali fuq blockchain

L-utent qed jilgħab Jgħid Roller. Għażilt 2 mis-6 naħat tal-kubu, l-imħatra hija 14-il mewġ. Jekk is-server ma jibgħatx firma RSA valida lill-kuntratt intelliġenti fiż-żmien speċifikat (2880 blokk), l-utent jieħu 34.44 WAVES.

Biex niġġenera n-numri fil-logħob, nużaw oracle - sistema esterna, mhux blockchain. Is-server iwettaq firma RSA tal-logħba id. Il-kuntratt intelliġenti jiċċekkja l-validità tal-firma u jiddetermina r-rebbieħ. Jekk is-server ma jibgħat xejn, allura l-utent awtomatikament jirbaħ.

Dan huwa metodu ta 'ġenerazzjoni onesta, minħabba li l-manipulazzjoni hija teknikament impossibbli. Il-logħob kollu Tradisys jaħdem ibbażat fuq l-algoritmu deskritt. Hekk jaħdmu l-logħob blockchain. Kollox huwa trasparenti u verifikabbli. M'hemm l-ebda analogi ta 'sistema bħal din fi kwalunkwe blockchain oħra. Dan huwa każwali ġust.

Sors: www.habr.com

Żid kumment