Waves ухаалаг дансны хэрэглээ: дуудлага худалдаанаас урамшууллын хөтөлбөр хүртэл

Waves ухаалаг дансны хэрэглээ: дуудлага худалдаанаас урамшууллын хөтөлбөр хүртэл

Блокчэйн нь ихэвчлэн зөвхөн криптовалюттай холбоотой байдаг ч DLT технологийн хэрэглээний талбар нь илүү өргөн байдаг. Блокчэйн ашиглах хамгийн ирээдүйтэй чиглэлүүдийн нэг бол автоматаар хийгддэг ухаалаг гэрээ бөгөөд үүнийг хийсэн талуудын хооронд итгэлцлийг шаарддаггүй.

RIDE – ухаалаг гэрээний хэл

Waves ухаалаг гэрээний тусгай хэлийг боловсруулсан - RIDE. Түүний бүрэн баримт бичиг байрладаг энд. Бас энд - энэ сэдвээр нийтлэл Хабр дээр.

RIDE гэрээ нь предикат бөгөөд "үнэн" эсвэл "худал"-ыг гаралт болгон буцаана. Үүний дагуу гүйлгээг блокчэйнд бүртгэх эсвэл татгалзсан болно. Ухаалаг гэрээ нь заасан нөхцлийн биелэлтийг бүрэн баталгаажуулдаг. RIDE-д гэрээнээс гүйлгээ үүсгэх одоогоор боломжгүй байна.

Өнөөдөр Waves хоёр төрлийн ухаалаг гэрээ байдаг: ухаалаг данс, ухаалаг хөрөнгө. Ухаалаг данс нь энгийн хэрэглэгчийн бүртгэл боловч түүнд зориулж бүх гүйлгээг хянах скрипт тохируулагдсан байдаг. Ухаалаг дансны скрипт нь иймэрхүү харагдаж болно, жишээлбэл:

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

tx нь шилжүүлгийн гүйлгээ биш тохиолдолд л загвар тааруулах механизмыг ашиглахыг зөвшөөрдөг боловсруулагдаж буй гүйлгээ юм. Гүйлгээний төрлийг шалгахын тулд RIDE-д загвар тааруулахыг ашигладаг. Одоо байгаа бүх бүртгэлийг ухаалаг дансны скриптээр боловсруулж болно гүйлгээний төрлүүд.

Скрипт нь хувьсагчдыг зарлаж, нөхцөл байдлыг бүрэн шалгахын тулд "if-then-else" бүтэц болон бусад аргыг ашиглаж болно. Гэрээг хэрэгжүүлэхээс өмнө урьдчилан таамаглахад хялбар, бүрэн бүтэн байдал, нарийн төвөгтэй (өртөг) байхын тулд RIDE нь гогцоо эсвэл үсрэлт хэллэгийг агуулаагүй болно.

Waves дансны бусад шинж чанарууд нь "төлөв" буюу дансны төлөв байдлыг агуулдаг. Та өгөгдлийн гүйлгээг (DataTransaction) ашиглан дансны төлөвт хязгааргүй тооны хос (түлхүүр, утга) бичиж болно. Энэ мэдээллийг дараа нь REST API болон ухаалаг гэрээнд шууд боловсруулах боломжтой.

Гүйлгээ бүр нь оролцогчийн гарын үсэг, шаардлагатай гүйлгээний ID гэх мэтийг оруулах боломжтой олон тооны нотлох баримтуудыг агуулж болно.

RIDE-тэй хамтран ажиллаж байна ЭНД Гэрээний эмхэтгэсэн дүр төрхийг (хэрэв эмхэтгэсэн бол) харах, шинэ данс үүсгэх, түүнд зориулж скрипт тохируулах, командын мөрөөр гүйлгээ илгээх боломжийг олгоно.

