බ්ලොක්චේන් මත RSA අහඹු

ගැටළුවක් ඇත - විමධ්‍යගත ජාලයක අහඹු අංකයක් උත්පාදනය කිරීම අපහසුය. සියලුම blockchains දැනටමත් මෙයට මුහුණ දී ඇත. ඇත්ත වශයෙන්ම, පරිශීලකයින් අතර විශ්වාසයක් නොමැති ජාල තුළ, ප්‍රතික්ෂේප කළ නොහැකි අහඹු අංකයක් නිර්මාණය කිරීම බොහෝ ගැටලු විසඳයි.

උදාහරණයක් ලෙස ක්‍රීඩා භාවිතා කරමින් ගැටළුව විසඳීමට අපි සමත් වූ ආකාරය මෙම ලිපියෙන් අපි ඔබට කියමු. ඒවායින් පළමුවැන්න විය තරංග නත්තල් ගස. සංවර්ධනය සඳහා, අපට අහඹු සංඛ්යා උත්පාදක යන්ත්රයක් අවශ්ය විය.

බ්ලොක්චේන් මත RSA අහඹු

මුලදී, අපි blockchain වෙතින් තොරතුරු මත පදනම්ව අංකයක් උත්පාදනය කිරීමට සැලසුම් කළෙමු. කෙසේ වෙතත්, පසුව එය පැහැදිලි විය: අංකය හැසිරවිය හැකිය, එනම් විසඳුම සුදුසු නොවේ.

අපි විසඳුමක් සමඟ ආවා: කැපවීම-පුළුල් කිරීමේ යෝජනා ක්රමය භාවිතා කරන්න. සේවාදායකයා 1 සිට 5 දක්වා අංකයක් අනුමාන කර, එයට ලුණු එකතු කර, පසුව ප්‍රතිඵලය හෑෂ් කර ඇත. Keccak කාර්යයන්. සේවාදායකය විසින් දැනටමත් සුරකින ලද අංකය සමඟ ස්මාර්ට් කොන්ත්‍රාත්තුව කල්තියා යොදවා ඇත. හැෂ් මගින් සඟවා ඇති අංකය අනුමාන කරන පරිශීලකයා දක්වා ක්‍රීඩාව පහත වැටෙන බව පෙනේ.

ක්රීඩකයා ඔට්ටු ඇල්ලූ අතර, සේවාදායකයා සැඟවුනු අංකය සහ "ලුණු" ස්මාර්ට් කොන්ත්රාත්තුවට යවා ඇත. සරලව කිවහොත්, ඔහු කාඩ්පත් හෙළි කළේය. ඊට පසු, සේවාදායකයා අංක පරීක්ෂා කර පරිශීලකයා දිනුවාද නැතිද යන්න තීරණය කළේය.

සේවාදායකය විසින් සත්‍යාපනය සඳහා අංකයක් හෝ "ලුණු" යවා නොමැති නම්, පරිශීලකයා ජය ගත්තේය. මෙම අවස්ථාවෙහිදී, සෑම ක්‍රීඩාවක් සඳහාම කල්තියා ස්මාර්ට් කොන්ත්‍රාත්තුවක් යෙදවීම සහ එහි විභව ජයග්‍රහණ ඇතුළත් කිරීම අවශ්‍ය විය. එය අපහසු, කාලය ගතවන සහ මිල අධික විය. ඒ කාලයේ වෙනත් ආරක්ෂිත විසඳුමක් තිබුණේ නැහැ.

මෑතකදී, Tradisys කණ්ඩායම Waves ප්‍රොටෝකෝලයට ශ්‍රිතයක් එක් කිරීමට යෝජනා කළේය rsaVerify(). එය පොදු සහ පුද්ගලික යතුර මත පදනම්ව RSA අත්සනෙහි වලංගු භාවය පරීක්ෂා කරයි. එහි ප්රතිඵලයක් වශයෙන්, විශේෂාංගය එකතු කරන ලදී.

අපි ක්රීඩා තුනක් සංවර්ධනය කර ඇත: ඩයිස් රෝලර්, කාසි පෙරළීම и රළ මත පදින්න. එක් එක් සසම්භාවී සංඛ්යා තාක්ෂණය ක්රියාත්මක කරයි. එය ක්‍රියාත්මක වන ආකාරය අපි සොයා බලමු.

බ්ලොක්චේන් මත RSA අහඹු

උදාහරණයක් ලෙස Ride on Waves භාවිතයෙන් අහඹු අංකයක් ජනනය කිරීම බලමු. ස්මාර්ට් කොන්ත්රාත්තුව සොයාගත හැකිය මෙහි.

ටැබ් එකට යන්න තිර රචනය සහ තෝරන්න විසංයෝජනය කරන ලදී. ඔබ ස්මාර්ට් කොන්ත්රාත් කේතය (aka script) දකිනු ඇත.

බ්ලොක්චේන් මත RSA අහඹු

ස්මාර්ට් කොන්ත්රාත් කේතයෙහි කාර්යයන් සමූහයක් අඩංගු වේ. @Callable ලෙස සලකුණු කර ඇති ඒවා භාවිතයෙන් දියත් කළ හැක ආරාධනා ගනුදෙනු. අපි කාර්යයන් දෙකක් ගැන උනන්දු වෙමු: ඔට්ටු и ඉවත් කරන්න:

  • func ඔට්ටුව (playerChoice)
  • func withdraw (gameId,rsaSign)

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 අහඹු

