Fampiharana ny kaonty Waves smart: manomboka amin'ny lavanty mankany amin'ny programa bonus

Fampiharana ny kaonty Waves smart: manomboka amin'ny lavanty mankany amin'ny programa bonus

Ny Blockchain dia matetika mifandray amin'ny cryptocurrencies, fa ny faritra fampiharana ny teknolojia DLT dia midadasika kokoa. Ny iray amin'ireo faritra mampanantena indrindra amin'ny fampiasana blockchain dia fifanarahana marani-tsaina izay tanterahina ho azy ary tsy mitaky fifampitokisana eo amin'ireo antoko izay niditra tao.

RIDE – fiteny ho an'ny fifanarahana marani-tsaina

Namolavola fiteny manokana ho an'ny fifanarahana marani-tsaina ny Waves - RIDE. Misy ny antontan-taratasy feno ao aminy eto. Ary eto- lahatsoratra momba ity lohahevitra ity amin'ny Habr.

Ny fifanarahana RIDE dia predicate ary mamerina ny "marina" na "diso" ho vokatra. Noho izany, ny fifampiraharahana dia voarakitra ao amin'ny blockchain na nolavina. Ny fifanarahana smart dia miantoka tanteraka ny fahatanterahan'ny fepetra voafaritra. Tsy azo atao ny mamorona fifampiraharahana amin'ny fifanarahana ao amin'ny RIDE.

Ankehitriny dia misy karazany roa ny fifanarahana marani-tsaina Waves: kaonty marani-tsaina sy fananana marani-tsaina. Ny kaonty hendry dia kaonty mpampiasa mahazatra, saingy misy script napetraka ho azy izay mifehy ny fifampiraharahana rehetra. Ny script kaonty smart dia mety ho toy izao, ohatra:

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

tx dia fifampiraharahana karakaraina izay avelantsika hampiasa ny mekanika mifanandrify amin'ny lamina raha tsy fifampiraharahana. Ny fampitoviana lamina ao amin'ny RIDE dia ampiasaina hanamarinana ny karazana fifanakalozana. Ny kaonty efa misy rehetra dia azo karakaraina amin'ny script kaonty smart karazana fifanakalozana.

Ny script koa dia afaka manambara fari-pitsipika, mampiasa ny fananganana "raha-tsy-tsy" ary fomba hafa hanamarinana tanteraka ny fepetra. Mba hahazoana antoka fa ny fifanarahana dia manana fahafenoana azo porofoina sy sarotra (vidiny) izay mora vinavinaina alohan'ny hanombohan'ny fanatanterahana ny fifanarahana, dia tsy misy fehezanteny na fanambarana mitsambikina ny RIDE.

Ny endri-javatra hafa amin'ny kaonty Waves dia ahitana ny fisian'ny "fanjakana", izany hoe ny toetry ny kaonty. Azonao atao ny manoratra tsiroaroa tsy manam-petra (fanalahidy, sanda) amin'ny toetry ny kaonty amin'ny alΓ lan'ny fifanakalozana angona (DataTransaction). Ity fampahalalana ity dia azo karakaraina amin'ny alΓ lan'ny REST API na mivantana amin'ny fifanarahana marani-tsaina.

Ny fifampiraharahana tsirairay dia afaka mirakitra porofo maromaro, izay ahafahana mampiditra ny sonian'ny mpandray anjara, ny ID ny fifampiraharahana ilaina, sns.

Miara-miasa amin'ny RIDE via HERE mamela anao hahita ny fomba fijery natambatra ny fifanarahana (raha natambatra), mamorona kaonty vaovao sy mametraka script ho azy, ary koa ny fandefasana ny fifampiraharahana amin'ny alalan'ny baiko.

Ho an'ny tsingerina feno, ao anatin'izany ny famoronana kaonty, fametrahana fifanarahana marani-tsaina momba izany ary fandefasana fifampiraharahana, dia azonao atao koa ny mampiasa tranomboky hifaneraserana amin'ny REST API (ohatra, C#, C, Java, JavaScript, Python, Rust, Elixir) . Raha hanomboka hiasa amin'ny IDE, tsindrio fotsiny ny bokotra VAOVAO.

Mivelatra ny fahafahana mampiasa fifanarahana marani-tsaina: manomboka amin'ny fandrarana ny fifampiraharahana amin'ny adiresy sasany ("lisitra mainty") ka hatramin'ny dApps sarotra.

Andeha hojerentsika ny ohatra manokana momba ny fampiasana fifanarahana marani-tsaina amin'ny raharaham-barotra: rehefa manao lavanty, fiantohana, ary mamorona programa momba ny tsy fivadihana.

Auctions

Ny iray amin'ireo fepetra ho an'ny lavanty mahomby dia ny mangarahara: tsy maintsy matoky ny mpandray anjara fa tsy azo atao ny manodikodina ny tolo-bidy. Izany dia azo tanterahina noho ny blockchain, izay misy angon-drakitra tsy miova momba ny filokana rehetra sy ny fotoana nanaovana azy ireo ho azon'ny mpandray anjara rehetra.

Ao amin'ny Waves blockchain, ny tolo-bidy dia azo raketina ao amin'ny kaonty lavanty amin'ny alΓ lan'ny DataTransaction.

Azonao atao ihany koa ny mametraka ny fotoana fanombohana sy fiafaran'ny lavanty amin'ny alΓ lan'ny laharan'ny sakana: ny fatran'ny famokarana sakana ao amin'ny Waves blockchain dia mitovy amin'ny 60 segondra.

1. Auction amin'ny vidiny miakatra amin'ny teny anglisy

Ireo mpandray anjara amin'ny lavanty anglisy dia mametraka tolo-bidy amin'ny fifaninanana. Ny filokana vaovao tsirairay dia tsy maintsy mihoatra ny teo aloha. Mifarana ny lavanty rehefa tsy misy mpividy mihoatra ny tolo-bidy farany. Amin'ity tranga ity, ny mpividy ambony indrindra dia tsy maintsy manome ny vola voalaza.

Misy ihany koa ny safidy amin'ny lavanty izay ametrahan'ny mpivarotra ny vidiny ambany indrindra amin'ny lot, ary ny vidiny farany dia tsy maintsy mihoatra izany. Raha tsy izany dia mbola tsy amidy ny antsasak'adiny.

Amin'ity ohatra ity, miara-miasa amin'ny kaonty noforonina manokana ho an'ny lavanty izahay. Ny faharetan'ny lavanty dia blocs 3000, ary ny vidin'ny fanombohana dia 0,001 WAVES. Ny mpandray anjara dia afaka mametraka tolo-bidy amin'ny alΓ lan'ny fandefasana DataTransaction miaraka amin'ny "vidiny" fototra sy ny sandan'ny tolony.

Ny vidin'ny tolo-bidy vaovao dia tsy maintsy ambony noho ny vidiny amin'izao fotoana izao ho an'ity fanalahidy ity, ary ny mpandray anjara dia tsy maintsy manana mari-pamantarana [new_bid + commission] farafaharatsiny ao amin'ny kaontiny. Ny adiresin'ny mpanafatra dia tsy maintsy voarakitra ao amin'ny saha "mpanefa" ao amin'ny DataTransaction, ary ny haavon'ny sakana amin'izao fotoana izao dia tsy maintsy ao anatin'ny vanim-potoana lavanty.

Raha amin'ny faran'ny lavanty ny mpandray anjara dia nametraka ny vidiny ambony indrindra, dia afaka mandefa ExchangeTransaction handoavana ny entana mifanaraka amin'ny vidiny voafaritra sy ny mpivady vola.

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. lavanty holandey momba ny fihenam-bidy

Amin'ny lavanty holandey, betsaka no atolotra amin'ny vidiny ambony kokoa noho izay tian'ny mpividy aloa. Ny vidiny dia mihena tsikelikely mandra-pahatongan'ny iray amin'ireo mpandray anjara hanaiky hividy ny lot amin'ny vidiny ankehitriny.

Amin'ity ohatra ity dia mampiasa tsy miova mitovy amin'ny teo aloha isika, ary koa ny dingana amin'ny vidiny rehefa mihena ny delta. Ny script kaonty dia manamarina raha ny mpandray anjara tokoa no voalohany nametraka filokana. Raha tsy izany, ny DataTransaction dia tsy eken'ny 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. lavanty β€œkarama rehetra”

β€œAll-pay” dia lavanty izay handoavana ny tolo-bidy rehetra ny mpandray anjara, na iza na iza mahazo ny antsapaka. Ny mpandray anjara vaovao tsirairay dia mandoa tolo-bidy, ary ny mpandray anjara izay manao ny tolo-bidy ambony indrindra no mahazo ny loka.

Amin'ny ohatra ataontsika, ny mpandray anjara amin'ny lavanty tsirairay dia mametraka tolo-bidy amin'ny alΓ lan'ny DataTransaction miaraka amin'ny (key, sanda)* = ("mpandresy", adiresy), ("vidiny", vidiny). Ny DataTransaction toy izany dia ankatoavina raha tsy efa manana TransferTransaction miaraka amin'ny soniany io mpandray anjara io ary ambony noho ny teo aloha rehetra ny tolony. Mitohy ny lavanty mandra-pahatongan'ny 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)
}

Fiantohana / Crowdfunding

Andeha hojerentsika ny toe-javatra iray izay ilainao hiantohana ny fananan'ny mpampiasa amin'ny fatiantoka ara-bola. Ohatra, ny mpampiasa iray dia maniry antoka fa raha mihena ny mari-pamantarana iray, dia ho afaka hamerina ny vola feno nandoavana ireo mari-pamantarana ireo izy, ary vonona ny handoa fiantohana ara-dalΓ na.

Mba hampiharana izany dia mila avoaka ny "token'ny fiantohana". Avy eo dia misy script apetraka ao amin'ny kaontin'ny tompon'ny politika, ka ireo ExchangeTransactions izay mahafeno fepetra sasany ihany no azo tanterahina.

Mba hisorohana ny fandaniana avo roa heny, mila mangataka amin'ny mpampiasa ianao handefa DataTransaction amin'ny kaontin'ny tompon'ny politika mialoha miaraka amin'ny (key, value) = (purchaseTransactionId, sellOrderId) ary mandrara ny fandefasana DataTransactions miaraka amin'ny fanalahidy efa nampiasaina.

Noho izany, ny porofon'ny mpampiasa dia tsy maintsy ahitana ny ID momba ny fividianana mari-pankasitrahana. Ny mpivady vola dia tsy maintsy mitovy amin'ny fividianana fividianana. Ny vola lany koa dia tsy maintsy mitovy amin'ilay raikitra tamin'ny fotoana nividianana, minus ny vidin'ny fiantohana.

Fantatra fa avy eo ny kaonty fiantohana dia mividy mari-pamantarana fiantohana amin'ny mpampiasa amin'ny vidiny tsy ambany noho ny iray nividianany azy ireo: ny kaonty fiantohana dia mamorona ExchangeTransaction, ny mpampiasa dia manao sonia ny baiko (raha vita tsara ny varotra), ny ny kaonty fiantohana dia manao sonia ny baiko faharoa sy ny fifampiraharahana manontolo ary mandefa izany any amin'ny blockchain.

Raha tsy misy fividianana, ny mpampiasa dia afaka mamorona ExchangeTransaction araka ny fitsipika voalaza ao amin'ny script ary mandefa ny varotra amin'ny blockchain. Amin'izany fomba izany dia afaka mamerina ny vola lany amin'ny fividianana mari-pankasitrahana azo antoka ny mpampiasa.

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

Ny mariky ny fiantohana dia azo atao ho fananana hendry, ohatra, mba handrara ny famindrana azy amin'ny antoko fahatelo.

Ity tetika ity dia azo ampiharina ihany koa ho an'ny token'ny crowdfunding, izay averina amin'ny tompony raha tsy voaangona ny vola takiana.

Fandoavan-ketra

Ny fifanarahana marani-tsaina dia azo ampiharina ihany koa amin'ny tranga izay ilaina ny manangona hetra amin'ny varotra tsirairay miaraka amin'ny karazana fananana maro. Izany dia azo atao amin'ny alΓ lan'ny fananana vaovao misy napetraka fanohanana ho an'ny fifanakalozana amin'ny fananana marani-tsaina:

1. Mamoaka FeeCoin izahay, izay halefa amin'ny mpampiasa amin'ny vidiny raikitra: 0,01 WAVES = 0,001 FeeCoin.

2. Mametraha fanohanana ho an'ny FeeCoin sy ny tahan'ny fifanakalozana: 0,001 WAVES = 0,001 FeeCoin.

3. Apetraho ity script manaraka ity ho an'ny fananana hendry:

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
}

Amin'izao fotoana izao, isaky ny misy olona mamindra ny fananana smart N dia hanome anao FeeCoin amin'ny habetsaky ny N/taxDivisor (izay azo vidiana aminao amin'ny 10 *N/taxDivisor WAVES), ary homenao ny mpitrandraka N/taxDivisor WAVES. Vokatr'izany, ny tombony (hetra) dia ho 9*N / taxDivisor WAVES.

Azonao atao ihany koa ny manao hetra amin'ny alΓ lan'ny script asset smart sy 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 sy programa tsy fivadihana

Cashback dia karazana programa mahatoky izay averin'ny mpividy ny ampahany amin'ny vola lany amin'ny vokatra na serivisy.

Rehefa mampihatra an'ity tranga ity amin'ny fampiasana kaonty marani-tsaina dia tsy maintsy manamarina ny porofo mitovy amin'ny nataonay tamin'ny raharaha fiantohana izahay. Mba hisorohana ny fandaniana avo roa heny, ny mpampiasa dia tsy maintsy mandefa DataTransaction miaraka amin'ny (key, value) = (purchaseTransactionId, cashbackTransactionId) alohan'ny handraisana vola.

Tsy maintsy mametraka fandrarana ihany koa ny fanalahidy efa misy amin'ny fampiasana DataTransaction. cashbackDivisor - vondrona mizara amin'ny ampahany cashback. Ireo. raha 0.1 ny anjaran'ny cashback, dia 1/0.1 = 10 ny cashbackDivisor.

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

Atomic swap dia ahafahan'ny mpampiasa mifanakalo fananana tsy misy fanampiana. Miaraka amin'ny swap atomika, ny mpandray anjara amin'ny fifampiraharahana dia takiana hanamarina izany ao anatin'ny fe-potoana iray.

Raha farafaharatsiny ny iray amin'ireo mpandray anjara dia tsy manome fanamafisana marina ny fifampiraharahana ao anatin'ny fotoana voatondro ho an'ny fifampiraharahana, dia foanana ny fifampiraharahana ary tsy misy ny fifanakalozana.

Amin'ny ohatra ataontsika dia hampiasa ity script kaonty marani-tsaina manaraka ity izahay:

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
}

Ao amin'ny lahatsoratra manaraka dia hojerentsika ny fampiasana kaonty marani-tsaina amin'ny fitaovana ara-bola toy ny safidy, hoavy ary faktiora.

Source: www.habr.com

Add a comment