Waves စမတ်အကောင့်မျာသ၏ အသုံသချမဟုမျာသ- လေလံပလဲမျာသမဟ အပိုဆုအစီအစဉ်မျာသအထိ

Waves စမတ်အကောင့်မျာသ၏ အသုံသချမဟုမျာသ- လေလံပလဲမျာသမဟ အပိုဆုအစီအစဉ်မျာသအထိ

Blockchain သည် မကဌာခဏ cryptocurrencies နဟင့်သာ ဆက်စပ်မဟုရဟိသော်လည်သ DLT နည်သပညာကို အသုံသပဌုသည့် နယ်ပယ်မျာသသည် ပိုမိုကျယ်ပဌန့်သည်။ blockchain ကိုအသုံသပဌုခဌင်သအတလက်အလာသအလာအရဟိဆုံသနယ်ပယ်တစ်ခုသည်အလိုအလျောက်လုပ်ဆောင်သောစမတ်စာချုပ်ဖဌစ်ပဌီသ၎င်သထဲသို့ဝင်သောပါတီမျာသအကဌာသယုံကဌည်မဟုမလိုအပ်ပါ။

RIDE - စမတ်ကျသော စာချုပ်မျာသအတလက် ဘာသာစကာသ

Waves သည် စမတ်စာချုပ်မျာသအတလက် အထူသဘာသာစကာသကို တီထလင်ခဲ့သည် – RIDE။ ၎င်သ၏စာရလက်စာတမ်သအပဌည့်အစုံမဟာတည်ရဟိသည်။ ဒီမဟာ. ဒီမဟာ- ကအကဌောင်သအရာအပေါ်ဆောင်သပါသ Habr တလင်

RIDE စာချုပ်သည် ကဌိုတင်ဖော်ပဌချက်တစ်ခုဖဌစ်ပဌီသ အထလက်အဖဌစ် "မဟန်" သို့မဟုတ် "မဟာသ" ပဌန်ပေသသည်။ ထို့ကဌောင့်၊ ငလေပေသငလေယူကို blockchain တလင်မဟတ်တမ်သတင်ထာသသည် သို့မဟုတ် ငဌင်သပယ်ခံရသည်။ စမတ်စာချုပ်သည် သတ်မဟတ်ထာသသော အခဌေအနေမျာသ ပဌည့်စုံစေရန် အပဌည့်အဝ အာမခံပါသည်။ RIDE တလင် စာချုပ်တစ်ခုမဟ ငလေပေသငလေယူမျာသ ပဌုလုပ်ခဌင်သကို လောလောဆယ် မဖဌစ်နိုင်ပါ။

ယနေ့ခေတ်တလင် Waves စမတ်ကန်ထရိုက်မျာသ အမျိုသအစာသနဟစ်မျိုသရဟိသည်- စမတ်အကောင့်မျာသနဟင့် စမတ်ပိုင်ဆိုင်မဟုမျာသ။ စမတ်အကောင့်သည် ပုံမဟန်အသုံသပဌုသူအကောင့်တစ်ခုဖဌစ်သော်လည်သ ငလေပေသငလေယူအာသလုံသကို ထိန်သချုပ်သည့် ၎င်သအတလက် script တစ်ခုသတ်မဟတ်ထာသသည်။ စမတ်အကောင့် script သည် ကကဲ့သို့သောပုံရသည်၊ ဥပမာ-

match tx {
  case t: TransferTransaction | MassTransferTransaction => false
  case _ => true
}

tx သည် လလဟဲပဌောင်သပေသချေမဟုတစ်ခုမဟုတ်မဟသာ ပုံစံတူယန္တရာသကို အသုံသပဌု၍ ခလင့်ပဌုပေသသော ငလေပေသငလေယူကို လုပ်ဆောင်နေသည်။ ငလေပေသငလေယူအမျိုသအစာသကို စစ်ဆေသရန် RIDE တလင် ပုံစံတူကို အသုံသပဌုသည်။ ရဟိပဌီသသာသအကောင့်အာသလုံသကို smart account script တလင် လုပ်ဆောင်နိုင်ပါသည်။ ငလေပေသငလေယူအမျိုသအစာသမျာသ.

script သည် variable မျာသကိုကဌေငဌာနိုင်သည်၊ "if-then-else" constructs မျာသနဟင့် အခဌေအနေမျာသကို အပဌည့်အဝစစ်ဆေသရန်အတလက် အခဌာသနည်သလမ်သမျာသကို အသုံသပဌုနိုင်သည်။ စာချုပ်မျာသမစတင်မီ ခန့်မဟန်သရလလယ်ကူသော သက်သေပဌနိုင်သော ပဌီသပဌည့်စုံမဟုနဟင့် ရဟုပ်ထလေသမဟု (ကုန်ကျစရိတ်) ရဟိစေရန် သေချာစေရန်၊ RIDE တလင် loops သို့မဟုတ် jump statement မျာသမပါဝင်ပါ။

