RSA o aza sou blockchain

Gen yon pwoblèm - li difisil pou jenere yon nimewo o aza nan yon rezo desantralize. Prèske tout blockchains te deja rankontre sa a. Vreman vre, nan rezo kote pa gen okenn konfyans ant itilizatè yo, kreye yon nimewo o aza nye rezoud anpil pwoblèm.

Nan atik sa a nou di w kouman nou jere yo rezoud pwoblèm nan lè l sèvi avèk jwèt kòm yon egzanp. Premye nan yo te Sou entènèt jwèt Waves Nwèl Tree. Pou devlopman, nou te bezwen yon dèlko nimewo o aza.

RSA o aza sou blockchain

Okòmansman, nou te planifye jenere yon nimewo ki baze sou enfòmasyon ki soti nan blockchain la. Sepandan, Lè sa a, li te vin klè: nimewo a ka manipile, ki vle di solisyon an pa apwopriye.

Nou te vini ak yon solisyon: sèvi ak konplo a komèt-agrandi. Sèvè a devine yon nimewo ki soti nan 1 a 5, li ajoute yon sèl nan li, epi answit hache rezilta a lè l sèvi avèk Keccak fonksyon. Sèvè a te deplwaye kontra entelijan ak nimewo ki deja sove a davans. Li sanble ke jwèt la bouyi desann nan itilizatè a devine nimewo a kache pa hash la.

Jwè a mete yon parye, ak sèvè a voye nimewo kache a ak "sèl" nan kontra a entelijan. An tèm senp, li te revele kat yo. Apre sa, sèvè a tcheke nimewo yo epi li deside si itilizatè a genyen oswa pèdi.

Si sèvè a pa voye yon nimewo oswa "sèl" pou verifikasyon, itilizatè a te genyen. Nan ka sa a, pou chak jwèt li te nesesè yo deplwaye yon kontra entelijan davans epi enkli genyen potansyèl yo nan li. Li te tounen soti nan konvenyan, tan konsome ak chè. Nan epòk sa a pa te gen okenn lòt solisyon an sekirite.

Dènyèman, ekip Tradisys la te pwopoze ajoute yon fonksyon nan pwotokòl Waves la rsaVerify(). Li tcheke validite siyati RSA a ki baze sou kle piblik ak prive. Kòm yon rezilta, karakteristik la te ajoute.

Nou te devlope twa jwèt: Woulo zo, Pyès monnen Flip и Woulib sou vag. Chak moun aplike teknoloji nimewo o aza. Ann chèche konnen ki jan li fonksyone.

RSA o aza sou blockchain

Ann gade nan jenere yon nimewo o aza lè l sèvi avèk Ride on Waves kòm yon egzanp. Ou ka jwenn kontra entelijan an isit la.

Ale nan tab la Script epi chwazi Dekonpile. Ou pral wè kòd kontra entelijan an (aka script).

RSA o aza sou blockchain

Kòd kontra entelijan an gen yon seri fonksyon. Moun ki make kòm @Callable ka lanse lè l sèvi avèk Tranzaksyon envokasyon. Nou enterese nan de fonksyon: parye и retire:

  • parye fonksyon (playerChoice)
  • fonksyon retire (gameId, rsaSign)

1. Itilizatè a chwazi longè segman an ak gwosè parye a.

RSA o aza sou blockchain

2. Kliyan an kreye yon fonksyon parye. Pou imaj ki anwo a li ta parye ("50").

3. Kliyan an voye yon tranzaksyon Invocation nan adrès kontra entelijan (emisyon InvocationTx). Tranzaksyon an gen fonksyon parye kòm yon paramèt apèl. Sa vle di ke tranzaksyon Envokasyon an deklanche ekzekisyon fonksyon parye (chwa: Chaîne) sou kontra entelijan an.

RSA o aza sou blockchain

4. Konsidere fonksyon parye a:

@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)))
                    }
    }

Fonksyon an ekri yon jwèt nouvo nan eta a nan kontra a entelijan. Savwa:

  • Idantifyan inik pou yon nouvo jwèt (id jwèt)
  • Eta jwèt = SUBMITTED
  • Chwa jwè (longè segman 50)
  • Kle piblik
  • Genyen potansyèl (depann sou parye jwè a)

RSA o aza sou blockchain

Men sa yon dosye done nan blockchain a sanble (kle-valè):

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

"Kle" (kle) - jwèt id nouvo jwèt. Done ki rete yo genyen nan liy lan nan "valè" jaden an. Antre sa yo estoke nan tab la Done kontra entelijan:

