Kukho ingxaki - kunzima ukwenza inani elingaqhelekanga kuthungelwano olunatyisiweyo. Phantse zonke ii-blockchains sele zidibene nale nto. Enyanisweni, kwiinethiwekhi apho kungekho kuthembana phakathi kwabasebenzisi, ukudala inani elingenakuphikiswa elingenakuphikiswa lisombulula iingxaki ezininzi.
Kweli nqaku sikuxelela indlela esikwazile ngayo ukusombulula ingxaki ngokusebenzisa imidlalo njengomzekelo. Eyokuqala yaba
Ekuqaleni, saceba ukuvelisa inombolo esekelwe kulwazi oluvela kwi-blockchain. Nangona kunjalo, emva koko kwacaca: inani linokusetyenziswa, oku kuthetha ukuba isisombululo asifanelekanga.
Siye saza nesisombululo: sebenzisa iskimu sokwandisa ukuzibophelela. Umncedisi uqikelele inani ukusuka ku-1 ukuya ku-5, wongeza ityuwa kuyo, kwaye emva koko wakhawuleza isiphumo usebenzisa
Umdlali ubeke ukubheja, kwaye umncedisi wathumela inombolo efihliweyo kunye "netyuwa" kwinkontileka ehlakaniphile. Ngamagama alula, watyhila amakhadi. Emva koko, umncedisi ujonge amanani kwaye wagqiba ukuba umsebenzisi uphumelele okanye ulahlekile.
Ukuba umncedisi akathumelanga inombolo okanye "ityuwa" yokuqinisekisa, umsebenzisi uphumelele. Kule meko, kumdlalo ngamnye kwakuyimfuneko ukuba kusetyenziswe isivumelwano esihlakaniphile kwangaphambili kwaye kubandakanye ukuphumelela okunokwenzeka kuyo. Kwafumaniseka ukuba ayiyongxaki, yatya ixesha kwaye ibiza imali eninzi. Ngelo xesha sasingekho esinye isisombululo esikhuselekileyo.
Kutshanje, iqela leTradisys licebise ukongeza umsebenzi kwiprotocol yamaWaves rsaVerify(). Ijonga ukunyaniseka komsayino we-RSA ngokusekelwe kwisitshixo sikawonke-wonke nesabucala. Ngenxa yoko, umsebenzi wongezwa.
Siphuhlise imidlalo emithathu:
Makhe sijonge ekuveliseni inani elingenamkhethe sisebenzisa iRide on Waves njengomzekelo. Ikhontrakthi ehlakaniphile inokufumaneka
Yiya kwisithuba umbhalo-ngqangi kwaye ukhethe Idityanisiwe. Uya kubona ikhowudi yekhontrakthi ehlakaniphile (aka iskripthi).
Ikhowudi yekhontrakthi ehlakaniphile iqulethe isethi yemisebenzi. Ezo ziphawulwe njenge-@Callable zinokusungulwa kusetyenziswa Iintengiselwano zokucela. Sinomdla kwimisebenzi emibini: ukubheja ΠΈ siyeke:
- func ukubheja (playerChoice)
- func ukurhoxisa(umdlaloId,rsaSign)
1. Umsebenzisi ukhetha ubude becandelo kunye nobungakanani bokubheja.
2. Umxhasi wenza umsebenzi wokubheja. Kumfanekiso ongentla kuya kuba ukubheja("50").
3. Umxhasi uthumela i-Invocation transaction kwidilesi ye-smart contract (i-broadcast InvocationTx). Intengiselwano iqulethe umsebenzi wokubheja njengepharamitha yokufowuna. Oku kuthetha ukuba intengiselwano ye-Invocation ibangela ukuphunyezwa komsebenzi wokubheja (ukhetho: Intambo) kwikhontrakthi ehlakaniphile.
4. Qwalasela umsebenzi wokubheja:
@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)))
}
}
Umsebenzi ubhala umdlalo omtsha kwimeko yekhontrakthi ehlakaniphile. Oko kukuthi:
- Isichongi esisodwa somdlalo omtsha (i-id yomdlalo)
- Imeko yomdlalo = ITHUNYELWE
- Ukhetho lomdlali (ubude becandelo 50)
- Isitshixo sikawonke-wonke
- Ukuphumelela okunokwenzeka (kuxhomekeke kubhejo lomdlali)
Yile ndlela irekhodi yedatha kwi-blockchain ibonakala ngayo (ixabiso elingundoqo):
{
"type": "string",
"value": "03WON_0283_448t8Jn9P3717UnXFEVD5VWjfeGE5gBNeWg58H2aJeQEgJ_06574069_09116020000_0229",
"key": "2GKTX6NLTgUrE4iy9HtpSSHpZ3G8W4cMfdjyvvnc21dx"
}
"Isitshixo" (isitshixo) - umdlalo id umdlalo omtsha. Idatha eseleyo iqulethwe kumgca wentsimi "yexabiso". La mangeno agcinwe kwisithuba Iinkcukacha isivumelwano esihlakaniphile:
5. Umncedisi "ujonge" kwinkontileka ehlakaniphile kwaye ufumana ukuthengiselana okuthunyelwe (umdlalo omtsha) usebenzisa i-blockchain Api. I-id yomdlalo omtsha sele irekhodwe kwi-blockchain, okuthetha ukuba ayinakutshintshwa okanye iphenjelelwe.
6. Umncedisi uvelisa umsebenzi wokurhoxisa (umdlaloId, rsaSign). Umzekelo, njengale:
withdraw ("FwsuaaShC6DMWdSWQ5osGWtYkVbTEZrsnxqDbVx5oUpq", "base64:Gy69dKdmXUEsAmUrpoWxDLTQOGj5/qO8COA+QjyPVYTAjxXYvEESJbSiCSBRRCOAliqCWwaS161nWqoTL/TltiIvw3nKyd4RJIBNSIgEWGM1tEtNwwnRwSVHs7ToNfZ2Dvk/GgPUqLFDSjnRQpTHdHUPj9mQ8erWw0r6cJXrzfcagKg3yY/0wJ6AyIrflR35mUCK4cO7KumdvC9Mx0hr/ojlHhN732nuG8ps4CUlRw3CkNjNIajBUlyKQwpBKmmiy3yJa/QM5PLxqdppmfFS9y0sxgSlfLOgZ51xRDYuS8NViOA7c1JssH48ZtDbBT5yqzRJXs3RnmZcMDr/q0x6Bg==")
7. Umncedisi uthumela i-Invocation transaction kwi-smart contract (i-broadcast InvocationTx). Intengiselwano iqulethe umnxeba owenziweyo wokurhoxisa umsebenzi (umdlaloId, rsaSign):
Umsebenzi uqulathe umdlalo id umdlalo omtsha kunye nesiphumo sokusayinwa kweRSA kwesazisi esisodwa esineqhosha labucala. Isiphumo sotyikityo asitshintshanga.
Kuthetha ukuthini oku?
Sithatha ixabiso elifanayo (i-id yomdlalo) kwaye sisebenzise indlela yokutyikitya yeRSA kuyo. Siya kuhlala sifumana umphumo ofanayo. Le yindlela esebenza ngayo i-algorithm yeRSA. Inombolo yokugqibela ayinakuguqulwa, kuba i-id yomdlalo kunye nesiphumo sokusebenzisa i-RSA ayaziwa. Ukukhetha inani nako akunanjongo.
8. I-Blockchain iyamkela ukuthengiselana. Iqhuba umsebenzi wokurhoxisa (umdlaloId, rsaSign)
9. Ngaphakathi komsebenzi wokurhoxisa, ukuhoxiswa kwenzeka Yenza imisebenzi yeRandInt (umdlaloId, rsaSign). Le yinombolo yejenereyitha engaqhelekanga
# @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")
}
irandi - kwaye kukho inani elingaqhelekanga.
Okokuqala, umtya uthathiwe, osisiphumo sotyikityo lweRSA umdlalo id isitshixo sabucala (rsaSign). Emva koko ihashi nge-SHA-256 (sha256(rsaSign)).
Asinakuqikelela isiphumo sotyikityo kunye ne-hashing elandelayo. Ngoko ke, akunakwenzeka ukuchaphazela ukuveliswa kwenani elingaqhelekanga. Ukufumana inani kuluhlu oluthile (umzekelo, ukusuka ku-1 ukuya kwi-100), sebenzisa umsebenzi woguqulelo we-toInt kunye ne-%100 (efanayo
Ekuqaleni kwenqaku sikhankanye umsebenzi rsaVerify(), ekuvumela ukuba ujonge ubunyani bomsayino we-RSA usebenzisa isitshixo sabucala ngokuchasene neloluntu. Nali iGenerateRandInt(umdlaloId,rsaSign) inxalenye:
rsaVerify (SHA256, toBytes(gameId), rsaSign, RSAPUBLIC)
Isitshixo sikawonke-wonke RSAPUBLIC kunye nomtya we-rsaSign zigqithiselwa kwigalelo. Utyikityo lujongiwe ukunyaniseka. Inani lenziwa ukuba itshekhi iphumelele. Kungenjalo, isixokelelwano sithathela ingqalelo ukuba umsayino awusebenzi (utyikityo olungasebenziyo lweRSA).
Umncedisi kufuneka asayine id yomdlalo ngeqhosha labucala kwaye athumele umsayino osebenzayo we-Rsa ngaphakathi kweebhloko ezingama-2880. Ipharamitha iqwalaselwe xa kuthunyelwa inkontileka ehlakaniphile. Ukuba akukho nto yenzekayo ngexesha elibekiweyo, umsebenzisi uyaphumelela. Kule meko, ibhaso kufuneka lithunyelwe kwidilesi yakho ngokwakho. Kuvela ukuba "akunanzuzo kumncedisi ukukopela", kuba oku kukhokelela ekulahlekelweni. Apha ngezantsi kukho umzekelo.
Umsebenzisi uyadlala
Ukuvelisa amanani kwimidlalo, sisebenzisa i-oracle - inkqubo yangaphandle, engekho-blockchain. Umncedisi wenza utyikityo lwe RSA ye id yomdlalo. Ikhontrakthi ye-smart ijonga ukuba semthethweni komsayino kwaye imisela ophumeleleyo. Ukuba umncedisi akathumeli nto, ngoko umsebenzisi uya kuphumelela ngokuzenzekelayo.
Le yindlela yesizukulwana esinyanisekileyo, kuba ukukhohlisa akunakwenzeka ngokobuchwepheshe. Yonke imidlalo yeTradisys isebenza ngokusekelwe kwi-algorithm echazwe. Le yindlela imidlalo ye-blockchain esebenza ngayo. Yonke into iselubala kwaye iyangqinwa. Akukho zifaniso zenkqubo enjalo kuyo nayiphi na enye i-blockchain. Le yinto eqhelekileyo.
umthombo: www.habr.com