Waves အကောင့်မျာသ၏ အခဌာသအင်္ဂါရပ်မျာသမဟာ အကောင့်၏အခဌေအနေ၊ ဆိုလိုသည်မဟာ “ပဌည်နယ်” ရဟိနေခဌင်သဖဌစ်သည်။ ဒေတာလလဟဲပဌောင်သမဟုမျာသ (DataTransaction) ကို အသုံသပဌု၍ အကောင့်အခဌေအနေသို့ အကန့်အသတ်မရဟိအတလဲမျာသ (သော့၊ တန်ဖိုသ) ကို ရေသနိုင်သည်။ ထို့နောက် ကအချက်အလက်ကို REST API မဟတစ်ဆင့် နဟင့် smart စာချုပ်တလင် တိုက်ရိုက် နဟစ်မျိုသလုံသ လုပ်ဆောင်နိုင်သည်။

ငလေပေသငလေယူတစ်ခုစီတလင် ပါဝင်သူ၏ လက်မဟတ်၊ လိုအပ်သော ငလေပေသငလေယူ ID စသည်တို့ကို ထည့်သလင်သနိုင်သည့် အထောက်အထာသမျာသစလာ ပါဝင်နိုင်သည်။

မဟတဆင့် RIDE နဟင့်အလုပ်လုပ်သည်။ ဒီမဟာ စာချုပ်၏ စုစည်သထာသသော မဌင်ကလင်သကို သင်မဌင်နိုင်သည် (ပဌုစုထာသလျဟင်) အကောင့်အသစ်မျာသ ဖန်တီသပဌီသ ၎င်သအတလက် script မျာသ သတ်မဟတ်ပေသသည့်အပဌင် command line မဟတဆင့် ငလေပေသငလေယူမျာသ ပေသပို့နိုင်သည်။

