Blockchain inowanzobatanidzwa chete necryptocurrencies, asi nzvimbo dzekushandiswa kweDLT tekinoroji dzakapamhama. Imwe yenzvimbo dzinonyanya kuvimbisa kushandiswa kwe blockchain chibvumirano chakangwara chinoitwa otomatiki uye chisingade kuvimbana pakati pemapato akapinda mairi.
RIDE - mutauro wezvibvumirano zvakangwara
Mafungu akagadzira mutauro wakasarudzika wezvibvumirano zvakangwara - RIDE. Zvinyorwa zvaro zvakakwana zviripo
Kondirakiti yeRIDE ishoko uye inodzorera "chokwadi" kana "nhema" sekubuda. Saizvozvo, kutengeserana kungave kwakanyorwa mu blockchain kana kurambwa. Iyo smart contract inovimbisa zvizere kuzadzikiswa kwemamiriro akatsanangurwa. Kugadzira kutengeserana kubva muchibvumirano muRIDE parizvino hazvigoneke.
Nhasi kune marudzi maviri eWaves smart makondirakiti: smart account uye smart assets. A smart account inguva dzose mushandisi account, asi script yakaisirwa iyo inodzora zvese zvekutengesa. Iyo smart account script inogona kutaridzika seizvi, semuenzaniso:
match tx {
case t: TransferTransaction | MassTransferTransaction => false
case _ => true
}
tx kutengeserana kuri kugadziriswa kwatinobvumira kushandisa maitiro ekufananidza nzira chete kana isiri yekufambisa. Patani yekufananidza muRIDE inoshandiswa kutarisa mhando yekutengeserana. Maakaundi ese aripo anogona kugadziriswa mune smart account script
Iyo script inogona zvakare kuzivisa akasiyana, shandisa "kana-zvino-zvimwe" inovaka uye dzimwe nzira dzekunyatso tarisa mamiriro. Kuti ive nechokwadi chekuti zvibvumirano zvinogoneka kuzara uye kuoma (mutengo) zviri nyore kufanotaura kusati kwaitwa kondirakiti, RIDE haina zvishwe kana kusvetuka zvirevo.
Mamwe maficha eWaves account anosanganisira kuvapo kwe "nyika," kureva, mamiriro eaccount. Iwe unogona kunyora nhamba isingaperi yemaviri (kiyi, kukosha) kune iyo account state uchishandisa data transaction (DataTransaction). Ruzivo urwu runogona kugadziridzwa zvese kuburikidza neREST API uye zvakananga muchibvumirano chakangwara.
Kutengeserana kwega kwega kunogona kuve nehumbowo hwakawanda, umo siginecha yemutori wechikamu, ID yekutengeserana kunodiwa, nezvimwe zvinogona kuiswa.
Kushanda neRIDE kuburikidza
Kutenderera kuzere, kusanganisira kugadzira account, kuisa kondirakiti yakangwara pairi uye kutumira kutengeserana, unogona zvakare kushandisa raibhurari yekudyidzana neREST API (semuenzaniso, C #, C, Java, JavaScript, Python, Rust, Elixir) . Kuti utange kushanda neIDE, ingobaya bhatani ITSVA.
Mikana yekushandisa smart makondirakiti yakakura: kubva pakurambidza kutengeserana kune mamwe makero ("black list") kusvika kune yakaoma dApps.
Zvino ngatitarisei mienzaniso chaiyo yekushandiswa kwezvibvumirano zvakangwara mubhizinesi: pakuita maokisheni, inishuwarenzi, uye kugadzira zvirongwa zvekuvimbika.
Auctions
Imwe yemamiriro ekutengesa yakabudirira ndeyekujeka: vatori vechikamu vanofanirwa kuve nechivimbo chekuti hazvibviri kushandura mabhidhi. Izvi zvinogona kuwanikwa nekuda kwe blockchain, uko isingachinjike data nezve ese mabheti uye nguva yaakaitwa ichave inowanikwa kune vese vatori vechikamu.
PaWaves blockchain, mabheti anogona kurekodhwa muakauction account state kuburikidza neDataTransaction.
Iwe unogona zvakare kuseta yekutanga uye yekupedzisira nguva yeauction uchishandisa block nhamba: iyo frequency ye block block muWaves blockchain inenge yakaenzana 60 seconds.
1. Chirungu ichikwira mutengo okisheni
Vatori vechikamu muokisheni yeChirungu vanoisa mabhidhi mumakwikwi nemumwe. Beti idzva rega rega rinofanira kudarika rakapfuura. Okisheni yacho inopera kana pasisina vateki vanodarika iyo yekupedzisira bhidhi. Muchiitiko ichi, mutengi wepamusoro anofanira kupa huwandu hwakataurwa.
Iko kune zvakare okisheni sarudzo umo mutengesi anoisa mutengo wakaderera wemujenya, uye mutengo wekupedzisira unofanirwa kuudarika. Zvikasadaro, mijenya inoramba isina kutengeswa.
Mumuenzaniso uyu, tiri kushanda neakaundi yakanyatsogadzirirwa iyo auction. Nguva yeokisheni ndeye 3000 zvidhinha, uye mutengo wekutanga weiyo mijenya ndeye 0,001 WAVES. Mumwe mutori wechikamu anogona kuisa bhidhi nekutumira DataTransaction nekiyi "mutengo" uye kukosha kwebhidhiro yavo.
Mutengo webhidhi idzva unofanirwa kunge wakakwira kupfuura mutengo wazvino wekiyi iyi, uye mubati wacho anofanira kunge aine [new_bid + commission] tokens muaccount yake. Kero yemutengi inofanirwa kurekodhwa mundima ye "sender" muDataTransaction, uye iyo yazvino bhidhiti block urefu inofanira kunge iri mukati menguva yekutengesa.
Kana pakupera kweokisheni mutori wechikamu akaisa mutengo wepamusoro, anogona kutumira ExchangeTransaction kubhadhara iyo inoenderana mujenya pamutengo wakatarwa uye mari peya.
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. Okisheni yechiDutch yemitengo iri kuderera
Muchitoro cheDutch, zvakawanda zvinotanga kupihwa nemutengo wakakwira kupfuura izvo mutengi anoda kubhadhara. Mutengo unodzikira nhanho nhanho kudzamara mumwe wevatori vechikamu abvuma kutenga mijenya pamutengo uripo.
Mumuenzaniso uyu tinoshandisa zvigadziriso zvakafanana sezvakaitwa mune yakapfuura, pamwe nedanho remutengo apo delta inoderera. Chinyorwa cheakaundi chinotarisa kana ari kutora chikamu ari iye wekutanga kuisa kubheja. Zvikasadaro, iyo DataTransaction haigamuchirwe neiyo 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 "yose-kubhadhara"
"Yese-kubhadhara" ndeye auction iyo vatori vechikamu vanobhadhara bhidhi, zvisinei nekuti ndiani anohwina mujenya. Mumwe nemumwe mutsva anotora chikamu anobhadhara bhidhi, uye mubati anoita iyo yakanyanya bhidhiro anohwina mujenya.
Mumuenzaniso wedu, mumwe nemumwe anotora chikamu anoisa bhidhi kuburikidza neDataTransaction ne (kiyi, kukosha) * = ("mukundi", kero), ("mutengo", mutengo). DhataTransaction yakadaro inobvumirwa chete kana mutori wechikamu uyu atova neTransferTransaction nesignature yake uye bhidhiyo yake yakakwirira kudarika yose yapfuura. The auction inoenderera kusvika endHeight yasvikwa.
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)
}
Inishuwarenzi / Crowdfunding
Ngatitarisei mamiriro ezvinhu apo iwe unofanirwa kuisa inishuwarenzi yevashandisi zvinhu zvinopesana nekurasikirwa kwemari. Semuenzaniso, mushandisi anoda vimbiso yekuti kana chiratidzo chikadzikira, achakwanisa kudzorera mari yakazara yakabhadharwa yezviratidzo izvi, uye anoda kubhadhara mari inonzwisisika yeinishuwarenzi.
Kuti uite izvi, "mainishuwarenzi tokens" anofanira kubudiswa. Ipapo script inoiswa pane accountholder's account, ichibvumira chete iyo ExchangeTransactions inosangana nemamwe mamiriro kuti iitwe.
Kuti udzivise kushandisa kaviri, unofanirwa kukumbira mushandisi kuti atumire DataTransaction kune accountholder's account in advance ne (kiyi, kukosha) = (purchaseTransactionId, sellOrderId) uye kurambidza kutumira DataTransactions nekiyi yakatoshandiswa.
Naizvozvo, humbowo hwemushandisi hunofanirwa kuve neiyo transaction ID yekutenga tokeni yeinishuwarenzi. Mari mbiri dzinofanira kunge dzakafanana nekutengesa kwekutenga. Mari yacho inofanirawo kuenzana neyakagadziriswa panguva yekutenga, kubvisa mutengo weinishuwarenzi.
Zvinonzwisisika kuti gare gare iyo inishuwarenzi account inotenga zviratidzo zveinishuwarenzi kubva kumushandisi pamutengo usiri wakaderera pane waakavatenga: iyo inishuwarenzi account inogadzira iyo ExchangeTransaction, mushandisi anosaina kurongeka (kana kutengeserana kwapera nemazvo), iyo Inishuwarenzi account inosaina yechipiri odha uye iyo yese kutengeserana uye inotumira kune iyo blockchain.
Kana pasina kutenga kunoitika, mushandisi anogona kugadzira ExchangeTransaction maererano nemitemo inotsanangurwa mune script uye kutumira kutengeserana kune blockchain. Nenzira iyi mushandisi anogona kudzorera mari yakashandiswa pakutenga ma tokens ane insured.
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)
}
Chiratidzo cheinishuwarenzi chinogona kuitwa chakangwara asset, semuenzaniso, kurambidza kuendeswa kune vechitatu mapato.
Ichi chirongwa chinogona zvakare kushandiswa kune crowdfunding tokens, iyo inodzoserwa kune varidzi kana mari inodiwa isati yaunganidzwa.
Mutero wekutengesa
Zvibvumirano zveSmart zvinoshandawo mumamiriro ezvinhu apo zvakakosha kuunganidza mutero pane imwe neimwe kutengeserana nemhando dzinoverengeka dzezvinhu. Izvi zvinogona kuitwa kuburikidza nechinhu chitsva chakaiswa
1. Tinobudisa FeeCoin, iyo ichatumirwa kuvashandisi pamutengo wakatarwa: 0,01 WAVES = 0,001 FeeCoin.
2. Isa rubatsiro rweFeeCoin uye chiyero chekuchinjana: 0,001 WAVES = 0,001 FeeCoin.
3. Seta chinyorwa chinotevera che smart asset:
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
}
Iye zvino pese munhu paanotamisa N smart assets, anokupa FeeCoin muhuwandu hweN/taxDivisor (iyo inogona kutengwa kubva kwauri pa10 *N/taxDivisor WAVES), uye iwe uchapa mucheri N/taxDivisor WAVES. Nekuda kweizvozvo, purofiti yako (mutero) ichave 9 * N / muteroDivisor WAVES.
Iwe unogona zvakare kuita mutero uchishandisa smart asset script uye 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 uye zvirongwa zvekuvimbika
Cashback imhando yechirongwa chekuvimbika umo mutengi anodzoserwa chikamu chemari yakashandiswa pane chigadzirwa kana sevhisi.
Pakuita nyaya iyi uchishandisa smart account, isu tinofanirwa kutarisa humbowo nenzira imwechete sezvatakaita mune inishuwarenzi kesi. Kuti udzivise kushandisa kaviri, mushandisi anofanira kutumira DataTransaction ne (kiyi, kukosha) = (kutengaTransactionId, cashbackTransactionId) asati agamuchira mari yekudzoserwa.
Isu tinofanirawo kuseta kurambidzwa kwemakiyi aripo tichishandisa DataTransaction. cashbackDivisor - chikamu chakakamurwa necashback share. Avo. kana iyo cashback share iri 0.1, then 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
Atomic swap inobvumira vashandisi kuchinjana midziyo pasina rubatsiro rwekuchinjana. Nekuchinjanisa kweatomu, vese vatori vechikamu mukutengeserana vanodiwa kuti vazvisimbise mukati meimwe nguva yenguva.
Kana imwe yevatori vechikamu isingapi kuvimbiswa kwakarurama kwekutengeserana mukati menguva yakagoverwa yekutengeserana, kutengeserana kunobviswa uye kuchinjana hakuitiki.
Mumuenzaniso wedu, isu tichashandisa inotevera 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
}
Muchinyorwa chinotevera tichatarisa mashandisirwo eakaunzi akaunzi mune zvemari zviridzwa senge sarudzo, ramangwana uye mabhiri.
Source: www.habr.com