பிளாக்செயினில் RSA ரேண்டம்

ஒரு சிக்கல் உள்ளது - பரவலாக்கப்பட்ட நெட்வொர்க்கில் சீரற்ற எண்ணை உருவாக்குவது கடினம். ஏறக்குறைய அனைத்து பிளாக்செயின்களும் இதை ஏற்கனவே சந்தித்துள்ளன. உண்மையில், பயனர்களிடையே நம்பிக்கை இல்லாத நெட்வொர்க்குகளில், மறுக்க முடியாத சீரற்ற எண்ணை உருவாக்குவது பல சிக்கல்களைத் தீர்க்கிறது.

இந்த கட்டுரையில், கேம்களை உதாரணமாகப் பயன்படுத்தி சிக்கலை எவ்வாறு தீர்க்க முடிந்தது என்பதை நாங்கள் உங்களுக்குக் கூறுகிறோம். அவற்றில் முதலாவது இருந்தது அலைகள் கிறிஸ்துமஸ் மரம். வளர்ச்சிக்கு, எங்களுக்கு ஒரு சீரற்ற எண் ஜெனரேட்டர் தேவைப்பட்டது.

பிளாக்செயினில் RSA ரேண்டம்

ஆரம்பத்தில், பிளாக்செயினில் இருந்து தகவல்களின் அடிப்படையில் ஒரு எண்ணை உருவாக்க திட்டமிட்டோம். இருப்பினும், பின்னர் அது தெளிவாகியது: எண்ணைக் கையாளலாம், அதாவது தீர்வு பொருத்தமானது அல்ல.

நாங்கள் ஒரு தீர்வைக் கொண்டு வந்தோம்: உறுதி-விரிவாக்கத் திட்டத்தைப் பயன்படுத்தவும். சேவையகம் 1 முதல் 5 வரையிலான எண்ணை யூகித்து, அதில் ஒரு உப்பைச் சேர்த்து, பின்னர் அதன் விளைவைப் பயன்படுத்தி ஹேஷ் செய்தது கெக்காக் செயல்பாடுகள். ஏற்கனவே சேமித்த எண்ணுடன் கூடிய ஸ்மார்ட் ஒப்பந்தத்தை சர்வர் முன்கூட்டியே பயன்படுத்தியது. ஹாஷால் மறைக்கப்பட்ட எண்ணை யூகிக்கும் பயனருக்கு விளையாட்டு கொதிக்கிறது.

வீரர் ஒரு பந்தயம் வைத்தார், மற்றும் சர்வர் மறைக்கப்பட்ட எண் மற்றும் "உப்பு" ஸ்மார்ட் ஒப்பந்தத்திற்கு அனுப்பியது. எளிமையான சொற்களில், அவர் அட்டைகளை வெளிப்படுத்தினார். அதன் பிறகு, சேவையகம் எண்களைச் சரிபார்த்து, பயனர் வெற்றி பெற்றாரா அல்லது தோற்றாரா என்பதை முடிவு செய்தார்.

சரிபார்ப்பிற்காக சேவையகம் எண் அல்லது "உப்பு" அனுப்பவில்லை என்றால், பயனர் வெற்றி பெற்றார். இந்த வழக்கில், ஒவ்வொரு விளையாட்டுக்கும் ஒரு ஸ்மார்ட் ஒப்பந்தத்தை முன்கூட்டியே வரிசைப்படுத்துவது மற்றும் அதில் சாத்தியமான வெற்றிகளைச் சேர்ப்பது அவசியம். இது சிரமமாகவும், நேரத்தை எடுத்துக்கொள்ளும் மற்றும் விலையுயர்ந்ததாகவும் மாறியது. அந்த நேரத்தில் வேறு பாதுகாப்பான தீர்வு இல்லை.

சமீபத்தில், Tradisys குழு அலைகள் நெறிமுறையில் ஒரு செயல்பாட்டைச் சேர்க்க முன்மொழிந்தது rsaVerify(). பொது மற்றும் தனிப்பட்ட விசையின் அடிப்படையில் RSA கையொப்பத்தின் செல்லுபடியை இது சரிபார்க்கிறது. இதன் விளைவாக, அம்சம் சேர்க்கப்பட்டது.

