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