RSA በዘፈቀደ በብሎክቼይን

ችግር አለ - ያልተማከለ አውታረ መረብ ውስጥ የዘፈቀደ ቁጥር ማመንጨት አስቸጋሪ ነው። ሁሉም ማለት ይቻላል blockchains ይህን አጋጥሞታል. በእርግጥ በተጠቃሚዎች መካከል መተማመን በሌለበት አውታረ መረቦች ውስጥ የማይካድ የዘፈቀደ ቁጥር መፍጠር ብዙ ችግሮችን ይፈታል።

በዚህ ጽሑፍ ውስጥ ጨዋታዎችን እንደ ምሳሌ በመጠቀም ችግሩን እንዴት መፍታት እንደቻልን እንነግርዎታለን. ከእነርሱም የመጀመሪያው ነበር ሞገዶች Xmas ዛፍ. ለልማት፣ የዘፈቀደ ቁጥር ጀነሬተር እንፈልጋለን።

RSA በዘፈቀደ በብሎክቼይን

መጀመሪያ ላይ ከ blockchain መረጃ ላይ በመመስረት ቁጥር ለማመንጨት አቅደናል። ሆኖም ግን, ከዚያም ግልጽ ሆነ: ቁጥሩ ሊገለበጥ ይችላል, ይህም ማለት መፍትሄው ተስማሚ አይደለም.

የመፍትሄ ሃሳብ አቅርበናል፡ የኮሚሽን ማስፋፊያ ዘዴን ተጠቀም። አገልጋዩ ከ 1 እስከ 5 ያለውን ቁጥር ገምቷል ፣ ጨው ጨመረበት እና ውጤቱን ተጠቅሞ አጠፋው የኬክካክ ተግባራት. አገልጋዩ ብልጥ ኮንትራቱን አስቀድሞ ከተቀመጠው ቁጥር ጋር አሰማርቷል። ጨዋታው በሃሽ የተደበቀውን ቁጥር ለመገመት ወደ ተጠቃሚው ይጎርፋል።

ተጫዋቹ አንድ ውርርድ አስቀምጧል, እና አገልጋዩ የተደበቀውን ቁጥር እና "ጨው" ወደ ብልጥ ኮንትራት ላከ. በቀላል ቃላት ካርዶቹን ገለጠ. ከዚያ በኋላ አገልጋዩ ቁጥሮቹን በማጣራት ተጠቃሚው ያሸነፈ ወይም የተሸነፈ መሆኑን ወስኗል።

አገልጋዩ ለማረጋገጫ ቁጥር ወይም “ጨው” ካልላከ ተጠቃሚው አሸንፏል። በዚህ ጉዳይ ላይ ለእያንዳንዱ ጨዋታ ብልጥ ውልን በቅድሚያ ማሰማራት እና በእሱ ውስጥ ሊሆኑ የሚችሉ ድሎችን ማካተት አስፈላጊ ነበር. የማይመች፣ ጊዜ የሚወስድ እና ውድ ሆኖ ተገኘ። በዚያን ጊዜ ሌላ አስተማማኝ መፍትሔ አልነበረም.

በቅርቡ፣ የ Tradisys ቡድን በ Waves ፕሮቶኮል ላይ አንድ ተግባር ለመጨመር ሐሳብ አቀረበ rsaVerify(). የህዝብ እና የግል ቁልፍን መሰረት በማድረግ የRSA ፊርማ ትክክለኛነት ያረጋግጣል። በውጤቱም, ባህሪው ተጨምሯል.

ሶስት ጨዋታዎችን አዘጋጅተናል፡- ዳይስ ሮለር, የሳንቲም ገልብጥ и በሞገድ ላይ ያሽከርክሩ. እያንዳንዳቸው የዘፈቀደ ቁጥር ቴክኖሎጂን ተግባራዊ ያደርጋሉ። እንዴት እንደሚሰራ እንወቅ።

RSA በዘፈቀደ በብሎክቼይን

