RSA تصادفی در بلاک چین

مشکلی وجود دارد - تولید یک عدد تصادفی در یک شبکه غیرمتمرکز دشوار است. تقریباً تمام بلاک چین ها قبلاً با این مورد مواجه شده اند. در واقع، در شبکه هایی که هیچ اعتمادی بین کاربران وجود ندارد، ایجاد یک عدد تصادفی غیرقابل انکار بسیاری از مشکلات را حل می کند.

در این مقاله به شما می گوییم که چگونه توانستیم با استفاده از بازی ها به عنوان مثال مشکل را حل کنیم. اولین آنها بود درخت کریسمس امواج. برای توسعه، به یک مولد اعداد تصادفی نیاز داشتیم.

RSA تصادفی در بلاک چین

در ابتدا، ما برنامه ریزی کردیم تا بر اساس اطلاعات بلاک چین، عددی تولید کنیم. با این حال، سپس مشخص شد: می توان عدد را دستکاری کرد، به این معنی که راه حل مناسب نیست.

ما به یک راه حل رسیدیم: از طرح commit-expand استفاده کنید. سرور یک عدد از 1 تا 5 را حدس زد، یک نمک به آن اضافه کرد و سپس نتیجه را با استفاده از هش کرد. توابع Keccak. سرور قرارداد هوشمند را با شماره ای که قبلاً ذخیره کرده بود، اجرا کرد. به نظر می رسد که بازی به حدس زدن شماره پنهان شده توسط هش توسط کاربر خلاصه می شود.

بازیکن شرط بندی کرد و سرور شماره پنهان و "نمک" را به قرارداد هوشمند ارسال کرد. به زبان ساده، او کارت ها را فاش کرد. پس از آن، سرور اعداد را بررسی کرد و تصمیم گرفت که آیا کاربر برنده یا باخته است.

اگر سرور یک عدد یا "سالت" را برای تأیید ارسال نکند، کاربر برنده می شود. در این مورد، برای هر بازی لازم بود از قبل یک قرارداد هوشمند مستقر شود و برنده‌های احتمالی در آن گنجانده شود. معلوم شد که ناخوشایند، وقت گیر و گران است. در آن زمان هیچ راه حل مطمئن دیگری وجود نداشت.

اخیراً تیم Tradisys اضافه کردن یک تابع به پروتکل Waves را پیشنهاد کرده است rsaVerify(). اعتبار امضای RSA را بر اساس کلید عمومی و خصوصی بررسی می کند. در نتیجه این ویژگی اضافه شد.

ما سه بازی توسعه داده ایم: می گوید غلتک, تلنگر سکه и سوار بر امواج. هر کدام از آنها فناوری اعداد تصادفی را پیاده سازی می کنند. بیایید بفهمیم که چگونه کار می کند.

RSA تصادفی در بلاک چین

بیایید به تولید یک عدد تصادفی با استفاده از Ride on Waves به عنوان مثال نگاه کنیم. قرارداد هوشمند را می توان پیدا کرد اینجا.

به برگه بروید خط و انتخاب کنید دکامپایل شد. کد قرارداد هوشمند (معروف به اسکریپت) را خواهید دید.

RSA تصادفی در بلاک چین

کد قرارداد هوشمند شامل مجموعه ای از توابع است. مواردی که به عنوان @Callable علامت گذاری شده اند را می توان با استفاده از آن راه اندازی کرد معاملات فراخوانی. ما به دو عملکرد علاقه مندیم: شرط и برداشت :

  • شرط بندی func (playerChoice)
  • برداشت func (gameId،rsaSign)

1. کاربر طول بخش و اندازه شرط را انتخاب می کند.

RSA تصادفی در بلاک چین

2. مشتری یک تابع شرط ایجاد می کند. برای تصویر بالا این خواهد بود شرط بندی ("50").

3. مشتری یک تراکنش Invocation را به آدرس قرارداد هوشمند (broadcast InvocationTx) ارسال می کند. تراکنش شامل تابع شرط به عنوان پارامتر تماس است. این بدان معنی است که تراکنش Invocation اجرای تابع شرط (انتخاب: رشته) را در قرارداد هوشمند آغاز می کند.

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. سرور یک تراکنش Invocation را به قرارداد هوشمند (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)).

ما نمی توانیم نتیجه امضا و هش بعدی را پیش بینی کنیم. بنابراین، تأثیرگذاری بر تولید یک عدد تصادفی غیرممکن است. برای به دست آوردن یک عدد در یک محدوده خاص (مثلاً از 1 تا 100)، از تابع تبدیل toInt و %100 (مشابه وزارت دفاع).

در ابتدای مقاله به تابع اشاره کردیم rsaVerify()، که به شما امکان می دهد اعتبار یک امضای RSA را با استفاده از یک کلید خصوصی در برابر یک کلید عمومی بررسی کنید. در اینجا بخش GenerateRandInt(gameId,rsaSign) است:

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

کلید عمومی RSAPUBLIC و رشته rsaSign به ورودی ارسال می شود. امضا از نظر اعتبار بررسی می شود. در صورت موفقیت آمیز بودن چک، عدد تولید می شود. در غیر این صورت، سیستم در نظر می گیرد که امضا معتبر نیست (امضای Invalid RSA).

سرور باید شناسه بازی را با یک کلید خصوصی امضا کند و یک امضای معتبر Rsa را در 2880 بلوک ارسال کند. این پارامتر هنگام استقرار قرارداد هوشمند پیکربندی می شود. اگر در مدت زمان تعیین شده اتفاقی نیفتد، کاربر برنده است. در این صورت جایزه باید خودتان به آدرس شما ارسال شود. به نظر می رسد که "فریب دادن سرور برای سرور سودآور نیست"، زیرا این منجر به ضرر می شود. در زیر یک نمونه آورده شده است.

RSA تصادفی در بلاک چین

کاربر در حال بازی است می گوید غلتک. من 2 طرف از 6 طرف مکعب را انتخاب کردم، شرط 14 موج است. اگر سرور امضای معتبر RSA را در مدت زمان مشخص شده (2880 بلوک) به قرارداد هوشمند ارسال نکند، کاربر 34.44 WAVES را می گیرد.

برای تولید اعداد در بازی ها، از اوراکل استفاده می کنیم - یک سیستم خارجی و غیر بلاک چینی. سرور یک امضای RSA از شناسه بازی را انجام می دهد. قرارداد هوشمند اعتبار امضا را بررسی می کند و برنده را مشخص می کند. اگر سرور چیزی ارسال نکند، کاربر به طور خودکار برنده می شود.

این یک روش تولید صادقانه است، زیرا دستکاری از نظر فنی غیرممکن است. همه بازی های Tradisys بر اساس الگوریتم توصیف شده کار می کنند. بازی های بلاک چین اینگونه عمل می کنند. همه چیز شفاف و قابل تایید است. مشابه چنین سیستمی در هیچ بلاک چین دیگری وجود ندارد. این یک تصادفی منصفانه است.

منبع: www.habr.com

اضافه کردن نظر