RSA-Ρ€Π°Π½Π΄ΠΎΠΌ Π½Π° Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅

Π•ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° – слоТно ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ случайноС число Π² Π΄Π΅Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΉ сСти. Π§ΡƒΡ‚ΡŒ Π»ΠΈ Π½Π΅ всС Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Ρ‹ ΡƒΠΆΠ΅ с этим ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ. Π’Π΅Π΄ΡŒ Π² сСтях, Π³Π΄Π΅ Π½Π΅Ρ‚ довСрия ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ, созданиС нСоспоримого случайного числа Ρ€Π΅ΡˆΠ°Π΅Ρ‚ мноТСство Π·Π°Π΄Π°Ρ‡.

Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ рассказываСм, ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΠ³Ρ€. ΠŸΠ΅Ρ€Π²ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ… стала Waves Xmas Tree. Для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π°ΠΌ понадобился Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ случайных чисСл.

RSA-Ρ€Π°Π½Π΄ΠΎΠΌ Π½Π° Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅

Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΌΡ‹ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ число Π½Π° основании ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈΠ· Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π°. Однако ΠΏΠΎΡ‚ΠΎΠΌ стало ясно: число ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ΄Ρ‚Π°ΡΠΎΠ²Π°Ρ‚ΡŒ, Π° Π·Π½Π°Ρ‡ΠΈΡ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚.

ΠœΡ‹ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π»ΠΈ ΠΎΠ±Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡƒΡ‚ΡŒ: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ схСму Β«ΠΊΠΎΠΌΠΌΠΈΡ‚-раскрытиС». Π‘Π΅Ρ€Π²Π΅Ρ€ Β«Π·Π°Π³Π°Π΄Ρ‹Π²Π°Π»Β» число ΠΎΡ‚ 1 Π΄ΠΎ 5, добавлял ΠΊ Π½Π΅ΠΌΡƒ «соль», Π° Π·Π°Ρ‚Π΅ΠΌ Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π» Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Keccak. CΠ΅Ρ€Π²Π΅Ρ€ Π·Π°Ρ€Π°Π½Π΅Π΅ Π΄Π΅ΠΏΠ»ΠΎΠΈΠ» смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ с ΡƒΠΆΠ΅ сохранСнным числом. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ, ΠΈΠ³Ρ€Π° сводидась ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΡƒΠ³Π°Π΄Ρ‹Π²Π°Π» число, скрытоС Ρ…ΡΡˆΠ΅ΠΌ.

Π˜Π³Ρ€ΠΎΠΊ Π΄Π΅Π»Π°Π» ставку, Π° сСрвСр отправлял Π·Π°Π³Π°Π΄Π°Π½Π½ΠΎΠ΅ число ΠΈ «соль» Π½Π° смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚. ΠŸΡ€ΠΎΡΡ‚Ρ‹ΠΌ языком, раскрывал ΠΊΠ°Ρ€Ρ‚Ρ‹. ПослС этого сСрвСр свСрял Ρ†ΠΈΡ„Ρ€Ρ‹ ΠΈ Ρ€Π΅ΡˆΠ°Π», ΠΏΠΎΠ±Π΅Π΄ΠΈΠ» ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π».

Если сСрвСр Π½Π΅ присылал число ΠΈΠ»ΠΈ «соль» для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΠΎΠ±Π΅ΠΆΠ΄Π°Π». Π’ этом случаС для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹ Π±Ρ‹Π»ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Ρ€Π°Π½Π΅Π΅ Π΄Π΅ΠΏΠ»ΠΎΠΈΡ‚ΡŒ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ΠΈ Π·Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ Π² Π½Π΅Π³ΠΎ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ. Оказалось, это Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Π΄ΠΎΠ»Π³ΠΎ ΠΈ Π΄ΠΎΡ€ΠΎΠ³ΠΎ. На Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ бСзопасного Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π΅ Π±Ρ‹Π»ΠΎ.

НСдавно ΠΊΠΎΠΌΠ°Π½Π΄Π° Tradisys ΠΏΡ€Π΅Π΄ΠΎΠΆΠΈΠ»Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Waves Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ rsaVerify(). Она провСряСт Π²Π°Π»ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒ RSA-подписи Π½Π° основании ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΈ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°. Π’ ΠΈΡ‚ΠΎΠ³Π΅ функция Π±Ρ‹Π»Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π°.

ΠœΡ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ Ρ‚Ρ€ΠΈ ΠΈΠ³Ρ€Ρ‹: Dice Roller, Coin Flip ΠΈ Ride On Waves. Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° тСхнология случайного числа. РазбСрСмся, ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

RSA-Ρ€Π°Π½Π΄ΠΎΠΌ Π½Π° Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅

Рассмотрим Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ случайного числа Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ride on Waves. Π‘ΠΌΠ°Ρ€Ρ‚-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ здСсь.

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π²ΠΎ Π²ΠΊΠ»Π°Π΄ΠΊΡƒ Script ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Decompiled. Π£Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΊΠΎΠ΄ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° (ΠΎΠ½ ΠΆΠ΅ скрипт).

RSA-Ρ€Π°Π½Π΄ΠΎΠΌ Π½Π° Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅

Код смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° содСрТит Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π’Π΅, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ ΠΊΠ°ΠΊ @Callable, ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Invocation-Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ. Нас ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‚ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: bet ΠΈ withdraw:

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

1. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ Π΄Π»ΠΈΠ½Ρƒ ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ° ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ ставки.

RSA-Ρ€Π°Π½Π΄ΠΎΠΌ Π½Π° Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅

2. ΠšΠ»ΠΈΠ΅Π½Ρ‚ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ bet-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Для изобраТСния Π²Ρ‹ΡˆΠ΅ это Π±ΡƒΠ΄Π΅Ρ‚ bet (Β«50Β»).

3. ΠšΠ»ΠΈΠ΅Π½Ρ‚ отправляСт Invocation-Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ Π½Π° адрСс смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° (broadcast InvocationTx). Вранзакция Π² качСствС Π‘all-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° содСрТит Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ bet. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Invocation-транзакция запускаСт Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ bet-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (choice: String) Π½Π° смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π΅.

RSA-Ρ€Π°Π½Π΄ΠΎΠΌ Π½Π° Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅

4. Рассмотрим bet-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:

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

Ѐункция записываСт Π² стСйт смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° Π½ΠΎΠ²ΡƒΡŽ ΠΈΠ³Ρ€Ρƒ. А ΠΈΠΌΠ΅Π½Π½ΠΎ:

  • Π£Π½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½ΠΎΠ²ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹ (game id)
  • Game state = SUBMITTED
  • Π’Ρ‹Π±ΠΎΡ€ ΠΈΠ³Ρ€ΠΎΠΊΠ° (Π΄Π»ΠΈΠ½Π° ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ° 50)
  • ΠŸΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡
  • ΠŸΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ (зависит ΠΎΡ‚ ставки ΠΈΠ³Ρ€ΠΎΠΊΠ°)

RSA-Ρ€Π°Π½Π΄ΠΎΠΌ Π½Π° Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅

Π’Π°ΠΊ выглядит запись Π΄Π°Π½Π½Ρ‹Ρ… Π² Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅ (ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅):

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

Β«ΠšΠ»ΡŽΡ‡Β» (key) – game id Π½ΠΎΠ²ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹. ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ содСрТатся Π² строкС поля Β«Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Β» (value). Π­Ρ‚ΠΈ записи хранятся Π²ΠΎ Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Data смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°:

RSA-Ρ€Π°Π½Π΄ΠΎΠΌ Π½Π° Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅

RSA-Ρ€Π°Π½Π΄ΠΎΠΌ Π½Π° Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅

5. Π‘Π΅Ρ€Π²Π΅Ρ€ «смотрит» Π½Π° смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ΠΈ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ (Π½ΠΎΠ²ΡƒΡŽ ΠΈΠ³Ρ€Ρƒ) с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Api Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π°. Game id Π½ΠΎΠ²ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹ ΡƒΠΆΠ΅ записан Π² Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅, Π° Π·Π½Π°Ρ‡ΠΈΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° Π½Π΅Π΅ ΡƒΠΆΠ΅ нСльзя

6. Π‘Π΅Ρ€Π²Π΅Ρ€ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ withdraw-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ (gameId, rsaSign). НапримСр, Ρ‚Π°ΠΊΡƒΡŽ:

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

7. Π‘Π΅Ρ€Π²Π΅Ρ€ отправляСт Invocation-Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ Π½Π° смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ (broadcast InvocationTx). Вранзакция содСрТит Π²Ρ‹Π·ΠΎΠ² сформированной withdraw-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (gameId, rsaSign):

RSA-Ρ€Π°Π½Π΄ΠΎΠΌ Π½Π° Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅

Ѐункция содСрТит game id Π½ΠΎΠ²ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹ ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ RSA-подписи ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ подписи Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π΅Π½.

Π§Ρ‚ΠΎ это Π·Π½Π°Ρ‡ΠΈΡ‚?

Π‘Π΅Ρ€Π΅ΠΌ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (game id) ΠΈ примСняСм ΠΊ Π½Π΅ΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄ RSA-подписи. Π‘ΡƒΠ΄Π΅ΠΌ всСгда ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Π’Π°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ RSA-Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ. НСльзя ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ числом, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ game id ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ примСнСния RSA Π½Π΅ извСстСн. ΠŸΠΎΠ΄Π±ΠΈΡ€Π°Ρ‚ΡŒ число Ρ‚Π°ΠΊΠΆΠ΅ бСссмыслСнно.

