RSA blockchain üzerinde rastgele

Bir sorun var; merkezi olmayan bir ağda rastgele bir sayı oluşturmak zordur. Hemen hemen tüm blockchainler bununla zaten karşılaştı. Nitekim kullanıcılar arasında güvenin bulunmadığı ağlarda inkar edilemez bir rasgele sayı oluşturmak birçok sorunu çözmektedir.

Bu yazıda size örnek olarak oyunları kullanarak sorunu nasıl çözmeyi başardığımızı anlatacağız. Bunlardan ilki Dalgalar Noel Ağacı. Geliştirme için rastgele bir sayı üretecine ihtiyacımız vardı.

RSA blockchain üzerinde rastgele

Başlangıçta blockchainden gelen bilgilere dayanarak bir sayı oluşturmayı planladık. Ancak daha sonra şu ortaya çıktı: Sayı manipüle edilebilir, bu da çözümün uygun olmadığı anlamına gelir.

Geçici bir çözüm bulduk: taahhüt genişletme şemasını kullanın. Sunucu 1'den 5'e kadar bir sayı tahmin etti, buna bir tuz ekledi ve ardından sonucu kullanarak karma işlemi yaptı. Keccak fonksiyonları. Sunucu, akıllı sözleşmeyi önceden kaydedilmiş numarayla önceden dağıttı. Oyunun, karma tarafından gizlenen sayıyı tahmin eden kullanıcıya indirgendiği ortaya çıktı.

Oyuncu bir bahis koydu ve sunucu gizli sayıyı ve "tuzu" akıllı sözleşmeye gönderdi. Basit bir ifadeyle kartları ortaya çıkardı. Bundan sonra sunucu sayıları kontrol etti ve kullanıcının kazanıp kazanmadığına karar verdi.

Sunucu doğrulama için bir sayı veya "tuz" göndermezse kullanıcı kazandı. Bu durumda, her oyun için önceden bir akıllı sözleşme dağıtmak ve potansiyel kazançları buna dahil etmek gerekiyordu. Zahmetli, zaman alıcı ve pahalı olduğu ortaya çıktı. O zamanlar başka güvenli bir çözüm yoktu.

Son zamanlarda Tradisys ekibi Waves protokolüne bir işlev eklemeyi önerdi rsaDoğrulama(). RSA imzasının geçerliliğini genel ve özel anahtara göre kontrol eder. Sonuç olarak özellik eklendi.

Üç oyun geliştirdik: Roller diyor, Coin Flip и Dalgaların Üzerinde Binmek. Her biri rastgele sayı teknolojisini uygular. Nasıl çalıştığını anlayalım.

RSA blockchain üzerinde rastgele

Örnek olarak Ride on Waves'i kullanarak rastgele bir sayı üretmeye bakalım. Akıllı sözleşme bulunabilir burada.

sekmeye git Senaryo ve seçin derlenmiş. Akıllı sözleşme kodunu (diğer adıyla komut dosyası) göreceksiniz.

RSA blockchain üzerinde rastgele

Akıllı sözleşme kodu bir dizi işlev içerir. @Callable olarak işaretlenenler kullanılarak başlatılabilir. Çağırma işlemleri. İki fonksiyonla ilgileniyoruz: bahis и geri çekilmek:

  • işlev bahisi (oyuncu Seçimi)
  • func çekilme(gameId,rsaSign)

1. Kullanıcı segmentin uzunluğunu ve bahis boyutunu seçer.

RSA blockchain üzerinde rastgele

2. Müşteri bir bahis fonksiyonu oluşturur. Yukarıdaki resim için şöyle olurdu bahis("50").

3. İstemci akıllı sözleşme adresine bir Çağırma işlemi gönderir (InvokasyonTx yayını). İşlem, çağrı parametresi olarak bahis fonksiyonunu içerir. Bu, Çağırma işleminin akıllı sözleşmedeki bahis fonksiyonunun (seçim: String) yürütülmesini tetiklediği anlamına gelir.

RSA blockchain üzerinde rastgele

4. Bahis fonksiyonunu düşünün:

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

Fonksiyon akıllı sözleşmenin durumuna yeni bir oyun yazar. Yani:

  • Yeni bir oyun için benzersiz tanımlayıcı (oyun kimliği)
  • Oyun durumu = GÖNDERİLDİ
  • Oyuncunun seçimi (bölüm uzunluğu 50)
  • Genel anahtar
  • Potansiyel kazançlar (oyuncunun bahsine bağlı olarak)

RSA blockchain üzerinde rastgele

Blockchain'deki bir veri kaydı şöyle görünür (anahtar/değer):

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

"Anahtar" (anahtar) – oyun kimliği yeni oyun. Geri kalan veriler “değer” alanının satırında bulunur. Bu girişler sekmede saklanır Veri akıllı sözleşme:

RSA blockchain üzerinde rastgele

RSA blockchain üzerinde rastgele

5. Sunucu akıllı sözleşmeye “bakar” ve blockchain Api'yi kullanarak gönderilen işlemi (yeni oyun) bulur. Yeni oyunun Oyun kimliği zaten blockchain'e kayıtlı, bu da artık değiştirilemeyeceği veya etkilenemeyeceği anlamına geliyor

6. Sunucu bir geri çekme işlevi oluşturur (gameId, rsaSign). Örneğin şöyle:

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

7. Sunucu akıllı sözleşmeye bir Çağırma işlemi gönderir (InvokasyonTx yayını). İşlem, oluşturulan para çekme işlevine (gameId, rsaSign) yapılan bir çağrı içerir:

RSA blockchain üzerinde rastgele

Fonksiyon şunları içerir: oyun kimliği yeni oyun ve RSA'nın özel anahtarla benzersiz bir tanımlayıcı imzalamasının sonucu. İmza sonucu değişmez.

Bu ne anlama geliyor?

Aynı değeri (oyun kimliği) alıyoruz ve ona RSA imza yöntemini uyguluyoruz. Her zaman aynı sonucu elde edeceğiz. RSA algoritması bu şekilde çalışır. Oyun kimliği ve RSA uygulamasının sonucu bilinmediğinden son sayı değiştirilemez. Bir sayı seçmek de anlamsızdır.

8. Blockchain işlemi kabul eder. Geri çekme işlevini çalıştırır (gameId, rsaSign)

9. Geri çekme fonksiyonu içerisinde geri çekilme gerçekleşir GenerateRandInt işlevleri (gameId, rsaSign). Bu bir rastgele sayı üretecidir

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

tüm - ve rastgele bir sayı var.

Öncelikle RSA imzasının sonucu olan string alınır. oyun kimliği Özel anahtar (rsaSign). Daha sonra SHA-256 (sha256(rsaSign)).

İmzanın ve ardından gelen karma işleminin sonucunu tahmin edemeyiz. Bu nedenle rastgele bir sayının üretilmesini etkilemek imkansızdır. Belirli bir aralıkta (örneğin 1'den 100'e kadar) bir sayı elde etmek için toInt dönüştürme işlevini ve %100'ü (şuna benzer) kullanın. şık).

Yazının başında fonksiyonundan bahsetmiştik. rsaDoğrulama()RSA imzasının geçerliliğini özel bir anahtarla genel bir anahtarla kontrol etmenize olanak tanır. İşte GenerateRandInt(gameId,rsaSign) kısmı:

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

Genel anahtar RSAPUBLIC ve rsaSign dizesi girişe iletilir. İmzanın geçerliliği kontrol edilir. Kontrol başarılı olursa numara oluşturulur. Aksi takdirde sistem imzanın geçerli olmadığını kabul eder (Geçersiz RSA imzası).

Sunucu, oyun kimliğini özel bir anahtarla imzalamalı ve 2880 blok içinde geçerli bir Rsa imzası göndermelidir. Parametre, akıllı sözleşme dağıtılırken yapılandırılır. Belirlenen süre içerisinde hiçbir şey olmazsa kullanıcı kazanır. Bu durumda ödülün adresinize kendiniz gönderilmesi gerekmektedir. "Sunucunun hile yapmasının karlı olmadığı" ortaya çıktı çünkü bu, kayba yol açıyor. Aşağıda bir örnek bulunmaktadır.

RSA blockchain üzerinde rastgele

Kullanıcı oynuyor Roller diyor. Küpün 2 ​​kenarından 6'sini seçtim, bahis 14 DALGA. Sunucu, belirtilen süre (2880 blok) içerisinde akıllı sözleşmeye geçerli bir RSA imzası göndermezse, kullanıcı 34.44 WAVES alacaktır.

Oyunlarda sayılar oluşturmak için harici, blockchain olmayan bir sistem olan bir oracle kullanıyoruz. Sunucu, oyun kimliğinin RSA imzasını gerçekleştirir. Akıllı sözleşme imzanın geçerliliğini kontrol eder ve kazananı belirler. Sunucu hiçbir şey göndermezse kullanıcı otomatik olarak kazanır.

Bu dürüst bir nesil yöntemidir çünkü manipülasyon teknik olarak imkansızdır. Tüm Tradisys oyunları açıklanan algoritmaya göre çalışır. Blockchain oyunları bu şekilde çalışır. Her şey şeffaf ve doğrulanabilir. Başka hiçbir blockchainde böyle bir sistemin benzeri yoktur. Bu oldukça rastgele bir durum.

Kaynak: habr.com

Yorum ekle