RSA random sa blockchain

Adunay usa ka problema - lisud ang paghimo og usa ka random nga numero sa usa ka desentralisado nga network. Hapit tanan nga mga blockchain nakasugat na niini. Sa tinuud, sa mga network diin wala’y pagsalig sa taliwala sa mga tiggamit, ang paghimo sa usa ka dili ikalimod nga random nga numero nakasulbad sa daghang mga problema.

Sa kini nga artikulo gisultihan ka namon kung giunsa namon nasulbad ang problema gamit ang mga dula ingon usa ka pananglitan. Ang una kanila mao ang Mga Waves Xmas Tree. Alang sa kalamboan, nagkinahanglan kami og random number generator.

RSA random sa blockchain

Sa sinugdan, kami nagplano sa pagmugna og usa ka numero base sa impormasyon gikan sa blockchain. Apan, unya kini nahimong tin-aw: ang gidaghanon mahimong mamanipula, nga nagpasabot nga ang solusyon dili angay.

Naghimo kami og usa ka workaround: gamita ang commit-expand scheme. Gitag-an sa server ang usa ka numero gikan sa 1 hangtod 5, gidugangan kini og asin, ug dayon gi-hash ang resulta gamit Mga gimbuhaton sa Keccak. Gi-deploy sa server ang intelihente nga kontrata uban ang na-save na nga numero sa daan. Kini turns nga ang duwa hubag ngadto sa user pagtag-an sa numero nga gitago sa hash.

Ang magdudula nagbutang og pusta, ug ang server nagpadala sa tinago nga numero ug "asin" sa smart contract. Sa yano nga mga termino, iyang gipadayag ang mga kard. Pagkahuman niana, gisusi sa server ang mga numero ug nakahukom kung nakadaog o napildi ang tiggamit.

Kung ang server wala magpadala usa ka numero o "asin" alang sa pag-verify, ang tiggamit midaog. Sa kini nga kaso, alang sa matag dula kinahanglan nga i-deploy ang usa ka intelihente nga kontrata nga abante ug ilakip ang mga potensyal nga kadaugan niini. Kini nahimo nga dili kombenyente, makahurot sa panahon ug mahal. Niadtong panahona walay laing luwas nga solusyon.

Bag-ohay lang, ang Tradisys team misugyot sa pagdugang og function sa Waves protocol rsaVerify(). Gisusi niini ang kabalido sa pirma sa RSA base sa publiko ug pribado nga yawe. Ingon usa ka sangputanan, ang bahin gidugang.

Naghimo kami og tulo ka mga dula: Dice Roller, Coin Flip ΠΈ Pagsakay sa mga Balod. Ang matag usa nagpatuman sa random nga teknolohiya sa numero. Atong tan-awon kon sa unsang paagi kini molihok.

RSA random sa blockchain

Atong tan-awon ang paghimo ug random nga numero gamit ang Ride on Waves isip pananglitan. Makita ang smart contract dinhi.

Pag-adto sa tab Script ug pagpili Decompiled. Imong makita ang smart contract code (aka script).

RSA random sa blockchain

Ang smart contract code naglangkob sa usa ka hugpong sa mga gimbuhaton. Kadtong gimarkahan nga @Callable mahimong ilunsad gamit Mga transaksyon sa pag-ampo. Kami interesado sa duha ka mga gimbuhaton: bet ΠΈ mobiya:

  • func bet (playerChoice)
  • function withdraw(gameId,rsaSign)

1. Gipili sa user ang gitas-on sa bahin ug ang gidak-on sa pusta.

RSA random sa blockchain

2. Ang kliyente nagmugna ug pusta function. Alang sa imahe sa ibabaw kini pusta("50").

3. Ang kliyente nagpadala ug transaksyon sa Invocation ngadto sa smart contract address (broadcast InvocationTx). Ang transaksyon naglangkob sa pusta function ingon usa ka parameter sa tawag. Kini nagpasabut nga ang transaksyon sa Invocation nagpalihok sa pagpatuman sa function sa pusta (pagpili: String) sa smart nga kontrata.

RSA random sa blockchain

4. Hunahunaa ang pusta function:

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

Ang function nagsulat usa ka bag-ong dula sa estado sa smart nga kontrata. Nga mao:

  • Talagsaong identifier alang sa usa ka bag-ong dula (game id)
  • Estado sa dula = GIPASULOD
  • Pagpili sa magdudula (gitas-on nga bahin 50)
  • Publikong yawe
  • Potensyal nga kadaugan (depende sa pusta sa magdudula)

RSA random sa blockchain

Kini ang hitsura sa usa ka rekord sa datos sa blockchain (key-value):

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

"Yawe" (key) - duwa id bag-ong dula. Ang nahabilin nga datos anaa sa linya sa "value" field. Kini nga mga entry gitipigan sa tab Data smart nga kontrata:

