ایک مسئلہ ہے - وکندریقرت نیٹ ورک میں بے ترتیب نمبر بنانا مشکل ہے۔ تقریباً تمام بلاکچینز پہلے ہی اس کا سامنا کر چکے ہیں۔ درحقیقت، ایسے نیٹ ورکس میں جہاں صارفین کے درمیان کوئی اعتماد نہیں ہے، ایک ناقابل تردید بے ترتیب نمبر بنانا بہت سے مسائل کو حل کرتا ہے۔
اس آرٹیکل میں ہم آپ کو بتاتے ہیں کہ ہم نے گیمز کو بطور مثال استعمال کرتے ہوئے اس مسئلے کو کیسے حل کیا۔ ان میں سے پہلا تھا۔
ابتدائی طور پر، ہم نے بلاکچین سے معلومات کی بنیاد پر ایک نمبر بنانے کا منصوبہ بنایا۔ تاہم، پھر یہ واضح ہو گیا: نمبر میں ہیرا پھیری کی جا سکتی ہے، جس کا مطلب ہے کہ حل مناسب نہیں ہے۔
ہم ایک حل لے کر آئے ہیں: کمٹ کی توسیع اسکیم کا استعمال کریں۔ سرور نے 1 سے 5 تک کی تعداد کا اندازہ لگایا، اس میں نمک شامل کیا، اور پھر اس کا استعمال کرتے ہوئے نتیجہ کو ہیش کیا۔
کھلاڑی نے شرط لگائی، اور سرور نے چھپا ہوا نمبر اور "نمک" سمارٹ کنٹریکٹ پر بھیج دیا۔ آسان الفاظ میں، اس نے کارڈز کا انکشاف کیا۔ اس کے بعد، سرور نے نمبروں کو چیک کیا اور فیصلہ کیا کہ آیا صارف جیت گیا یا ہارا۔
اگر سرور نے تصدیق کے لیے نمبر یا "نمک" نہیں بھیجا تو صارف جیت گیا۔ اس صورت میں، ہر گیم کے لیے ضروری تھا کہ پہلے سے ایک سمارٹ کنٹریکٹ تعینات کیا جائے اور اس میں ممکنہ جیت کو شامل کیا جائے۔ یہ تکلیف دہ، وقت طلب اور مہنگا نکلا۔ اس وقت کوئی دوسرا محفوظ حل نہیں تھا۔
حال ہی میں، Tradisys ٹیم نے Waves پروٹوکول میں ایک فنکشن شامل کرنے کی تجویز پیش کی۔ 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"
}
"کلید" (کلید) - گیم آئی ڈی نیا کھیل. باقی ڈیٹا "ویلیو" فیلڈ کی لائن میں موجود ہے۔ یہ اندراجات ٹیب میں محفوظ ہیں۔ ڈیٹا سمارٹ معاہدہ:
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. بلاکچین لین دین کو قبول کرتا ہے۔ یہ واپس لینے کا فنکشن چلاتا ہے (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 دستخط کرتا ہے۔ سمارٹ کنٹریکٹ دستخط کی درستگی کی جانچ کرتا ہے اور فاتح کا تعین کرتا ہے۔ اگر سرور کچھ نہیں بھیجتا ہے، تو صارف خود بخود جیت جاتا ہے۔
یہ ایک ایماندار نسل کا طریقہ ہے، کیونکہ ہیرا پھیری تکنیکی طور پر ناممکن ہے۔ تمام Tradisys گیمز بیان کردہ الگورتھم کی بنیاد پر کام کرتے ہیں۔ بلاکچین گیمز اس طرح کام کرتی ہیں۔ سب کچھ شفاف اور قابل تصدیق ہے۔ کسی دوسرے بلاکچین میں اس طرح کے نظام کے کوئی ینالاگ نہیں ہیں۔ یہ ایک منصفانہ بے ترتیب ہے۔
ماخذ: www.habr.com