Ride on Wavesን እንደ ምሳሌ በመጠቀም የዘፈቀደ ቁጥር ማመንጨትን እንመልከት። ዘመናዊው ውል ሊገኝ ይችላል እዚህ.

ወደ ትሩ ይሂዱ ስክሪፕት እና ይምረጡ ተሰብስቧል. የስማርት ኮንትራት ኮድ (aka script) ያያሉ።

RSA በዘፈቀደ በብሎክቼይን

ብልጥ የኮንትራት ኮድ የተግባር ስብስብ ይዟል። @Callable የሚል ምልክት የተደረገባቸው በመጠቀም መጀመር ይችላሉ። የጥሪ ግብይቶች. በሁለት ተግባራት ላይ ፍላጎት አለን: ተጫው и አውጣ:

  • func bet (ተጫዋች ምርጫ)
  • func ማውጣት(gameId፣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. አገልጋዩ ብልጥ ኮንትራቱን "ይመለከተዋል" እና የተላከውን ግብይት (አዲስ ጨዋታ) በ blockchain Api በመጠቀም ያገኛል. የአዲሱ ጨዋታ የጨዋታ መታወቂያ አስቀድሞ በብሎክቼይን ውስጥ ተመዝግቧል፣ ይህ ማለት ከአሁን በኋላ ሊለወጥ ወይም ሊነካ አይችልም ማለት ነው።

6. አገልጋዩ የማስወጣት ተግባር (gameId, rsaSign) ያመነጫል. ለምሳሌ፣ እንደዚህ፡-

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

7. አገልጋዩ የ Invocation ግብይትን ወደ ስማርት ኮንትራት (ስርጭት InvocationTx) ይልካል። ግብይቱ ለተፈጠረው የማውጣት ተግባር (gameId፣ rsaSign) ጥሪ ይዟል።

RSA በዘፈቀደ በብሎክቼይን

ተግባሩ ይዟል የጨዋታ መታወቂያ አዲስ ጨዋታ እና 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)).

የፊርማውን እና የሚቀጥለውን ሃሽንግ ውጤት መተንበይ አንችልም። ስለዚህ, በዘፈቀደ ቁጥር ማመንጨት ላይ ተጽእኖ ማድረግ አይቻልም. በተወሰነ ክልል ውስጥ ቁጥርን ለማግኘት (ለምሳሌ ከ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 WAVES ነው። በተጠቀሰው ጊዜ (2880 ብሎኮች) ውስጥ አገልጋዩ ትክክለኛ የRSA ፊርማ ካልላከ ተጠቃሚው 34.44 WAVES ይወስዳል።

በጨዋታዎች ውስጥ ቁጥሮችን ለመፍጠር ኦራክልን እንጠቀማለን - ውጫዊ ፣ blockchain ያልሆነ ስርዓት። አገልጋዩ የጨዋታውን መታወቂያ RSA ፊርማ ያከናውናል። ብልጥ ኮንትራቱ የፊርማውን ትክክለኛነት ያረጋግጣል እና አሸናፊውን ይወስናል። አገልጋዩ ምንም ነገር ካልላከ ተጠቃሚው በራስ-ሰር ያሸንፋል።

ይህ ሐቀኛ የትውልድ ዘዴ ነው, ምክንያቱም ማጭበርበር በቴክኒካዊ ሁኔታ የማይቻል ነው. ሁሉም የ Tradisys ጨዋታዎች በተገለጸው ስልተ ቀመር መሰረት ይሰራሉ. የብሎክቼይን ጨዋታዎች የሚሰሩት በዚህ መንገድ ነው። ሁሉም ነገር ግልጽ እና ሊረጋገጥ የሚችል ነው. በማንኛውም ሌላ blockchain ውስጥ የዚህ ዓይነቱ ሥርዓት ተመሳሳይ ነገሮች የሉም። ይህ ፍትሃዊ የዘፈቀደ ነው።

ምንጭ: hab.com

አስተያየት ያክሉ