ΠΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° β ΡΠ»ΠΎΠΆΠ½ΠΎ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ Π² Π΄Π΅ΡΠ΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΡΠ΅ΡΠΈ. Π§ΡΡΡ Π»ΠΈ Π½Π΅ Π²ΡΠ΅ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Ρ ΡΠΆΠ΅ Ρ ΡΡΠΈΠΌ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΠΈΡΡ. ΠΠ΅Π΄Ρ Π² ΡΠ΅ΡΡΡ , Π³Π΄Π΅ Π½Π΅Ρ Π΄ΠΎΠ²Π΅ΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌΠΈ, ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π΅ΠΎΡΠΏΠΎΡΠΈΠΌΠΎΠ³ΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ ΡΠΈΡΠ»Π° ΡΠ΅ΡΠ°Π΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π·Π°Π΄Π°Ρ.
Π ΡΡΠ°ΡΡΠ΅ ΡΠ°ΡΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ, ΠΊΠ°ΠΊ ΡΠ΄Π°Π»ΠΎΡΡ ΡΠ΅ΡΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΈΠ³Ρ. ΠΠ΅ΡΠ²ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ
ΡΡΠ°Π»Π°
ΠΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΠΌΡ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π»ΠΈ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΈΡΠ»ΠΎ Π½Π° ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΈΠ· Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π°. ΠΠ΄Π½Π°ΠΊΠΎ ΠΏΠΎΡΠΎΠΌ ΡΡΠ°Π»ΠΎ ΡΡΠ½ΠΎ: ΡΠΈΡΠ»ΠΎ ΠΌΠΎΠ³ΡΡ ΠΏΠΎΠ΄ΡΠ°ΡΠΎΠ²Π°ΡΡ, Π° Π·Π½Π°ΡΠΈΡ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡ.
ΠΡ ΠΏΡΠΈΠ΄ΡΠΌΠ°Π»ΠΈ ΠΎΠ±Ρ
ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡΡΡ: ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡ
Π΅ΠΌΡ Β«ΠΊΠΎΠΌΠΌΠΈΡ-ΡΠ°ΡΠΊΡΡΡΠΈΠ΅Β». Π‘Π΅ΡΠ²Π΅Ρ Β«Π·Π°Π³Π°Π΄ΡΠ²Π°Π»Β» ΡΠΈΡΠ»ΠΎ ΠΎΡ 1 Π΄ΠΎ 5, Π΄ΠΎΠ±Π°Π²Π»ΡΠ» ΠΊ Π½Π΅ΠΌΡ Β«ΡΠΎΠ»ΡΒ», Π° Π·Π°ΡΠ΅ΠΌ Ρ
ΡΡΠΈΡΠΎΠ²Π°Π» ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ
ΠΠ³ΡΠΎΠΊ Π΄Π΅Π»Π°Π» ΡΡΠ°Π²ΠΊΡ, Π° ΡΠ΅ΡΠ²Π΅Ρ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ» Π·Π°Π³Π°Π΄Π°Π½Π½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ ΠΈ Β«ΡΠΎΠ»ΡΒ» Π½Π° ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ. ΠΡΠΎΡΡΡΠΌ ΡΠ·ΡΠΊΠΎΠΌ, ΡΠ°ΡΠΊΡΡΠ²Π°Π» ΠΊΠ°ΡΡΡ. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΡΠ΅ΡΠ²Π΅Ρ ΡΠ²Π΅ΡΡΠ» ΡΠΈΡΡΡ ΠΈ ΡΠ΅ΡΠ°Π», ΠΏΠΎΠ±Π΅Π΄ΠΈΠ» ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈΠ»ΠΈ ΠΏΡΠΎΠΈΠ³ΡΠ°Π».
ΠΡΠ»ΠΈ ΡΠ΅ΡΠ²Π΅Ρ Π½Π΅ ΠΏΡΠΈΡΡΠ»Π°Π» ΡΠΈΡΠ»ΠΎ ΠΈΠ»ΠΈ Β«ΡΠΎΠ»ΡΒ» Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠΎΠ±Π΅ΠΆΠ΄Π°Π». Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ³ΡΡ Π±ΡΠ»ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΡΠ°Π½Π΅Π΅ Π΄Π΅ΠΏΠ»ΠΎΠΈΡΡ ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ ΠΈ Π·Π°ΠΊΠ»Π°Π΄ΡΠ²Π°ΡΡ Π² Π½Π΅Π³ΠΎ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΡΠΉ Π²ΡΠΈΠ³ΡΡΡ. ΠΠΊΠ°Π·Π°Π»ΠΎΡΡ, ΡΡΠΎ Π½Π΅ΡΠ΄ΠΎΠ±Π½ΠΎ, Π΄ΠΎΠ»Π³ΠΎ ΠΈ Π΄ΠΎΡΠΎΠ³ΠΎ. ΠΠ° ΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ Π΄ΡΡΠ³ΠΎΠ³ΠΎ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π½Π΅ Π±ΡΠ»ΠΎ.
ΠΠ΅Π΄Π°Π²Π½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° Tradisys ΠΏΡΠ΅Π΄ΠΎΠΆΠΈΠ»Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² ΠΏΡΠΎΡΠΎΠΊΠΎΠ» Waves ΡΡΠ½ΠΊΡΠΈΡ rsaVerify(). ΠΠ½Π° ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ Π²Π°Π»ΠΈΠ΄Π½ΠΎΡΡΡ RSA-ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ Π½Π° ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΡΠ±Π»ΠΈΡΠ½ΠΎΠ³ΠΎ ΠΈ ΠΏΡΠΈΠ²Π°ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ°. Π ΠΈΡΠΎΠ³Π΅ ΡΡΠ½ΠΊΡΠΈΡ Π±ΡΠ»Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π°.
ΠΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ ΡΡΠΈ ΠΈΠ³ΡΡ:
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ ΡΠΈΡΠ»Π° Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Ride on Waves. Π‘ΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ
ΠΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π²ΠΎ Π²ΠΊΠ»Π°Π΄ΠΊΡ Script ΠΈ Π²ΡΠ±Π΅ΡΠΈΡΠ΅ Decompiled. Π£Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΊΠΎΠ΄ ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ° (ΠΎΠ½ ΠΆΠ΅ ΡΠΊΡΠΈΠΏΡ).
ΠΠΎΠ΄ ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ° ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π½Π°Π±ΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΉ. Π’Π΅, ΡΡΠΎ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Ρ ΠΊΠ°ΠΊ @Callable, ΠΌΠΎΠ³ΡΡ Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Invocation-ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ. ΠΠ°Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΡΡ Π΄Π²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ: bet ΠΈ withdraw:
- func bet (playerChoice)
- func withdraw (gameId,rsaSign)
1. ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π²ΡΠ±ΠΈΡΠ°Π΅Ρ Π΄Π»ΠΈΠ½Ρ ΠΎΡΡΠ΅Π·ΠΊΠ° ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ ΡΡΠ°Π²ΠΊΠΈ.
2. ΠΠ»ΠΈΠ΅Π½Ρ ΡΠΎΡΠΌΠΈΡΡΠ΅Ρ bet-ΡΡΠ½ΠΊΡΠΈΡ. ΠΠ»Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π²ΡΡΠ΅ ΡΡΠΎ Π±ΡΠ΄Π΅Ρ bet (Β«50Β»).
3. ΠΠ»ΠΈΠ΅Π½Ρ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Invocation-ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π½Π° Π°Π΄ΡΠ΅Ρ ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ° (broadcast InvocationTx). Π’ΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π‘all-ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΡΠ½ΠΊΡΠΈΡ bet. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Invocation-ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ bet-ΡΡΠ½ΠΊΡΠΈΠΈ (choice: String) Π½Π° ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ΅.
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)
- ΠΡΠ±Π»ΠΈΡΠ½ΡΠΉ ΠΊΠ»ΡΡ
- ΠΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΡΠΉ Π²ΡΠΈΠ³ΡΡΡ (Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΡΠ°Π²ΠΊΠΈ ΠΈΠ³ΡΠΎΠΊΠ°)
Π’Π°ΠΊ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π·Π°ΠΏΠΈΡΡ Π΄Π°Π½Π½ΡΡ
Π² Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π΅ (ΠΊΠ»ΡΡ-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅):
{
"type": "string",
"value": "03WON_0283_448t8Jn9P3717UnXFEVD5VWjfeGE5gBNeWg58H2aJeQEgJ_06574069_09116020000_0229",
"key": "2GKTX6NLTgUrE4iy9HtpSSHpZ3G8W4cMfdjyvvnc21dx"
}
Β«ΠΠ»ΡΡΒ» (key) β game id Π½ΠΎΠ²ΠΎΠΉ ΠΈΠ³ΡΡ. ΠΡΡΠ°Π»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡΡ Π² ΡΡΡΠΎΠΊΠ΅ ΠΏΠΎΠ»Ρ Β«Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅Β» (value). ΠΡΠΈ Π·Π°ΠΏΠΈΡΠΈ Ρ ΡΠ°Π½ΡΡΡΡ Π²ΠΎ Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Data ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ°:
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):
Π€ΡΠ½ΠΊΡΠΈΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ 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 (Π°Π½Π°Π»ΠΎΠ³
Π Π½Π°ΡΠ°Π»Π΅ ΡΡΠ°ΡΡΠΈ ΠΌΡ ΡΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ rsaVerify(), ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π²Π°Π»ΠΈΠ΄Π½ΠΎΡΡΡ RSA-ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ ΠΏΡΠΈΠ²Π°ΡΠ½ΡΠΌ ΠΊΠ»ΡΡΠΎΠΌ ΠΏΠΎ ΠΏΡΠ±Π»ΠΈΡΠ½ΠΎΠΌΡ. ΠΠΎΡ ΡΠ°ΡΡΡ GenerateRandInt (gameId,rsaSign):
rsaVerify (SHA256, toBytes(gameId), rsaSign, RSAPUBLIC)
ΠΠ° Π²Ρ ΠΎΠ΄ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΠΏΡΠ±Π»ΠΈΡΠ½ΡΠΉ ΠΊΠ»ΡΡ RSAPUBLIC ΠΈ ΡΡΡΠΎΠΊΠ° rsaSign. ΠΠΎΠ΄ΠΏΠΈΡΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ Π½Π° Π²Π°Π»ΠΈΠ΄Π½ΠΎΡΡΡ. Π§ΠΈΡΠ»ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ Π² ΡΠ»ΡΡΠ°Π΅ ΡΡΠΏΠ΅ΡΠ½ΠΎΠΉ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ. Π ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠΈΡΡΠ΅ΠΌΠ° ΡΡΠΈΡΠ°Π΅Ρ, ΡΡΠΎ ΠΏΠΎΠ΄ΠΏΠΈΡΡ Π½Π΅ Π²Π°Π»ΠΈΠ΄Π½Π° (Invalid RSA signature).
Π‘Π΅ΡΠ²Π΅Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°ΡΡ game id ΠΈΠ³ΡΡ ΠΏΡΠΈΠ²Π°ΡΠ½ΡΠΌ ΠΊΠ»ΡΡΠΎΠΌ ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ Π²Π°Π»ΠΈΠ΄Π½ΡΡ Rsa-ΠΏΠΎΠ΄ΠΏΠΈΡΡ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ 2880 Π±Π»ΠΎΠΊΠΎΠ². ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ Π΄Π΅ΠΏΠ»ΠΎΠ΅ ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ°. ΠΡΠ»ΠΈ Π·Π° ΠΎΡΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π²ΡΠΈΠ³ΡΡΠ²Π°Π΅Ρ. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠΈΠ· Π½ΡΠΆΠ½ΠΎ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ Π½Π° ΡΠ²ΠΎΠΉ Π°Π΄ΡΠ΅Ρ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ. ΠΠΎΠ»ΡΡΠ°Π΅ΡΡΡ, ΡΠ΅ΡΠ²Π΅ΡΡ Β«Π½Π΅ Π²ΡΠ³ΠΎΠ΄Π½ΠΎ ΠΎΠ±ΠΌΠ°Π½ΡΠ²Π°ΡΡΒ», Π²Π΅Π΄Ρ ΡΡΠΎ Π²Π΅Π΄Π΅Ρ ΠΊ ΠΏΡΠΎΠΈΠ³ΡΡΡΡ. ΠΠΈΠΆΠ΅ β ΠΏΡΠΈΠΌΠ΅Ρ.
ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈΠ³ΡΠ°Π΅Ρ Π²
ΠΠ»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΡΠΈΡΠ΅Π» Π² ΠΈΠ³ΡΠ°Ρ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΎΡΠ°ΠΊΡΠ» β Π²Π½Π΅ΡΠ½ΡΡ, Π½Π΅ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½ΠΎΠ²ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ. Π‘Π΅ΡΠ²Π΅Ρ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅Ρ RSA-ΠΏΠΎΠ΄ΠΏΠΈΡΡ game id. Π‘ΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ Π²Π°Π»ΠΈΠ΄Π½ΠΎΡΡΡ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΏΠΎΠ±Π΅Π΄ΠΈΡΠ΅Π»Ρ. ΠΡΠ»ΠΈ ΡΠ΅ΡΠ²Π΅Ρ Π½Π΅ ΠΏΡΠΈΡΠ»Π°Π» Π½ΠΈΡΠ΅Π³ΠΎ, ΡΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠ±Π΅ΠΆΠ΄Π°Π΅Ρ.
ΠΡΠΎ ΡΠ΅ΡΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ, Π²Π΅Π΄Ρ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΡΡΠΈΡ ΡΠ΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π°. ΠΡΠ΅ ΠΈΠ³ΡΡ Tradisys ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°. Π’Π°ΠΊ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΈΠ³ΡΡ Π½Π° Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π΅. ΠΡΠ΅ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎ ΠΈ ΠΏΠΎΠ΄Π΄Π°Π΅ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ΅. ΠΠ½Π°Π»ΠΎΠ³ΠΎΠ² ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ Π½Π΅Ρ Π½ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ Π΄ΡΡΠ³ΠΎΠΌ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π΅. ΠΡΠΎ ΡΠ΅ΡΡΠ½ΡΠΉ ΡΠ°Π½Π΄ΠΎΠΌ.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com