RSA o aza sou blockchain

RSA o aza sou blockchain

5. Sèvè a "gade" nan kontra a entelijan epi li jwenn tranzaksyon an voye (nouvo jwèt) lè l sèvi avèk blockchain Api la. Idantite jwèt la nan nouvo jwèt la deja anrejistre nan blòk la, ki vle di li pa ka chanje oswa enfliyanse ankò.

6. Sèvè a jenere yon fonksyon retire (gameId, rsaSign). Pou egzanp, tankou sa a:

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

7. Sèvè a voye yon tranzaksyon Invocation nan kontra entelijan (emisyon InvocationTx). Tranzaksyon an gen yon apèl nan fonksyon an retire fòme (gameId, rsaSign):

RSA o aza sou blockchain

Fonksyon an gen ladan l jwèt id nouvo jwèt ak rezilta RSA siyen yon idantifyan inik ak yon kle prive. Rezilta siyati a pa chanje.

Kisa sa vle di?

Nou pran menm valè a (id jwèt) epi aplike metòd siyati RSA a. N ap toujou jwenn menm rezilta a. Men ki jan algorithm RSA a ap travay. Nimewo final la pa ka manipile, depi id jwèt la ak rezilta a nan aplike RSA yo pa konnen. Chwazi yon nimewo tou se initil.

8. Blockchain aksepte tranzaksyon an. Li kouri fonksyon an retire (gameId, rsaSign)

9. Anndan fonksyon an retire, retrè fèt Fonksyon GenerateRandInt (gameId, rsaSign). Sa a se yon dèlko nimewo o aza

# @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")
    }

rand - epi gen yon nimewo o aza.

Premyèman, yo pran fisèl la, ki se rezilta siyati RSA a jwèt id kle prive (rsaSign). Lè sa a, hache ak SHA-256 (sha256(rsaSign)).

Nou pa ka predi rezilta siyati a ak hachaj ki vin apre a. Se poutèt sa, li enposib enfliyanse jenerasyon an nan yon nimewo o aza. Pou jwenn yon nimewo nan yon seri sèten (pa egzanp, soti nan 1 a 100), sèvi ak fonksyon konvèsyon toInt ak % 100 (menm jan ak Mod).

Nan kòmansman atik la nou mansyone fonksyon an rsaVerify(), ki pèmèt ou tcheke validite yon siyati RSA lè l sèvi avèk yon kle prive kont yon siyati piblik. Men pati GenerateRandInt(gameId,rsaSign):

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

Kle piblik RSAPUBLIC ak fisèl rsaSign yo pase nan opinyon an. Yo tcheke siyati a pou validite. Nimewo a pwodui si chèk la reyisi. Sinon, sistèm nan konsidere ke siyati a pa valab (siyati RSA envalid).

Sèvè a dwe siyen idantifikasyon jwèt la ak yon kle prive epi voye yon siyati Rsa valab nan 2880 blòk. Se paramèt la configuré lè deplwaye kontra entelijan an. Si pa gen anyen ki rive nan tan yo bay la, itilizatè a genyen. Nan ka sa a, yo dwe voye pri a nan adrès ou tèt ou. Li sanble ke li "pa pwofitab pou sèvè a tronpe", paske sa a mennen nan pèt. Anba a se yon egzanp.

RSA o aza sou blockchain

Itilizatè a ap jwe Woulo zo. Mwen te chwazi 2 nan 6 kote kib la, parye a se 14 VAG. Si sèvè a pa voye yon siyati RSA valab nan kontra entelijan an nan tan espesifye (2880 blòk), itilizatè a pral pran 34.44 WAVES.

Pou jenere nimewo nan jwèt, nou itilize yon Oracle - yon sistèm ekstèn, ki pa bloke. Sèvè a fè yon siyati RSA nan id jwèt la. Kontra entelijan an tcheke validite siyati a epi detèmine gayan an. Si sèvè a pa voye anyen, lè sa a itilizatè a otomatikman genyen.

Sa a se yon metòd jenerasyon onèt, paske manipilasyon se teknikman enposib. Tout jwèt Tradisys travay ki baze sou algorithm ki dekri a. Men ki jan jwèt blockchain travay. Tout bagay se transparan ak verifye. Pa gen okenn analogue nan yon sistèm konsa nan nenpòt lòt blockchain. Sa a se yon o aza jis.

Sous: www.habr.com

Add nouvo kòmantè