Daim ntawv thov ntawm Waves cov nyiaj ntse: los ntawm kev sib tw rau cov kev pab cuam ntxiv

Daim ntawv thov ntawm Waves cov nyiaj ntse: los ntawm kev sib tw rau cov kev pab cuam ntxiv

Blockchain feem ntau tsuas yog cuam tshuam nrog cryptocurrencies, tab sis thaj chaw ntawm kev siv DLT thev naus laus zis ntau dua. Ib qho kev cog lus zoo tshaj plaws rau kev siv blockchain yog daim ntawv cog lus ntse uas tau ua tiav thiab tsis tas yuav muaj kev ntseeg siab ntawm ob tog uas nkag mus rau hauv nws.

RIDE - ib hom lus rau kev cog lus ntse

Waves tau tsim cov lus tshwj xeeb rau kev cog lus ntse - RIDE. Nws cov ntaub ntawv tiav yog nyob no. Thiab ntawm no - tsab xov xwm ntawm lub ncauj lus no ntawm Habr.

Daim ntawv cog lus RIDE yog ib qho piv txwv thiab xa rov qab "tseeb" lossis "tsis tseeb" raws li cov zis. Raws li, qhov kev sib pauv yog sau tseg hauv blockchain lossis tsis lees paub. Daim ntawv cog lus ntse tau lees paub qhov ua tiav ntawm cov xwm txheej tshwj xeeb. Tsim kev lag luam los ntawm daim ntawv cog lus hauv RIDE tam sim no tsis tuaj yeem ua tau.

Niaj hnub no muaj ob hom Waves ntse daim ntawv cog lus: cov nyiaj ntse thiab cov cuab tam ntse. Ib tus as khauj ntse yog tus neeg siv nyiaj tsis tu ncua, tab sis tsab ntawv raug teeb tsa rau nws uas tswj txhua qhov kev hloov pauv. Ib daim ntawv sau nyiaj ntse yuav zoo li qhov no, piv txwv li:

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

tx yog kev ua lag luam uas peb tso cai siv cov qauv sib txuam tsuas yog tias nws tsis yog kev hloov pauv. Cov qauv sib txuam hauv RIDE yog siv los kuaj xyuas hom kev lag luam. Tag nrho cov nyiaj uas twb muaj lawm tuaj yeem ua tiav hauv daim ntawv sau nyiaj ntse hom kev lag luam.

Tsab ntawv kuj tseem tuaj yeem tshaj tawm cov kev hloov pauv, siv "yog-tom qab-lwm" tsim thiab lwm txoj hauv kev rau kev kuaj xyuas tag nrho. Txhawm rau kom ntseeg tau tias cov ntawv cog lus muaj qhov ua tiav tiav thiab qhov nyuaj (tus nqi) uas yooj yim los twv ua ntej kev cog lus pib ua tiav, RIDE tsis muaj cov voj voog lossis cov lus dhia.

Lwm yam nta ntawm Waves accounts muaj xws li muaj lub "xeev", uas yog, lub xeev ntawm tus account. Koj tuaj yeem sau tus lej tsis kawg ntawm cov khub (qhov tseem ceeb, tus nqi) rau tus account lub xeev siv cov ntaub ntawv pauv (DataTransaction). Cov ntaub ntawv no tuaj yeem ua tiav ob qho tib si los ntawm REST API thiab ncaj qha hauv daim ntawv cog lus ntse.

Txhua qhov kev sib pauv tuaj yeem muaj cov ntaub ntawv pov thawj, uas kos npe ntawm tus neeg koom nrog, ID ntawm qhov yuav tsum tau ua, thiab lwm yam tuaj yeem nkag mus.

Ua haujlwm nrog RIDE ntawm NTAWM NO tso cai rau koj kom pom cov kev pom zoo ntawm daim ntawv cog lus (yog tias nws tau muab tso ua ke), tsim cov nyiaj tshiab thiab teeb tsa cov ntawv rau nws, nrog rau xa cov kev hloov pauv ntawm kab hais kom ua.

