ืืฉ ืืขืื - ืงืฉื ืืืืฆืจ ืืกืคืจ ืืงืจืื ืืจืฉืช ืืืืืจืช. ืืืขื ืื ืืืืืงืฆ'ืืื ืืืจ ื ืชืงืื ืืื. ืืืื, ืืจืฉืชืืช ืฉืืื ืืื ืืืื ืืื ืืฉืชืืฉืื, ืืฆืืจืช ืืกืคืจ ืืงืจืื ืฉืืื ืืืืืืฉื ืคืืชืจืช ืืขืืืช ืจืืืช.
ืืืืืจ ืื ืื ื ืืกืคืจืื ืืื ืืืฆื ืืฆืืื ื ืืคืชืืจ ืืช ืืืขืื ืืืืฆืขืืช ืืฉืืงืื ืืืืืื. ืืจืืฉืื ืฉืืื ืืื
ืืชืืืื, ืชืื ื ื ืืืฆืืจ ืืกืคืจ ืืืืืกืก ืขื ืืืืข ืืืืืืงืฆ'ืืื. ืขื ืืืช, ืื ืืชืืจืจ: ื ืืชื ืืฉื ืืช ืืช ืืืกืคืจ, ืื ืฉืืืืจ ืฉืืคืชืจืื ืืื ื ืืชืืื.
ืืืฆืื ื ืคืชืจืื ืืขืงืืคืช ืืืขืื: ืืฉืชืืฉ ืืกืืืืช commit-expand. ืืฉืจืช ื ืืืฉ ืืกืคืจ ื-1 ืขื 5, ืืืกืืฃ ืื ืืื ืืื ืืืืฉ ืืช ืืชืืฆืื ืืืืฆืขืืช
ืืฉืืงื ืืืฆืข ืืืืืจ, ืืืฉืจืช ืฉืื ืืช ืืืกืคืจ ืืืืื ืื"ืืื" ืืืืื ืืืื. ืืืืืื ืคืฉืืืืช, ืืื ืืฉืฃ ืืช ืืงืืคืื. ืืืืจ ืืื, ืืฉืจืช ืืืง ืืช ืืืกืคืจืื ืืืืืื ืื ืืืฉืชืืฉ ื ืืฆื ืื ืืคืกืื.
ืื ืืฉืจืช ืื ืฉืื ืืกืคืจ ืื "ืืื" ืืืืืืช, ืืืฉืชืืฉ ื ืืฆื. ืืืงืจื ืื, ืขืืืจ ืื ืืฉืืง ืืื ืฆืืจื ืืคืจืืก ืืืื ืืื ืืจืืฉ ืืืืืื ืื ืืืืืช ืคืืื ืฆืืืืืืช. ืืชืืจืจ ืฉืื ืื ื ืื, ืืืงื ืืื ืืืงืจ. ืืืืชื ืชืงืืคื ืื ืืื ืคืชืจืื ืืืื ืืืจ.
ืืืืจืื ื, ืฆืืืช Tradisys ืืฆืืข ืืืืกืืฃ ืคืื ืงืฆืื ืืคืจืืืืงืื Waves rsaVerify(). ืืื ืืืืง ืืช ืชืงืคืืช ืืชืืืช ื-RSA ืืืชืืกืก ืขื ืืืคืชื ืืฆืืืืจื ืืืคืจืื. ืืชืืฆืื ืืื, ืืชืืื ื ื ืืกืคื.
ืคืืชืื ื ืฉืืืฉื ืืฉืืงืื:
ืืืื ื ืกืชืื ืขื ืืฆืืจืช ืืกืคืจ ืืงืจืื ืืืืฆืขืืช Ride on Waves ืืืืืื. ื ืืชื ืืืฆืื ืืช ืืืืื ืืืื
ืขืืืจ ืืืจืืืกืืื ืชืกืจืื ืืืืจ ืคืืจืง ืงืืืคืืืฆืื. ืชืจืื ืืช ืงืื ืืืืื ืืืื (ืืืืื ื ืื ืกืงืจืืคื).
ืงืื ืืืืื ืืืื ืืืื ืงืืืฆื ืฉื ืคืื ืงืฆืืืช. ืืื ืืืกืืื ืื ื-@Callable ื ืืชื ืืืคืขืื ืืืืฆืขืืช ืขืกืงืืืช ืืืื ื. ืื ื ืืขืื ืืื ืื ืืฉืชื ืคืื ืงืฆืืืช: ืืืืจ ะธ ืืกืืช:
- ืืืืืจ func (ืืืืจืช ืฉืืงื)
- func draw(gameId,rsaSign)
1. ืืืฉืชืืฉ ืืืืจ ืืช ืืืจื ืืงืืข ืืืช ืืืื ืืืืืืจ.
2. ืืืงืื ืืืฆืจ ืคืื ืงืฆืืืช ืืืืืจ. ืขืืืจ ืืชืืื ื ืืืขืื ืื ืืืื bet("50").
3. ืืืงืื ืฉืืื ืขืกืงืช Invocation ืืืชืืืช ืืืืื ืืืื (broadcast InvocationTx). ืืขืกืงื ืืืืื ืืช ืคืื ืงืฆืืืช ืืืืืืจ ืืคืจืืืจ ืฉืืื. ืืืฉืืขืืช ืืื ืฉืขืกืงืช ื-Invocation ืืคืขืืื ืืช ืืืฆืืข ืคืื ืงืฆืืืช ืืืืืืจ (ืืืืจื: String) ืืืืื ืืืื.
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)
- ืืคืชื ืฆืืืืจื
- ืืืืืช ืคืืื ืฆืืืืืืช (ืชืืื ืืืืืืจ ืฉื ืืฉืืงื)
ืื ื ืจืืืช ืจืฉืืืช ื ืชืื ืื ืืืืืงืฆ'ืืื (ืขืจื-ืืคืชื):
{
"type": "string",
"value": "03WON_0283_448t8Jn9P3717UnXFEVD5VWjfeGE5gBNeWg58H2aJeQEgJ_06574069_09116020000_0229",
"key": "2GKTX6NLTgUrE4iy9HtpSSHpZ3G8W4cMfdjyvvnc21dx"
}
"ืืคืชื" (ืืคืชื) - ืืืื ืืฉืืง ืืฉืืง ืืืฉ. ืฉืืจ ืื ืชืื ืื ืืืืืื ืืฉืืจืช ืืฉืื "ืขืจื". ืขืจืืื ืืื ืืืืืกื ืื ืืืจืืืกืืื ื ืชืื ืื ืืืื ืืื:
5. ืืฉืจืช "ืืกืชืื" ืขื ืืืืื ืืืื ืืืืฆื ืืช ืืขืกืงื ืฉื ืฉืืื (ืืฉืืง ืืืฉ) ืืืืฆืขืืช ืืืืืงืฆ'ืืื Api. ืืืื ืืืฉืืง ืฉื ืืืฉืืง ืืืืฉ ืืืจ ืืชืืขื ืืืืืงืฆ'ืืื, ืื ืฉืืืืจ ืฉืืืจ ืื ื ืืชื ืืฉื ืืช ืืืชื ืื ืืืฉืคืืข ืขืืื
6. ืืฉืจืช ืืืฆืจ ืคืื ืงืฆืืืช ืืฉืืื (gameId, rsaSign). ืืืืืื, ืื:
withdraw ("FwsuaaShC6DMWdSWQ5osGWtYkVbTEZrsnxqDbVx5oUpq", "base64:Gy69dKdmXUEsAmUrpoWxDLTQOGj5/qO8COA+QjyPVYTAjxXYvEESJbSiCSBRRCOAliqCWwaS161nWqoTL/TltiIvw3nKyd4RJIBNSIgEWGM1tEtNwwnRwSVHs7ToNfZ2Dvk/GgPUqLFDSjnRQpTHdHUPj9mQ8erWw0r6cJXrzfcagKg3yY/0wJ6AyIrflR35mUCK4cO7KumdvC9Mx0hr/ojlHhN732nuG8ps4CUlRw3CkNjNIajBUlyKQwpBKmmiy3yJa/QM5PLxqdppmfFS9y0sxgSlfLOgZ51xRDYuS8NViOA7c1JssH48ZtDbBT5yqzRJXs3RnmZcMDr/q0x6Bg==")
7. ืืฉืจืช ืฉืืื ืขืกืงืช Invocation ืืืืื ืืืื (broadcast InvocationTx). ืืขืกืงื ืืืืื ืงืจืืื ืืคืื ืงืฆืืืช ืืืฉืืื ืฉื ืืฆืจื (gameId, rsaSign):
ืืคืื ืงืฆืื ืืืืื ืืืื ืืฉืืง ืืฉืืง ืืืฉ ืืืชืืฆืื ืฉื ืืชืืืช RSA ืฉื ืืืื ืืืืืื ืขื ืืคืชื ืคืจืื. ืชืืฆืืช ืืืชืืื ืืื ืฉืื ืื.
ืื ืื ืืืืจ?
ืื ืื ื ืืืงืืื ืืช ืืืชื ืขืจื (ืืืื ืืฉืืง) ืืืืืืื ืขืืื ืืช ืฉืืืช ืืืชืืื RSA. ืชืืื ื ืงืื ืืช ืืืชื ืชืืฆืื. ืื ืขืืื ืืืืืจืืชื RSA. ืื ื ืืชื ืืชืืจื ืืช ืืืกืคืจ ืืกืืคื, ืืืืืื ืฉืืืื ืืืฉืืง ืืืชืืฆืื ืฉื ืืืืช RSA ืืื ื ืืืืขืื. ืื ืืืืจืช ืืกืคืจ ืืื ืืกืจืช ืืขื.
8. Blockchain ืืงืื ืืช ืืขืกืงื. ืืื ืืคืขืื ืืช ืคืื ืงืฆืืืช ืื ืกืืื (gameId, rsaSign)
9. ืืชืื ืคืื ืงืฆืืืช ืื ืกืืื ืืชืจืืฉืช ื ืกืืื ืคืื ืงืฆืืืช 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")
}
ืฉืืจื - ืืืฉ ืืกืคืจ ืืงืจืื.
ืจืืฉืืช, ืืืืจืืืช ื ืืงืืช, ืฉืืื ืชืืฆืื ืฉื ืืชืืืช RSA ืืืื ืืฉืืง ืืคืชื ืคืจืื (rsaSign). ืืืืจ ืืื ืืืืื ืขื SHA-256 (sha256(rsaSign)).
ืืื ื ื ืืืืืื ืืืืืช ืืช ืืชืืฆืื ืฉื ืืืชืืื ืื-hashing ืฉืืืืจ ืืื. ืืื, ืื ืืคืฉืจ ืืืฉืคืืข ืขื ืืฆืืจืช ืืกืคืจ ืืงืจืื. ืืื ืืงืื ืืกืคืจ ืืืืื ืืกืืื (ืืืืืื, ื-1 ืขื 100), ืืฉืชืืฉ ืืคืื ืงืฆืืืช ืืืืจื toInt ืื-%100 (ืืืืื ื
ืืชืืืืช ืืืืืจ ืืืืจื ื ืืช ืืคืื ืงืฆืื rsaVerify(), ืืืืคืฉืจ ืืืืืง ืืช ืชืงืคืืช ืืชืืืช RSA ืืืืฆืขืืช ืืคืชื ืคืจืื ืืื ืืคืชื ืฆืืืืจื. ืื ื ืืืืง GenerateRandInt(gameId,rsaSign):
rsaVerify (SHA256, toBytes(gameId), rsaSign, RSAPUBLIC)
ืืืคืชื ืืฆืืืืจื RSAPUBLIC ืืืืืจืืืช rsaSign ืืืขืืจืื ืืงืื. ืืืชืืื ื ืืืงืช ืืืื ืชืืงืฃ. ืืืกืคืจ ื ืืฆืจ ืื ืืืืืงื ืืฆืืืื. ืืืจืช, ืืืขืจืืช ืืืฉืืื ืฉืืืชืืื ืืื ื ืืืงืืช (ืืชืืืช RSA ืื ืืืงืืช).
ืขื ืืฉืจืช ืืืชืื ืขื ืืืื ืืืฉืืง ืขื ืืคืชื ืคืจืื ืืืฉืืื ืืชืืืช Rsa ืืืงืืช ืืชืื 2880 ืืืืงืื. ืืคืจืืืจ ืืืืืจ ืืขืช ืคืจืืกืช ืืืืื ืืืื. ืื ืฉืื ืืืจ ืื ืงืืจื ืืืื ืืืืงืฆื, ืืืฉืชืืฉ ืื ืฆื. ืืืงืจื ืื, ืืฉ ืืฉืืื ืืช ืืคืจืก ืืืชืืืช ืฉืื ืืขืฆืื. ืืกืชืืจ ืฉ"ืื ืืฉืชืื ืืฉืจืช ืืจืืืช", ืื ืื ืืืืื ืืืคืกื. ืืืื ืืืืื.
ืืืฉืชืืฉ ืืฉืืง
ืืื ืืืฆืืจ ืืกืคืจืื ืืืฉืืงืื, ืื ื ืืฉืชืืฉืื ืืืืจืงื - ืืขืจืืช ืืืฆืื ืืช ืฉืืื ื ืืืืงืฆ'ืืื. ืืฉืจืช ืืืฆืข ืืชืืืช RSA ืฉื ืืืื ืืืฉืืง. ืืืืื ืืืื ืืืืง ืืช ืชืืงืฃ ืืืชืืื ืืงืืืข ืืช ืืืืื. ืื ืืฉืจืช ืื ืฉืืื ืืืื, ืืืฉืชืืฉ ืื ืฆื ืืืืืืืืช.
ืืืื ืฉืืืช ืืืจ ืื ื, ืื ืื ืืคืืืฆืื ืืื ืืืชื ืืคืฉืจืืช ืืืืื ื ืืื ืืช. ืื ืืฉืืงื Tradisys ืขืืืืื ืขื ืืกืืก ืืืืืืจืืชื ืืืชืืืจ. ืื ืคืืขืืื ืืฉืืงื ืืืืงืฆ'ืืื. ืืื ืฉืงืืฃ ืื ืืชื ืืืืืืช. ืืื ืื ืืืืื ืืืขืจืืช ืืื ืืืฃ ืืืืงืฆ'ืืื ืืืจ. ืืื ืืงืจืื ืืืื.
ืืงืืจ: www.habr.com