Codsiga xisaabaadka smart Waves: laga bilaabo xaraashka ilaa barnaamijyada gunnada

Codsiga xisaabaadka smart Waves: laga bilaabo xaraashka ilaa barnaamijyada gunnada

Blockchain inta badan waxay la xiriirtaa oo kaliya lacagaha loo yaqaan 'cryptocurrencies', laakiin aagagga adeegsiga tignoolajiyada DLT ayaa aad u ballaaran. Mid ka mid ah meelaha ugu rajo-gelinta badan ee isticmaalka blockchain waa qandaraas caqli-gal ah oo si toos ah loo fuliyo oo aan u baahnayn kalsooni ka dhaxaysa dhinacyada galay.

RIDE – luqad loogu talagalay qandaraasyada smart

Mowjadaha ayaa sameeyay luuqad gaar ah oo loogu talagalay qandaraasyada caqliga leh - RIDE. Dukumeentigeeda oo dhammaystiran ayaa yaalla halkan. Oo halkan - maqaal ku saabsan mawduucan ee Habr.

Qandaraaska RIDE waa saadaal wuxuuna soo celiyaa "run" ama "been" sidii wax soo saar ahaan. Sidaas awgeed, wax kala iibsiga waxaa lagu diiwaangeliyaa blockchain ama waa la diiday. Qandaraaska smart ayaa si buuxda u dammaanad qaadaya buuxinta shuruudaha la cayimay. Ka abuurista wax kala iibsiga qandaraaska RIDE hadda suurtagal maaha.

Maanta waxaa jira laba nooc oo qandaraasyada Waves smart: xisaabaadka smart iyo hantida smart. Koontada casriga ah waa akoon isticmaale oo joogto ah, laakiin qoraal ayaa loo dejiyay kaas oo maamula dhammaan wax kala iibsiga. Qoraal xisaabeedka smart wuxuu u ekaan karaa sidan, tusaale:

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

tx waa macaamil ganacsi oo la farsameeyo oo aan u oggolaano isticmaalka habka isbarbardhigga qaabka kaliya haddii aysan ahayn macaamil wareejin. U dhigma qaabka RIDE waxaa loo isticmaalaa in lagu hubiyo nooca wax kala iibsiga. Dhammaan xisaabaadka jira waxaa lagu farsamayn karaa qoraalka xisaabta smart noocyada wax kala iibsiga.

Qoraalku waxa kale oo uu ku dhawaaqi karaa doorsoomayaasha, isticmaal "haddii-ka dibna-kale" dhismooyinka iyo habab kale si aad si buuxda u hubiso xaaladaha. Si loo hubiyo in qandaraasyadu ay leeyihiin dhammaystir la taaban karo iyo kakanaanta (qiimaha) oo ay fududahay in la saadaaliyo ka hor intaan la bilaabin fulinta qandaraaska, RIDE kuma jiraan wareegyo ama weedho boodi ah.

Tilmaamaha kale ee xisaabaadka Waves waxaa ka mid ah joogitaanka "state", taas oo ah, xaaladda xisaabta. Waxaad ku qori kartaa tiro aan xadidnayn oo lammaane ah (furaha, qiimaha) gobolka koontada adiga oo isticmaalaya macaamilka xogta (DataTransaction). Macluumaadkan ayaa markaa laga baaraandegi karaa labadaba REST API iyo si toos ah qandaraaska smart.

Wax kala iibsi kastaa waxa uu ka koobnaan karaa cadaymo kala duwan, kaas oo saxeexa ka qaybqaataha, aqoonsiga macaamilka loo baahan yahay, iwm.

La shaqaynta RIDE iyada oo loo marayo HALKAN Waxay kuu ogolaaneysaa inaad aragto aragtida la soo ururiyey ee qandaraaska (haddii la ururiyey), abuurista xisaabaadyo cusub oo u dejiso qoraallo, iyo sidoo kale u dirto macaamil ganacsi iyada oo loo marayo khadka taliska.

