
A baya Mun kalli shari'o'in amfani da yawa don asusu masu wayo a cikin kasuwanci, gami da gwanjo da shirye-shiryen aminci.
A yau za mu tattauna yadda asusu masu wayo da wayayyun kadarori za su iya inganta gaskiya da amincin kayan aikin kuɗi kamar zaɓuɓɓuka, gaba, da lissafin kuɗi.
Zabin
Wani zaɓi shine kwangilar musayar hannun jari wanda ke ba mai siye yancin siyan kadara a kan takamaiman farashi ko kafin takamaiman kwanan wata, amma ba ya wajabta wa mai siye yin hakan.
Za a iya aiwatar da zaɓi kamar haka:
Muna amfani da kadara mai wayo don zaɓuɓɓukan kansu azaman kayan aiki da asusu mai wayo don ɗan takara wanda ke aiki azaman musayar kuma yana ba da zaɓuɓɓuka. Mahalarcin musayar yayi alƙawarin siyar da ƙayyadaddun adadin ƙayyadaddun ƙayyadaddun ƙayyadaddun ƙayyadaddun ƙaya a farashi (sellPrice) tsakanin karewaStart da karewaEnd tsayin toshe.
A cikin lambar kadara mai wayo, za mu bincika kawai cewa yana kasuwanci ne kawai tsakanin ƙayyadaddun tsayi, kuma ba za mu bincika wani abu ba, barin duk alhakin bin ƙa'idodin zuwa lambar ɗan takara ta musayar.
Lambar kadara mai wayo:
let expirationStart = 100000
let expirationEnd = 101440
match tx {
case some : ExchangeTransaction | TransferTransaction =>
height > expirationStart && height <= expirationEnd
case _ => false
}
Bari mu ɗauka masu biyowa: ɗan takarar musayar ya sayar da zaɓuɓɓuka don siyan kadara, kuma sauran mahalarta zasu iya canja wurin ko kasuwanci waɗannan zaɓuɓɓuka. Don aiwatar da haƙƙinsu na siye, mai yuwuwar mai siye dole ne ya canza adadin zaɓuɓɓukan da ake so zuwa asusun mai siyarwa, wato, ɗan takarar musayar. Sannan suna rikodin canja wurin da aka kammala a cikin yanayin asusun ɗan takarar musayar, sannan kawai za a iya ci gaba da Canjawar Kasuwanci bisa ƙayyadaddun sharuɗɗan siye/sayar.
A cikin lambar asusu mai kaifin baki, dole ne mu tabbatar da cewa duk wani ExchangeTransaction da ke wucewa ta cikinta don ma'amala ta ƙarshe / siyarwa ta cika ƙayyadaddun ƙayyadaddun ƙayyadaddun ƙayyadaddun ƙayyadaddun ƙayyadaddun ƙayyadaddun ƙayyadaddun, kuma ɗan takarar ya sayi daidai adadin raka'a da suka aika zuwa asusun ɗan takara na musayar. Mai yuwuwar mai siye dole ne ya aika ingantaccen DataTransaction game da canja wurin da aka kammala don hana kashewa biyu ta ɗan takaran musayar. A cikin wannan DataTransaction, mai siye yana ajiyar ƙima daidai da adadin zaɓuɓɓukan da aka canjawa wuri zuwa asusun mahalarta musayar, watau, adadin raka'a na kadarar da za su iya saya, ta amfani da maɓalli daidai da adireshinsu.
Smart account code:
#владелец аккаунта дает обязательство продать определенное количество юнитов ассета
#по цене sellPrice между высотами блоков expirationStart и expirationEnd
let expirationStart = 100000
let expirationEnd = 101440
let sellPrice = 10000
let amountAsset = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
let priceAsset = base58'9jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
#ID ассета-опциона
let optionsAsset = base58'7jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
#извлекаем из транзакции адрес отправителя
let this = tx.sender
match tx {
case dataTx : DataTransaction =>
#извлекаем количество юнитов из дата-транзакции по ключу (ID пользователя)
let units = extract(getInteger(dataTx.data, dataTx.data[0].key))
#извлекаем трансфер-транзакцию опционов из пруфа
let e = transactionById(dataTx.proofs[2]) #
match e {
case transferTx : TransferTransaction =>
#убеждаемся, что трансфер был на текущий адрес
(transferTx.recipient == this) &&
#убеждаемся, что отправитель транзакции написал в качестве ключа свой ID
dataTx.data[0].key == toBase58String(transferTx.sender.bytes) &&
sigVerify(dataTx.bodyBytes, dataTx.proofs[0], transferTx.senderPublicKey) &&
#убеждаемся, что указанное количество юнитов соответствует посланному количеству опционов
(units == transferTx.amount) &&
#убеждаемся, что был переведен именно ассет-опцион
(transferTx.assetId == optionsAsset)
case _ => false
} &&
size(dataTx.data) == 1 && !isDefined(getInteger(this, dataTx.data[0].key))
&& height > expirationStart && height <= expirationEnd
case exchangeTx : ExchangeTransaction =>
#убеждаемся, что итоговый обмен происходит по указанным заранее правилам
let correctAssetPair = exchangeTx.sellOrder.assetPair.amountAsset == amountAsset &&
exchangeTx.sellOrder.assetPair.priceAsset == priceAsset
let correctPrice = exchangeTx.sellOrder.price == sellPrice
#извлекаем дата-транзакцию из пруфа
let d = transactionById(exchangeTx.proofs[2])
match d{
case dataTx : DataTransaction =>
let buyOrderSender = dataTx.data[0].key
toBase58String(exchangeTx.buyOrder.sender.bytes) == buyOrderSender &&
exchangeTx.amount == extract(getInteger(dataTx.data, buyOrderSender))
case _ => false
} &&
exchangeTx.sellOrder.sender == this &&
correctAssetPair && correctPrice &&
height > expirationStart && height <= expirationEnd
case _ => false
}
Makowa a kan smart accounts
Ba kamar wani zaɓi ba, kwangilar nan gaba ba haƙƙi bane, amma wajibi ne na mai siye don siyan kadara a farashin da kwangilar ta kayyade a wani matsayi a gaba.
Gabaɗaya, aiwatar da kwangilar nan gaba yana kama da aiwatar da zaɓi. Anan, kadari mai wayo yana aiki azaman kwangilar gaba.
Hakanan wajibi ne don tabbatar da cewa mai siye da mai siyarwa duka sun sanya hannu kan odar siyan. Kwangilar nan gaba wajibi ne wanda dole ne a cika shi a kowane hali. Don haka, idan mai siyarwa ko ɗan takara ya gaza kan wajibcin su, kowane ɗan takarar cibiyar sadarwa zai iya ƙaddamar da ma'amala, ta haka ya cika kwangilar gaba.
Rubutun kadara mai wayo yana sarrafa duk Canja wurin Canja wurin da Canja-canje na kadara ta gaba, amincewa da su kawai idan ɗan takarar mai siye ya ƙirƙiri oda don siyan kadari na gaba daga ɗan takaran musayar.
Dole ne wannan odar ya kasance mai inganci kuma ya cika sharuddan kwangilar nan gaba. Don tabbatar da odar, zaku iya shigar da duk filayensa zuwa cikin asusun mai siye tare da wakilcin byte na odar da aka sanya hannu, sannan ku inganta shi a waje.
RIDE a halin yanzu baya haɗa da aikin tantance byte na mu'amala na asali, amma ya haɗa da duk kayan aikin da ake buƙata. Saboda haka, masu haɓakawa na iya gwada aiwatar da wannan aikin da kansu.
Multi-sa hannu asusu / Escrow
Asusun sa hannu da yawa yana ba masu amfani da yawa damar sarrafa kadarori tare (misali, ma'amalar kadara na iya yiwuwa tare da sa hannun uku cikin masu amfani huɗu kawai). Don ƙirƙirar asusun sa hannu da yawa a cikin yaren RIDE, zamu iya amfani da hujjojin ciniki.
Hakanan za'a iya amfani da asusun sa hannu da yawa don asusun ɓoye, inda ake riƙe kuɗi har sai bangarorin da ke cikin yarjejeniyar sun cika wajibcinsu.
let alicePubKey = base58'5AzfA9UfpWVYiwFwvdr77k6LWupSTGLb14b24oVdEpMM'
let bobPubKey = base58'2KwU4vzdgPmKyf7q354H9kSyX9NZjNiq4qbnH2wi2VDF'
let cooperPubKey = base58'GbrUeGaBfmyFJjSQb9Z8uTCej5GzjXfRDVGJGrmgt5cD'
#выясняем, кто предоставил корректные подписи
let aliceSigned = if(sigVerify(tx.bodyBytes, tx.proofs[0], alicePubKey)) then 1 else 0
let bobSigned = if(sigVerify(tx.bodyBytes, tx.proofs[1], bobPubKey)) then 1 else 0
let cooperSigned = if(sigVerify(tx.bodyBytes, tx.proofs[2], cooperPubKey)) then 1 else 0
#суммируем все корректные подписи и проверяем их количество
aliceSigned + bobSigned + cooperSigned >= 2
Yin rijistar Token-curated (TCR)
Yawancin dandamali na blockchain suna fuskantar matsalar kadarorin masu guba. Misali, duk adireshin da ke biyan kuɗi na iya ƙirƙirar kadara akan Waves.
Rijistar token-curated (TCR), wanda masu riƙe da alama suka ƙirƙira, yana taimakawa magance matsalar kare masu amfani da blockchain kanta daga kadarorin masu guba.
Don kada kuri'a don takamaiman alamar da za a ƙara cikin jeri, mai riƙe da hannun jari yana sanya hannun jari daidai da nasu na jimlar wadatar alama. Ana haɗa alamar a cikin rajista idan yawancin masu riƙe da shi suka ƙi amincewa.
A cikin misalinmu, muna ƙyale mai amfani ya ƙara alama zuwa jeri don yin la'akari (a lokacin ƙalubale) ta maɓallin jiha = asset_name kawai idan ƙimar ƙidayar yanzu = 0.
Dole ne mai amfani kuma ya sami ma'auni mara sifili na wannan alamar a cikin walat ɗin su. Bayan haka, lokacin jefa ƙuri'a ya fara, lokacin da mai amfani zai iya zabar kowane kadara a cikin walat ɗin su, amma sau ɗaya kawai, ta hanyar ƙididdige shi daga 1 zuwa 10. Ƙa'idodin masu amfani suna wakiltar maɓallan form user_address+assetID.
let asset = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
let addingStartHeight = 1000
let votingStartHeight = 2000
let votingEndHeight = 3000
#извлекаем из транзакции адрес отправителя
let this = extract(tx.sender)
#извлекаем адрес из пруфа транзакции
let address = addressFromPublicKey(tx.proofs[1])
match tx {
case t: DataTransaction =>
if(height > addingStartHeight)
then(
if(height < votingStartHeight)
then(
#adding
#выясняем, есть ли этот ассет у этого адреса
let hasTokens = assetBalance(address, asset) > 0
size(t.data) == 1
#убеждаемся, что этот ассет еще не был добавлен
&& !isDefined(getInteger(this, toBase58String(asset)))
#убеждаемся, что по ключу-ассету добавляется значение равное 0
&& extract(getInteger(t.data, toBase58String(asset))) == 0
&& hasTokens
)
else(
if(height < votingEndHeight)
then
(
#voting
#узнаем текущее количество голосов за данный ассет и задаваемое количество
let currentAmount = extract(getInteger(this, toBase58String(asset)))
let newAmount = extract(getInteger(t.data, toBase58String(asset)))
let betString = toBase58String(address.bytes) + toBase58String(asset)
#убеждаемся, что этот адрес еще не голосовал за этот ассет
let noBetBefore = !isDefined(getInteger(this, betString))
let isBetCorrect = extract(getInteger(t.data, betString)) > 0
&& extract(getInteger(t.data, betString)) <= 10
#убеждаемся, что у голосующего есть необходимые токены
let hasTokens = assetBalance(address, asset) > 0
#проверяем корректность значений транзакции
size(t.data) == 2 && isDefined(getInteger(this, toBase58String(asset)))
&& newAmount == currentAmount + 1
&& noBetBefore && isBetCorrect && hasTokens
)
else false
) && sigVerify(tx.bodyBytes, tx.proofs[0], tx.proofs[1])
)
else false
case _ => false
}
Kudin biyan kuɗi
A cikin wannan misalin, za mu duba yin amfani da asusu masu wayo don yin biyan kuɗi na yau da kullun don samfur ko sabis a tazarar da aka saita - "kudin biyan kuɗi."
Idan mai amfani ya ba da asusu mai wayo (ta hanyar shaidar ma'amala) tare da ID na TransferTransaction tare da adadin kuɗin da ake buƙata, zai iya rubuta zuwa asusun jihar {maɓalli: adireshi, ƙimar: gaskiya}.
Wannan yana nufin cewa mai amfani ya tabbatar da biyan kuɗin sa ga samfur ko sabis. Lokacin da biyan kuɗin ya ƙare, kowane mai amfani da hanyar sadarwa zai iya saita ƙimar kusa da maɓalli mai dacewa a cikin jihar. arya.
let subscriptionPeriod = 44000
let signature = tx.proofs[0]
let pk = tx.proofs[1]
let requiredAmount = 100000
#извлекаем из транзакции адрес отправителя
let this = extract(tx.sender)
match tx {
case d: DataTransaction =>
#извлекаем дату последнего платежа
let lastPaymentHeight = extract(getInteger(this, d.data[0].key + "_lastPayment"))
size(d.data) == 1 && d.data[0].value == "false" && lastPaymentHeight + subscriptionPeriod < height
||
(
let address = d.data[0].key
#извлекаем трансфер-транзакцию по ID, указанному в пруфах
let ttx = transactionById(d.proofs[0])
size(d.data) == 2
&& d.data[0].value == "true"
&& d.data[1].key == address + "_lastPayment"
&& match ttx {
case purchase : TransferTransaction =>
d.data[1].value == transactionHeightById(purchase.id)
&& toBase58String(purchase.sender.bytes) == address
&& purchase.amount == requiredAmount
&& purchase.recipient == this
#убеждаемся, что ассет waves
&& !isDefined(purchase.assetId)
case _ => false
}
)
case _ => false
}
Zabe
Za a iya amfani da Smart asusu don aiwatar da zaɓen blockchain. Misali zai kasance zaben mafi kyawun rahoton jakada a matsayin wani bangare na shirin jakadan. Ana amfani da jihar asusun azaman dandamali don rikodin ƙuri'a don wani zaɓi na musamman.
A cikin wannan misali, kawai waɗanda suka sayi alamun "zaɓe" na musamman ne kawai aka yarda su yi zabe. Mahalarci yana ƙaddamar da DataTransaction a gaba tare da maɓalli (maɓalli, ƙima) = (purchaseTransactionId, buyTransactionId). An haramta saita wata ƙima ta daban don wannan maɓalli. Za a iya saita DataEntry sau ɗaya ta amfani da adireshinsu da zaɓin jefa ƙuri'a. Zaɓe yana yiwuwa ne kawai a lokacin ƙayyadadden lokacin.
let asset = base58'8jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
let address = addressFromPublicKey(tx.proofs[1])
let votingStartHeight = 2000
let votingEndHeight = 3000
#извлекаем из транзакции адрес отправителя
let this = extract(tx.sender)
match tx {
case t: DataTransaction =>
(height > votingStartHeight && height < votingEndHeight) &&
#убеждаемся, что у транзакции правильная подпись
sigVerify(tx.bodyBytes, tx.proofs[0], tx.proofs[1]) &&
#проверяем, что пользователь отдает свой голос напротив своего адреса
if (t.data[0].key == toBase58String(address.bytes))
then (
#извлекаем транзакцию перевод голосовательного токена из пруфов
let purchaseTx = transactionById(t.proofs[7])
match purchaseTx {
case purchase : TransferTransaction =>
let correctSender = purchase.sender == t.sender
let correctAsset = purchase.assetId == asset
let correctPrice = purchase.amount == 1
let correctProof = extract(getBinary(this, toBase58String(purchase.id))) == t.id
correctSender && correctAsset && correctPrice && correctProof
case _ => false
}
)
else
size(t.data) == 1 && !isDefined(getBinary(this, t.data[0].key))
case _ => false
}
Bill na musanya
Kudi na musayar wani takalifi ne a rubuce wanda dole ne wani bangare ya biya wani kayyade adadin kudi a lokacin da ake bukata ko a ranar da aka kayyade.
A cikin misalinmu, muna amfani da asusu mai wayo wanda kwanan watan ƙarewarsa yayi daidai da ranar biyan kuɗi.
let expiration = 100000
let amount = 10
let asset = base58'9jfD2JBLe23XtCCSQoTx5eAW5QCU6Mbxi3r78aNQLcNf'
let Bob = Address(base58'3NBVqYXrapgJP9atQccdBPAgJPwHDKkh6A8')
let Alice = Address(base58'3PNX6XwMeEXaaP1rf5MCk8weYeF7z2vJZBg')
match tx {
case t: TransferTransaction =>
(t.assetId == asset)&&
(t.amount == amount)&&
(t.sender == Bob)&&
(t.recipient == Alice)&&
(sigVerify(t.bodyBytes, t.proofs[0], t.senderPublicKey))&&
(height >= expiration)
case _ => false
}
Deposit
Adadi shine sanya kuɗi a banki a ƙarƙashin wasu sharuɗɗan (lokaci, riba).
A cikin misalinmu, asusu mai wayo yana aiki azaman banki. Bayan wasu adadin tubalan, daidai da lokacin ajiya, mai amfani zai iya dawo da kuɗin su tare da sha'awa. Rubutun ya ƙayyade tsayin toshe (finalHeight), bayan haka mai amfani zai iya cire kuɗi daga asusun.
tsawoUnit shine adadin tubalan a cikin raka'a ɗaya na lokaci (misali, wata, shekara, da sauransu). Da farko, muna bincika kasancewar rikodin tare da biyu (maɓalli, ƙima) = (farkonTransferTransaction, FutureDataTransaction). Sannan, mai amfani dole ne ya ƙaddamar da Canja wurin Canja wurin tare da ingantaccen bayani game da adadin ajiya da ribar da aka tara akan lokacin ajiya. An tabbatar da wannan bayanin akan ainihin Canja wurin, wanda ke ƙunshe a cikin tabbacin Canja wurin na yanzu. depositDivisor shine juzu'in juzu'in ajiya (idan an karɓi ajiya a 10%, juzu'in ajiya shine 0,1, da depositDevisor = 1/0,1 = 10).
let this = extract(tx.sender)
let depositDivisor = 10
let heightUnit = 1000
let finalHeight = 100000
match tx {
case e : TransferTransaction =>
#извлекаем высоту транзакции по ID транзакции в седьмом пруфе
let depositHeight = extract(transactionHeightById(e.proofs[7]))
#извлекаем транзакцию депозита
let purchaseTx = transactionById(e.proofs[7])
match purchaseTx {
case deposit : TransferTransaction =>
let correctSender = deposit.sender == e.sender
#убеждаемся, что пользователь переводит себе корректную сумму депозита + проценты
let correctAmount = deposit.amount + deposit.amount / depositDivisor * (height - depositHeight) / heightUnit == e.amount
let correctProof = extract(getBinary(this, toBase58String(deposit.id))) == e.id
correctSender && correctProof && correctAmount
case _ => false
}
&& finalHeight <= height
case _ => sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
}
A cikin labarin na uku kuma na ƙarshe a cikin wannan silsilar, za mu bincika ƙarin amfani da shari'o'in don kadarori masu wayo, gami da daskarewa da ƙuntata ma'amaloli don takamaiman adireshi.
source: www.habr.com
