RSA блокчейндегі кездейсоқ

Мәселе бар - орталықтандырылмаған желіде кездейсоқ санды генерациялау қиын. Барлық дерлік блокчейндер бұған тап болды. Шынында да, пайдаланушылар арасында сенім жоқ желілерде даусыз кездейсоқ санды жасау көптеген мәселелерді шешеді.

Бұл мақалада біз мысал ретінде ойындарды пайдалана отырып, мәселені қалай шешкенімізді айтамыз. Олардың біріншісі болды Толқындар шыршасы. Әзірлеу үшін бізге кездейсоқ сандар генераторы қажет болды.

RSA блокчейндегі кездейсоқ

Бастапқыда біз блокчейндегі ақпарат негізінде нөмір жасауды жоспарладық. Алайда, содан кейін белгілі болды: нөмірді басқаруға болады, яғни шешім қолайлы емес.

Біз уақытша шешім таптық: commit-expand схемасын қолданыңыз. Сервер 1-ден 5-ке дейінгі санды болжап, оған тұз қосып, нәтижені пайдаланып хэшировка жасады Keccak функциялары. Сервер алдын ала сақталған нөмірмен смарт келісімшартты орналастырды. Ойын пайдаланушы хэшпен жасырылған нөмірді болжауға дейін төмендейді екен.

Ойыншы ставка қойды, ал сервер жасырын нөмірді және смарт келісімшартқа «тұзды» жіберді. Қарапайым тілмен айтқанда, ол карталарды ашты. Осыдан кейін сервер сандарды тексеріп, пайдаланушы жеңді ме, әлде жеңілді ме деп шешті.

Сервер тексеру үшін нөмірді немесе «тұзды» жібермесе, пайдаланушы жеңді. Бұл жағдайда әрбір ойын үшін алдын ала смарт келісімшартты орналастыру және оған ықтимал ұтыстарды қосу қажет болды. Бұл ыңғайсыз, уақытты қажет ететін және қымбат болып шықты. Ол кезде басқа қауіпсіз шешім жоқ еді.

Жақында Tradisys командасы Waves протоколына функция қосуды ұсынды rsaVerify(). Ол ашық және жабық кілт негізінде RSA қолтаңбасының жарамдылығын тексереді. Нәтижесінде функция қосылды.

Біз үш ойын әзірледік: Роллер дейді, Coin Flip и Ride on Waves. Олардың әрқайсысы кездейсоқ сандар технологиясын жүзеге асырады. Оның қалай жұмыс істейтінін анықтайық.

RSA блокчейндегі кездейсоқ

Мысал ретінде Ride on Waves көмегімен кездейсоқ санды құруды қарастырайық. Ақылды келісімшартты табуға болады осында.

Қойындыға өтіңіз сценарий және таңдаңыз Декомпиляцияланған. Сіз смарт келісімшарт кодын (ака сценарий) көресіз.

RSA блокчейндегі кездейсоқ

Смарт келісімшарт коды функциялар жинағын қамтиды. @Callable ретінде белгіленгендерді пайдалану арқылы іске қосуға болады Шақыру операциялары. Бізді екі функция қызықтырады: Рейтингтi көрсету Жалакидi жасау и алып тастай:

  • func ставкасы (playerChoice)
  • функцияны алып тастау(ойын идентификаторы, rsaSign)

1. Пайдаланушы сегменттің ұзындығын және ставка өлшемін таңдайды.

RSA блокчейндегі кездейсоқ

2. Клиент ставка функциясын жасайды. Жоғарыдағы сурет үшін бұл болар еді ставка("50").

3. Клиент шақыру транзакциясын смарт келісімшарт мекенжайына жібереді (InvocationTx трансляциясы). Транзакция шақыру параметрі ретінде ставка функциясын қамтиды. Бұл шақыру транзакциясы смарт келісімшарттағы ставка функциясының (таңдау: Жол) орындалуын іске қосатынын білдіреді.

RSA блокчейндегі кездейсоқ

4. Ставка функциясын қарастырыңыз:

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

Функция смарт келісімшарт күйіне жаңа ойын жазады. Атап айтқанда:

  • Жаңа ойынға арналған бірегей идентификатор (ойын идентификаторы)
  • Ойын күйі = ЖІБЕРІЛГЕН
  • Ойыншының таңдауы (сегмент ұзындығы 50)
  • Ашық кілт
  • Ықтимал ұтыстар (ойыншының ставкасына байланысты)

RSA блокчейндегі кездейсоқ

Блокчейндегі деректер жазбасы осылай көрінеді (кілт-мәні):

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

«Кілт» (кілт) – ойын идентификаторы жаңа ойын. Қалған деректер «мән» өрісінің жолында қамтылған. Бұл жазбалар қойындыда сақталады мәліметтер ақылды келісім-шарт:

