ఒక సమస్య ఉంది - వికేంద్రీకృత నెట్వర్క్లో యాదృచ్ఛిక సంఖ్యను రూపొందించడం కష్టం. దాదాపు అన్ని బ్లాక్చెయిన్లు ఇప్పటికే దీనిని ఎదుర్కొన్నాయి. వాస్తవానికి, వినియోగదారుల మధ్య నమ్మకం లేని నెట్వర్క్లలో, వివాదాస్పద యాదృచ్ఛిక సంఖ్యను సృష్టించడం అనేక సమస్యలను పరిష్కరిస్తుంది.
గేమ్లను ఉదాహరణగా ఉపయోగించి సమస్యను ఎలా పరిష్కరించాలో ఈ కథనంలో మేము మీకు చెప్తాము. వాటిలో మొదటిది
ప్రారంభంలో, మేము బ్లాక్చెయిన్ నుండి సమాచారం ఆధారంగా ఒక సంఖ్యను రూపొందించాలని ప్లాన్ చేసాము. అయితే, అప్పుడు స్పష్టమైంది: సంఖ్యను మార్చవచ్చు, అంటే పరిష్కారం తగినది కాదు.
మేము ఒక ప్రత్యామ్నాయంతో ముందుకు వచ్చాము: కమిట్-ఎక్స్పాండ్ స్కీమ్ని ఉపయోగించండి. సర్వర్ 1 నుండి 5 వరకు సంఖ్యను ఊహించి, దానికి ఉప్పును జోడించి, ఆపై ఫలితాన్ని ఉపయోగించి హాష్ చేసింది
ఆటగాడు పందెం వేసాడు మరియు సర్వర్ దాచిన సంఖ్యను మరియు "ఉప్పు"ను స్మార్ట్ ఒప్పందానికి పంపింది. సరళంగా చెప్పాలంటే, అతను కార్డులను వెల్లడించాడు. ఆ తర్వాత, సర్వర్ నంబర్లను తనిఖీ చేసి, వినియోగదారు గెలిచాడా లేదా ఓడిపోయాడా అని నిర్ణయించింది.
ధృవీకరణ కోసం సర్వర్ నంబర్ లేదా "ఉప్పు"ని పంపకపోతే, వినియోగదారు గెలిచారు. ఈ సందర్భంలో, ప్రతి గేమ్కు ముందుగానే స్మార్ట్ ఒప్పందాన్ని అమలు చేయడం మరియు దానిలో సంభావ్య విజయాలను చేర్చడం అవసరం. ఇది అసౌకర్యంగా, సమయం తీసుకుంటుందని మరియు ఖరీదైనదిగా మారింది. ఆ సమయంలో ఇతర సురక్షితమైన పరిష్కారం లేదు.
ఇటీవల, Tradisys బృందం వేవ్స్ ప్రోటోకాల్కు ఒక ఫంక్షన్ను జోడించాలని ప్రతిపాదించింది rsaVerify(). ఇది పబ్లిక్ మరియు ప్రైవేట్ కీ ఆధారంగా RSA సంతకం యొక్క చెల్లుబాటును తనిఖీ చేస్తుంది. ఫలితంగా, ఫీచర్ జోడించబడింది.
మేము మూడు ఆటలను అభివృద్ధి చేసాము:
రైడ్ ఆన్ వేవ్స్ని ఉదాహరణగా ఉపయోగించి యాదృచ్ఛిక సంఖ్యను రూపొందించడాన్ని చూద్దాం. స్మార్ట్ ఒప్పందాన్ని కనుగొనవచ్చు
ట్యాబ్కి వెళ్లండి స్క్రిప్ట్ మరియు ఎంచుకోండి డీకంపైల్ చేయబడింది. మీరు స్మార్ట్ కాంట్రాక్ట్ కోడ్ (అకా స్క్రిప్ట్) చూస్తారు.
స్మార్ట్ కాంట్రాక్ట్ కోడ్ ఫంక్షన్ల సమితిని కలిగి ఉంటుంది. @Callable అని గుర్తు పెట్టబడిన వాటిని ఉపయోగించి ప్రారంభించవచ్చు ఆహ్వాన లావాదేవీలు. మేము రెండు విధులపై ఆసక్తి కలిగి ఉన్నాము: పందెం и వెనక్కి:
- ఫంక్ పందెం (ప్లేయర్చాయిస్)
- ఫంక్ ఉపసంహరణ (గేమ్ఐడి, ఆర్సాసైన్)
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)))
}
}
ఫంక్షన్ స్మార్ట్ ఒప్పందం యొక్క స్థితికి కొత్త గేమ్ను వ్రాస్తుంది. అవి:
- కొత్త గేమ్ కోసం ప్రత్యేక ఐడెంటిఫైయర్ (గేమ్ ఐడి)
- గేమ్ స్థితి = సమర్పించబడింది
- ఆటగాడి ఎంపిక (సెగ్మెంట్ పొడవు 50)
- పబ్లిక్ కీ
- సంభావ్య విజయాలు (ఆటగాడి పందెం మీద ఆధారపడి)
బ్లాక్చెయిన్లోని డేటా రికార్డ్ ఇలా కనిపిస్తుంది (కీ-విలువ):
{
"type": "string",
"value": "03WON_0283_448t8Jn9P3717UnXFEVD5VWjfeGE5gBNeWg58H2aJeQEgJ_06574069_09116020000_0229",
"key": "2GKTX6NLTgUrE4iy9HtpSSHpZ3G8W4cMfdjyvvnc21dx"
}
"కీ" (కీ) - గేమ్ id కొత్త గేమ్. మిగిలిన డేటా "విలువ" ఫీల్డ్ యొక్క లైన్లో ఉంటుంది. ఈ ఎంట్రీలు ట్యాబ్లో నిల్వ చేయబడతాయి సమాచారం తెలివైన ఒప్పందం:
5. సర్వర్ స్మార్ట్ కాంట్రాక్టును "చూస్తుంది" మరియు blockchain Apiని ఉపయోగించి పంపిన లావాదేవీని (కొత్త గేమ్) కనుగొంటుంది. కొత్త గేమ్ యొక్క గేమ్ ఐడి ఇప్పటికే బ్లాక్చెయిన్లో రికార్డ్ చేయబడింది, అంటే ఇది ఇకపై మార్చబడదు లేదా ప్రభావితం చేయబడదు
6. సర్వర్ ఉపసంహరణ ఫంక్షన్ను ఉత్పత్తి చేస్తుంది (గేమ్ఐడి, ఆర్సాసైన్). ఉదాహరణకు, ఇలా:
withdraw ("FwsuaaShC6DMWdSWQ5osGWtYkVbTEZrsnxqDbVx5oUpq", "base64:Gy69dKdmXUEsAmUrpoWxDLTQOGj5/qO8COA+QjyPVYTAjxXYvEESJbSiCSBRRCOAliqCWwaS161nWqoTL/TltiIvw3nKyd4RJIBNSIgEWGM1tEtNwwnRwSVHs7ToNfZ2Dvk/GgPUqLFDSjnRQpTHdHUPj9mQ8erWw0r6cJXrzfcagKg3yY/0wJ6AyIrflR35mUCK4cO7KumdvC9Mx0hr/ojlHhN732nuG8ps4CUlRw3CkNjNIajBUlyKQwpBKmmiy3yJa/QM5PLxqdppmfFS9y0sxgSlfLOgZ51xRDYuS8NViOA7c1JssH48ZtDbBT5yqzRJXs3RnmZcMDr/q0x6Bg==")
7. సర్వర్ స్మార్ట్ కాంట్రాక్టుకు ఆహ్వానం లావాదేవీని పంపుతుంది (ప్రసారం InvocationTx). లావాదేవీ ఏర్పడిన ఉపసంహరణ ఫంక్షన్కు కాల్ను కలిగి ఉంది (గేమ్ఐడి, ఆర్సాసైన్):
ఫంక్షన్ కలిగి ఉంటుంది గేమ్ id కొత్త గేమ్ మరియు ప్రైవేట్ కీతో ప్రత్యేకమైన ఐడెంటిఫైయర్ యొక్క RSA సంతకం ఫలితంగా. సంతకం ఫలితం మారదు.
దీని అర్థం ఏమిటి?
మేము అదే విలువను (గేమ్ ఐడి) తీసుకుంటాము మరియు దానికి RSA సంతకం పద్ధతిని వర్తింపజేస్తాము. మేము ఎల్లప్పుడూ అదే ఫలితాన్ని పొందుతాము. ఈ విధంగా RSA అల్గోరిథం పనిచేస్తుంది. గేమ్ ఐడి మరియు RSAని వర్తింపజేయడం వల్ల వచ్చే ఫలితం తెలియనందున, చివరి సంఖ్యను మార్చడం సాధ్యం కాదు. సంఖ్యను ఎంచుకోవడం కూడా అర్థరహితం.
8. బ్లాక్చెయిన్ లావాదేవీని అంగీకరిస్తుంది. ఇది ఉపసంహరణ ఫంక్షన్ను అమలు చేస్తుంది (గేమ్ఐడి, rsaSign)
9. ఉపసంహరణ ఫంక్షన్ లోపల, ఉపసంహరణ జరుగుతుంది రాండ్ఇంట్ ఫంక్షన్లను రూపొందించండి (గేమ్ఐడి, ఆర్సాసైన్). ఇది యాదృచ్ఛిక సంఖ్య జనరేటర్
# @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 ప్రైవేట్ కీ (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 సంతకాన్ని నిర్వహిస్తుంది. స్మార్ట్ ఒప్పందం సంతకం యొక్క చెల్లుబాటును తనిఖీ చేస్తుంది మరియు విజేతను నిర్ణయిస్తుంది. సర్వర్ ఏదైనా పంపకపోతే, వినియోగదారు స్వయంచాలకంగా గెలుస్తారు.
ఇది నిజాయితీ తరం పద్ధతి, ఎందుకంటే తారుమారు సాంకేతికంగా అసాధ్యం. అన్ని Tradisys గేమ్లు వివరించిన అల్గోరిథం ఆధారంగా పని చేస్తాయి. బ్లాక్చెయిన్ గేమ్లు ఈ విధంగా పనిచేస్తాయి. ప్రతిదీ పారదర్శకంగా మరియు ధృవీకరించదగినది. మరే ఇతర బ్లాక్చెయిన్లో అటువంటి వ్యవస్థ యొక్క అనలాగ్లు లేవు. ఇది న్యాయమైన యాదృచ్ఛికం.
మూలం: www.habr.com