8. Π‘Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ. Она запускаСт withdraw-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ (gameId, rsaSign)

9. Π’Π½ΡƒΡ‚Ρ€ΠΈ withdraw-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ происходит Π²Ρ‹Π²ΠΎΠ· GenerateRandInt-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (gameId, 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-подписи game id ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ (rsaSign). Π—Π°Ρ‚Π΅ΠΌ Ρ…ΡΡˆΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ SHA-256 (sha256(rsaSign)).

ΠœΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅Π΄ΡΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ подписи ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ случайного числа. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ число Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΡ‚ 1 Π΄ΠΎ 100), примСняСтся функция прСобразования toInt ΠΈ %100 (Π°Π½Π°Π»ΠΎΠ³ mod).

Π’ Π½Π°Ρ‡Π°Π»Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΌΡ‹ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ rsaVerify(), которая позволяСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π²Π°Π»ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒ RSA-подписи ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ ΠΏΠΎ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠΌΡƒ. Π’ΠΎΡ‚ Ρ‡Π°ΡΡ‚ΡŒ GenerateRandInt (gameId,rsaSign):

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

На Π²Ρ…ΠΎΠ΄ пСрСдаСтся ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ RSAPUBLIC ΠΈ строка rsaSign. Подпись провСряСтся Π½Π° Π²Π°Π»ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒ. Число гСнСрируСтся Π² случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ. Π’ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ случаС систСма считаСт, Ρ‡Ρ‚ΠΎ подпись Π½Π΅ Π²Π°Π»ΠΈΠ΄Π½Π° (Invalid RSA signature).

Π‘Π΅Ρ€Π²Π΅Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒ game id ΠΈΠ³Ρ€Ρ‹ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π²Π°Π»ΠΈΠ΄Π½ΡƒΡŽ Rsa-подпись Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ 2880 Π±Π»ΠΎΠΊΠΎΠ². ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ настраиваСтся ΠΏΡ€ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠ΅ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°. Если Π·Π° ΠΎΡ‚Π²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ врСмя Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ происходит, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Π²Π°Π΅Ρ‚. Π’ этом случаС ΠΏΡ€ΠΈΠ· Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π½Π° свой адрСс ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ, сСрвСру Β«Π½Π΅ Π²Ρ‹Π³ΠΎΠ΄Π½ΠΎ ΠΎΠ±ΠΌΠ°Π½Ρ‹Π²Π°Ρ‚ΡŒΒ», вСдь это Π²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹ΡˆΡƒ. НиТС – ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

RSA-Ρ€Π°Π½Π΄ΠΎΠΌ Π½Π° Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΈΠ³Ρ€Π°Π΅Ρ‚ Π² Dice Roller. Π’Ρ‹Π±Ρ€Π°Π» 2 ΠΈΠ· 6 Π³Ρ€Π°Π½Π΅ΠΉ ΠΊΡƒΠ±ΠΈΠΊΠ°, ставка – 14 WAVES. Если сСрвСр Π½Π΅ ΠΏΡ€ΠΈΡˆΠ»Π΅Ρ‚ Π²Π°Π»ΠΈΠ΄Π½ΡƒΡŽ RSA-подпись Π½Π° смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ установлСнного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (2880 Π±Π»ΠΎΠΊΠΎΠ²), ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π·Π°Π±Π΅Ρ€Π΅Ρ‚ 34.44 WAVES.

Для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ чисСл Π² ΠΈΠ³Ρ€Π°Ρ… ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΡ€Π°ΠΊΡƒΠ» – внСшнюю, Π½Π΅ Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½ΠΎΠ²ΡƒΡŽ систСму. Π‘Π΅Ρ€Π²Π΅Ρ€ осущСствляСт RSA-подпись game id. Π‘ΠΌΠ°Ρ€Ρ‚-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ провСряСт Π²Π°Π»ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒ подписи ΠΈ опрСдСляСт побСдитСля. Если сСрвСр Π½Π΅ прислал Π½ΠΈΡ‡Π΅Π³ΠΎ, Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ автоматичСски ΠΏΠΎΠ±Π΅ΠΆΠ΄Π°Π΅Ρ‚.

Π­Ρ‚ΠΎ чСстный ΠΌΠ΅Ρ‚ΠΎΠ΄ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ, вСдь манипуляция тСхничСски Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π°. ВсС ΠΈΠ³Ρ€Ρ‹ Tradisys Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π° основании описанного Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°. Π’Π°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΈΠ³Ρ€Ρ‹ Π½Π° Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅. ВсС ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎ ΠΈ поддаСтся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅. Аналогов ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ систСмы Π½Π΅Ρ‚ Π½ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠΌ Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅. Π­Ρ‚ΠΎ чСстный Ρ€Π°Π½Π΄ΠΎΠΌ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com