Бүртгэл үүсгэх, түүн дээр ухаалаг гэрээ суулгах, гүйлгээ илгээх зэрэг бүрэн мөчлөгийн хувьд та REST API-тай харилцах номын санг ашиглаж болно (жишээлбэл, C#, C, Java, JavaScript, Python, Rust, Elixir) . IDE-тэй ажиллаж эхлэхийн тулд ШИНЭ товчийг дарна уу.

Ухаалаг гэрээг ашиглах боломжууд нь өргөн цар хүрээтэй: тодорхой хаяг руу ("хар жагсаалт") гүйлгээ хийхийг хориглохоос эхлээд нарийн төвөгтэй dApps хүртэл.

Одоо дуудлага худалдаа явуулах, даатгал хийх, үнэнч байх хөтөлбөрийг бий болгоход ухаалаг гэрээг бизнест ашиглах тодорхой жишээнүүдийг харцгаая.

Дуудлага худалдаа

Дуудлага худалдаа амжилттай болох нөхцөлүүдийн нэг бол ил тод байдал юм: оролцогчид тендерийг удирдах боломжгүй гэдэгт итгэлтэй байх ёстой. Энэ нь блокчэйний ачаар хүрч болох бөгөөд бүх бооцооны талаарх өөрчлөгдөшгүй мэдээлэл, түүнийг хийсэн цаг хугацаа бүх оролцогчдод нээлттэй байх болно.

Waves блокчэйн дээр тендерийг DataTransaction-ээр дамжуулан дуудлага худалдааны дансны төлөвт бүртгэж болно.

Та мөн блокийн дугаарыг ашиглан дуудлага худалдааны эхлэх, дуусах цагийг тохируулах боломжтой: Waves блокчейн дэх блок үүсгэх давтамж ойролцоогоор тэнцүү байна. 60 секунд.

1. Англи хэлний өсөх үнийн дуудлага худалдаа

Английн дуудлага худалдаанд оролцогчид өөр хоорондоо өрсөлдөн саналаа өгдөг. Шинэ бооцоо бүр өмнөхөөсөө давсан байх ёстой. Дуудлага худалдаа сүүлийн саналаас давсан оролцогч байхгүй үед дуусна. Энэ тохиолдолд хамгийн өндөр үнийн санал өгсөн хүн заасан үнийн дүнг өгөх ёстой.

Мөн дуудлага худалдааны сонголт байдаг бөгөөд энэ нь худалдагч тухайн багцын доод үнийг тогтоодог бөгөөд эцсийн үнэ нь түүнээс хэтрэх ёстой. Үгүй бол багц зарагдаагүй хэвээр үлдэнэ.

Энэ жишээнд бид дуудлага худалдаанд зориулж тусгайлан үүсгэсэн данстай ажиллаж байна. Дуудлага худалдааны үргэлжлэх хугацаа 3000 блок, лотын анхны үнэ 0,001 WAVES. Оролцогч нь "үнэ" болон үнийн дүнгийн хамт DataTransaction илгээх замаар тендерт оролцох боломжтой.

Шинэ тендерийн үнэ нь энэ түлхүүрийн одоогийн үнээс өндөр байх ёстой бөгөөд оролцогч өөрийн дансанд хамгийн багадаа [new_bid + комисс] жетонтой байх ёстой. Өгөгдлийн гүйлгээний "илгээгч" талбарт оролцогчийн хаягийг бичсэн байх ба одоогийн тендерийн блокийн өндөр нь дуудлага худалдааны хугацаанд байх ёстой.

Дуудлага худалдааны төгсгөлд оролцогч хамгийн өндөр үнийг тогтоосон бол тэрээр заасан үнэ болон валютын хосоор харгалзах багцыг төлөхийн тулд ExchangeTransaction илгээх боломжтой.

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. Голландын үнэ буурч байгаа дуудлага худалдаа

Голландын дуудлага худалдаагаар эхлээд худалдан авагчийн төлөхөөс өндөр үнээр их зүйлийг санал болгодог. Оролцогчдын аль нэг нь тухайн багцыг тухайн үеийн үнээр худалдаж авахыг зөвшөөрөх хүртэл үнэ нь алхам алхмаар буурдаг.

Энэ жишээнд бид өмнөхтэй ижил тогтмол хэмжигдэхүүн, мөн дельта буурах үеийн үнийн алхамыг ашигладаг. Бүртгэлийн скрипт нь тухайн оролцогч үнэхээр хамгийн түрүүнд бооцоо тавьсан эсэхийг шалгадаг. Үгүй бол DataTransaction-ийг блокчейн хүлээн зөвшөөрөхгүй.

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. "Бүх төлбөртэй" дуудлага худалдаа

“Бүх төлбөр” гэдэг нь дуудлага худалдаанд оролцогчид хэн нь хожсоноос үл хамааран үнийн дүнг төлдөг дуудлага худалдаа юм. Шинэ оролцогч бүр саналаа төлж, хамгийн их санал тавьсан оролцогч сугалаанд хождог.

Бидний жишээн дээр дуудлага худалдаанд оролцогч бүр DataTransaction-аар (түлхүүр, үнэ цэнэ)* = (“ялагч”, хаяг),(“үнэ”, үнэ) санал тавьдаг. Энэ оролцогч өөрийн гарын үсэг бүхий шилжүүлгийн гүйлгээтэй бөгөөд түүний санал өмнөх бүх гүйлгээнээс өндөр байвал ийм өгөгдөл гүйлгээг зөвшөөрнө. Дуудлага худалдаа 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)
}