நாங்கள் மூன்று விளையாட்டுகளை உருவாக்கியுள்ளோம்: டைஸ் ரோலர், Coin Flip и அலைகளில் சவாரி செய்யுங்கள். ஒவ்வொன்றும் ரேண்டம் எண் தொழில்நுட்பத்தை செயல்படுத்துகிறது. இது எவ்வாறு செயல்படுகிறது என்பதைக் கண்டுபிடிப்போம்.

பிளாக்செயினில் RSA ரேண்டம்

ரைட் ஆன் வேவ்ஸைப் பயன்படுத்தி ஒரு ரேண்டம் எண்ணை உருவாக்குவதை உதாரணமாகப் பார்ப்போம். ஸ்மார்ட் ஒப்பந்தத்தைக் காணலாம் இங்கே.

தாவலுக்குச் செல்லவும் ஸ்கிரிப்ட் மற்றும் தேர்ந்தெடுக்கவும் தொகுக்கப்பட்டது. நீங்கள் ஸ்மார்ட் ஒப்பந்தக் குறியீட்டைக் காண்பீர்கள் (அக்கா ஸ்கிரிப்ட்).

பிளாக்செயினில் RSA ரேண்டம்

ஸ்மார்ட் ஒப்பந்தக் குறியீடு செயல்பாடுகளின் தொகுப்பைக் கொண்டுள்ளது. @Callable எனக் குறிக்கப்பட்டவற்றைப் பயன்படுத்தி தொடங்கலாம் அழைப்பு பரிவர்த்தனைகள். நாங்கள் இரண்டு செயல்பாடுகளில் ஆர்வமாக உள்ளோம்: பந்தயம் и திரும்ப:

  • ஃபங்க் பந்தயம் (பிளேயர் சாய்ஸ்)
  • func withdraw(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. சர்வர் ஸ்மார்ட் ஒப்பந்தத்தை "பார்க்கிறது" மற்றும் பிளாக்செயின் Api ஐப் பயன்படுத்தி அனுப்பப்பட்ட பரிவர்த்தனையை (புதிய கேம்) கண்டறியும். புதிய கேமின் கேம் ஐடி ஏற்கனவே பிளாக்செயினில் பதிவு செய்யப்பட்டுள்ளது, அதாவது இனி அதை மாற்றவோ பாதிக்கவோ முடியாது

6. சேவையகம் திரும்பப் பெறும் செயல்பாட்டை உருவாக்குகிறது (gameId, rsaSign). உதாரணமாக, இது போன்றது:

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

7. சேவையகம் ஒரு அழைப்பு பரிவர்த்தனையை ஸ்மார்ட் ஒப்பந்தத்திற்கு அனுப்புகிறது (ஒளிபரப்பு InvocationTx). பரிவர்த்தனையானது உருவாக்கப்பட்ட திரும்பப் பெறுதல் செயல்பாட்டிற்கான அழைப்பைக் கொண்டுள்ளது (gameId, rsaSign):

பிளாக்செயினில் RSA ரேண்டம்

செயல்பாடு கொண்டுள்ளது விளையாட்டு ஐடி புதிய கேம் மற்றும் தனிப்பட்ட விசையுடன் தனிப்பட்ட அடையாளங்காட்டியில் RSA கையொப்பமிட்டதன் விளைவு. கையெழுத்து முடிவு மாறாமல் உள்ளது.

இது என்ன அர்த்தம்?

நாங்கள் அதே மதிப்பை (கேம் ஐடி) எடுத்து அதற்கு RSA கையொப்ப முறையைப் பயன்படுத்துகிறோம். நாம் எப்போதும் அதே முடிவைப் பெறுவோம். RSA அல்காரிதம் இப்படித்தான் செயல்படுகிறது. கேம் ஐடி மற்றும் ஆர்எஸ்ஏவைப் பயன்படுத்துவதன் முடிவு தெரியாததால், இறுதி எண்ணைக் கையாள முடியாது. எண்ணைத் தேர்ந்தெடுப்பதும் அர்த்தமற்றது.

8. Blockchain பரிவர்த்தனையை ஏற்றுக்கொள்கிறது. இது திரும்பப் பெறுதல் செயல்பாட்டை இயக்குகிறது (gameId, rsaSign)

9. திரும்பப் பெறுதல் செயல்பாட்டின் உள்ளே, திரும்பப் பெறுதல் ஏற்படுகிறது ராண்ட்இன்ட் செயல்பாடுகளை உருவாக்கவும் (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 (இதைப் போன்றது மோட்).

கட்டுரையின் ஆரம்பத்தில் நாங்கள் செயல்பாட்டைக் குறிப்பிட்டோம் rsaVerify(), இது RSA கையொப்பத்தின் செல்லுபடியை பொது விசைக்கு எதிராக தனிப்பட்ட விசையைப் பயன்படுத்தி சரிபார்க்க அனுமதிக்கிறது. இங்கே GenerateRandInt(gameId,rsaSign) பகுதி:

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

பொது விசை RSAPUBLIC மற்றும் rsaSign சரம் உள்ளீட்டிற்கு அனுப்பப்படும். கையொப்பம் செல்லுபடியாகும் என சரிபார்க்கப்பட்டது. காசோலை வெற்றிகரமாக இருந்தால் எண் உருவாக்கப்படும். இல்லையெனில், கையொப்பம் செல்லாது என்று கணினி கருதுகிறது (தவறான RSA கையொப்பம்).

சேவையகம் கேம் ஐடியில் தனிப்பட்ட விசையுடன் கையொப்பமிட வேண்டும் மற்றும் 2880 தொகுதிகளுக்குள் செல்லுபடியாகும் Rsa கையொப்பத்தை அனுப்ப வேண்டும். ஸ்மார்ட் ஒப்பந்தத்தைப் பயன்படுத்தும்போது அளவுரு கட்டமைக்கப்படுகிறது. ஒதுக்கப்பட்ட நேரத்திற்குள் எதுவும் நடக்கவில்லை என்றால், பயனர் வெற்றி பெறுவார். இந்த வழக்கில், பரிசு உங்கள் முகவரிக்கு அனுப்பப்பட வேண்டும். இது "சேவையகத்தை ஏமாற்றுவது லாபகரமானது அல்ல" என்று மாறிவிடும், ஏனெனில் இது இழப்புக்கு வழிவகுக்கிறது. கீழே ஒரு உதாரணம்.

பிளாக்செயினில் RSA ரேண்டம்

பயனர் விளையாடுகிறார் டைஸ் ரோலர். நான் கனசதுரத்தின் 2 பக்கங்களில் 6ஐத் தேர்ந்தெடுத்தேன், பந்தயம் 14 அலைகள். குறிப்பிட்ட நேரத்திற்குள் (2880 தொகுதிகள்) ஸ்மார்ட் ஒப்பந்தத்திற்கு செல்லுபடியாகும் RSA கையொப்பத்தை சேவையகம் அனுப்பவில்லை என்றால், பயனர் 34.44 அலைகளை எடுப்பார்.

கேம்களில் எண்களை உருவாக்க, நாங்கள் ஆரக்கிளைப் பயன்படுத்துகிறோம் - வெளிப்புற, பிளாக்செயின் அல்லாத அமைப்பு. கேம் ஐடியின் RSA கையொப்பத்தை சேவையகம் செய்கிறது. ஸ்மார்ட் ஒப்பந்தம் கையொப்பத்தின் செல்லுபடியை சரிபார்த்து வெற்றியாளரைத் தீர்மானிக்கிறது. சேவையகம் எதையும் அனுப்பவில்லை என்றால், பயனர் தானாகவே வெற்றி பெறுவார்.

இது ஒரு நேர்மையான தலைமுறை முறையாகும், ஏனெனில் கையாளுதல் தொழில்நுட்ப ரீதியாக சாத்தியமற்றது. அனைத்து Tradisys கேம்களும் விவரிக்கப்பட்ட அல்காரிதம் அடிப்படையில் செயல்படுகின்றன. பிளாக்செயின் விளையாட்டுகள் இப்படித்தான் செயல்படுகின்றன. எல்லாம் வெளிப்படையானது மற்றும் சரிபார்க்கக்கூடியது. வேறு எந்த பிளாக்செயினிலும் அத்தகைய அமைப்பின் ஒப்புமைகள் இல்லை. இது நியாயமான தற்செயல்.

ஆதாரம்: www.habr.com

கருத்தைச் சேர்