බ්ලොක්චේන් හි දත්ත වාර්තාවක් පෙනෙන්නේ මෙයයි (ප්‍රධාන අගය):

{
    "type": "string",
    "value": "03WON_0283_448t8Jn9P3717UnXFEVD5VWjfeGE5gBNeWg58H2aJeQEgJ_06574069_09116020000_0229",
    "key": "2GKTX6NLTgUrE4iy9HtpSSHpZ3G8W4cMfdjyvvnc21dx"
  }

"යතුර" (යතුර) - ක්‍රීඩා හැඳුනුම්පත නව ක්රීඩාව. ඉතිරි දත්ත "අගය" ක්ෂේත්රයේ රේඛාවේ අඩංගු වේ. මෙම ඇතුළත් කිරීම් ටැබය තුළ ගබඩා කර ඇත දත්ත බුද්ධිමත් ගිවිසුම:

බ්ලොක්චේන් මත RSA අහඹු

බ්ලොක්චේන් මත RSA අහඹු

5. සේවාදායකය ස්මාර්ට් කොන්ත්රාත්තුව දෙස "බලයි" සහ blockchain Api භාවිතයෙන් යවන ලද ගනුදෙනුව (නව ක්රීඩාව) සොයා ගනී. නව ක්‍රීඩාවේ ක්‍රීඩා හැඳුනුම දැනටමත් බ්ලොක්චේන් හි සටහන් කර ඇත, එයින් අදහස් වන්නේ එය තවදුරටත් වෙනස් කිරීමට හෝ බලපෑම් කිරීමට නොහැකි බවයි

6. සේවාදායකය විසින් withdraw ශ්‍රිතයක් ජනනය කරයි (gameId, rsaSign). උදාහරණයක් ලෙස, මේ වගේ:

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

7. සේවාදායකය ස්මාර්ට් කොන්ත්‍රාත්තුවට ආරාධනා ගනුදෙනුවක් යවයි (Broadcast InvocationTx). ගනුදෙනුවෙහි පිහිටුවා ගත් withdraw ශ්‍රිතයට ඇමතුමක් අඩංගු වේ (gameId, rsaSign):

බ්ලොක්චේන් මත RSA අහඹු

කාර්යය අඩංගු වේ ක්‍රීඩා හැඳුනුම්පත නව ක්‍රීඩාව සහ පුද්ගලික යතුරක් සමඟ අනන්‍ය හඳුනාගැනීමක් RSA අත්සන් කිරීමේ ප්‍රතිඵලය. අත්සන ප්‍රතිඵලය නොවෙනස්ව පවතී.

මෙයින් අදහස් කරන්නේ කුමක්ද?

අපි එකම අගය (ගේම් හැඳුනුම්පත) ගෙන RSA අත්සන් ක්‍රමය එයට යොදන්නෙමු. අපි හැම විටම එකම ප්රතිඵලය ලබා ගන්නෙමු. RSA ඇල්ගොරිතම ක්‍රියා කරන්නේ මෙහෙමයි. ක්‍රීඩා හැඳුනුම්පත සහ RSA යෙදීමේ ප්‍රතිඵලය නොදන්නා බැවින් අවසාන අංකය හැසිරවිය නොහැක. අංකයක් තෝරා ගැනීම ද අර්ථ විරහිත ය.

8. Blockchain ගනුදෙනුව පිළිගනී. එය withdraw ශ්‍රිතය ක්‍රියාත්මක කරයි (gameId, rsaSign)

9. withdraw function එක ඇතුලේ withdrawal වෙනවා RandInt කාර්යයන් ජනනය කරන්න (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 ක් ගනු ඇත.

ක්‍රීඩා වල සංඛ්‍යා උත්පාදනය කිරීම සඳහා, අපි ඔරකල් භාවිතා කරමු - බාහිර, අවහිර නොවන පද්ධතියකි. සේවාදායකය ක්‍රීඩා හැඳුනුම්පතේ RSA අත්සනක් සිදු කරයි. ස්මාර්ට් කොන්ත්රාත්තුව අත්සනෙහි වලංගුභාවය පරීක්ෂා කර ජයග්රාහකයා තීරණය කරයි. සේවාදායකයා කිසිවක් නොයවන්නේ නම්, පරිශීලකයා ස්වයංක්‍රීයව ජය ගනී.

මෙය අවංක උත්පාදන ක්‍රමයකි, මන්ද හැසිරවීම තාක්ෂණික වශයෙන් කළ නොහැකි ය. සියලුම Tradisys ක්රීඩා විස්තර කරන ලද ඇල්ගොරිතම මත පදනම්ව ක්රියා කරයි. බ්ලොක්චේන් ක්‍රීඩා ක්‍රියා කරන ආකාරය මෙයයි. සෑම දෙයක්ම විනිවිද පෙනෙන සහ සත්‍යාපනය කළ හැකි ය. වෙනත් බ්ලොක්චේන් එකක එවැනි පද්ධතියක ඇනෙලොග් නොමැත. මෙය සාධාරණ අහඹු සිදුවීමකි.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න