بلاکچین پر RSA بے ترتیب

ایک مسئلہ ہے - وکندریقرت نیٹ ورک میں بے ترتیب نمبر بنانا مشکل ہے۔ تقریباً تمام بلاکچینز پہلے ہی اس کا سامنا کر چکے ہیں۔ درحقیقت، ایسے نیٹ ورکس میں جہاں صارفین کے درمیان کوئی اعتماد نہیں ہے، ایک ناقابل تردید بے ترتیب نمبر بنانا بہت سے مسائل کو حل کرتا ہے۔

اس آرٹیکل میں ہم آپ کو بتاتے ہیں کہ ہم نے گیمز کو بطور مثال استعمال کرتے ہوئے اس مسئلے کو کیسے حل کیا۔ ان میں سے پہلا تھا۔ لہریں کرسمس ٹری. ترقی کے لیے، ہمیں ایک بے ترتیب نمبر جنریٹر کی ضرورت تھی۔

بلاکچین پر RSA بے ترتیب

ابتدائی طور پر، ہم نے بلاکچین سے معلومات کی بنیاد پر ایک نمبر بنانے کا منصوبہ بنایا۔ تاہم، پھر یہ واضح ہو گیا: نمبر میں ہیرا پھیری کی جا سکتی ہے، جس کا مطلب ہے کہ حل مناسب نہیں ہے۔

ہم ایک حل لے کر آئے ہیں: کمٹ کی توسیع اسکیم کا استعمال کریں۔ سرور نے 1 سے 5 تک کی تعداد کا اندازہ لگایا، اس میں نمک شامل کیا، اور پھر اس کا استعمال کرتے ہوئے نتیجہ کو ہیش کیا۔ کیکک افعال. سرور نے پہلے سے محفوظ کردہ نمبر کے ساتھ سمارٹ کنٹریکٹ کو پہلے سے تعینات کر دیا۔ اس سے پتہ چلتا ہے کہ گیم ہیش کے چھپے ہوئے نمبر کا اندازہ لگانے والے صارف کے سامنے ابلتا ہے۔

کھلاڑی نے شرط لگائی، اور سرور نے چھپا ہوا نمبر اور "نمک" سمارٹ کنٹریکٹ پر بھیج دیا۔ آسان الفاظ میں، اس نے کارڈز کا انکشاف کیا۔ اس کے بعد، سرور نے نمبروں کو چیک کیا اور فیصلہ کیا کہ آیا صارف جیت گیا یا ہارا۔

اگر سرور نے تصدیق کے لیے نمبر یا "نمک" نہیں بھیجا تو صارف جیت گیا۔ اس صورت میں، ہر گیم کے لیے ضروری تھا کہ پہلے سے ایک سمارٹ کنٹریکٹ تعینات کیا جائے اور اس میں ممکنہ جیت کو شامل کیا جائے۔ یہ تکلیف دہ، وقت طلب اور مہنگا نکلا۔ اس وقت کوئی دوسرا محفوظ حل نہیں تھا۔

حال ہی میں، Tradisys ٹیم نے Waves پروٹوکول میں ایک فنکشن شامل کرنے کی تجویز پیش کی۔ rsaVerify(). یہ عوامی اور نجی کلید کی بنیاد پر RSA دستخط کی درستگی کی جانچ کرتا ہے۔ نتیجے کے طور پر، خصوصیت شامل کی گئی تھی.

ہم نے تین کھیل تیار کیے ہیں: ڈائس رولر, سکے پلٹائیں и لہروں پر سواری کریں۔. ہر ایک بے ترتیب نمبر ٹیکنالوجی کو لاگو کرتا ہے۔ آئیے معلوم کریں کہ یہ کیسے کام کرتا ہے۔

بلاکچین پر RSA بے ترتیب

آئیے مثال کے طور پر رائڈ آن ویوز کا استعمال کرتے ہوئے ایک بے ترتیب نمبر پیدا کرنے کو دیکھتے ہیں۔ سمارٹ کنٹریکٹ مل سکتا ہے۔ یہاں.

ٹیب پر جائیں اسکرپٹ اور منتخب کریں ڈی کمپائلڈ. آپ کو سمارٹ کنٹریکٹ کوڈ (عرف اسکرپٹ) نظر آئے گا۔

بلاکچین پر RSA بے ترتیب

سمارٹ کنٹریکٹ کوڈ میں افعال کا ایک سیٹ ہوتا ہے۔ جن کو @Callable کے بطور نشان زد کیا گیا ہے انہیں استعمال کرکے لانچ کیا جاسکتا ہے۔ دعوتی لین دین. ہم دو افعال میں دلچسپی رکھتے ہیں: شرط لگا سکتا ہوں и دستبردار:

  • فنک شرط (کھلاڑی کا انتخاب)
  • فنک انخلا (گیم آئی ڈی، آر ایس اے سائن)

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 الگورتھم اس طرح کام کرتا ہے۔ حتمی نمبر میں ہیرا پھیری نہیں کی جا سکتی، کیونکہ گیم آئی ڈی اور RSA لاگو کرنے کا نتیجہ معلوم نہیں ہے۔ نمبر چننا بھی بے معنی ہے۔

8. بلاکچین لین دین کو قبول کرتا ہے۔ یہ واپس لینے کا فنکشن چلاتا ہے (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

نیا تبصرہ شامل کریں