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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • ஃபன்க் பந்தயம் (பிளேயர் சாய்ஸ்)
  • செயல்பாடு திரும்பப் பெறுதல் (கேம்ஐடி, ஆர்எஸ்ஏசைன்)

1. பயனர் பிரிவின் நீளம் மற்றும் பந்தய அளவைத் தேர்ந்தெடுக்கிறார்.

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

2. கிளையன்ட் ஒரு பந்தய செயல்பாட்டை உருவாக்குகிறார். மேலே உள்ள படத்திற்கு, இது பந்தயம் («50»).

3. வாடிக்கையாளர் ஸ்மார்ட் ஒப்பந்த முகவரிக்கு (Broadcast 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 ரேண்டம்

ஒரு blockchain-ல் தரவு உள்ளீடு இப்படித்தான் இருக்கும் (முக்கிய மதிப்பு):

{
    "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. சேவையகம் ஸ்மார்ட் ஒப்பந்தத்திற்கு (Broadcast InvocationTx) ஒரு அழைப்பு பரிவர்த்தனையை அனுப்புகிறது. பரிவர்த்தனையில் உருவாக்கப்பட்ட திரும்பப் பெறும் செயல்பாட்டிற்கு (gameId, rsaSign) ஒரு அழைப்பு உள்ளது:

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

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

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

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

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

கையொப்பம் மற்றும் அதைத் தொடர்ந்து வரும் ஹேஷிங்கின் முடிவை நாம் கணிக்க முடியாது. எனவே, ஒரு சீரற்ற எண்ணின் உருவாக்கத்தை பாதிக்க முடியாது. ஒரு குறிப்பிட்ட வரம்பில் (எடுத்துக்காட்டாக, 1 முதல் 100 வரை) ஒரு எண்ணைப் பெற, toInt மாற்ற செயல்பாடு மற்றும் %100 (ஒப்புமை) மோட்).

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

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

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

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

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

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

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

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

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

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