Даатгал / Crowdfunding

Хэрэглэгчдийн хөрөнгийг санхүүгийн хохирлоос даатгах шаардлагатай нөхцөл байдлыг авч үзье. Жишээлбэл, хэрэглэгч жетон үнэ унавал эдгээр жетонд төлсөн мөнгөө бүрэн буцааж авах боломжтой гэсэн баталгааг хүсч байгаа бөгөөд боломжийн хэмжээний даатгал төлөхөд бэлэн байна.

Үүнийг хэрэгжүүлэхийн тулд “даатгалын жетон” гаргах шаардлагатай. Дараа нь скриптийг даатгуулагчийн дансанд суулгаж, зөвхөн тодорхой нөхцөлийг хангасан солилцооны гүйлгээг гүйцэтгэх боломжийг олгодог.

Давхар зардал гаргахаас сэргийлэхийн тулд та хэрэглэгчээс даатгуулагчийн данс руу (түлхүүр, үнэ цэнэ) = (pchaseTransactionId, sellOrderId)-ээр DataTransaction илгээхийг хүсч, өмнө нь ашигласан түлхүүрээр DataTransaction илгээхийг хориглох шаардлагатай.

Тиймээс хэрэглэгчийн нотолгоо нь даатгалын жетон худалдан авсан гүйлгээний ID-г агуулсан байх ёстой. Валютын хос нь худалдан авалтын гүйлгээтэй ижил байх ёстой. Зардал нь мөн даатгалын үнийг хасч, худалдан авах үед тогтоосон зардалтай тэнцүү байх ёстой.

Дараа нь даатгалын данс нь хэрэглэгчээс даатгалын жетоныг худалдаж авсан үнээс доогуур үнээр худалдаж авдаг гэж ойлгож болно: даатгалын данс нь ExchangeTransaction үүсгэдэг, хэрэглэгч захиалгад гарын үсэг зурдаг (хэрэв гүйлгээ зөв хийгдсэн бол), даатгалын данс нь хоёр дахь захиалга болон бүх гүйлгээнд гарын үсэг зурж, блокчэйнд илгээдэг.

Хэрэв худалдан авалт хийгдээгүй бол хэрэглэгч скриптэд тодорхойлсон дүрмийн дагуу ExchangeTransaction үүсгэж, гүйлгээг блокчэйнд илгээх боломжтой. Ингэснээр хэрэглэгч даатгуулсан жетон худалдан авахад зарцуулсан мөнгөө буцааж өгөх боломжтой.

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