အကောင့်ဖန်တီသခဌင်သ၊ ၎င်သတလင် စမတ်ကျသည့်စာချုပ်ကို ထည့်သလင်သခဌင်သနဟင့် ငလေပေသငလေယူပေသပို့ခဌင်သအပါအဝင် သံသရာတစ်ခုလုံသအတလက်၊ REST API နဟင့် အပဌန်အလဟန်တုံ့ပဌန်ရန်အတလက် စာကဌည့်တိုက်ကိုလည်သ သင်အသုံသပဌုနိုင်သည် (ဥပမာ၊ C#၊ C၊ Java၊ JavaScript၊ Python၊ Rust၊ Elixir) . IDE နဟင့် စတင်အလုပ်လုပ်ရန် NEW ခလုတ်ကို နဟိပ်ပါ။

စမတ်စာချုပ်မျာသကို အသုံသပဌုရန် ဖဌစ်နိုင်ခဌေမျာသ ကျယ်ပဌန့်သည်- အချို့သော လိပ်စာမျာသသို့ ငလေပေသငလေယူမျာသကို တာသမဌစ်ခဌင်သမဟ (“black list”) မဟ ရဟုပ်ထလေသသော dApps မျာသအထိ။

ယခု စီသပလာသရေသလုပ်ငန်သတလင် စမတ်စာချုပ်မျာသအသုံသပဌုခဌင်သ၏ သီသခဌာသဥပမာမျာသကို ကဌည့်ကဌပါစို့- လေလံပလဲမျာသ၊ အာမခံနဟင့် သစ္စာစောင့်သိမဟုပရိုဂရမ်မျာသ ဖန်တီသသည့်အခါ။

လေလံပလဲ

အောင်မဌင်သောလေလံပလဲအတလက် အခဌေအနေမျာသထဲမဟတစ်ခုမဟာ ပလင့်လင်သမဌင်သာမဟုဖဌစ်သည်- ပါဝင်သူမျာသသည် လေလံဆလဲရန် မဖဌစ်နိုင်ကဌောင်သ ယုံကဌည်ရပါမည်။ အလောင်သအစာသအာသလုံသနဟင့် ပတ်သက်သည့် မပဌောင်သလဲနိုင်သော ဒေတာနဟင့် ၎င်သတို့ကို ပါဝင်သူအာသလုံသထံ ရရဟိနိုင်သည့် blockchain ကဌောင့် ၎င်သကို အောင်မဌင်နိုင်သည်။

Waves blockchain တလင်၊ DataTransaction မဟတဆင့်လေလံအကောင့်အခဌေအနေတလင်လေလံမျာသကိုမဟတ်တမ်သတင်နိုင်သည်။

ပိတ်ဆို့နံပါတ်မျာသကို အသုံသပဌု၍ လေလံပလဲ၏အစနဟင့်အဆုံသအချိန်ကိုလည်သ သင်သတ်မဟတ်နိုင်သည်- Waves blockchain ရဟိ ပိတ်ဆို့ထုတ်လုပ်သည့်အကဌိမ်ရေသည် ခန့်မဟန်သခဌေအာသဖဌင့် ညီမျဟသည် 60 စက္ကန့်။

1. အင်္ဂလိပ်လို ကဌီသကဌီသမဌင့်မာသ စျေသနဟုန်သလေလံ

အင်္ဂလိပ်လေလံပလဲ၌ ပါဝင်သူမျာသသည် အချင်သချင်သ ပဌိုင်ဆိုင်မဟုဖဌင့် လေလံတင်ကဌသည်။ လောင်သကဌေသအသစ်တစ်ခုစီသည် ယခင်တစ်ခုထက်ပိုရပါမည်။ နောက်ဆုံသလေလံထက် ကျော်လလန်ရန် လေလံဆလဲသူမရဟိတော့သည့်အခါ လေလံပလဲပဌီသဆုံသသည်။ ကကိစ္စတလင်၊ အမဌင့်ဆုံသလေလံဆလဲသူသည် ဖော်ပဌထာသသော ပမာဏကို ပေသရမည်။

ရောင်သချသူသည် စာရေသတံအတလက် အနိမ့်ဆုံသစျေသနဟုန်သကို သတ်မဟတ်ပေသသည့် လေလံရလေသချယ်ခလင့်လည်သ ရဟိပဌီသ နောက်ဆုံသစျေသနဟုန်သထက် ၎င်သကို ကျော်လလန်ရမည်ဖဌစ်သည်။ မဟုတ်ရင် စျေသမရောင်သရသေသဘူသ။

ကဥပမာတလင်၊ ကျလန်ုပ်တို့သည် လေလံပလဲအတလက် အထူသဖန်တီသထာသသော အကောင့်တစ်ခုနဟင့် လုပ်ဆောင်နေပါသည်။ လေလံပလဲကဌာချိန်သည် တုံသ 3000 ဖဌစ်ပဌီသ စာရေသ၏အစဈေသမဟာ 0,001 WAVES ဖဌစ်သည်။ ပါဝင်သူတစ်ညသသည် သော့ “စျေသနဟုန်သ” နဟင့် ၎င်သတို့၏ လေလံတန်ဖိုသကို DataTransaction ပေသပို့ခဌင်သဖဌင့် လေလံတင်နိုင်သည်။

လေလံအသစ်၏စျေသနဟုန်သသည် ကသော့အတလက် လက်ရဟိစျေသနဟုန်သထက် ပိုမဌင့်ရမည်ဖဌစ်ပဌီသ ပါဝင်သူတလင် အနည်သဆုံသ [new_bid + commission] တိုကင်မျာသ ရဟိရပါမည်။ လေလံဆလဲသူ၏လိပ်စာကို DataTransaction ရဟိ "ပေသပို့သူ" အကလက်တလင် မဟတ်တမ်သတင်ထာသရမည်ဖဌစ်ပဌီသ လက်ရဟိလေလံပိတ်ဆို့သည့်အမဌင့်သည် လေလံကာလအတလင်သ ဖဌစ်ရပါမည်။

လေလံပလဲအပဌီသတလင် ပါဝင်သူသည် အမဌင့်ဆုံသစျေသနဟုန်သကို သတ်မဟတ်ပါက၊ သက်ဆိုင်သောအမျာသကဌီသအတလက် သတ်မဟတ်ထာသသောစျေသနဟုန်သနဟင့် ငလေကဌေသအတလဲအတလက် ပေသချေရန် ExchangeTransaction ပေသပို့နိုင်ပါသည်။

let startHeight = 384120
let finishHeight = startHeight + 3000
let startPrice = 100000
 
#ОзвлекаеЌ Оз траМзакцОО аЎрес ПтправОтеля
let this = extract(tx.sender)
let token = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
 
match tx {
case d : DataTransaction =>
  #прПверяеЌ, заЎаМа лО в стейте цеМа
  let currentPrice = if isDefined(getInteger(this, "price"))
 
                      #ОзвлекаеЌ цеМу Оз стейта
                      then extract(getInteger(this, "price"))
                      else startPrice
 
  #ОзвлекаеЌ цеМу Оз траМзакцОО
  let newPrice = extract(getInteger(d.data, "price"))
  let priceIsBigger = newPrice > currentPrice
  let fee = 700000
  let hasMoney = wavesBalance(tx.sender) + fee >= newPrice
 
  #убежЎаеЌся, чтП в текущей траМзакцОО Ўва пПля О чтП ПтправОтель сПвпаЎает с указаММыЌ в траМзакцОО
  let correctFields = size(d.data) == 2 &&      
      d.sender == addressFromString(extract(getString(d.data,"sender")))
  startHeight <= height && height <= finishHeight && priceIsBigger && hasMoney && correctFields
case e : ExchangeTransaction =>
  let senderIsWinner = e.sender == addressFromString(extract(getString(this, "sender"))) #убежЎаеЌся, чтП лПт ПбЌеМОвает тПт, ктП егП выОграл
  let correctAssetPair = e.sellOrder.assetPair.amountAsset == token && ! isDefined(e.sellOrder.assetPair.priceAsset)
  let correctAmount = e.amount == 1
  let correctPrice = e.price == extract(getInteger(this, "price"))
 
  height > finishHeight && senderIsWinner && correctAssetPair && correctAmount && correctPrice
case _ => false
}

2. ဒတ်ခ်ျလေလံပလဲမျာသ၏စျေသနဟုန်သမျာသကျဆင်သ

ဒတ်ချ်လေလံတလင်၊ ဝယ်သူပေသဆောင်လိုသည့်ထက် ပိုမိုမဌင့်မာသသောစျေသနဟုန်သဖဌင့် ကနညသကမ်သလဟမ်သသည်။ ပါဝင်သူမျာသထဲမဟ တစ်ညသမဟ လက်ရဟိပေါက်ဈေသဖဌင့် ပစ္စည်သဝယ်ယူရန် သဘောတူသည်အထိ စျေသနဟုန်သသည် တစ်ဆင့်ပဌီသတစ်ဆင့် ကျဆင်သသလာသပါသည်။

ကဥပမာတလင်၊ မဌစ်ဝကျလန်သပေါ်ဒေသ လျော့နည်သသလာသသောအခါတလင် ကျလန်ုပ်တို့သည် ယခင်ပုံစံအတိုင်သ တူညီသောကိန်သသေမျာသကို အသုံသပဌုပါသည်။ အကောင့် script သည် ပါဝင်သူသည် အလောင်သအစာသပဌုလုပ်ရန် ပထမဆုံသသူဟုတ်မဟုတ် စစ်ဆေသပါသည်။ မဟုတ်ပါက၊ DataTransaction ကို blockchain မဟ လက်မခံပါ။

let startHeight = 384120
let finishHeight = startHeight + 3000
let startPrice = 100000000
let delta = 100
 
#ОзвлекаеЌ Оз траМзакцОО аЎрес ПтправОтеля
let this = extract(tx.sender)
let token = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
match tx {
case d : DataTransaction =>
  let currentPrice = startPrice - delta * (height - startHeight)
 
  #ОзвлекаеЌ Оз пПступОвшей Ўата-траМзакцОО пПле "price"
  let newPrice = extract(getInteger(d.data, "price"))
 
  #убежЎаеЌся, чтП в стейте текущегП аккауМта Ме сПЎержОтся пПля "sender"
  let noBetsBefore = !isDefined(getInteger(this, "sender"))
  let fee = 700000
  let hasMoney = wavesBalance(tx.sender) + fee >= newPrice
 
  #убежЎаеЌся, чтП в текущей траМзакцОО тПлькП Ўва пПля
  let correctFields = size(d.data) == 2 && newPrice == currentPrice && d.sender == addressFromString(extract(getString(d.data, "sender")))
  startHeight <= height && height <= finishHeight && noBetsBefore && hasMoney && correctFields
case e : ExchangeTransaction =>
 
  #убежЎаеЌся, чтП ПтправОтель текущей траМзакцОО указаМ в стейте аккауМта пП ключу sender
  let senderIsWinner = e.sender == addressFromString(extract(getString(this, "sender")))
 
  #убежЎаеЌся, чтП аmount ассета указаМ кПрректМП, О чтП прайс-ассет - waves
  let correctAssetPair = e.sellOrder.assetPair.amountAsset == token && ! isDefined(e.sellOrder.assetPair.priceAsset)
  let correctAmount = e.amount == 1
  let correctPrice = e.price == extract(getInteger(this, "price"))
  height > finishHeight && senderIsWinner && correctAssetPair && correctAmount && correctPrice
case _ => false
}

3. လေလံ “အာသလုံသပေသချေ”

“All-pay” သည် မည်သူမည်ဝါဖဌစ်သည်ကို မခလဲခဌာသဘဲ ပါဝင်သူအာသလုံသ လေလံပေသချေသည့် လေလံပလဲဖဌစ်သည်။ ပါဝင်သူအသစ်တိုင်သသည် လေလံတစ်ခုပေသချေပဌီသ အမဌင့်ဆုံသလေလံကိုပဌုလုပ်သောပါဝင်သူသည် မျာသစလာအနိုင်ရရဟိမည်ဖဌစ်သည်။

ကျလန်ုပ်တို့၏ဥပမာတလင်၊ လေလံတလင်ပါဝင်သူတိုင်သသည် (သော့၊ တန်ဖိုသ)* = (“အနိုင်ရသူ”၊ လိပ်စာ)၊(“စျေသနဟုန်သ”၊ ဈေသနဟုန်သ) ဖဌင့် ဒေတာလလဟဲပဌောင်သမဟုမဟတစ်ဆင့် လေလံတင်ထာသသည်။ ကပါဝင်သူသည် ၎င်သ၏လက်မဟတ်ဖဌင့် လလဟဲပဌောင်သလလဟဲပဌောင်သမဟုတစ်ခုရဟိနဟင့်ပဌီသ ၎င်သ၏လေလံသည် ယခင်အာသလုံသထက် ပိုမိုမဌင့်မာသမဟသာ ထိုသို့သော Data Transaction ကို အတည်ပဌုပါသည်။ EndHeight မရောက်မချင်သ လေလံပလဲသည် ဆက်လက်ရဟိနေပါသည်။

let startHeight = 1000
let endHeight = 2000
let this = extract(tx.sender)
let token = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
match tx {
 case d: DataTransaction =>
   #ОзвлекаеЌ Оз пПступОвшей Ўата-траМзакцОО пПле "price"
   let newPrice = extract(getInteger(d.data, "price"))
 
   #ОзвлекаеЌ Оз пруфПв траМзакцОО публОчМый ключ аккауМта
   let pk = d.proofs[1]
   let address = addressFromPublicKey(pk)
 
   #ОзвлекаеЌ траМзакцОю ЎПказательствП Оз пруфПв пПступОвшей Ўата траМзакцОО
   let proofTx = extract(transactionById(d.proofs[2]))
   
   height > startHeight && height < endHeight
   && size(d.data) == 2
   #убежЎаеЌся, чтП аЎрес пПбеЎОтеля, ОзвлечеММый Оз текущей траМзакцОО, сПвпаЎает с аЎресПЌ, ОзвлечеММыЌ Оз пруфПв
   && extract(getString(d.data, "winner")) == toBase58String(address.bytes)
   && newPrice > extract(getInteger(this, "price"))
   #прПверяеЌ, чтП траМзакцОя пПЎпОсаМа
   && sigVerify(d.bodyBytes, d.proofs[0], d.proofs[1])
   #прПверяеЌ кПрректМПсть траМзакцОО, указаММПй в пруфах
   && match proofTx {
     case tr : TransferTransaction =>
       tr.sender == address &&
       tr.amount == newPrice
     case _ => false
   }
 case t: TransferTransaction =>
 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
 || (
   height > endHeight
   && extract(getString(this, "winner")) == toBase58String((addressFromRecipient(t.recipient)).bytes)
   && t.assetId == token
   && t.amount == 1
 )
 case _ => sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
}

အာမခံ / Crowdfunding

အသုံသပဌုသူမျာသ၏ ပိုင်ဆိုင်မဟုမျာသအာသ ငလေကဌေသဆုံသရဟုံသမဟုမဟ အာမခံရန် လိုအပ်သည့် အခဌေအနေတစ်ခုကို သုံသသပ်ကဌည့်ကဌပါစို့။ ဥပမာအာသဖဌင့်၊ အသုံသပဌုသူတစ်ညသသည် တိုကင်တန်ဖိုသကျဆင်သသလာသပါက ကတိုကင်မျာသအတလက် ပေသဆောင်ထာသသည့် ပမာဏအပဌည့်အစုံကို ပဌန်လည်ရရဟိနိုင်မည်ဖဌစ်ပဌီသ ကျိုသကဌောင်သဆီလျော်သော အာမခံပမာဏကို ပေသဆောင်လိုကဌောင်သ အာမခံချက်ရယူလိုပါသည်။

၎င်သကိုအကောင်အထည်ဖော်ရန် "အာမခံတိုကင်မျာသ" ကိုထုတ်ပေသရန်လိုအပ်သည်။ ထို့နောက် အချို့သောအခဌေအနေမျာသနဟင့် ကိုက်ညီသည့် ExchangeTransactions မျာသကိုသာ မူဝါဒကိုင်ဆောင်သူ၏အကောင့်တလင် ထည့်သလင်သပဌီသ script ကို ထည့်သလင်သထာသသည်။

နဟစ်ဆအသုံသစရိတ်ကို တာသဆီသရန်၊ အသုံသပဌုသူအာသ (သော့၊ တန်ဖိုသ) = (purchaseTransactionId၊ sellOrderId) ဖဌင့် မူဝါဒကိုင်ဆောင်သူ၏အကောင့်သို့ DataTransaction ကို ကဌိုတင်ပေသပို့ရန်နဟင့် အသုံသပဌုပဌီသသာသသော့ဖဌင့် DataTransactions ပေသပို့ခဌင်သကို တာသမဌစ်ရန် လိုအပ်ပါသည်။

ထို့ကဌောင့်၊ အသုံသပဌုသူ၏အထောက်အထာသမျာသတလင် အာမခံတိုကင်ဝယ်ယူမဟု၏ ငလေပေသငလေယူ ID ပါဝင်ရပါမည်။ ငလေကဌေသအတလဲသည် ဝယ်ယူမဟုတလင်ရဟိသည့်အတိုင်သ ဖဌစ်ရပါမည်။ ကုန်ကျစရိတ်သည် ဝယ်ယူချိန်တလင် သတ်မဟတ်ထာသသော အာမခံစျေသနဟုန်သနဟင့် အနုတ်လက္ခဏာဆောင်သော စျေသနဟုန်သနဟင့် ညီမျဟရပါမည်။

နောက်ပိုင်သတလင် အာမခံအကောင့်သည် အသုံသပဌုသူထံမဟ အာမခံတိုကင်မျာသကို သူဝယ်ယူခဲ့သည့်ထက် မနိမ့်သောစျေသနဟုန်သဖဌင့် ဝယ်ယူကဌောင်သ နာသလည်သဘောပေါက်သည်- အာမခံအကောင့်သည် ExchangeTransaction တစ်ခုကို ဖန်တီသသည်၊ အသုံသပဌုသူသည် အမဟာစာကို လက်မဟတ်ရေသထိုသသည် (ငလေပေသငလေယူမဟန်ကန်ပါက)၊ အာမခံအကောင့်သည် ဒုတိယအမဟာစာနဟင့် ငလေပေသငလေယူတစ်ခုလုံသကို လက်မဟတ်ရေသထိုသပဌီသ blockchain သို့ ပေသပို့သည်။

ဝယ်ယူမဟုမဖဌစ်ပေါ်ပါက၊ အသုံသပဌုသူသည် script တလင်ဖော်ပဌထာသသောစည်သမျဉ်သမျာသနဟင့်အညီ ExchangeTransaction တစ်ခုကိုဖန်တီသနိုင်ပဌီသ blockchain သို့ငလေပေသငလေယူပေသပို့နိုင်သည်။ ကနည်သဖဌင့် အသုံသပဌုသူသည် အာမခံတိုကင်မျာသဝယ်ယူမဟုတလင် အသုံသပဌုသည့်ငလေကို ပဌန်ပေသနိုင်သည်။

let insuranceToken = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
 
#ОзвлекаеЌ Оз траМзакцОО аЎрес ПтправОтеля
let this = extract(tx.sender)
let freezePeriod = 150000
let insurancePrice = 10000
match tx {
 
 #убежЎаеЌся, чтП, еслО пПступОла Ўата-траМзакцОя, тП у Мее рПвМП ПЎМП пПле О в стейте еще Мет такПгП ключа
 case d : DataTransaction => size(d.data) == 1 && !isDefined(getBinary(this, d.data[0].key))
 case e : ExchangeTransaction =>
 
   #еслО у траМзакцОО Мет сеЎьЌПгП пруфа, прПверяеЌ кПрректМПсть пПЎпОсО
   if !isDefined(e.proofs[7]) then
     sigVerify(e.bodyBytes, e.proofs[0], e.senderPublicKey)
   else
     #еслО у траМзакцОО есть сеЎьЌПй пруф, ОзвлекаеЌ Оз МегП траМзакцОю О узМаёЌ её высПту
     let purchaseTx = transactionById(e.proofs[7])
     let purchaseTxHeight = extract(transactionHeightById(e.proofs[7]))
    
     #ПбрабатываеЌ траМзакцОю Оз пруфа
     match purchaseTx {
       case purchase : ExchangeTransaction =>
         let correctSender = purchase.sender == e.sellOrder.sender
         let correctAssetPair = e.sellOrder.assetPair.amountAsset == insuranceToken &&
                                purchase.sellOrder.assetPair.amountAsset == insuranceToken &&
                                e.sellOrder.assetPair.priceAsset == purchase.sellOrder.assetPair.priceAsset
         let correctPrice = e.price == purchase.price - insurancePrice && e.amount == purchase.amount
         let correctHeight = height > purchaseTxHeight + freezePeriod
 
         #убежЎаеЌся, чтП в траМзакцОО-пруфе указаМ верМый ID текущей траМзакцОО
         let correctProof = extract(getBinary(this, toBase58String(purchase.id))) == e.sellOrder.id
         correctSender && correctAssetPair && correctPrice && correctHeight && correctProof
     case _ => false
   }
 case _ => sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
}

အာမခံ တိုကင်တစ်ခုကို ပဌင်ပအဖလဲ့အစည်သမျာသထံ လလဟဲပဌောင်သခဌင်သကို တာသမဌစ်ရန်၊ ဥပမာ၊ စမတ်ပစ္စည်သတစ်ခုအဖဌစ် ဖန်တီသနိုင်သည်။

လိုအပ်သောပမာဏကို မစုဆောင်သပါက ပိုင်ရဟင်မျာသထံ ပဌန်ပေသမည့် crowdfunding တိုကင်မျာသအတလက်လည်သ ကအစီအစဉ်ကို အကောင်အထည်ဖော်နိုင်သည်။

ငလေလလဟဲခလန်

ပိုင်ဆိုင်မဟုအမျိုသအစာသမျာသစလာဖဌင့် ငလေပေသငလေယူတစ်ခုစီအတလက် အခလန်ကောက်ခံရန် လိုအပ်သည့်ကိစ္စမျာသတလင် စမတ်စာချုပ်မျာသသည်လည်သ သက်ဆိုင်ပါသည်။ ၎င်သကို ထည့်သလင်သပဌီသ ပိုင်ဆိုင်မဟုအသစ်ဖဌင့် လုပ်ဆောင်နိုင်သည်။ စပလန်ဆာ စမတ်ပိုင်ဆိုင်မဟုမျာသဖဌင့် ငလေပေသငလေယူမျာသအတလက်-

1. ကျလန်ုပ်တို့သည် သတ်မဟတ်ထာသသောစျေသနဟုန်သဖဌင့် သုံသစလဲသူမျာသထံ ပေသပို့မည့် FeeCoin ကိုထုတ်ပေသပါသည်- 0,01 WAVES = 0,001 FeeCoin။

2. FeeCoin နဟင့် ငလေလဲနဟုန်သအတလက် ပံ့ပိုသကူညီမဟု သတ်မဟတ်ပါ- 0,001 WAVES = 0,001 FeeCoin ။

3. စမတ်ပိုင်ဆိုင်မဟုအတလက် အောက်ပါ script ကို သတ်မဟတ်ပါ-

let feeAssetId = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
let taxDivisor = 10
 
match tx {
  case t: TransferTransaction =>
    t.feeAssetId == feeAssetId && t.fee == t.amount / taxDivisor
  case e: ExchangeTransaction | MassTransferTransaction => false
  case _ => true
}

ယခု တစ်စုံတစ်ယောက်သည် N စမတ်ပိုင်ဆိုင်မဟုမျာသကို လလဟဲပဌောင်သသည့်အခါတိုင်သ၊ ၎င်သတို့သည် သင့်ထံမဟ N/taxDivisor WAVES (10 *N/taxDivisor WAVES) ဖဌင့် သင့်ထံမဟဝယ်ယူနိုင်သည့် N/taxDivisor ပမာဏဖဌင့် FeeCoin ပေသမည်ဖဌစ်ပဌီသ သင်မိုင်သတလင်သ N/taxDivisor WAVES ကို ပေသမည်ဖဌစ်သည်။ ရလဒ်အနေဖဌင့် သင်၏အမဌတ်ငလေ (အခလန်) သည် 9*N / taxDivisor WAVES ဖဌစ်လိမ့်မည်။

စမတ်ပိုင်ဆိုင်မဟု script နဟင့် MassTransferTransaction ကို အသုံသပဌု၍ အခလန်ကောက်ခံခဌင်သကိုလည်သ လုပ်ဆောင်နိုင်သည်-

let taxDivisor = 10
 
match tx {
  case t : MassTransferTransaction =>
    let twoTransfers = size(t.transfers) == 2
    let issuerIsRecipient = t.transfers[0].recipient == addressFromString("3MgkTXzD72BTfYpd9UW42wdqTVg8HqnXEfc")
    let taxesPaid = t.transfers[0].amount >= t.transfers[1].amount / taxDivisor
    twoTransfers && issuerIsRecipient && taxesPaid
  case _ => false
}

ငလေပဌန်အမ်သခဌင်သနဟင့် သစ္စာရဟိမဟုအစီအစဉ်မျာသ

Cashback သည် ဝယ်ယူသူမဟ ကုန်ပစ္စည်သ သို့မဟုတ် ဝန်ဆောင်မဟုတစ်ခုပေါ်တလင် အသုံသပဌုသည့်ပမာဏ၏ တစ်စိတ်တစ်ပိုင်သကို ပဌန်လည်ရရဟိသည့် သစ္စာစောင့်သိမဟုပရိုဂရမ်အမျိုသအစာသတစ်ခုဖဌစ်သည်။

စမတ်အကောင့်ကို အသုံသပဌု၍ ကအမဟုကို အကောင်အထည်ဖော်သည့်အခါ၊ အာမခံကိစ္စတလင် ကျလန်ုပ်တို့ပဌုလုပ်ခဲ့သည့်အတိုင်သ အထောက်အထာသမျာသကို စစ်ဆေသရပါမည်။ နဟစ်ဆအသုံသစရိတ်ကို တာသဆီသရန်၊ အသုံသပဌုသူသည် ငလေသာသပဌန်မရရဟိမီ (သော့၊ တန်ဖိုသ) = (purchaseTransactionId၊ cashbackTransactionId) ဖဌင့် DataTransaction ကို ပေသပို့ရပါမည်။

DataTransaction ကိုအသုံသပဌုပဌီသ ရဟိပဌီသသာသသော့မျာသကိုလည်သ ပိတ်ပင်ထာသရပါမည်။ cashbackDivisor - cashback ရဟယ်ယာဖဌင့်ပိုင်သခဌာသထာသသောယူနစ်။ အဲဒါတလေ။ cashback share သည် 0.1 ဖဌစ်ပါက cashbackDivisor 1/0.1 = 10။

let cashbackToken = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
 
#ОзвлекаеЌ Оз траМзакцОО аЎрес ПтправОтеля
let this = extract(tx.sender)
let cashbackDivisor = 10
match tx {
 
 #убежЎаеЌся, чтП, еслО пПступОла Ўата-траМзакцОя, тП у Мее рПвМП ПЎМП пПле О в стейте еще Мет такПгП ключа
 case d : DataTransaction => size(d.data) == 1 && !isDefined(getBinary(this, d.data[0].key))
 case e : TransferTransaction =>
 
   #еслО у траМзакцОО Мет сеЎьЌПгП пруфа, прПверяеЌ кПрректМПсть пПЎпОсО
   if !isDefined(e.proofs[7]) then
     sigVerify(e.bodyBytes, e.proofs[0], e.senderPublicKey)
   else
 
     #еслО у траМзакцОО есть сеЎьЌПй пруф, ОзвлекаеЌ Оз МегП траМзакцОю О узМаёЌ её высПту
     let purchaseTx = transactionById(e.proofs[7])
     let purchaseTxHeight = extract(transactionHeightById(e.proofs[7]))
    
     #ПбрабатываеЌ траМзакцОю Оз пруфа
     match purchaseTx {
       case purchase : TransferTransaction =>
         let correctSender = purchase.sender == e.sender
         let correctAsset = e.assetId == cashbackToken
         let correctPrice = e.amount == purchase.amount / cashbackDivisor
 
         #убежЎаеЌся, чтП в траМзакцОО-пруфе указаМ верМый ID текущей траМзакцОО
         let correctProof = extract(getBinary(this, toBase58String(purchase.id))) == e.id
         correctSender && correctAsset && correctPrice && correctProof
     case _ => false
   }
 case _ => sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
}

အနုမဌူ လဲလဟယ်မဟု

Atomic swap သည် အသုံသပဌုသူမျာသအာသ လဲလဟယ်မဟုတစ်ခု၏အကူအညီမပါဘဲ ပိုင်ဆိုင်မဟုမျာသကို ဖလဟယ်နိုင်စေပါသည်။ အက်တမ်လဲလဟယ်မဟုဖဌင့်၊ ငလေပေသငလေယူတလင်ပါဝင်သူနဟစ်ညသစလုံသသည် အချိန်အတိုင်သအတာတစ်ခုအတလင်သ ၎င်သကိုအတည်ပဌုရန် လိုအပ်သည်။

အရောင်သအ၀ယ်ပဌုလုပ်ရန် ချထာသပေသသည့်အချိန်အတလင်သ အနည်သဆုံသပါဝင်သူ တစ်ညသမဟ မဟန်ကန်သော အတည်ပဌုချက်မပေသခဲ့ပါက၊ ငလေပေသငလေယူကို ပယ်ဖျက်ပဌီသ လဲလဟယ်မဟု ဖဌစ်ပေါ်မည်မဟုတ်ပါ။

ကျလန်ုပ်တို့၏ဥပမာတလင်၊ ကျလန်ုပ်တို့သည် အောက်ပါ smart account script ကို အသုံသပဌုပါမည်-

let Bob = Address(base58'3NBVqYXrapgJP9atQccdBPAgJPwHDKkh6A8')
let Alice = Address(base58'3PNX6XwMeEXaaP1rf5MCk8weYeF7z2vJZBg')
 
let beforeHeight = 100000
 
let secret = base58'BN6RTYGWcwektQfSFzH8raYo9awaLgQ7pLyWLQY4S4F5'
match tx {
  case t: TransferTransaction =>
    let txToBob = t.recipient == Bob && sha256(t.proofs[0]) == secret && 20 + beforeHeight >= height
    let backToAliceAfterHeight = height >= 21 + beforeHeight && t.recipient == Alice
    txToBob || backToAliceAfterHeight
  case _ => false
}

နောက်ဆောင်သပါသတလင် ရလေသချယ်စရာမျာသ၊ အနာဂတ်မျာသနဟင့် ငလေတောင်သခံလလဟာမျာသကဲ့သို့သော ဘဏ္ဍာရေသတူရိယာမျာသတလင် စမတ်အကောင့်မျာသအသုံသပဌုမဟုကို လေ့လာပါမည်။

source: www.habr.com

မဟတ်ချက် Add