RSA random amin'ny blockchain

Misy ny olana - sarotra ny mamorona isa kisendrasendra ao amin'ny tambajotram-pitantanana. Saika ny blockchain rehetra dia efa nihaona tamin'izany. Eny tokoa, amin'ny tambajotra izay tsy misy fifampitokisana eo amin'ny mpampiasa, ny famoronana isa tsy azo lavina dia mamaha olana maro.

Ato amin'ity lahatsoratra ity dia milaza aminao ny fomba nahavita hamaha ny olana amin'ny fampiasana ny lalao ho ohatra. Ny voalohany tamin'izy ireo dia Hazo Krismasy Waves. Ho an'ny fampandrosoana dia mila mpamokatra nomerao kisendrasendra izahay.

RSA random amin'ny blockchain

Tany am-boalohany dia nikasa ny hamorona isa mifototra amin'ny fampahalalana avy amin'ny blockchain izahay. Nazava anefa avy eo hoe: azo amboarina ny isa, izany hoe tsy mety ny vahaolana.

Nahita vahaolana izahay: ampiasao ny drafitra commit-expand. Naminavina isa 1 ka hatramin'ny 5 ny mpizara, nampiana sira iray, ary avy eo dia nanaisotra ny valiny tamin'ny fampiasana Keccak functions. Ny mpizara dia nametraka ny fifanarahana marani-tsaina miaraka amin'ny laharana efa voatahiry mialoha. Hita fa ny lalao dia mitodika amin'ny mpampiasa maminavina ny isa nafenin'ny hash.

Nametraka filokana ilay mpilalao, ary nandefa ny isa miafina sy ny "sira" ho an'ny fifanarahana marani-tsaina ny mpizara. Raha tsorina dia nambarany ireo karatra. Taorian'izay dia nanamarina ny isa ny mpizara ary nanapa-kevitra raha nandresy na resy ny mpampiasa.

Raha tsy nandefa isa na β€œsira” ho fanamarinana ny mpizara dia nandresy ny mpampiasa. Amin'ity tranga ity, ho an'ny lalao tsirairay dia ilaina ny mametraka fifanarahana marani-tsaina mialoha ary mampiditra ny mety ho fandresena ao anatiny. Nivadika ho tsy nety, nandany fotoana ary lafo. Tamin'izany fotoana izany dia tsy nisy vahaolana azo antoka hafa.

Vao haingana, ny ekipa Tradisys dia nanolotra soso-kevitra hanampiana fiasa amin'ny protocol Waves rsaVerify(). Izy io dia manamarina ny maha-ara-dalΓ na ny sonia RSA mifototra amin'ny fanalahidin'ny daholobe sy tsy miankina. Vokatr'izany dia nampiana ilay endri-javatra.

Namolavola lalao telo izahay: Dice Roller, Flip Coin ΠΈ Ride On Waves. Ny tsirairay amin'izy ireo dia mampiasa teknolojia nomerika kisendrasendra. Andeha hojerentsika ny fomba fiasan'izy io.

RSA random amin'ny blockchain

Andeha hojerentsika ny famoronana isa kisendrasendra amin'ny fampiasana Ride on Waves ho ohatra. Ny fifanarahana smart dia azo jerena eto.

Mandehana any amin'ny kiheba Script ary safidio Decompiled. Ho hitanao ny code contrat smart (aka script).

RSA random amin'ny blockchain

Ny kaody fifanarahana marani-tsaina dia misy andiana asa. Ireo voamarika ho @Callable dia azo atomboka amin'ny fampiasana Transactions invocation. Liana amin'ny fiasa roa izahay: Bet ΠΈ hiala:

  • func bet (playerChoice)
  • Func withdraw(gameId,rsaSign)

1. Ny mpampiasa dia mifidy ny halavan'ny fizarana sy ny haben'ny filokana.

RSA random amin'ny blockchain

2. Ny mpanjifa dia mamorona asa filokana. Ho an'ny sary etsy ambony dia mety bet("50").

3. Ny mpanjifa dia mandefa fifampiraharahana amin'ny Invocation mankany amin'ny adiresy fifanarahana marani-tsaina (broadcast InvocationTx). Ny fifampiraharahana dia misy ny fiasan'ny bet ho toy ny mari-pamantarana antso. Midika izany fa ny fifampiraharahana Invocation dia miteraka ny fanatanterahana ny asa filokana (safidy: String) amin'ny fifanarahana marani-tsaina.

RSA random amin'ny blockchain

4. Diniho ny fiasan'ny filokana:

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

Ny fiasa dia manoratra lalao vaovao amin'ny toetry ny fifanarahana marani-tsaina. izany hoe:

  • Mpanondro tokana ho an'ny lalao vaovao (lalao id)
  • Fanjakana lalao = NAVERINA
  • Safidin'ny mpilalao (halavan'ny fizarana 50)
  • Key public
  • Fandresena mety hitranga (miankina amin'ny filokana an'ny mpilalao)

RSA random amin'ny blockchain

Toy izao ny firaketana data ao amin'ny blockchain (key-value):

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

"Key" (key) - lalao id lalao vaovao. Ny angon-drakitra sisa dia voarakitra ao amin'ny andalana amin'ny saha "value". Ireo fidirana ireo dia voatahiry ao amin'ny tabilao Data fifanarahana smart:

