RSA acak ing blockchain

Ana masalah - angel ngasilake nomer acak ing jaringan desentralisasi. Meh kabeh blockchain wis nemoni iki. Pancen, ing jaringan sing ora ana kapercayan ing antarane pangguna, nggawe nomer acak sing ora bisa dipungkiri ngrampungake akeh masalah.

Ing artikel iki kita pitutur marang kowe carane kita ngatur kanggo ngatasi masalah nggunakake game minangka conto. Sing pisanan yaiku Wit Natal Ombak. Kanggo pangembangan, kita butuh generator nomer acak.

RSA acak ing blockchain

Kaping pisanan, kita ngrancang ngasilake nomer adhedhasar informasi saka pamblokiran. Nanging, banjur dadi jelas: nomer kasebut bisa dimanipulasi, tegese solusi kasebut ora cocog.

Kita nggawe solusi: gunakake skema commit-expand. Server guessed nomer saka 1 kanggo 5, nambah uyah kanggo, lan banjur hashed asil nggunakake Fungsi Kec. Server masang kontrak cerdas kanthi nomer sing wis disimpen sadurunge. Pranyata metu sing game boils mudhun kanggo pangguna guess nomer didhelikake dening hash.

Pamuter diselehake nang, lan server dikirim nomer didhelikake lan "uyah" kanggo kontrak pinter. Ing istilah sing prasaja, dheweke mbukak kertu kasebut. Sawise iku, server mriksa nomer kasebut lan mutusake manawa pangguna menang utawa kalah.

Yen server ora ngirim nomer utawa "uyah" kanggo verifikasi, pangguna menang. Ing kasus iki, kanggo saben game perlu masang kontrak pinter ing advance lan kalebu potensial winnings ing. Pranyata ora trep, butuh wektu lan larang. Ing wektu iku ora ana solusi liyane sing aman.

Bubar, tim Tradisys ngusulake nambahake fungsi menyang protokol Waves rsaVerifikasi(). Iki mriksa validitas teken RSA adhedhasar kunci umum lan pribadi. AkibatΓ©, fitur kasebut ditambahake.

Kita wis ngembangake telung game: Dadu Roller, Coin Flip ΠΈ Numpak Ombak. Saben wong nindakake teknologi nomer acak. Ayo dipikirake cara kerjane.

RSA acak ing blockchain

Ayo goleki ngasilake nomer acak nggunakake Ride on Waves minangka conto. Kontrak pinter bisa ditemokake kene.

Pindhah menyang tab script banjur pilih Dikompilasi. Sampeyan bakal weruh kode kontrak pinter (aka script).

RSA acak ing blockchain

Kode kontrak cerdas ngemot sakumpulan fungsi. Sing ditandhani minangka @Callable bisa diluncurake nggunakake Transaksi invocation. Kita kasengsem ing rong fungsi: nang ΠΈ mbatalake:

  • taruhan fungsi (playerChoice)
  • fungsi withdraw(gameId,rsaSign)

1. Pangguna milih dawa babagan lan ukuran nang.

RSA acak ing blockchain

2. Klien nggawe fungsi totohan. Kanggo gambar ing ndhuwur bakal dadi taruhan("50").

3. Klien ngirim transaksi Invocation menyang alamat kontrak cerdas (broadcast InvocationTx). Transaksi ngandhut fungsi nang minangka parameter telpon. Iki tegese transaksi Invocation micu eksekusi fungsi taruhan (pilihan: String) ing kontrak cerdas.

RSA acak ing blockchain

4. Coba fungsi taruhan:

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

Fungsi nyerat game anyar kanggo negara kontrak pinter. yaiku:

  • Pengenal unik kanggo game anyar (id game)
  • Negara game = SUBMITTED
  • Pilihan pemain (dawa segmen 50)
  • Kunci umum
  • Potensi menang (gumantung saka taruhan pemain)

RSA acak ing blockchain

Iki minangka rekaman data ing blockchain (nilai kunci):

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

"Kunci" (kunci) - id game game anyar. Data sing isih ana ing baris kolom "nilai". Entri iki disimpen ing tab Data kontrak pinter:

RSA acak ing blockchain

RSA acak ing blockchain

5. Server "katon" ing kontrak pinter lan nemokake transaksi sing dikirim (game anyar) nggunakake blockchain Api. Game id saka game anyar wis direkam ing blockchain, tegese ora bisa diganti utawa dipengaruhi maneh

6. Server ngasilake fungsi mundur (gameId, rsaSign). Contone, kaya iki:

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

7. Server ngirim transaksi Invocation menyang kontrak pinter (broadcast InvocationTx). Transaksi kasebut ngemot telpon menyang fungsi mundur sing dibentuk (gameId, rsaSign):

RSA acak ing blockchain

Fungsi kasebut ngemot id game game anyar lan asil RSA tondo asto saka pengenal unik karo tombol pribadi. Asil teken ora owah.

Apa tegese iki?

Kita njupuk nilai sing padha (id game) lan aplikasi cara teken RSA. Kita bakal tansah entuk asil sing padha. Iki minangka algoritma RSA. Nomer final ora bisa diapusi, wiwit id game lan asil aplikasi RSA ora dikenal. Milih nomer uga ora ana gunane.

8. Blockchain nampa transaksi kasebut. Nganggo fungsi mundur (gameId, rsaSign)

9. Ing njero fungsi mundur, mundur kedadeyan Fungsi GenerateRandInt (gameId, rsaSign). Iki minangka generator nomer acak

# @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 - lan ana nomer acak.

Kaping pisanan, senar kasebut dijupuk, yaiku asil saka teken RSA id game kunci pribadhi (rsaTandha). Banjur hash nganggo SHA-256 (sha256(rsaSign)).

Kita ora bisa prΓ©dhiksi asil teken lan hashing sakteruse. Mulane, iku mokal kanggo pengaruhe generasi nomer acak. Kanggo entuk nomer ing sawetara tartamtu (contone, saka 1 nganti 100), gunakake fungsi konversi toInt lan %100 (padha karo mod).

Ing wiwitan artikel kasebut kita sebutake fungsi kasebut rsaVerifikasi(), sing ngidini sampeyan mriksa validitas teken RSA nggunakake kunci pribadhi marang sing umum. Punika bagean GenerateRandInt(gameId,rsaSign):

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

Kunci umum RSAPUBLIC lan string rsaSign diterusake menyang input. Tandha dipriksa validitas. Nomer kui yen mriksa kasil. Yen ora, sistem nganggep manawa teken ora sah (Tandha RSA ora sah).

Server kudu mlebu id game karo tombol pribadi lan ngirim teken Rsa bener ing 2880 pamblokiran. Parameter dikonfigurasi nalika masang kontrak cerdas. Yen ora ana apa-apa ing wektu sing ditemtokake, pangguna menang. Ing kasus iki, hadiah kudu dikirim menyang alamat sampeyan dhewe. Pranyata metu sing "ora duwe bathi kanggo server ngapusi", amarga iki ndadΓ©kakΓ© kanggo mundhut. Ing ngisor iki contone.

RSA acak ing blockchain

Pangguna lagi muter Dadu Roller. Aku milih 2 saka 6 sisih kotak, nang 14 WAVES. Yen server ora ngirim teken RSA bener kanggo kontrak pinter ing wektu tartamtu (2880 pamblokiran), pangguna bakal njupuk 34.44 WAVES.

Kanggo ngasilake nomer ing game, kita nggunakake oracle - eksternal, sistem non-blockchain. Server nindakake teken RSA saka id game. Kontrak cerdas mriksa validitas teken lan nemtokake pemenang. Yen server ora ngirim apa-apa, pangguna kanthi otomatis menang.

Iki minangka cara generasi sing jujur, amarga manipulasi sacara teknis ora mungkin. Kabeh game Tradisys bisa adhedhasar algoritma diterangake. Iki cara kerja game blockchain. Kabeh iku transparan lan bisa diverifikasi. Ora ana analog saka sistem kasebut ing blockchain liyane. Iki acak adil.

Source: www.habr.com

Add a comment