Даатгалын жетоныг ухаалаг хөрөнгө болгож, жишээлбэл, гуравдагч этгээдэд шилжүүлэхийг хориглох боломжтой.

Энэ схемийг crowdfunding tokens-д мөн хэрэгжүүлж болох бөгөөд хэрэв шаардлагатай хэмжээгээр цуглуулаагүй бол эзэмшигчид нь буцааж өгдөг.

Гүйлгээний татвар

Ухаалаг гэрээ нь хэд хэдэн төрлийн хөрөнгийн гүйлгээ бүрээс татвар авах шаардлагатай тохиолдолд мөн хамаарна. Үүнийг суулгасан шинэ хөрөнгө ашиглан хийж болно ивээн тэтгэгч ухаалаг хөрөнгөтэй гүйлгээний хувьд:

1. Бид FeeCoin гаргадаг бөгөөд үүнийг тогтмол үнээр хэрэглэгчдэд илгээх болно: 0,01 WAVES = 0,001 FeeCoin.

2. FeeCoin-ийн ивээн тэтгэгч болон валютын ханшийг тогтооно: 0,001 WAVES = 0,001 FeeCoin.

3. Ухаалаг хөрөнгийн хувьд дараах скриптийг тохируулна уу:

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
}

Одоо хэн нэгэн N ухаалаг хөрөнгийг шилжүүлэх бүрд тэд N/taxDivisor-ын хэмжээгээр FeeCoin өгөх болно (энэ нь танаас 10 *N/taxDivisor WAVES-д худалдан авах боломжтой), харин та уурхайчинд N/taxDivisor WAVES өгөх болно. Үүний үр дүнд таны ашиг (татвар) 9*N / taxDivisor WAVES байх болно.

Та мөн ухаалаг хөрөнгийн скрипт болон 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 гэдэг нь худалдан авагч бүтээгдэхүүн, үйлчилгээнд зарцуулсан үнийн дүнгийн тодорхой хэсгийг буцааж авдаг үнэнч байдлын хөтөлбөрийн нэг төрөл юм.

Ухаалаг данс ашиглан энэ хэргийг хэрэгжүүлэхдээ даатгалын тохиолдолтой адил нотлох баримтыг шалгах ёстой. Давхар зардал гаргахаас сэргийлэхийн тулд хэрэглэгч бэлэн мөнгө авахаасаа өмнө (түлхүүр, утга) = (худалдан авалтын гүйлгээний дугаар, cashbackTransactionId) гэсэн утгатай DataTransaction илгээх ёстой.

Бид мөн DataTransaction ашиглан одоо байгаа түлхүүрүүдэд хориг тавих ёстой. cashbackDivisor - бэлэн мөнгө буцааж авах хувьцаанд хуваагдсан нэгж. Тэдгээр. Хэрэв бэлэн мөнгө буцааж авах хувь 0.1 бол 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)
}

Атомын солилцоо

Атомын солилцоо нь хэрэглэгчдэд биржийн тусламжгүйгээр хөрөнгө солилцох боломжийг олгодог. Атомын своп хэлцлийн хувьд гүйлгээнд оролцогч хоёулаа тодорхой хугацааны дотор үүнийг баталгаажуулах шаардлагатай.

Хэрэв оролцогчдын дор хаяж нэг нь гүйлгээнд заасан хугацаанд гүйлгээг зөв баталгаажуулаагүй бол гүйлгээг цуцалж, солилцоо хийгдэхгүй.

Бидний жишээн дээр бид дараах ухаалаг дансны скриптийг ашиглах болно.

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
}

Дараагийн өгүүллээр бид опцион, фьючерс, үнэт цаас зэрэг санхүүгийн хэрэгсэлд ухаалаг данс ашиглах талаар авч үзэх болно.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх