د سمارټ شتمنیو څپې: تور او سپین لیستونه، د وقفې سوداګرۍ

د سمارټ شتمنیو څپې: تور او سپین لیستونه، د وقفې سوداګرۍ

په تیرو دوو مقالو کې موږ د سمارټ حسابونو په اړه خبرې وکړې او څنګه یې کارول کیدی شي د لیلامونو ترسره کولو او د وفادارۍ برنامې رامینځته کولو لپارهاو هم مرسته د مالي وسایلو شفافیت ډاډمن کول.

اوس به موږ سمارټ شتمنۍ او د دوی د کارولو ډیری قضیې وګورو، په شمول د شتمنیو کنګل کول او په مشخصو پتو کې د راکړې ورکړې محدودیتونه.

Waves Smart Assets کاروونکو ته اجازه ورکوي چې په شتمنیو باندې سکریپټ پټ کړي، د سمارټ حسابونو په څیر ورته میکانیک تعقیب کړي. هره نوې معامله چې د سمارټ اثاثو په کارولو سره رامینځته کیږي لومړی به د سکریپټ لخوا تایید شي ، او یوازې بیا د بلاکچین لخوا.

دا د سمارټ اثاثو او سمارټ حسابونو ترمینځ لاندې توپیرونو په پام کې نیولو سره ارزښت لري:

  1. د سمارټ شتمنۍ په کوډ کې، د ثبوتونو چک کول ناممکن دي (موږ د دوی په اړه خبرې وکړې په لومړۍ مقاله کې).
  2. د سمارټ حساب کوډ کې، تاسو کولی شئ د تبادلې لیږد چیک کړئ یوازې که ستاسو حساب د میچر حساب وي. که نه نو، یوازې امر چک شوی. په سمارټ اثاثو کوډ کې، تاسو نشئ کولی امر مستقیم چیک کړئ؛ تاسو کولی شئ د تبادلې لیږد وګورئ، او که اړتیا وي، له دې څخه یو امر استخراج کړئ.
  3. یو سمارټ شتمني، د سمارټ حساب برعکس، دولت نلري، مګر موږ لاهم د سکریپټ څخه د حساب ریاستونو ته لاسرسی لرو.

سمارټ شتمنۍ د قراردادونو لیکل خورا ساده کوي، د ډیری قضیو پلي کول لنډ او ښکلي کوي.

د شتمنیو کنګل کول

د یوې ټاکلې بلاک لوړوالي ته د شتمنیو کنګل کول هدف لوړوالی، تاسو کولی شئ دا ارزښت په ساده ډول د لاندې سمارټ شتمنۍ سکریپټ کې تنظیم کړئ:

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

د میچر ځانګړی حالت

د مطلوب په توګه د ځانګړي میچر تنظیم کولو لپاره ، تاسو کولی شئ د دې پته د لیږونکي په توګه په سمارټ اثاثه سکریپټ کې تنظیم کړئ چې داسې ښکاري:

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

د ترلاسه کونکو "سپین لیست".

د دې لپاره چې ټکنونه یوازې ځینې حسابونو ته واستول شي - د ترلاسه کونکو "سپینه لیست" رامینځته کولو لپاره - تاسو کولی شئ د لاندې سکیم سره سمارټ شتمنۍ وکاروئ چې په لیست کې د شاملیدو لپاره چک کوي:

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
}

د امنیتي دلایلو او د ژبې د ثابت بشپړتیا لپاره، لیست د تکرار تطبیق نه لري. له همدې امله دا د کانکریټ عناصرو سیټ په توګه تعریف شوی.

د ترلاسه کونکو "تور لیست".

په ورته ډول، ځینې حسابونو ته د ټوکن لیږلو منع کولو لپاره، تاسو کولی شئ "تور لیست" جوړ کړئ. په دې حالت کې، په سمه توګه ورته سمارټ شتمنۍ کارول کیږي، مګر د پتې سره چک شوي ترڅو ډاډ ترلاسه شي چې دا په تور لیست کې ندي:

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
}

د صادرونکي په اجازې لیږل

د سمارټ شتمنۍ په کارولو سره، تاسو کولی شئ یوازې د جاري کونکي په اجازې سره د سمارټ شتمنۍ لیږلو اختیار هم تنظیم کړئ (د ژمنې / پور لیبل). جاري کونکی د خپل حساب په حالت کې د لیږد ID په ځای کولو سره خپله رضایت څرګندوي:

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

یوازې د ځانګړو سکو لپاره تبادله وکړئ

یو سمارټ شتمنۍ اجازه ورکوي چې دا یوازې د ځینو سکو لپاره تبادله کړي. د مثال په توګه، یوازې د Bitcoins لپاره د تبادلې اجازه ورکولو لپاره، تاسو کولی شئ لاندې کوډ وکاروئ:

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

د اوریکل څخه د قیمت له مخې تجارت

په سمارټ اثاثو سکریپټ کې ، تاسو کولی شئ یوازې د باور وړ اوریکل حالت کې ټاکل شوي نرخ کې سوداګرۍ ته اجازه ورکړئ. دلته د دې ډول سکریپټ یوه بیلګه ده:

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
}

دلته موږ د غیر څرګند ټکي سره مخ یو کله چې د هغه شتمنۍ ID چیک کوو چې ورسره سوداګرۍ ترسره کیږي. ټکی دا دی چې که د شتمنۍ ID تعریف شوی نه وي، نو موږ د WAVES په اړه خبرې کوو. په سکریپټ کې، موږ ډاډ ترلاسه کوو چې سوداګرۍ د WAVES سره په سمه توګه په دې ډول ترسره کیږي.

ثابت نرخ زیاتوالی

تاسو کولی شئ د سمارټ شتمنۍ لپاره یو ثابت قیمت وټاکئ، کوم چې به په ورکړل شوي تناسب کې ګام په ګام زیاتوالی ومومي. دلته د شتمنۍ سکریپټ یوه بیلګه ده چې قیمت به په هر 5 بلاکس کې 1000٪ زیاتوالی ومومي:

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
}


د وقفې سوداګرۍ

همچنان ، د سکریپټ څخه مننه ، د سمارټ شتمنۍ سوداګرۍ دمخه ټاکل شوي وقفو پورې محدود کیدی شي. دلته د دې ډول سکریپټ یوه بیلګه ده:

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

په سکریپټ کې موږ ډاډ ترلاسه کوو چې د سوداګرۍ له پیل څخه پیل لوړوالی نه زیات حد وقفې د وقفې اوږدوالی په ساحه کې د ټاکل شوي بلاکونو شمیر سره مساوي دی منځګړی.

سرچینه: www.habr.com

Add a comment