Көйгөй бар - борбордон ажыратылган тармакта кокус санды түзүү кыйын. Дээрлик бардык блокчейндер буга чейин эле кездешкен. Чынында эле, колдонуучулардын ортосунда ишеним жок тармактарда, талашсыз кокус санды түзүү көптөгөн көйгөйлөрдү чечет.
Бул макалада биз мисал катары оюндарды колдонуу менен көйгөйдү кантип чечкенибизди айтабыз. Алардын биринчиси болгон . Иштеп чыгуу үчүн бизге кокус сандар генератору керек болчу.

Башында биз блокчейнден алынган маалыматтын негизинде санды түзүүнү пландаштырганбыз. Бирок, андан кийин белгилүү болду: саны манипуляцияланышы мүмкүн, бул чечим ылайыктуу эмес дегенди билдирет.
Биз чечүү жолун таптык: commit-expand схемасын колдонуңуз. Сервер 1ден 5ке чейинки санды болжолдоп, ага туз кошуп, андан соң натыйжаны хэштеди . Сервер алдын ала сакталган номер менен акылдуу келишимди жайгаштырган. Көрсө, оюн колдонуучу хэш менен жашырылган санды болжолдоого чейин жетет.
Оюнчу коюмду коюп, сервер жашыруун номерди жана акылдуу келишимге "тузду" жөнөттү. Жөнөкөй сөз менен айтканда, ал карталарды ачып берди. Андан кийин сервер сандарды текшерип, колдонуучу утту же утулдубу деп чечкен.
Эгерде сервер текшерүү үчүн номер же "туз" жөнөтпөсө, колдонуучу утуп алды. Бул учурда, ар бир оюн үчүн алдын ала акылдуу келишимди жайгаштыруу жана ага потенциалдуу утуштарды кошуу керек болчу. Ыңгайсыз, убакытты талап кылган жана кымбат болуп чыкты. Ал убакта башка коопсуз чечим жок болчу.
Жакында Tradisys командасы Waves протоколуна функция кошууну сунуштады rsaVerify(). Бул ачык жана купуя ачкычтын негизинде RSA колунун жарактуулугун текшерет. Натыйжада, өзгөчөлүк кошулду.
Биз үч оюн иштеп чыктык: , и . Ар бири кокус сандар технологиясын ишке ашырат. Келгиле, анын кантип иштээрин карап көрөлү.

Мисал катары Ride on Waves аркылуу кокус санды түзүүнү карап көрөлү. акылдуу келишимди табууга болот .
Өтмөккө өтүңүз кол шрифти жана тандаңыз Декомпиляцияланган. Сиз акылдуу келишим кодун (ака скрипт) көрөсүз.

Акылдуу келишим коду функциялардын топтомун камтыйт. @Callable катары белгиленгендерди колдонуу менен ишке киргизсе болот Чакыруу транзакциялары. Биз эки функцияга кызыкдарбыз: мелдешүү и алып:
- func коюм (playerChoice)
- func алып салуу(gameId,rsaSign)
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"
}"Ачкыч" (ачкыч) - оюн ID жаңы оюн. Калган маалыматтар "маани" талаасынын сабында камтылган. Бул жазуулар өтмөктө сакталат маалыматтар акылдуу келишим:


5. Сервер акылдуу келишимди "карайт" жана блокчейн Api аркылуу жөнөтүлгөн транзакцияны (жаңы оюн) табат. Жаңы оюндун Оюн идентификатору блокчейнге мурунтан эле жазылган, демек аны мындан ары өзгөртүүгө же таасир этүүгө болбойт
6. Сервер алуу функциясын (gameId, rsaSign) жаратат. Мисалы, бул сыяктуу:
withdraw ("FwsuaaShC6DMWdSWQ5osGWtYkVbTEZrsnxqDbVx5oUpq", "base64:Gy69dKdmXUEsAmUrpoWxDLTQOGj5/qO8COA+QjyPVYTAjxXYvEESJbSiCSBRRCOAliqCWwaS161nWqoTL/TltiIvw3nKyd4RJIBNSIgEWGM1tEtNwwnRwSVHs7ToNfZ2Dvk/GgPUqLFDSjnRQpTHdHUPj9mQ8erWw0r6cJXrzfcagKg3yY/0wJ6AyIrflR35mUCK4cO7KumdvC9Mx0hr/ojlHhN732nuG8ps4CUlRw3CkNjNIajBUlyKQwpBKmmiy3yJa/QM5PLxqdppmfFS9y0sxgSlfLOgZ51xRDYuS8NViOA7c1JssH48ZtDbBT5yqzRJXs3RnmZcMDr/q0x6Bg==")7. Сервер акылдуу келишимге Чакыруу транзакциясын жөнөтөт (InvocationTx берүү). Транзакцияда түзүлгөн алып салуу функциясына чакыруу камтылган (gameId, rsaSign):

Функция камтыйт оюн ID жаңы оюн жана жеке ачкыч менен уникалдуу идентификатордун RSA кол коюусунун натыйжасы. Кол коюунун жыйынтыгы өзгөрүүсүз калды.
Бул эмнени билдирет?
Биз ошол эле маанини (оюн ID) алып, ага 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 колунун натыйжасы болуп саналат, алынат оюн ID купуя ачкыч (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 кол тамгасын жөнөтүшү керек. Параметр акылдуу келишимди жайылтууда конфигурацияланат. Эгерде берилген убакыттын ичинде эч нерсе болбосо, колдонуучу утат. Мындай учурда байгени өз дарегиңизге өзүңүз жөнөтүү керек. Көрсө, бул “серверге алдоо пайдалуу эмес”, анткени бул жоготууга алып келет. Төмөндө бир мисал келтирилген.

Колдонуучу ойноп жатат . Мен кубтун 2 тарабынын 6син тандадым, коюм 14 ТОЛКУН. Эгерде сервер көрсөтүлгөн убакыттын ичинде акылдуу келишимге жарактуу RSA кол тамгасын жөнөтпөсө (2880 блок), колдонуучу 34.44 WAVES алат.
Оюндарда сандарды түзүү үчүн биз oracle колдонобуз - тышкы, блокчейн эмес система. Сервер оюн идентификаторунун RSA кол тамгасын аткарат. Акылдуу келишим колдун жарактуулугун текшерип, жеңүүчүнү аныктайт. Эгерде сервер эч нерсе жөнөтпөсө, анда колдонуучу автоматтык түрдө утат.
Бул чынчыл муун ыкмасы, анткени манипуляция техникалык жактан мүмкүн эмес. Бардык Tradisys оюндары сүрөттөлгөн алгоритмдин негизинде иштейт. Блокчейн оюндары ушундайча иштейт. Баары ачык-айкын жана текшерилет. Башка блокчейндерде мындай системанын аналогдору жок. Бул адилеттүү кокустук.
Source: www.habr.com
