Waves سمارٽ اڪائونٽس جون ايپليڪيشنون: نيلامي کان وٺي بونس پروگرامن تائين

Waves سمارٽ اڪائونٽس جون ايپليڪيشنون: نيلامي کان وٺي بونس پروگرامن تائين

Blockchain اڪثر ڪري صرف cryptocurrencies سان لاڳاپيل آهي، پر DLT ٽيڪنالاجي جي ايپليڪيشن جا علائقا تمام وسيع آهن. بلاڪچين جي استعمال لاءِ سڀ کان وڌيڪ واعدو ڪندڙ علائقن مان هڪ هڪ سمارٽ معاهدو آهي جيڪو خودڪار طور تي عمل ڪيو ويندو آهي ۽ ان ۾ داخل ٿيل پارٽين جي وچ ۾ اعتماد جي ضرورت ناهي.

RIDE - سمارٽ معاهدن لاءِ هڪ ٻولي

Waves سمارٽ معاهدن لاءِ هڪ خاص ٻولي ٺاهي آهي - RIDE. ان جو مڪمل دستاويز موجود آهي هتي. ۽ هتي - هن موضوع تي مضمون حبر تي.

RIDE معاهدو هڪ پيشڪش آهي ۽ موٽائي ٿو "سچو" يا "غلط" جي طور تي. ان جي مطابق، ٽرانزيڪشن يا ته بلاڪچين ۾ رڪارڊ ڪيو ويو آهي يا رد ڪيو ويو آهي. سمارٽ معاهدو مڪمل طور تي مخصوص شرطن کي پورو ڪرڻ جي ضمانت ڏئي ٿو. RIDE ۾ هڪ معاهدي مان ٽرانزيڪشن ٺاهڻ في الحال ممڪن ناهي.

اڄ اتي ٻه قسم جا Waves سمارٽ معاهدو آهن: سمارٽ اڪائونٽس ۽ سمارٽ اثاثا. هڪ سمارٽ اڪائونٽ هڪ باقاعده يوزر کاتو آهي، پر ان لاءِ هڪ اسڪرپٽ سيٽ ڪيل آهي جيڪا سڀني ٽرانزيڪشن کي ڪنٽرول ڪري ٿي. هڪ سمارٽ اڪائونٽ اسڪرپٽ شايد هن طرح نظر اچن ٿا، مثال طور:

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

tx هڪ ٽرانزيڪشن آهي جنهن تي عمل ڪيو پيو وڃي جنهن کي اسان صرف ان صورت ۾ استعمال ڪرڻ جي اجازت ڏيون ٿا نمونن جي ميلاپ واري ميڪانيزم کي جيڪڏهن اهو منتقلي ٽرانزيڪشن نه آهي. RIDE ۾ نموني جي ميلاپ کي ٽرانزيڪشن جي قسم کي جانچڻ لاء استعمال ڪيو ويندو آهي. سڀ موجود اڪائونٽس سمارٽ اڪائونٽ اسڪرپٽ ۾ پروسيس ڪري سگھجن ٿا ٽرانزيڪشن جا قسم.

اسڪرپٽ پڻ متغيرن جو اعلان ڪري سگھي ٿو، "جيڪڏھن-تو-ٻيو" ٺاھڻ ۽ ٻين طريقن کي مڪمل طور تي جانچڻ لاء استعمال ڪريو. انهي ڳالهه کي يقيني بڻائڻ لاءِ ته معاهدن ۾ ثابتي مڪمل ۽ پيچيدگي (قيمت) آهي جيڪا اڳڪٿي ڪرڻ آسان آهي معاهدي تي عملدرآمد شروع ٿيڻ کان اڳ، RIDE ۾ لوپ يا جمپ بيان شامل نه آهن.

Waves اڪائونٽن جي ٻين خاصيتن ۾ "رياست" جي موجودگي شامل آهي، يعني اڪائونٽ جي حالت. توهان ڊيٽا ٽرانزيڪشن (ڊيٽا ٽرانزيڪشن) استعمال ڪندي اڪائونٽ اسٽيٽ تي جوڑوں جو لامحدود تعداد (ڪي، قدر) لکي سگهو ٿا. اها معلومات وري پروسيس ڪري سگهجي ٿي REST API ذريعي ۽ سڌو سنئون سمارٽ معاهدي ۾.

