Waves akıllı varlıkları: kara listeler ve beyaz listeler, aralıklı ticaret

Waves akıllı varlıkları: kara listeler ve beyaz listeler, aralıklı ticaret

Önceki iki yazımızda akıllı hesaplardan ve nasıl kullanılabileceğinden bahsetmiştik. müzayedeler düzenlemek ve sadakat programları oluşturmak içinve ayrıca yardım finansal araçların şeffaflığını sağlamak.

Şimdi akıllı varlıklara ve varlıkların dondurulması ve belirli adreslerdeki işlemlerde kısıtlamalar getirilmesi dahil olmak üzere çeşitli kullanım durumlarına bakacağız.

Waves Smart Assets, kullanıcıların akıllı hesaplarla aynı mekaniği izleyerek varlıkları komut dosyası oluşturmasına olanak tanır. Akıllı bir varlık kullanılarak oluşturulan her yeni işlem, önce komut dosyası tarafından ve ancak bundan sonra blok zinciri tarafından onaylanacaktır.

Akıllı varlıklar ve akıllı hesaplar arasındaki aşağıdaki farkları belirtmekte fayda var:

  1. Bir akıllı varlığın kodunda, kanıtları kontrol etmek imkansızdır (bunlardan bahsettik) ilk makalede).
  2. Akıllı hesap kodunda, ExchangeTransaction'ı yalnızca hesabınız bir eşleştirme hesabıysa kontrol edebilirsiniz. Aksi takdirde sadece sıra kontrol edilir. Akıllı varlık kodunda doğrudan emri kontrol edemezsiniz, ExchangeTransaction'ı kontrol edebilir ve gerekirse emri buradan çıkarabilirsiniz.
  3. Bir akıllı varlığın, akıllı hesaptan farklı olarak bir durumu yoktur, ancak yine de komut dosyasından hesap durumlarına erişimimiz vardır.

Akıllı varlıklar, sözleşmelerin yazılmasını büyük ölçüde basitleştirerek birçok vakanın uygulanmasını özlü ve zarif hale getirir.

Varlık dondurma

Varlıkları belirli bir blok yüksekliğine kadar dondurmak için hedefYükseklik, bu değeri aşağıdaki akıllı varlığın komut dosyasında kolayca ayarlayabilirsiniz:

let targetHeight = 1500000
height >= targetHeight
 
height - функция языка, возращающая текущую высоту.

Spesifik eşleyici koşulu

Belirli bir eşleyiciyi istenen eşleyici olarak ayarlamak için, bunun gibi bir akıllı varlık komut dosyasında adresini gönderen olarak ayarlayabilirsiniz:

match tx {
    case t : ExchangeTransaction =>
        t.sender == addressFromString("3PJaDyprvekvPXPuAtxrapacuDJopgJRaU3")
    case _ => true
}

Alıcıların "beyaz listesi"

Belirteçlerin yalnızca belirli hesaplara gönderilmesine izin vermek için - alıcılardan oluşan bir "beyaz liste" oluşturmak için - listeye dahil olup olmadığını kontrol eden aşağıdaki şemaya sahip bir akıllı varlık kullanabilirsiniz:

match tx {
  case t : TransferTransaction =>
    let trustedRecipient1 = addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4")
    let trustedRecipient2 = addressFromString("3PLZcCJyYQnfWfzhKXRA4rteCQC9J1ewf5K")
    let trustedRecipient3 = addressFromString("3PHrS6VNPRtUD8MHkfkmELavL8JnGtSq5sx")
    t.recipient == trustedRecipient1 || t.recipient == trustedRecipient2 || t.recipient == trustedRecipient3
  case _ => false
}

Güvenlik nedenleriyle ve kanıtlanabilir dil kesinliği nedeniyle, liste bir yineleyici uygulaması içermez. Bu nedenle, bir dizi somut eleman olarak belirtilir.

Alıcıların "kara listesi"

Benzer şekilde, belirli hesaplara jeton gönderilmesini önlemek için bir "kara liste" oluşturabilirsiniz. Bu durumda, tam olarak aynı akıllı varlık kullanılır, ancak adreste bir kara liste olup olmadığı kontrol edilir:

match tx {
  case t : TransferTransaction =>
    let bannedRecipient1 = addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4")
    let bannedRecipient2 = addressFromString("3PLZcCJyYQnfWfzhKXRA4rteCQC9J1ewf5K")
    let bannedRecipient3 = addressFromString("3PHrS6VNPRtUD8MHkfkmELavL8JnGtSq5sx")
    t.recipient != bannedRecipient1 && t.recipient != bannedRecipient2 && t.recipient != bannedRecipient3
  case _ => false
}

Düzenleyenin izniyle gönderme

Bir akıllı varlıkla, yalnızca verenin izniyle bir akıllı varlık gönderme seçeneğini de ayarlayabilirsiniz. (taahhüt/borç etiketi). Yayıncı, işlem kimliğini hesabının durumunda yayınlayarak onayını ifade eder:

match tx {
  case t : TransferTransaction =>
    let issuer = extract(addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4"))
    #убеждаемся, что в стейте эмитента содержится ID текущей транзакции
    isDefined(getInteger(issuer, toBase58String(t.id)))
  case _ => false
}

Yalnızca belirli madeni paralarla değiştirin

Akıllı bir varlık, onu yalnızca belirli madeni paralarla takas etme izni verir. Örneğin, yalnızca bitcoin takasına izin vermek için aşağıdaki kodu kullanabilirsiniz:

let BTCId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
match tx {
  case t : ExchangeTransaction =>
    t.sellOrder.assetPair.priceAsset == BTCId ||
     t.sellOrder.assetPair.amountAsset == BTCId
  case _ => true
}

Oracle'dan fiyata göre ticaret yapın

Akıllı varlık komut dosyasında, yalnızca güvenilir bir kehanet durumunda sabit fiyattan işlem yapma iznini ayarlayabilirsiniz. İşte böyle bir betiğin bir örneği:

let oracle = Address(base58'3PLNmokt22NrSiNvCLvwMUP84LCMJqbXwAD')
let assetId = toBase58String(base58'oWgJN6YGZFtZrV8BWQ1PGktZikgg7jzGmtm16Ktyvjd')
 
match tx {
  #запрещаем передачу ассета
  case t: TransferTransaction | MassTransferTransaction => false
  case e: ExchangeTransaction =>
    #убеждаемся, что торговля происходит по цене, заданной в стейте оракла для этого ассета
    let correctPrice = e.price == extract(getInteger(oracle, assetId))
    #убеждаемся, что торговля происходит в обмен на WAVES
    let correctPriceAsset = !isDefined(e.sellOrder.assetPair.priceAsset) 
correctPrice && correctPriceAsset
  case _ => true
}

Burada, işlem gören varlığın kimliğini kontrol ederken bariz olmayan bir nokta ile karşı karşıyayız. Gerçek şu ki, varlık kimliği tanımlanmamışsa, o zaman WAVES'ten bahsediyoruz. Komut dosyasında, bu şekilde ticaretin WAVES ile birlikte yürütülmesini sağlıyoruz.

Sabit fiyat artışı

Belirli bir oranda adım adım artacak bir akıllı varlık için sabit bir fiyat belirleyebilirsiniz. Her 5 blokta fiyatını %1000 artıracak bir varlık komut dosyası örneği:

let startPrice = 10
let startHeight = 1000
let interval = 1000
#на сколько процентов цена увеличивается за один шаг
let raise = 5
 
match tx {
  case t: TransferTransaction | MassTransferTransaction => false
  case e: ExchangeTransaction =>
    e.price == startPrice + ((height - startHeight) / interval) * (100 + raise) / 100
    && !isDefined(e.sellOrder.assetPair.priceAsset)
  case _ => true
}


Aralıklı ticaret

Ayrıca script sayesinde akıllı varlık alım satımı önceden belirlenmiş aralıklarla sınırlandırılabiliyor. İşte böyle bir betiğin bir örneği:

let startHeight = 10000
let interval = 44000
let limit = 1500
 
match tx {
  case t: TransferTransaction | MassTransferTransaction | ExchangeTransaction =>
    (height - startHeight) % interval < limit
  case _ => true
}

Komut dosyasında, ticaretin başından itibaren Başlangıç ​​Yüksekliği fazla geçmedi sınır aralıklar. Aralığın uzunluğu, alanda belirtilen blok sayısına eşittir. aralık.

Kaynak: habr.com

Yorum ekle