RSA random sa blockchain

RSA random sa blockchain

5. Ang server "nagtan-aw" sa smart nga kontrata ug nakit-an ang gipadala nga transaksyon (bag-ong dula) gamit ang blockchain Api. Ang Game id sa bag-ong dula natala na sa blockchain, nga nagpasabot nga dili na kini mausab o maimpluwensyahan

6. Ang server nagmugna og withdraw function (gameId, rsaSign). Pananglitan, sama niini:

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

7. Ang server nagpadala ug transaksyon sa Invocation ngadto sa smart contract (broadcast InvocationTx). Ang transaksyon naglangkob sa usa ka tawag sa naporma nga withdraw function (gameId, rsaSign):

RSA random sa blockchain

Ang function naglangkob duwa id bag-ong dula ug ang resulta sa pagpirma sa RSA sa usa ka talagsaon nga identifier nga adunay pribadong yawe. Ang resulta sa pirma wala mausab.

Unsa ang gipasabut niini?

Gikuha namon ang parehas nga kantidad (game id) ug gipadapat ang RSA signature nga pamaagi niini. Kanunay namong makuha ang parehas nga resulta. Ingon niini kung giunsa ang RSA algorithm nagtrabaho. Ang katapusan nga numero dili mamanipula, tungod kay ang dula id ug ang resulta sa pag-apply sa RSA wala mahibal-an. Ang pagpili og numero walay kapuslanan usab.

8. Gidawat sa Blockchain ang transaksyon. Gipadagan niini ang withdraw function (gameId, rsaSign)

9. Sa sulod sa withdraw function, ang withdrawal mahitabo GenerateRandInt functions (gameId, rsaSign). Kini usa ka random number generator

# @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 - ug adunay usa ka random nga numero.

Una, gikuha ang hilo, nga resulta sa pirma sa RSA duwa id pribado nga yawe (rsaSign). Dayon gi-hash gamit ang SHA-256 (sha256(rsaSign)).

Dili nato matag-an ang resulta sa pirma ug sa sunod nga hashing. Busa, imposible nga maimpluwensyahan ang henerasyon sa usa ka random nga numero. Aron makakuha og numero sa usa ka piho nga range (pananglitan, gikan sa 1 hangtod 100), gamita ang toInt conversion function ug %100 (sama sa mod).

Sa sinugdanan sa artikulo among gihisgutan ang function rsaVerify(), nga nagtugot kanimo sa pagsusi sa balido sa usa ka RSA nga pirma gamit ang usa ka pribado nga yawe batok sa usa ka publiko. Ania ang GenerateRandInt(gameId,rsaSign) nga bahin:

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

Ang public key nga RSAPUBLIC ug ang rsaSign string gipasa sa input. Ang pirma gisusi alang sa pagkabalido. Ang numero mamugna kung ang tseke malampuson. Kung dili, gikonsiderar sa sistema nga dili balido ang pirma (Dili balido nga pirma sa RSA).

Ang server kinahanglang mopirma sa game id gamit ang pribadong yawe ug magpadala ug balido nga Rsa signature sulod sa 2880 blocks. Ang parameter gi-configure sa dihang nag-deploy sa smart contract. Kung walay mahitabo sulod sa gitakdang panahon, ang user ang modaog. Sa kini nga kaso, ang premyo kinahanglan ipadala sa imong adres mismo. Kini nahimo nga kini "dili kapuslanan alang sa server nga manglimbong", tungod kay kini nagdala sa pagkawala. Sa ubos usa ka pananglitan.

RSA random sa blockchain

Ang tiggamit nagdula Dice Roller. Gipili nako ang 2 sa 6 ka kilid sa cube, ang pusta kay 14 WAVES. Kung ang server dili magpadala ug balido nga RSA signature sa smart contract sulod sa gitakdang oras (2880 blocks), ang user mokuha ug 34.44 WAVES.

Aron makamugna og mga numero sa mga dula, naggamit kami og orakulo - usa ka eksternal, non-blockchain nga sistema. Ang server naghimo sa usa ka RSA nga pirma sa game id. Gisusi sa smart nga kontrata ang kabalido sa pirma ug gitino ang mananaog. Kung ang server wala magpadala bisan unsa, dayon ang user awtomatikong modaog.

Kini usa ka matinuoron nga pamaagi sa henerasyon, tungod kay ang pagmaniobra sa teknikal imposible. Ang tanan nga mga dula sa Tradisys nagtrabaho base sa gihulagway nga algorithm. Ingon niini kung giunsa ang mga dula nga blockchain molihok. Ang tanan transparent ug mapamatud-an. Wala’y mga analogue sa ingon nga sistema sa bisan unsang uban nga blockchain. Kini usa ka patas nga random.

Source: www.habr.com

Idugang sa usa ka comment