RSA random amin'ny blockchain

RSA random amin'ny blockchain

5. Ny mpizara dia "mijery" ny fifanarahana marani-tsaina ary mahita ny fifampiraharahana nalefa (lalao vaovao) mampiasa ny blockchain Api. Ny id Game an'ny lalao vaovao dia efa voarakitra ao amin'ny blockchain, izay midika fa tsy azo ovaina na voataona intsony

6. Ny mpizara dia mamorona fiasa misintona (gameId, rsaSign). Ohatra, toy izao:

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

7. Ny mpizara dia mandefa fifampiraharahana Invocation amin'ny fifanarahana marani-tsaina (broadcast InvocationTx). Ny fifampiraharahana dia misy antso mankany amin'ny fiasa misintona (gameId, rsaSign):

RSA random amin'ny blockchain

Ny fiasa dia misy lalao id lalao vaovao sy ny vokatry ny sonia RSA famantarana tokana miaraka amin'ny fanalahidy manokana. Tsy miova ny vokatry ny sonia.

Inona no dikan'izany?

Raisinay ny sanda mitovy (id lalao) ary ampiharo amin'izany ny fomba sonia RSA. Hahazo vokatra mitovy foana isika. Izany no fomba fiasan'ny algorithm RSA. Tsy azo ovaina ny isa farany, satria tsy fantatra ny id lalao sy ny vokatry ny fampiharana ny RSA. Tsy misy dikany koa ny fisafidianana isa.

8. Blockchain dia manaiky ny fifampiraharahana. Izy io dia mitantana ny fiasa misintona (gameId, rsaSign)

9. Ao anatin'ny fiasan'ny fisintahana dia misy ny fisintonana GenerateRandInt asa (gameId, rsaSign). Izy io dia mpamokatra nomerao kisendrasendra

# @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 - ary misy isa kisendrasendra.

Voalohany, alaina ny tady, izay vokatry ny sonia RSA lalao id fanalahidy manokana (rsaSign). Avy eo dia voasivana miaraka amin'ny SHA-256 (sha256(rsaSign)).

Tsy afaka maminavina ny vokatry ny sonia sy ny hashing manaraka isika. Noho izany, tsy azo atao ny mitaona ny famoronana isa kisendrasendra. Mba hahazoana isa amin'ny faritra iray (ohatra, manomboka amin'ny 1 ka hatramin'ny 100), ampiasao ny toInt fiovam-po sy %100 (mitovy amin'ny Mod).

Tany am-piandohan'ny lahatsoratra dia niresaka momba ny asa rsaVerify(), izay ahafahanao manamarina ny maha-ara-dalΓ na ny sonia RSA amin'ny fampiasana fanalahidy manokana amin'ny an'ny daholobe. Ity ny ampahany GenerateRandInt(gameId,rsaSign):

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

Ny lakilen'ny daholobe RSAPUBLIC sy ny tady rsaSign dia alefa amin'ny fampidirana. Ny sonia dia voamarina fa manan-kery. Ny isa dia vokarina raha mahomby ny fanamarinana. Raha tsy izany dia heverin'ny rafitra fa tsy manan-kery ny sonia (sonia RSA tsy mety).

Ny mpizara dia tsy maintsy manao sonia ny id lalao amin'ny fanalahidy manokana ary mandefa sonia Rsa manan-kery ao anatin'ny 2880 sakana. Ny parameter dia amboarina rehefa mampiasa ny fifanarahana marani-tsaina. Raha tsy misy zavatra mitranga ao anatin'ny fotoana voatondro dia mandresy ny mpampiasa. Amin'ity tranga ity dia tsy maintsy alefa any amin'ny adiresinao ny loka. Hita fa "tsy mahasoa ny mpizara ny mamitaka", satria miteraka fatiantoka izany. Ity ambany ity ny ohatra iray.

RSA random amin'ny blockchain

Milalao ny mpampiasa Dice Roller. Nisafidy 2 tamin'ny lafiny 6 amin'ny cube aho, ny filokana dia 14 WAVES. Raha tsy mandefa sonia RSA manan-kery amin'ny fifanarahana marani-tsaina ny mpizara ao anatin'ny fotoana voafaritra (2880 blocs), dia handray 34.44 WAVES ny mpampiasa.

Mba hamoronana isa amin'ny lalao dia mampiasa oracle izahay - rafitra ivelany tsy misy blockchain. Ny mpizara dia manao sonia RSA amin'ny id lalao. Ny fifanarahana smart dia manamarina ny maha-ara-dalΓ na ny sonia ary mamaritra ny mpandresy. Raha tsy mandefa na inona na inona ny mpizara dia mandresy ho azy ny mpampiasa.

Ity dia fomba famokarana marina, satria tsy azo atao ny manodinkodina. Ny lalao Tradisys rehetra dia miasa mifototra amin'ny algorithm voalaza. Izany no fomba fiasan'ny lalao blockchain. Mangarahara sy azo hamarinina ny zava-drehetra. Tsy misy analogue ny rafitra toy izany amin'ny blockchain hafa. Kisendrasendra fotsiny izany.

Source: www.habr.com

Add a comment