åé¡ããããŸããåæ£åãããã¯ãŒã¯ã§ã¯ä¹±æ°ãçæããã®ãå°é£ã§ãã ã»ãŒãã¹ãŠã®ãããã¯ãã§ãŒã³ããã§ã«ãã®åé¡ã«ééããŠããŸãã å®éããŠãŒã¶ãŒéã«ä¿¡é Œé¢ä¿ããªããããã¯ãŒã¯ã§ã¯ãåŠå®ã§ããªãä¹±æ°ãäœæããããšã§å€ãã®åé¡ã解決ãããŸãã
ãã®èšäºã§ã¯ãã²ãŒã ãäŸãšããŠãã©ã®ããã«åé¡ã解決ã§ãããã説æããŸãã ãã®ãã¡ã®æåã®ãã®ã¯ã
åœåãç§ãã¡ã¯ãããã¯ãã§ãŒã³ããã®æ
å ±ã«åºã¥ããŠçªå·ãçæããããšãèšç»ããŠããŸããã ããããæ°å€ã¯æäœã§ããå¯èœæ§ãããããã®ãœãªã¥ãŒã·ã§ã³ã¯é©åã§ã¯ãªãããšãæããã«ãªããŸããã
ç§ãã¡ã¯ãcommit-expand ã¹ããŒã ã䜿çšãããšããåé¿çãèãåºããŸããã ãµãŒããŒã¯ 1 ãã 5 ãŸã§ã®æ°å€ãæšæž¬ããããã«ãœã«ããè¿œå ãããã®çµæã次ã䜿çšããŠããã·ã¥ããŸãã
ãã¬ãŒã€ãŒãè³ãããããšããµãŒããŒã¯é ãããæ°åãšããœã«ãããã¹ããŒã ã³ã³ãã©ã¯ãã«éä¿¡ããŸãã ç°¡åã«èšãã°ã圌ã¯ã«ãŒããå ¬éããŸããã ãã®åŸããµãŒããŒã¯æ°åã確èªãããŠãŒã¶ãŒãåã£ããè² ãããã決å®ããŸãã
ãµãŒããŒãæ€èšŒã®ããã«æ°åãŸãã¯ããœã«ãããéä¿¡ããªãã£ãå ŽåããŠãŒã¶ãŒãåã¡ãŸãã ãã®å Žåãã²ãŒã ããšã«äºåã«ã¹ããŒã ã³ã³ãã©ã¯ããå±éãããã®äžã«æœåšçãªè³éãå«ããå¿ èŠããããŸããã ããã¯äžäŸ¿ã§ãæéãšè²»çšããããããšãå€æããŸããã åœæãä»ã«å®å šãªè§£æ±ºçã¯ãããŸããã§ããã
æè¿ãTradisys ããŒã 㯠Waves ãããã³ã«ã«æ©èœãè¿œå ããããšãææ¡ããŸããã rsaVerify()ã å ¬éããŒãšç§å¯ããŒã«åºã¥ã㊠RSA 眲åã®æå¹æ§ããã§ãã¯ããŸãã ãã®çµæãæ©èœãè¿œå ãããŸããã
ç§ãã¡ã¯ XNUMX ã€ã®ã²ãŒã ãéçºããŸããã
Ride on Waves ãäŸãšããŠä¹±æ°ã®çæãèŠãŠã¿ãŸãããã ã¹ããŒãã³ã³ãã©ã¯ããèŠã€ãã
ã¿ãã«ç§»å ã¹ã¯ãªãã éžæããŸã éã³ã³ãã€ã«æžã¿ã ã¹ããŒã ã³ã³ãã©ã¯ã ã³ãŒã (å¥åã¹ã¯ãªãã) ã衚瀺ãããŸãã
ã¹ããŒã ã³ã³ãã©ã¯ã ã³ãŒãã«ã¯äžé£ã®é¢æ°ãå«ãŸããŠããŸãã @Callable ãšããŠããŒã¯ããããã®ã¯ã次ã䜿çšããŠèµ·åã§ããŸãã åŒã³åºããã©ã³ã¶ã¯ã·ã§ã³ã ç§ãã¡ã¯ XNUMX ã€ã®é¢æ°ã«èå³ããããŸã: è³ãã О æ€éãã:
- ãã¡ã³ã¯ããã (ãã¬ã€ã€ãŒéžæ)
- funcdraw(gameId,rsaSign)
1. ãŠãŒã¶ãŒã¯ã»ã°ã¡ã³ãã®é·ããšè³ãéã®ãµã€ãºãéžæããŸãã
2. ã¯ã©ã€ã¢ã³ãã¯ãããé¢æ°ãäœæããŸãã äžã®ç»åã®å Žåã¯æ¬¡ã®ããã«ãªããŸã ããã("50").
3. ã¯ã©ã€ã¢ã³ãã¯ãã¹ããŒã ã³ã³ãã©ã¯ã ã¢ãã¬ã¹ (ãããŒããã£ã¹ã InvocationTx) ã«åŒã³åºããã©ã³ã¶ã¯ã·ã§ã³ãéä¿¡ããŸãã ãã©ã³ã¶ã¯ã·ã§ã³ã«ã¯ã³ãŒã«ãã©ã¡ãŒã¿ãšããŠãããé¢æ°ãå«ãŸããŠããŸãã ããã¯ãåŒã³åºããã©ã³ã¶ã¯ã·ã§ã³ãã¹ããŒã ã³ã³ãã©ã¯ãäžã®ãããé¢æ° (éžæè¢: æåå) ã®å®è¡ãããªã¬ãŒããããšãæå³ããŸãã
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)))
}
}
ãã®é¢æ°ã¯ãã¹ããŒã ã³ã³ãã©ã¯ãã®ç¶æ ã«æ°ããã²ãŒã ãæžã蟌ã¿ãŸãã ã€ãŸã:
- æ°ããã²ãŒã ã®äžæã®èå¥å (ã²ãŒã ID)
- ã²ãŒã ã®ç¶æ = éä¿¡æžã¿
- ãã¬ã€ã€ãŒã®éžæ (ã»ã°ã¡ã³ãé· 50)
- å ¬ééµ
- æœåšçãªè³é (ãã¬ã€ã€ãŒã®è³ãã«å¿ããŠ)
ãããã¯ãã§ãŒã³å
ã®ããŒã¿ ã¬ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸã (ããŒãšå€)ã
{
"type": "string",
"value": "03WON_0283_448t8Jn9P3717UnXFEVD5VWjfeGE5gBNeWg58H2aJeQEgJ_06574069_09116020000_0229",
"key": "2GKTX6NLTgUrE4iy9HtpSSHpZ3G8W4cMfdjyvvnc21dx"
}
ãéµãïŒããŒïŒ â ã²ãŒã ID æ°ããã²ãŒã ã æ®ãã®ããŒã¿ã¯ãå€ããã£ãŒã«ãã®è¡ã«å«ãŸããŸãã ãããã®ãšã³ããªã¯ã¿ãã«ä¿åãããŸã äžã€ ã¹ããŒãã³ã³ãã©ã¯ã:
5. ãµãŒããŒã¯ã¹ããŒã ã³ã³ãã©ã¯ããã調ã¹ãããããã¯ãã§ãŒã³ API ã䜿çšããŠéä¿¡ããããã©ã³ã¶ã¯ã·ã§ã³ (æ°ããã²ãŒã ) ãèŠã€ããŸãã æ°ããã²ãŒã ã®ã²ãŒã ID ã¯ãã§ã«ãããã¯ãã§ãŒã³ã«èšé²ãããŠãããããå€æŽããã圱é¿ãäžãããããããšã¯ã§ããŸãã
6. ãµãŒããŒã¯åŒãåºãé¢æ° (gameIdãrsaSign) ãçæããŸãã ããšãã°ã次ã®ããã«ãªããŸãã
withdraw ("FwsuaaShC6DMWdSWQ5osGWtYkVbTEZrsnxqDbVx5oUpq", "base64:Gy69dKdmXUEsAmUrpoWxDLTQOGj5/qO8COA+QjyPVYTAjxXYvEESJbSiCSBRRCOAliqCWwaS161nWqoTL/TltiIvw3nKyd4RJIBNSIgEWGM1tEtNwwnRwSVHs7ToNfZ2Dvk/GgPUqLFDSjnRQpTHdHUPj9mQ8erWw0r6cJXrzfcagKg3yY/0wJ6AyIrflR35mUCK4cO7KumdvC9Mx0hr/ojlHhN732nuG8ps4CUlRw3CkNjNIajBUlyKQwpBKmmiy3yJa/QM5PLxqdppmfFS9y0sxgSlfLOgZ51xRDYuS8NViOA7c1JssH48ZtDbBT5yqzRJXs3RnmZcMDr/q0x6Bg==")
7. ãµãŒããŒã¯ãåŒã³åºããã©ã³ã¶ã¯ã·ã§ã³ãã¹ããŒã ã³ã³ãã©ã¯ãã«éä¿¡ããŸã (ãããŒããã£ã¹ã InvocationTx)ã ãã©ã³ã¶ã¯ã·ã§ã³ã«ã¯ã圢æãããdrawalé¢æ°(gameIdãrsaSign)ãžã®åŒã³åºããå«ãŸããŠããŸãã
é¢æ°ã«ã¯ä»¥äžãå«ãŸããŸã ã²ãŒã ID æ°ããã²ãŒã ãšãç§å¯ããŒã䜿çšããäžæã®èå¥åã® RSA 眲åã®çµæã 眲åçµæã¯å€ãããŸããã
ããã¯ã©ãããæå³ã§ããïŒ
åãå€ (ã²ãŒã ID) ãååŸããããã« RSA 眲åã¡ãœãããé©çšããŸãã åžžã«åãçµæãåŸãããŸãã ããã RSA ã¢ã«ãŽãªãºã ã®ä»çµã¿ã§ãã ã²ãŒã ID ãš RSA ã®é©çšçµæãäžæãªãããæçµçãªæ°å€ãæäœããããšã¯ã§ããŸããã æ°åãéžã¶ã®ãç¡æå³ã§ãã
8. ãããã¯ãã§ãŒã³ããã©ã³ã¶ã¯ã·ã§ã³ãåãå ¥ããŸãã åŒãåºãé¢æ° (gameIdãrsaSign) ãå®è¡ããŸãã
9. åŒãåºãé¢æ°å ã§åŒãåºããçºçããŸã RandInt é¢æ°ã®çæ (ã²ãŒã IDã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 眲åã®çµæã§ããæååãååŸãããŸãã ã²ãŒã ID ç§å¯éµ (rsaãµã€ã³ïŒã 次ã«ãSHA-256 ã§ããã·ã¥åãããŸã (sha256(rsaSign)).
眲åãšãã®åŸã®ããã·ã¥ã®çµæãäºæž¬ããããšã¯ã§ããŸããã ãããã£ãŠãä¹±æ°ã®çæã«åœ±é¿ãäžããããšã¯ã§ããŸããã ç¹å®ã®ç¯å² (ããšãã°ã1 ãã 100) ã®æ°å€ãååŸããã«ã¯ãtoInt å€æé¢æ°ãš %100 (次ã®ããã«) ã䜿çšããŸãã
èšäºã®åé ã§é¢æ°ã«ã€ããŠè§ŠããŸããã rsaVerify()ã䜿çšãããšãå ¬éããŒãšæ¯èŒããŠç§å¯ããŒã䜿çšããŠãRSA 眲åã®æå¹æ§ããã§ãã¯ã§ããŸãã GenerateRandInt(gameId,rsaSign) ã®éšåã¯æ¬¡ã®ãšããã§ãã
rsaVerify (SHA256, toBytes(gameId), rsaSign, RSAPUBLIC)
å ¬éã㌠RSAPUBLIC ãš rsaSign æååãå ¥åã«æž¡ãããŸãã 眲åã®æå¹æ§ããã§ãã¯ãããŸãã ãã§ãã¯ãæåãããšçªå·ãçæãããŸãã ãã以å€ã®å Žåãã·ã¹ãã ã¯çœ²åãç¡å¹ã§ãããšã¿ãªããŸã (ç¡å¹ãª RSA 眲å)ã
ãµãŒããŒã¯ç§å¯ããŒã䜿çšããŠã²ãŒã ID ã«çœ²åããæå¹ãª Rsa 眲åã 2880 ãããã¯ä»¥å ã«éä¿¡ããå¿ èŠããããŸãã ãã©ã¡ãŒã¿ãŒã¯ãã¹ããŒã ã³ã³ãã©ã¯ãã®ãããã€æã«æ§æãããŸãã å²ãåœãŠãããæéå ã«äœãèµ·ãããªããã°ããŠãŒã¶ãŒã®åã¡ã§ãã ãã®å Žåãè³åã¯ãèªèº«ã®äœæã«éä»ããŠããã ãå¿ èŠããããŸãã ããã¯æ倱ã«ã€ãªãããããããµãŒããŒã«ãšã£ãŠäžæ£è¡çºã¯å©çã«ãªããªããããšãããããŸãã 以äžã«äŸã瀺ããŸãã
ãŠãŒã¶ãŒããã¬ã€ããŠããŸã
ã²ãŒã ã§æ°å€ãçæããã«ã¯ãå€éšã®éãããã¯ãã§ãŒã³ ã·ã¹ãã ã§ãããªã©ã¯ã«ã䜿çšããŸãã ãµãŒããŒã¯ã²ãŒã ID ã® RSA 眲åãå®è¡ããŸãã ã¹ããŒã ã³ã³ãã©ã¯ãã¯çœ²åã®æå¹æ§ããã§ãã¯ããåè ã決å®ããŸãã ãµãŒããŒãäœãéä¿¡ããªãå Žåã¯ããŠãŒã¶ãŒãèªåçã«åã¡ãŸãã
æäœã¯æè¡çã«äžå¯èœãªã®ã§ãããã¯æ£çŽãªçææ¹æ³ã§ãã ãã¹ãŠã® Tradisys ã²ãŒã ã¯ã説æãããŠããã¢ã«ãŽãªãºã ã«åºã¥ããŠåäœããŸãã ããããããã¯ãã§ãŒã³ã²ãŒã ã®ä»çµã¿ã§ãã ãã¹ãŠãéæã§æ€èšŒå¯èœã§ãã ä»ã®ãããã¯ãã§ãŒã³ã«ã¯ãã®ãããªã·ã¹ãã ã«é¡äŒŒãããã®ã¯ãããŸããã ããã¯ããªãã®ã©ã³ãã ã§ãã
åºæïŒ habr.com