RSA блокчейндегі кездейсоқ

RSA блокчейндегі кездейсоқ

5. Сервер смарт келісім-шартқа «қарайды» және блокчейн Api көмегімен жіберілген транзакцияны (жаңа ойын) табады. Жаңа ойынның ойын идентификаторы блокчейнде әлдеқашан жазылған, яғни оны енді өзгерту немесе әсер ету мүмкін емес.

6. Сервер қайтарып алу функциясын жасайды (gameId, rsaSign). Мысалы, келесідей:

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

7. Сервер смарт келісім-шартқа шақыру транзакциясын жібереді (InvocationTx трансляциясы). Транзакцияда қалыптасқан қайтару функциясына шақыру бар (gameId, rsaSign):

RSA блокчейндегі кездейсоқ

Функция құрамында ойын идентификаторы жаңа ойын және жеке кілтпен бірегей идентификаторға RSA қол қою нәтижесі. Қол қою нәтижесі өзгеріссіз.

Бұл нені білдіреді?

Біз бірдей мәнді (ойын идентификаторы) аламыз және оған RSA қолтаңба әдісін қолданамыз. Біз әрқашан бірдей нәтиже аламыз. RSA алгоритмі осылай жұмыс істейді. Ойын идентификаторы және RSA қолдану нәтижесі белгісіз болғандықтан, соңғы нөмірді өңдеу мүмкін емес. Санды таңдау да мағынасыз.

8. Блокчейн транзакцияны қабылдайды. Ол шығару функциясын іске қосады (gameId, rsaSign)

9. Шығару функциясының ішінде шығару орын алады GenerateRandInt функциялары (ойын коды, rsaSign). Бұл кездейсоқ сандар генераторы

# @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 - және кездейсоқ сан бар.

Алдымен RSA қолтаңбасының нәтижесі болып табылатын жол алынады ойын идентификаторы жеке кілт (rsaSign). Содан кейін SHA-256 (sha256(rsaSign)).

Біз қолтаңбаның және кейінгі хэшингтің нәтижесін болжай алмаймыз. Сондықтан кездейсоқ санның генерациясына әсер ету мүмкін емес. Белгілі бір ауқымдағы санды алу үшін (мысалы, 1-ден 100-ге дейін) toInt түрлендіру функциясын және % 100 (ұқсас) пайдаланыңыз. Mod).

Мақаланың басында біз функцияны атап өттік rsaVerify(), бұл RSA қолтаңбасының жарамдылығын ашық кілтке қарсы жабық кілтпен тексеруге мүмкіндік береді. Міне, GenerateRandInt(gameId,rsaSign) бөлігі:

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

RSAPUBLIC ашық кілті және rsaSign жолы кіріске жіберіледі. Қолдың жарамдылығы тексеріледі. Тексеру сәтті болған жағдайда нөмір жасалады. Әйтпесе, жүйе қолтаңбаны жарамсыз деп санайды (Жарамсыз RSA қолтаңбасы).

Сервер ойын идентификаторына жеке кілтпен қол қойып, 2880 блок ішінде жарамды Rsa қолтаңбасын жіберуі керек. Параметр смарт келісімшартты қолдану кезінде конфигурацияланады. Егер берілген уақыт ішінде ештеңе болмаса, пайдаланушы жеңеді. Бұл жағдайда сыйлықты өз мекенжайыңызға өзіңіз жіберу керек. Бұл «серверге алдау тиімсіз» болып шықты, өйткені бұл жоғалтуға әкеледі. Төменде мысал келтірілген.

RSA блокчейндегі кездейсоқ

Пайдаланушы ойнап жатыр Роллер дейді. Мен текшенің 2 жағының 6-ін таңдадым, ставка 14 ТОЛҚЫН. Сервер белгіленген уақыт ішінде (2880 блок) смарт келісімшартқа жарамды RSA қолтаңбасын жібермесе, пайдаланушы 34.44 WAVES қабылдайды.

Ойындарда сандарды генерациялау үшін біз oracle қолданамыз - сыртқы, блокчейн емес жүйе. Сервер ойын идентификаторының RSA қолтаңбасын орындайды. Смарт келісім-шарт қолтаңбаның жарамдылығын тексеріп, жеңімпазды анықтайды. Егер сервер ештеңе жібермесе, пайдаланушы автоматты түрде жеңеді.

Бұл адал ұрпақ әдісі, өйткені манипуляция техникалық мүмкін емес. Барлық Tradisys ойындары сипатталған алгоритм негізінде жұмыс істейді. Блокчейн ойындары осылай жұмыс істейді. Барлығы ашық және тексеруге болады. Басқа блокчейндерде мұндай жүйенің аналогтары жоқ. Бұл әділ кездейсоқ.

Ақпарат көзі: www.habr.com

пікір қалдыру