هر ٽرانزيڪشن ۾ ثبوتن جي هڪ صف شامل ٿي سگھي ٿي، جنهن ۾ شرڪت ڪندڙ جي دستخط، گهربل ٽرانزيڪشن جي ID، وغيره داخل ڪري سگھجن ٿيون.

RIDE ذريعي ڪم ڪندي هتي توهان کي معاهدو جو مرتب ٿيل نظارو ڏسڻ جي اجازت ڏئي ٿو (جيڪڏهن اهو مرتب ڪيو ويو آهي)، نوان اڪائونٽ ٺاهي ۽ ان لاءِ اسڪرپٽ سيٽ ڪريو، انهي سان گڏ ڪمانڊ لائن ذريعي ٽرانزيڪشن موڪليو.

مڪمل چڪر لاءِ، جنهن ۾ اڪائونٽ ٺاهڻ، ان تي سمارٽ ڪانٽريڪٽ انسٽال ڪرڻ ۽ ٽرانزيڪشن موڪلڻ شامل آهن، توهان REST API (مثال طور، C#, C, Java, JavaScript, Python, Rust, Elixir) سان رابطو ڪرڻ لاءِ لائبريري پڻ استعمال ڪري سگهو ٿا. . IDE سان ڪم ڪرڻ شروع ڪرڻ لاءِ، بس ڪلڪ ڪريو نئون بٽڻ.

سمارٽ معاهدن کي استعمال ڪرڻ جا امڪان وسيع آهن: ٽرانزيڪشن کي منع ڪرڻ کان وٺي ڪجهه پتي تائين ("ڪاري فهرست") پيچيده ڊي ايپس تائين.

هاڻي اچو ته ڪاروبار ۾ سمارٽ معاهدن جي استعمال جا مخصوص مثال ڏسو: جڏهن نيلامي، انشورنس، ۽ وفاداري پروگرام ٺاهڻ.

نيلام

هڪ ڪامياب نيلامي لاءِ شرطن مان هڪ آهي شفافيت: شرڪت ڪندڙن کي يقين رکڻ گهرجي ته بولن کي هٿي ڏيڻ ناممڪن آهي. اهو حاصل ڪري سگهجي ٿو بلاڪچين جي مهرباني، جتي سڀني شرطن بابت ناقابل قابل ڊيٽا ۽ وقت جڏهن اهي ٺاهيا ويا هئا سڀني شرڪت ڪندڙن لاء دستياب هوندي.

Waves blockchain تي، ڊيٽا ٽرانزيڪشن ذريعي نيلامي اڪائونٽ اسٽيٽ ۾ بوليون رڪارڊ ڪري سگھجن ٿيون.

توهان بلاڪ نمبرن کي استعمال ڪندي نيلام جي شروعات ۽ آخري وقت پڻ مقرر ڪري سگهو ٿا: Waves blockchain ۾ بلاڪ نسل جي تعدد تقريبن برابر آهي 60 سيڪنڊ

1. انگريزي چڙهندڙ قيمت نيلام

انگلش نيلامي ۾ حصو وٺندڙ هڪ ٻئي سان مقابلي ۾ بوليون. هر نئين شرط پوئين هڪ کان وڌيڪ هجڻ گهرجي. نيلام ختم ٿي ويندو آهي جڏهن ڪو به وڌيڪ بولڊر نه هوندو آهي ته آخري بولي کان وڌيڪ. انهي صورت ۾، بلند ترين بلڊر کي بيان ڪيل رقم مهيا ڪرڻ گهرجي.

اتي پڻ ھڪڙو نيلام اختيار آھي جنھن ۾ وڪڻندڙ گھٽ ۾ گھٽ قيمت مقرر ڪري ٿو، ۽ حتمي قيمت ان کان وڌيڪ ٿيڻ گھرجي. ٻي صورت ۾، لاٽ اڻ وڪرو رهي ٿو.

هن مثال ۾، اسان هڪ اڪائونٽ سان ڪم ڪري رهيا آهيون خاص طور تي نيلام لاءِ ٺاهيل. نيلامي جو عرصو 3000 بلاڪ آھي، ۽ لاٽ جي شروعاتي قيمت 0,001 WAVES آھي. حصو وٺندڙ "قيمت" ۽ انهن جي بوليءَ جي قيمت سان ڊيٽا ٽرانزيڪشن موڪلڻ سان هڪ بول رکي سگهي ٿو.

نئين بوليءَ جي قيمت ھن چاٻي جي موجوده قيمت کان وڌيڪ ھجڻ گھرجي، ۽ حصو وٺندڙ وٽ پنھنجي کاتي ۾ گھٽ ۾ گھٽ [new_bid + Commission] ٽوڪن ھجڻ گھرجي. بيڊر جي ايڊريس کي ڊيٽا ٽرانزيڪشن ۾ "موڪلندڙ" فيلڊ ۾ رڪارڊ ڪيو وڃي، ۽ موجوده بولي بلاڪ جي اوچائي نيلامي جي مدت جي اندر هجڻ گهرجي.

جيڪڏهن نيلامي جي آخر ۾ حصو وٺندڙ سڀ کان وڌيڪ قيمت مقرر ڪئي آهي، هو هڪ ايڪسچينج ٽرانزيڪشن موڪلي سگهي ٿو لاڳاپيل لاٽ لاءِ مخصوص قيمت ۽ ڪرنسي جي جوڙي تي ادا ڪرڻ لاءِ.

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. گھٽتائي جي قيمتن جو ڊچ نيلام

ڊچ نيلامي ۾، تمام گهڻو ابتدائي طور تي پيش ڪيو ويندو آهي ان کان وڌيڪ قيمت تي جيڪو خريد ڪندڙ ادا ڪرڻ لاء تيار آهي. قيمت قدم بہ قدم گھٽجي ٿي جيستائين شرڪت ڪندڙن مان ھڪڙو موجوده قيمت تي لاٽ خريد ڪرڻ تي راضي ٿئي.

هن مثال ۾ اسان ساڳيون ثابتيون استعمال ڪريون ٿا جيئن پوئين هڪ ۾، انهي سان گڏ قيمت جو مرحلو جڏهن ڊيلٽا گهٽجي ٿو. اڪائونٽ اسڪرپٽ چيڪ ڪري ٿو ته ڇا حصو وٺندڙ واقعي پهرين شرط رکي ٿو. ٻي صورت ۾، ڊيٽا ٽرانزيڪشن بلاڪچين طرفان قبول نه ڪيو ويو آهي.

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. نيلام “سڀ ادا”

"سڀ-ادا" هڪ نيلام آهي جنهن ۾ سڀئي شرڪت ادا ڪندا آهن، بغير ڪنهن کي تمام گهڻو کٽيو. هر نئون حصو وٺندڙ هڪ بول ادا ڪري ٿو، ۽ حصو وٺندڙ جيڪو وڌ ۾ وڌ بول ڏئي ٿو اهو گهڻو کٽي ٿو.

اسان جي مثال ۾، هر نيلام ۾ حصو وٺندڙ ڊيٽا ٽرانزيڪشن ذريعي (ڪجهه، قدر)* = ("فاتح"، پتو)، ("قيمت"، قيمت) سان هڪ بولي رکي ٿو. اهڙي ڊيٽا ٽرانزيڪشن کي صرف ان صورت ۾ منظور ڪيو ويندو آهي جڏهن هن شرڪت ڪندڙ وٽ اڳ ۾ ئي پنهنجي دستخط سان هڪ منتقلي ٽرانزيڪشن آهي ۽ هن جي بولي سڀني اڳين کان وڌيڪ آهي. نيلام جاري آهي جيستائين اوچائي جي آخري حد تائين پهچي وڃي.

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

اچو ته هڪ صورتحال تي غور ڪريو جتي توهان کي مالي نقصان جي خلاف صارفين جي اثاثن کي بيمه ڪرڻ جي ضرورت آهي. مثال طور، هڪ صارف هڪ گارنٽي چاهي ٿو ته جيڪڏهن هڪ ٽوڪن جي قيمت گھٽجي ٿي، ته هو انهن ٽوڪن لاءِ ادا ڪيل پوري رقم واپس حاصل ڪري سگهندو، ۽ بيمه جي مناسب رقم ادا ڪرڻ لاءِ تيار آهي.

هن کي لاڳو ڪرڻ لاء، "انشورنس ٽوڪن" جاري ڪرڻ جي ضرورت آهي. پوءِ پاليسي هولڊر جي اڪائونٽ تي هڪ اسڪرپٽ انسٽال ٿيل آهي، صرف انهن مٽاسٽا جي ٽرانزيڪشن کي اجازت ڏئي ٿي جيڪي ڪجهه شرطن کي پورا ڪن ٿيون.

ٻيڻو خرچ ڪرڻ کان بچڻ لاءِ، توهان کي صارف کي درخواست ڪرڻ جي ضرورت آهي ته پاليسي هولڊر جي اڪائونٽ ۾ اڳ ۾ ئي ڊيٽا ٽرانزيڪشن موڪلڻ لاءِ (key, value) = (purchaseTransactionId, sellOrderId) ۽ ڊيٽا ٽرانزيڪشن موڪلڻ کان روڪيو هڪ چيڪ سان جيڪو اڳ ۾ ئي استعمال ڪيو ويو آهي.

تنهن ڪري، صارف جي ثبوتن ۾ انشورنس ٽوڪن جي خريداري جي ٽرانزيڪشن ID شامل هجڻ گهرجي. ڪرنسي جوڙو ساڳيو هجڻ گهرجي جيئن خريداري جي ٽرانزيڪشن ۾. قيمت پڻ ان جي برابر هجڻ گهرجي جيڪا خريداري جي وقت مقرر ڪئي وئي آهي، انشورنس جي قيمت کان گھٽ.

اهو سمجھيو ويو آهي ته بعد ۾ انشورنس اڪائونٽ صارف کان انشورنس ٽوڪن خريد ڪري ٿو ان قيمت کان گهٽ نه جنهن تي هن انهن کي خريد ڪيو آهي: انشورنس اڪائونٽ هڪ ايڪسچينج ٽرانزيڪشن ٺاهي ٿو، صارف آرڊر تي دستخط ڪري ٿو (جيڪڏهن ٽرانزيڪشن صحيح طريقي سان مڪمل ٿئي ٿي)، انشورنس اڪائونٽ ٻئي آرڊر ۽ سڄي ٽرانزيڪشن تي دستخط ڪري ٿو ۽ ان کي بلاڪچين ڏانهن موڪلي ٿو.

جيڪڏهن ڪا به خريداري نه ٿي ٿئي، صارف اسڪرپٽ ۾ بيان ڪيل ضابطن جي مطابق ايڪسچينج ٽرانزيڪشن ٺاهي سگهي ٿو ۽ ٽرانزيڪشن کي بلاڪچين ڏانهن موڪلي سگهي ٿو. هن طريقي سان صارف بيمه ٿيل ٽوڪن جي خريداري تي خرچ ڪيل رقم واپس ڪري سگهي ٿو.

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 ٽوڪن، جيڪي مالڪن کي واپس ڪيا ويندا آهن جيڪڏهن گهربل رقم گڏ نه ڪئي وئي آهي.

ٽرانزيڪشن ٽيڪس

سمارٽ معاهدو انهن ڪيسن ۾ پڻ لاڳو ٿين ٿا جتي ضروري هجي ته هر ٽرانزيڪشن تي ٽيڪس گڏ ڪرڻ جي ڪيترن ئي قسمن جي اثاثن سان. اهو ٿي سگهي ٿو هڪ نئين اثاثن ذريعي نصب ٿيل اسپانسرشپ سمارٽ اثاثن سان ٽرانزيڪشن لاءِ:

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
}

