Waves blok zincirinde merkezi olmayan, açık kaynaklı ortaklık programı

Bettex ekibi tarafından Waves Labs bağışının bir parçası olarak uygulanan, Waves blok zincirinde merkezi olmayan bir ortaklık programı.

Yazı reklam değildir! Program açık kaynak olup, kullanımı ve dağıtımı ücretsizdir. Programın kullanımı dApp uygulamalarının gelişimini teşvik eder ve genel olarak her İnternet kullanıcısına fayda sağlayan merkezi olmayan yönetimi teşvik eder.

Waves blok zincirinde merkezi olmayan, açık kaynaklı ortaklık programı

Bağlı kuruluş programları için sunulan dApp, işlevlerinin bir parçası olarak bağlı kuruluş içeren projelere yönelik bir şablondur. Kod, kopyalama için bir şablon olarak, bir kitaplık olarak veya teknik uygulama için bir dizi fikir olarak kullanılabilir.

İşlevsellik açısından bu, bir yönlendirenle kayıt, yönlendirmeler için çok düzeyli ödül tahakkuku ve sisteme kaydolma motivasyonu (nakit iadesi) uygulayan düzenli bir ortaklık sistemidir. Sistem "saf" bir dApp'tir, yani web uygulaması kendi arka ucuna, veritabanına vb. sahip olmadan doğrudan blockchain ile etkileşime girer.

Diğer birçok projede de faydalı olabilecek teknikler kullanıldı:

  • Anında geri ödeme ile akıllı bir hesabı borca ​​çağırmak (çağrı sırasında hesapta çağrıyı ödeyecek jeton yoktur, ancak çağrı sonucunda orada görünürler).
  • PoW-captcha - akıllı hesap işlevlerine yapılan yüksek frekanslı otomatik çağrılara karşı koruma - captcha'ya benzer, ancak bilgi işlem kaynaklarının kullanımının kanıtı yoluyla.
  • Bir şablon kullanarak veri anahtarlarını sorgulayın.

Uygulama aşağıdakilerden oluşur:

  • ride4dapps dilindeki akıllı hesap kodu (planlandığı gibi, ortaklık işlevselliğinin uygulanması gereken ana akıllı hesapla birleştirilir);
  • WAVES NODE REST API üzerinden bir soyutlama düzeyi uygulayan js sarmalayıcısı;
  • Kitaplığı ve RIDE kodunu kullanmanın bir örneği olan vuejs çerçevesindeki kod.

Listelenen tüm özellikleri açıklayalım.

Anında geri ödeme ile borç için akıllı hesap çağırma

InvokeScript'i çağırmak, işlemi başlatan hesaptan bir ücret ödenmesini gerektirir. Hesaplarında belirli miktarda WAVES tokeni bulunan blockchain meraklılarına yönelik bir proje yapıyorsanız bu sorun değil ancak ürünün genel halk tarafından kullanılması amaçlanıyorsa bu ciddi bir sorun haline geliyor. Sonuçta, kullanıcının WAVES tokenlarını (veya işlemler için ödeme yapmak için kullanılabilecek başka bir uygun varlığı) satın almasıyla ilgilenmesi gerekir, bu da projeye girişin önündeki zaten önemli olan engeli artırır. Sistemimizden likit bir varlık pompalamak için otomatik sistemler oluşturulduğunda, işlemler için ödeme yapabilecek ve bunların kötüye kullanılması riskiyle karşı karşıya kalacak kullanıcılara bir varlık dağıtabiliriz.

InvokeScript'i "masrafları alıcıya ait olmak üzere" (komut dosyasının yüklü olduğu akıllı hesap) çağırmak mümkün olsaydı çok uygun olurdu ve açık bir şekilde olmasa da böyle bir olasılık mevcut.

InvokeScript'in içinde arayanın adresine, harcanan ücret belirteçlerini telafi eden bir ScriptTransfer yaparsanız, çağrı sırasında arayan hesapta hiçbir varlık olmasa bile böyle bir çağrı başarılı olacaktır. Bunun mümkün olmasının nedeni, yeterli miktarda token olup olmadığının kontrolünün, işlemden önce değil, çağrıldıktan sonra yapılması ve böylece işlemlerin anında geri ödemeye tabi olarak krediyle yapılabilmesidir.

ScriptTransfer(i.arayan, i.ücret, birim)

Aşağıdaki kod, akıllı hesap fonlarını kullanarak harcanan ücreti geri öder. Bu özelliğin kötüye kullanılmasına karşı korunmak için, arayanın ücreti gerekli varlığa ve makul sınırlar dahilinde harcadığına dair bir çek kullanılması gerekir:

func checkFee(i:Invocation) = {
if i.fee > maxFee then throw(“unreasonable large fee”) else
if i.feeAssetId != unit then throw(“fee must be in WAVES”) else true
}

Ayrıca, kötü niyetli ve anlamsız fon israfına karşı korunmak için otomatik çağrı koruması (PoW-captcha) gereklidir.

PoW-captcha

İş kanıtı captcha'sı fikri yeni değil ve WAVES temelinde uygulananlar da dahil olmak üzere çeşitli projelerde zaten uygulandı. Buradaki fikir, projemizin kaynaklarını tüketen bir eylemi gerçekleştirmek için arayan kişinin aynı zamanda kendi kaynaklarını da harcaması gerektiğidir, bu da kaynak tükenmesi saldırısını oldukça pahalı hale getirir. İşlemi gönderenin PoW sorununu çözdüğünün çok kolay ve düşük maliyetli bir şekilde doğrulanması için bir işlem kimliği kontrolü vardır:

if take(toBase58String(i.transactionId), 3) != “123” ardından throw(“iş kanıtı başarısız oldu”) else

Bir işlemi gerçekleştirmek için, arayan kişinin bu tür parametreleri, base58 kodunun (id) 123 sayısıyla başlayacak şekilde seçmesi gerekir; bu, ortalama olarak birkaç on saniyelik işlemci zamanına karşılık gelir ve genel olarak görevimiz için makuldür. Daha basit veya daha karmaşık bir PoW gerekiyorsa görev açıkça ve kolayca değiştirilebilir.

Şablon kullanarak veri anahtarlarını sorgulama

Blockchain'i bir veritabanı olarak kullanmak için, veritabanını şablonlara dayalı anahtar-val olarak sorgulamak için API araçlarına sahip olmak hayati önem taşımaktadır. Böyle bir araç seti Temmuz 2019'un başında bir parametre şeklinde ortaya çıktı ?maçlar REST API isteğinde /adresler/data?matches=regexp. Artık bir web uygulamasından birden fazla anahtar almamız gerekiyorsa ve tüm anahtarları aynı anda değil, yalnızca bir grup olarak almamız gerekiyorsa, anahtar adına göre seçim yapabiliriz. Örneğin bu projede para çekme işlemleri şu şekilde kodlanmıştır:

withdraw_${userAddress}_${txid}

bu, şablonu kullanarak herhangi bir adres için para çekme işlemlerinin bir listesini almanızı sağlar:

?matches=withdraw_${userAddress}_.*

Şimdi bitmiş çözümün bileşenlerine bakalım.

Vuejs kodu

Kod, gerçek projeye yakın çalışan bir demodur. Waves Keeper aracılığıyla oturum açmayı gerçekleştirir ve kullanıcıyı sisteme kaydettiği, işlem verilerini sorguladığı ve ayrıca kazanılan parayı kullanıcının hesabına çekmenize olanak tanıyan affiliate.js kitaplığıyla birlikte çalışır.

Waves blok zincirinde merkezi olmayan, açık kaynaklı ortaklık programı

RIDE kodu

Kayıt, fonlama ve para çekme fonksiyonlarından oluşur.

Register fonksiyonu bir kullanıcıyı sisteme kaydeder. İki parametresi vardır: yönlendiren (yönlendiren adresi) ve işlev kodunda kullanılmayan, işlem kimliğini (PoW-captcha görevi) seçmek için gerekli olan tuz parametresi.

İşlev (bu projedeki diğer işlevler gibi) borç çağırma tekniğini kullanır; işlevin sonucu, bu işlevin çağrılması için bir ücretin ödenmesini finanse etmektir. Bu çözüm sayesinde yeni cüzdan oluşturan bir kullanıcı, sistemle hemen çalışabiliyor ve işlem ücreti ödemesine olanak tanıyan bir varlığı satın alma veya alma endişesine gerek kalmıyor.

Kayıt fonksiyonunun sonucu iki kayıttır:

${owner)_referer = referer
${referer}_referral_${owner} = owner

Bu, ileri ve geri aramalara (belirli bir kullanıcının yönlendirmesi ve belirli bir kullanıcının tüm yönlendirmeleri) izin verir.

Fon işlevi daha çok gerçek işlevsellik geliştirmek için bir şablondur. Sunulan haliyle, işlem tarafından aktarılan tüm fonları alır ve bunları 1, 2, 3. seviye yönlendirenlerin hesaplarına, "para iadesi" hesabına ve "değişiklik" hesabına (önceki hesaplara dağıtıldığında kalan her şey) dağıtır. hesaplar buraya gider).

Nakit para iadesi, son kullanıcıyı yönlendirme sistemine katılmaya motive etmenin bir yoludur. Kullanıcı, komisyonun sistem tarafından ödenen kısmını, yönlendirme ödüllerinde olduğu gibi "para iadesi" şeklinde geri çekebilir.

Referans sistemi kullanılırken fon fonksiyonu değiştirilmeli ve sistemin çalışacağı akıllı hesabın ana mantığına entegre edilmelidir. Örneğin, yapılan bir bahis için bir tavsiye ödülü ödeniyorsa, fon işlevi, bahsin oynandığı (veya ödülün ödendiği başka bir hedefli eylemin gerçekleştirildiği) mantığa yerleştirilmelidir. Bu işleve üç düzeyde yönlendirme ödülü kodlanmıştır. Daha fazla veya daha az seviye yapmanız gerekiyorsa, bu da kodda düzeltilir. Ödül yüzdesi seviye1-seviye3 sabitleri tarafından belirlenir; kodda şu şekilde hesaplanır: miktar * seviye / 1000yani 1 değeri %0,1'e karşılık gelir (bu da kodda değiştirilebilir).

İşlevin çağrılması hesap bakiyesini değiştirir ve ayrıca formun günlüğe kaydedilmesi amacıyla girişler oluşturur:

fund_address_txid = address:owner:inc:level:timestamp
Для получения timestamp (текущего времени) используется такая вот связка
func getTimestamp() = {
let block = extract(blockInfoByHeight(height))
toString(block.timestamp)
}

Yani işlem süresi, bulunduğu bloğun süresidir. Bu, özellikle çağrılabilir öğede mevcut olmadığından, işlemin kendi zaman damgasını kullanmaktan daha güvenilirdir.
Para çekme işlevi, biriken tüm ödülleri kullanıcının hesabına görüntüler. Günlüğe kaydetme amacıyla girişler oluşturur:

# withdraw log: withdraw_user_txid=amount:timestamp

uygulama

Uygulamanın ana kısmı, bağlı kuruluş veri modelleri ile WAVES NODE REST API arasında bir köprü olan affiliate.js kitaplığıdır. Çerçeveden bağımsız bir soyutlama düzeyi uygular (herhangi biri kullanılabilir). Aktif işlevler (kaydolma, geri çekilme), Waves Keeper'ın sistemde kurulu olduğunu varsayar; kütüphanenin kendisi bunu kontrol etmez.

Yöntemleri uygular:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

Metodların işlevselliği isimlerinden açıkça anlaşılmaktadır; parametreler ve döndürülen veriler kodda açıklanmıştır. Kayıt işlevi ek açıklamalar gerektirir - 123'te başlayacak şekilde işlem kimliğini seçme döngüsünü başlatır - bu, toplu kayıtlara karşı koruma sağlayan yukarıda açıklanan PoW-captcha'dır. İşlev, gerekli kimliğe sahip bir işlem bulur ve ardından onu Waves Keeper aracılığıyla imzalar.

DEX ortaklık programına şuradan ulaşılabilir: Github.com.

Kaynak: habr.com

Yorum ekle