Rau tag nrho lub voj voog, suav nrog kev tsim ib tus as-qhauj, txhim kho daim ntawv cog lus ntse rau nws thiab xa cov khoom lag luam, koj tuaj yeem siv lub tsev qiv ntawv rau kev cuam tshuam nrog REST API (piv txwv li, C#, C, Java, JavaScript, Python, Rust, Elixir) . Txhawm rau pib ua haujlwm nrog IDE, tsuas yog nyem lub pob tshiab.

Cov muaj peev xwm siv cov ntawv cog lus ntse yog qhov dav: los ntawm kev txwv kev lag luam rau qee qhov chaw nyob ("dub npe") mus rau dApps nyuaj.

Tam sim no cia peb saib cov piv txwv tshwj xeeb ntawm kev siv cov ntawv cog lus ntse hauv kev lag luam: thaum ua kev sib tw, kev tuav pov hwm, thiab tsim cov kev pabcuam ncaj ncees.

Kev muag khoom

Ib qho ntawm cov xwm txheej rau kev sib tw ua tiav yog pob tshab: cov neeg tuaj koom yuav tsum ntseeg siab tias nws tsis tuaj yeem tswj hwm qhov kev sib tw. Qhov no tuaj yeem ua tiav ua tsaug rau blockchain, qhov twg cov ntaub ntawv tsis hloov pauv ntawm txhua qhov kev twv txiaj thiab lub sijhawm uas lawv tau ua yuav muaj rau txhua tus neeg koom.

Ntawm Waves blockchain, kev twv yuav raug kaw nyob rau hauv lub xeev tus account auction ntawm DataTransaction.

Koj tuaj yeem teeb tsa lub sijhawm pib thiab xaus ntawm kev sib tw siv cov lej thaiv: qhov zaus ntawm kev tsim thaiv hauv Waves blockchain yog kwv yees li sib npaug. 60 vib nas this.

1. English ascending price auction

Cov neeg koom nrog hauv kev sib tw Askiv qhov chaw twv hauv kev sib tw nrog ib leeg. Txhua tus thawj koom ruam tshiab yuav tsum tshaj qhov dhau los. Qhov kev sib tw xaus thaum tsis muaj cov neeg sib tw ntxiv kom dhau qhov kev sib tw zaum kawg. Hauv qhov no, tus neeg sib tw siab tshaj plaws yuav tsum muab tus nqi teev tseg.

Kuj tseem muaj kev xaiv auction uas tus neeg muag khoom tau teev tus nqi tsawg kawg nkaus rau qhov ntau, thiab tus nqi kawg yuav tsum tshaj nws. Txwv tsis pub, qhov ntau tseem tsis tau muag.

Hauv qhov piv txwv no, peb tab tom ua haujlwm nrog tus account tshwj xeeb tsim rau kev sib tw. Lub sijhawm sib tw yog 3000 blocks, thiab tus nqi pib ntawm qhov ntau yog 0,001 WAVES. Ib tus neeg tuaj koom tuaj yeem tso qhov kev sib tw los ntawm kev xa cov DataTransaction nrog tus yuam sij "nqi" thiab tus nqi ntawm lawv qhov kev twv.

Tus nqi ntawm qhov kev sib tw tshiab yuav tsum siab dua tus nqi tam sim no rau tus yuam sij no, thiab tus neeg koom yuav tsum muaj tsawg kawg [new_bid + commission] tokens hauv nws tus account. Tus neeg sib tw qhov chaw nyob yuav tsum tau sau tseg rau hauv "sender" teb hauv DataTransaction, thiab tam sim no qhov siab thaiv qhov siab yuav tsum nyob rau hauv lub sijhawm sib tw.

Yog tias thaum kawg ntawm qhov kev sib tw, tus neeg tuaj koom tau teeb tsa tus nqi siab tshaj plaws, nws tuaj yeem xa ib qho ExchangeTransaction los them rau qhov sib thooj ntawm tus nqi teev thiab cov txiaj ntsig.

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. Dutch auction ntawm tus nqi txo

Hauv kev sib tw Dutch, ntau qhov pib pib ntawm tus nqi siab dua li tus neeg yuav khoom txaus siab them. Tus nqi txo qis zuj zus mus txog thaum ib tus neeg koom nrog pom zoo yuav ntau ntawm tus nqi tam sim no.

Hauv qhov piv txwv no peb siv tib qhov tsis tu ncua ib yam li yav dhau los, nrog rau tus nqi kauj ruam thaum delta txo. Cov ntawv sau nyiaj txheeb xyuas seb tus neeg koom puas yog thawj tus thawj koom ruam. Txwv tsis pub, DataTransaction tsis tau txais los ntawm 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. Auction "tag nrho-them"

"Tag nrho-them" yog qhov kev sib tw uas txhua tus neeg koom them tus nqi sib tw, tsis hais leej twg yeej qhov ntau. Txhua tus neeg tuaj koom tshiab them tus nqi sib tw, thiab tus neeg koom nrog uas ua rau qhov siab tshaj plaws tau yeej qhov ntau.

Hauv peb qhov piv txwv, txhua tus neeg koom nrog kev sib tw muab qhov kev sib tw ntawm DataTransaction nrog (qhov tseem ceeb, tus nqi) * = ("yeej", chaw nyob), ("nqi", nqe). Xws li DataTransaction tsuas yog pom zoo yog tias tus neeg koom nrog no twb muaj Kev Hloov Pauv nrog nws kos npe thiab nws qhov kev sib tw siab dua tag nrho cov yav dhau los. Lub auction tseem mus txog qhov kawg Height.

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

Insurance / Crowdfunding

Cia peb xav txog qhov xwm txheej uas koj yuav tsum tau pov hwm cov neeg siv khoom muaj nqis tiv thaiv kev poob nyiaj txiag. Piv txwv li, tus neeg siv xav tau kev lees paub tias yog tias tus token depreciates, nws yuav tuaj yeem rov qab tau tag nrho cov nyiaj them rau cov tokens, thiab txaus siab them tus nqi pov hwm tsim nyog.

Yuav kom siv tau qhov no, "insurance tokens" yuav tsum tau muab tawm. Tom qab ntawd ib tsab ntawv raug ntsia rau ntawm tus tuav ntaub ntawv tus account, tso cai rau tsuas yog cov ExchangeTransactions uas ua tau raws li qee yam xwm txheej kom ua tiav.

Txhawm rau tiv thaiv kev siv nyiaj ob npaug, koj yuav tsum thov kom tus neeg siv xa daim DataTransaction rau tus tuav tswj tus account ua ntej nrog (qhov tseem ceeb, tus nqi) = (purchaseTransactionId, sellOrderId) thiab txwv tsis pub xa DataTransactions nrog tus yuam sij uas twb tau siv lawm.

Yog li ntawd, tus neeg siv cov ntaub ntawv pov thawj yuav tsum muaj tus lej ID ntawm kev tuav pov hwm token muas. Tus khub txiaj yuav tsum zoo ib yam li hauv kev yuav khoom. Tus nqi kuj yuav tsum sib npaug li qhov ruaj thaum lub sijhawm yuav khoom, rho tawm tus nqi ntawm kev tuav pov hwm.

Nws tau nkag siab tias tom qab ntawd tus account tuav pov hwm yuav cov ntawv pov hwm tokens los ntawm tus neeg siv ntawm tus nqi tsis qis dua qhov uas nws tau yuav lawv: cov nyiaj tuav pov hwm tsim ib qho ExchangeTransaction, tus neeg siv kos npe rau qhov kev txiav txim (yog tias qhov kev sib pauv tiav lawm), lub kev tuav pov hwm tus account kos npe rau qhov kev txiav txim thib ob thiab tag nrho cov kev sib pauv thiab xa mus rau blockchain.

Yog tias tsis muaj kev yuav khoom tshwm sim, tus neeg siv tuaj yeem tsim qhov ExchangeTransaction raws li cov cai tau piav qhia hauv tsab ntawv thiab xa cov kev pauv mus rau blockchain. Txoj kev no tus neeg siv tuaj yeem xa rov qab cov nyiaj siv los ntawm kev yuav cov ntawv pov hwm tokens.

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

Ib qho kev tuav pov hwm token tuaj yeem ua ib qho cuab tam ntse, piv txwv li, txwv tsis pub nws hloov mus rau lwm tus neeg.

Cov tswv yim no tseem tuaj yeem siv tau rau cov neeg coob coob tokens, uas tau xa rov qab mus rau cov tswv yog tias qhov xav tau tsis tau sau.

Cov se ua lag luam

Cov ntawv cog lus ntse kuj tseem siv tau rau hauv rooj plaub uas yuav tsum tau sau se ntawm txhua qhov kev sib pauv nrog ntau hom khoom muaj nqis. Qhov no tuaj yeem ua tiav los ntawm cov cuab yeej tshiab nrog kev teeb tsa kev txhawb nqa rau kev lag luam nrog cov cuab tam ntse:

1. Peb muab FeeCoin, uas yuav raug xa mus rau cov neeg siv ntawm tus nqi ruaj khov: 0,01 WAVES = 0,001 FeeCoin.

2. Teem kev txhawb nqa rau FeeCoin thiab pauv tus nqi: 0,001 WAVES = 0,001 FeeCoin.

3. Teem cov ntawv hauv qab no rau cov cuab yeej ntse:

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
}

Tam sim no txhua zaus ib tug neeg hloov N cov cuab tam ntse, lawv yuav muab FeeCoin rau koj hauv tus nqi ntawm N / taxDivisor (uas tuaj yeem yuav los ntawm koj ntawm 10 * N / taxDivisor WAVES), thiab koj yuav muab cov miner N / taxDivisor WAVES. Yog li ntawd, koj cov nyiaj tau los (se) yuav yog 9 * N / taxDivisor WAVES.

Koj tseem tuaj yeem ua se siv cov khoom vaj khoom tsev ntse thiab 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 thiab loyalty programs

Cashback yog ib hom kev pabcuam ncaj ncees uas tus neeg yuav khoom tau rov qab ib feem ntawm cov nyiaj siv rau cov khoom lossis kev pabcuam.

Thaum ua raws li cov ntaub ntawv no siv tus account ntse, peb yuav tsum xyuas cov ntaub ntawv pov thawj zoo ib yam li peb tau ua hauv cov ntaub ntawv pov hwm. Txhawm rau tiv thaiv kev siv nyiaj ob npaug, tus neeg siv yuav tsum xa DataTransaction nrog (qhov tseem ceeb, tus nqi) = (purchaseTransactionId, cashbackTransactionId) ua ntej tau txais nyiaj rov qab.

Peb kuj yuav tsum teeb tsa txwv tsis pub siv cov yuam sij uas twb muaj lawm siv DataTransaction. cashbackDivisor - chav faib faib los ntawm cov nyiaj rov qab. Cov. yog tias qhov sib faib nyiaj rov qab yog 0.1, ces 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 swb

Atomic swap tso cai rau cov neeg siv pauv cov cuab tam yam tsis muaj kev sib pauv. Nrog rau kev sib pauv atomic, ob tus neeg koom hauv kev sib pauv yuav tsum tau lees paub nws nyob rau hauv ib lub sijhawm.

Yog tias tsawg kawg yog ib qho ntawm cov neeg koom tsis tau muab kev lees paub tseeb ntawm qhov kev sib pauv hauv lub sijhawm muab rau kev sib pauv, kev hloov pauv raug muab tso tseg thiab kev pauv pauv tsis tshwm sim.

Hauv peb qhov piv txwv, peb yuav siv cov ntawv sau nyiaj ntse hauv qab no:

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
}

Hauv tsab xov xwm tom ntej no peb yuav saib kev siv cov nyiaj ntse hauv cov cuab yeej nyiaj txiag xws li kev xaiv, yav tom ntej thiab cov nqi.

Tau qhov twg los: www.hab.com

Ntxiv ib saib