ڪيش بيڪ ۽ وفاداري پروگرام

ڪيش بيڪ هڪ قسم جي وفاداري پروگرام آهي جنهن ۾ خريد ڪندڙ هڪ پراڊڪٽ يا خدمت تي خرچ ڪيل رقم جو حصو واپس حاصل ڪري ٿو.

جڏهن هڪ سمارٽ اڪائونٽ استعمال ڪندي هن ڪيس تي عمل ڪيو وڃي، اسان کي ثبوتن کي ساڳئي طريقي سان جانچڻ گهرجي جيئن اسان انشورنس ڪيس ۾ ڪيو هو. ٻيڻو خرچ کي روڪڻ لاءِ، صارف کي ڪيش بيڪ حاصل ڪرڻ کان اڳ (key، value) = (perchaseTransactionId، cashbackTransactionId) سان ڊيٽا ٽرانسڪشن موڪلڻ گهرجي.

اسان کي لازمي طور تي ڊيٽا ٽرانزيڪشن استعمال ڪندي موجوده چاٻين تي پابندي لڳائڻ گهرجي. ڪيش بيڪ ڊيوائزر - يونٽ ورهايل ڪيش بيڪ شيئر طرفان. اهي. جيڪڏهن ڪيش بيڪ شيئر 0.1 آهي، ته پوءِ ڪيش بيڪ ڊيويزر 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

تبصرو شامل ڪريو