Wareeg buuxa, oo ay ku jiraan abuurista akoon, ku rakibida qandaraas caqli gal ah iyo diritaanka macaamil ganacsi, waxaad sidoo kale u isticmaali kartaa maktabad si aad ula falgasho API REST (tusaale, C #, C, Java, JavaScript, Python, Rust, Elixir) . Si aad u bilowdo la shaqaynta IDE, kaliya dhagsii badhanka CUSUB.

Suurtagalnimada isticmaalka qandaraasyada smart waa ballaaran: laga bilaabo mamnuucista wax kala iibsiga ilaa ciwaanada qaarkood ("liiska madow") ilaa dApps adag.

Hadda aynu eegno tusaalooyin gaar ah oo ku saabsan isticmaalka qandaraasyada caqliga leh ee ganacsiga: marka la samaynayo xaraashka, caymiska, iyo abuurista barnaamijyada daacadnimada.

Xaraashka

Mid ka mid ah shuruudaha xaraashka guuleysta ayaa ah daahfurnaan: kaqeybgalayaashu waa inay ku kalsoonaadaan inaysan suurtagal ahayn in la maareeyo dalabaadka. Tan waxaa lagu gaari karaa iyadoo loo mahadcelinayo blockchain, halkaasoo xogta aan la beddeli karin ee ku saabsan dhammaan khamaarka iyo waqtiga la sameeyay ay heli doonaan dhammaan ka qaybgalayaasha.

Marka la eego blockchain ee Waves, dalabyada waxaa lagu qori karaa xisaabta xaraashka iyada oo loo marayo DataTransaction.

Waxa kale oo aad dejin kartaa bilowga iyo dhammaadka wakhtiga xaraashka adiga oo isticmaalaya tirooyinka xannibaadda: inta jeer ee jiilka xannibaadda ee blockchain Waves waxay la mid tahay qiyaastii 60 ilbiriqsi

1. Xaraashka qiimaha kor u kaca ee Ingiriisiga

Ka qaybgalayaasha xaraash Ingiriisi waxay ku tartamayaan midba midka kale. sharad kasta oo cusub waa in uu ka badan yahay kii hore. Xaraashku wuxuu dhamaanayaa marka aysan jirin shirkado kale oo ka badan tartanka ugu dambeeya. Xaaladdan oo kale, qandaraaslaha ugu sarreeya waa inuu bixiyaa qaddarka la sheegay.

Waxa kale oo jira ikhtiyaar xaraash kaas oo iibiyuhu dejiyo qiimaha ugu yar ee fara badan, qiimaha ugu dambeeyana waa inuu ka badan yahay. Haddii kale, bakhtiyaa nasiibku wuu jiraa.

Tusaalahan, waxaanu kula shaqaynaynaa akoon si gaar ah loogu sameeyay xaraashka. Muddada xaraashku waa 3000 baloog, qiimaha bilawga ah ee alaabtuna waa 0,001 WAVES. Ka qaybqaataha wuxuu soo diri karaa dalab isagoo soo diraya DataTransaction oo wata furaha "qiimaha" iyo qiimaha dalabkooda.

Qiimaha qandaraaska cusubi waa inuu ka sarreeyaa qiimaha hadda furaha, ka qaybqaatahana waa inuu akoonkiisa ku hayaa ugu yaraan [new_bid + commission] tokens. Ciwaanka qandaraaslaha waa in lagu diwaan galiyo goobta "diraha" ee DataTransaction, iyo dhererka xannibaadda qandaraasku waa in uu ku jiraa xilliga xaraashka.

Haddii dhamaadka xaraashka ka qaybqaataha uu dejiyo qiimaha ugu sarreeya, wuxuu soo diri karaa ExchangeTransaction si uu ugu bixiyo saamiga u dhigma qiimaha iyo lacagta la cayimay.

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. Xaraashka Nederlandka ee hoos u dhaca qiimaha

Xaraashka Nederlandka, wax badan ayaa marka hore lagu bixiyaa qiimo ka sarreeya waxa iibsaduhu doonayo inuu bixiyo. qiimuhu wuxuu hoos u dhacayaa talaabo-tallaabo ilaa mid ka mid ah ka qaybgalayaasha uu ogolaado inuu ku iibsado baadka qiimaha hadda jira.

Tusaalahan waxaanu isticmaalnaa isla joogtooyinkii kii hore, iyo sidoo kale talaabada qiimaha marka delta hoos u dhacdo. Qoraalka akoonku wuxuu hubinayaa in ka qaybqaataha uu runtii yahay kan ugu horreeya ee sharad dhiga. Haddii kale, DataTransaction ma aqbalayo 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. Xaraashka "dhammaan bixinta"

"All-pay" waa xaraash ay dhammaan ka qaybgalayaashu bixiyaan tartanka, iyada oo aan loo eegin cidda ku guulaysata saamiga. Ka qaybgale kasta oo cusub ayaa bixiya dalab, ka qaybqaataha sameeya dalabka ugu badana wuxuu ku guulaystaa saamiga.

Tusaalahayaga, ka qaybgale xaraash kastaa wuxuu ku shubaa dalab isagoo adeegsanaya DataTransaction leh (furaha, qiimaha)* = ("guuleeyaha", ciwaanka), ("qiimaha", qiimaha). DataTransaction noocan oo kale ah ayaa la ansixiyay kaliya haddii ka qaybqaatahani uu hore u lahaa Transfer TransferTransaction oo saxiixiisa iyo dalabkiisu uu ka sarreeyo dhammaan kuwii hore. Xaraashka ayaa socon doona ilaa dhamaadkaHeight laga gaarayo.

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

Caymiska / Crowdfunding

Aynu ka fiirsanno xaalad aad u baahan tahay inaad ka caymiso hantida isticmaalayaasha ka dhanka ah khasaaraha maaliyadeed. Tusaale ahaan, isticmaaluhu wuxuu rabaa dammaanad ah in haddii calaamaduhu hoos u dhacaan, uu awoodi doono inuu dib u soo celiyo lacagta buuxda ee lagu bixiyay calaamadahan, oo uu diyaar u yahay inuu bixiyo qaddar macquul ah oo caymis ah.

Si taas loo hirgeliyo, "calaamadaha caymiska" waxay u baahan yihiin in la soo saaro. Kadibna qoraal ayaa lagu rakibay koontada sharci-hayaha, taas oo u oggolaanaysa kaliya ExchangeTransactions ee buuxiya shuruudaha qaarkood in la fuliyo.

Si aad uga hortagto kharashaadka labanlaabka ah, waxaad u baahan tahay inaad ka codsato adeegsadaha inuu horay ugu soo diro DataTransaction akoontada siyaasad-hayaha oo wata (furaha, qiimaha) = (purchaseTransactionId, sellOrderId) oo aad mamnuucdo diritaanka DataTransactions fure hore loo isticmaalay.

Sidaa darteed, caddaynta isticmaaluhu waa inay ku jiraan aqoonsiga macaamil ganacsi ee calaamada caymiska iibsashada. Lammaanaha lacaguhu waa inay la mid noqdaan kuwa wax iibsiga. Kharashku sidoo kale waa inuu la mid noqdaa kan go'an wakhtiga iibka, laga jaray qiimaha caymiska.

Waxaa la fahamsan yahay in markaa ka dib koontada caymisku ay ka iibsato calaamadihii caymiska ee isticmaalaha qiimo aan ka yarayn kii uu ku iibsaday: xisaabta caymiska waxay abuurtaa ExchangeTransaction, isticmaaluhu wuxuu saxeexaa amarka (haddii macaamilka si sax ah loo dhammeeyo), Koontada caymisku waxay saxeexdaa amarka labaad iyo macaamilka oo dhan waxayna u dirtaa blockchain .

Haddii wax iibsi ah uusan dhicin, isticmaaluhu wuxuu abuuri karaa ExchangeTransaction si waafaqsan xeerarka lagu qeexay qoraalka oo u diro macaamilka blockchain. Sidan ayuu isticmaaluhu u soo celin karaa lacagta ku baxday iibsashada calaamado caymis ah.

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

Calaamadda caymiska waxaa la samayn karaa hanti caqli-gal ah, tusaale ahaan, si loo mamnuuco u wareejinta dhinacyada saddexaad.

Nidaamkan waxa kale oo loo hirgelin karaa calaamado badan oo lacag ururin ah, kuwaas oo lagu celiyo mulkiilayaasha haddii aan la soo qaadin qaddarka loo baahan yahay.

Canshuuraha wax kala iibsiga

Qandaraasyada casriga ah ayaa sidoo kale lagu dabaqi karaa kiisaska ay lagama maarmaan tahay in la ururiyo canshuurta macaamil kasta oo leh dhowr nooc oo hanti ah. Tan waxa lagu samayn karaa hanti cusub oo la rakibay kafaalaqaadid wax kala iibsiga hantida smart:

1. Waxaanu bixinaa FeeCoin, kaas oo loogu diri doono isticmaalayaasha qiimo go'an: 0,01 WAVES = 0,001 FeeCoin.

2. U deji kafaala-qaadka FeeCoin iyo heerka sarrifka: 0,001 WAVES = 0,001 FeeCoin.

3. U deji qoraalka soo socda ee hantida caqliga leh:

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
}

Hadda mar kasta oo uu qof wareejiyo N hantida smart, waxay ku siin doonaan FeeCoin qaddarka N/taxDivisor (taas oo laga iibsan karo 10 *N/taxDivisor WAVES), waxaadna siin doontaa macdanta N/taxDivisor WAVES. Natiijo ahaan, faa'iidadaada (canshuurta) waxay noqon doontaa 9*N / cashuur qaybiye WAVES.

Waxa kale oo aad samayn kartaa canshuur adiga oo isticmaalaya qoraalka hantida smart iyo 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
}

Lacag celinta iyo barnaamijyada daacadnimada

Cashback waa nooc ka mid ah barnaamijka daacadnimada kaas oo iibsaduhu uu dib ugu soo celiyo qayb ka mid ah qaddarka ku baxay badeecad ama adeeg.

Marka la fulinayo kiiskan adoo isticmaalaya xisaab caqli-gal ah, waa inaan hubinnaa caddaynta si la mid ah sidii aan ku samaynay kiiska caymiska. Si looga hortago kharaj laba jibaaran, isticmaaluhu waa inuu soo diraa DataTransaction leh (furaha, qiimaha) = (purchaseTransactionId, cashbackTransactionId) ka hor intaysan helin lacag caddaan ah.

Waa inaan sidoo kale dhigno mamnuucida furayaasha jira anagoo adeegsanayna DataTransaction. cashbackDivisor - unug loo qaybiyay saamiga dib u celinta. Kuwaas. Haddii saamiga cashback uu yahay 0.1, ka dibna 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)
}

Atomikada is dhaafsiga

Isku beddelka atomiga wuxuu u oggolaanayaa isticmaaleyaasha inay beddelaan hantida iyaga oo aan gacan ka helin beddelka. Isku beddelashada atomiga, labada ka qaybgalayaasha wax kala iibsiga waxa looga baahan yahay inay ku xaqiijiyaan muddo cayiman gudaheed.

Haddii ugu yaraan mid ka mid ah ka qaybgalayaashu aanu bixin caddayn sax ah oo ku saabsan macaamilka wakhtiga loo qoondeeyey macaamilka, macaamilku waa la joojiyay oo sarrifka ma dhicin.

Tusaalahayaga, waxaanu isticmaali doonaa qoraalka akoonka smart ee soo socda:

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
}

Maqaalka soo socda waxaan ku eegi doonaa isticmaalka xisaabaadka smart ee agabka maaliyadeed sida xulashooyinka, mustaqbalka iyo biilasha.

Source: www.habr.com

Add a comment