वेव्स स्मार्ट खातों का अनुप्रयोग: नीलामी से लेकर बोनस कार्यक्रम तक

वेव्स स्मार्ट खातों का अनुप्रयोग: नीलामी से लेकर बोनस कार्यक्रम तक

ब्लॉकचेन अक्सर केवल क्रिप्टोकरेंसी से जुड़ी होती है, लेकिन डीएलटी तकनीक के अनुप्रयोग के क्षेत्र बहुत व्यापक हैं। ब्लॉकचेन के उपयोग के लिए सबसे आशाजनक क्षेत्रों में से एक एक स्मार्ट अनुबंध है जो स्वचालित रूप से निष्पादित होता है और इसमें प्रवेश करने वाले पक्षों के बीच विश्वास की आवश्यकता नहीं होती है।

RIDE - स्मार्ट अनुबंधों के लिए एक भाषा

वेव्स ने स्मार्ट कॉन्ट्रैक्ट के लिए एक विशेष भाषा विकसित की है - RIDE। इसका पूरा दस्तावेज मौजूद है यहां. और यहां - इस विषय पर आलेख हैबर पर।

RIDE अनुबंध एक विधेय है और आउटपुट के रूप में "सही" या "गलत" लौटाता है। तदनुसार, लेनदेन या तो ब्लॉकचेन में दर्ज किया जाता है या अस्वीकार कर दिया जाता है। स्मार्ट अनुबंध निर्दिष्ट शर्तों की पूर्ति की पूरी गारंटी देता है। RIDE में किसी अनुबंध से लेनदेन उत्पन्न करना वर्तमान में संभव नहीं है।

आज वेव्स स्मार्ट कॉन्ट्रैक्ट दो प्रकार के हैं: स्मार्ट अकाउंट और स्मार्ट एसेट्स। स्मार्ट खाता एक नियमित उपयोगकर्ता खाता है, लेकिन इसके लिए एक स्क्रिप्ट सेट की जाती है जो सभी लेनदेन को नियंत्रित करती है। उदाहरण के लिए, एक स्मार्ट खाता स्क्रिप्ट इस तरह दिख सकती है:

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

टीएक्स एक लेनदेन है जिसे संसाधित किया जा रहा है और हम पैटर्न मिलान तंत्र का उपयोग करने की अनुमति केवल तभी देते हैं जब यह स्थानांतरण लेनदेन न हो। RIDE में पैटर्न मिलान का उपयोग लेनदेन के प्रकार की जांच करने के लिए किया जाता है। सभी मौजूदा खातों को स्मार्ट खाता स्क्रिप्ट में संसाधित किया जा सकता है लेन-देन के प्रकार.

स्क्रिप्ट वेरिएबल्स भी घोषित कर सकती है, स्थितियों की पूरी तरह से जाँच करने के लिए "यदि-तब-अन्यथा" संरचनाओं और अन्य तरीकों का उपयोग कर सकती है। यह सुनिश्चित करने के लिए कि अनुबंधों में सिद्ध पूर्णता और जटिलता (लागत) है जिसका अनुबंध निष्पादन शुरू होने से पहले अनुमान लगाना आसान है, RIDE में लूप या जंप स्टेटमेंट शामिल नहीं हैं।

वेव्स खातों की अन्य विशेषताओं में "राज्य" की उपस्थिति शामिल है, अर्थात खाते की स्थिति। आप डेटा लेनदेन (डेटाट्रांसेक्शन) का उपयोग करके खाता स्थिति में अनंत संख्या में जोड़े (कुंजी, मूल्य) लिख सकते हैं। इस जानकारी को REST API और सीधे स्मार्ट अनुबंध दोनों के माध्यम से संसाधित किया जा सकता है।

प्रत्येक लेनदेन में सबूतों की एक श्रृंखला हो सकती है, जिसमें भागीदार के हस्ताक्षर, आवश्यक लेनदेन की आईडी आदि दर्ज की जा सकती है।

RIDE के माध्यम से कार्य करना आईडीई आपको अनुबंध का संकलित दृश्य देखने (यदि यह संकलित है), नए खाते बनाने और इसके लिए स्क्रिप्ट सेट करने, साथ ही कमांड लाइन के माध्यम से लेनदेन भेजने की अनुमति देता है।

एक पूर्ण चक्र के लिए, जिसमें एक खाता बनाना, उस पर एक स्मार्ट अनुबंध स्थापित करना और लेनदेन भेजना शामिल है, आप REST API (उदाहरण के लिए, C#, C, Java, JavaScript, Python, Rust, Elixir) के साथ इंटरैक्ट करने के लिए एक लाइब्रेरी का भी उपयोग कर सकते हैं। . आईडीई के साथ काम करना शुरू करने के लिए, बस नया बटन क्लिक करें।

स्मार्ट अनुबंधों का उपयोग करने की संभावनाएं व्यापक हैं: कुछ पतों ("ब्लैक लिस्ट") पर लेनदेन को प्रतिबंधित करने से लेकर जटिल डीएपी तक।

आइए अब व्यवसाय में स्मार्ट अनुबंधों के उपयोग के विशिष्ट उदाहरण देखें: नीलामी, बीमा और वफादारी कार्यक्रम बनाते समय।

नीलामी

एक सफल नीलामी की शर्तों में से एक पारदर्शिता है: प्रतिभागियों को आश्वस्त होना चाहिए कि बोलियों में हेरफेर करना असंभव है। इसे ब्लॉकचेन की बदौलत हासिल किया जा सकता है, जहां सभी दांवों और उनके लगाए जाने के समय के बारे में अपरिवर्तनीय डेटा सभी प्रतिभागियों के लिए उपलब्ध होगा।

वेव्स ब्लॉकचेन पर, डेटाट्रांसएक्शन के माध्यम से नीलामी खाता स्थिति में बोलियां दर्ज की जा सकती हैं।

आप ब्लॉक नंबरों का उपयोग करके नीलामी का प्रारंभ और समाप्ति समय भी निर्धारित कर सकते हैं: वेव्स ब्लॉकचेन में ब्लॉक पीढ़ी की आवृत्ति लगभग बराबर है 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)
}

बीमा/क्राउडफंडिंग

आइए एक ऐसी स्थिति पर विचार करें जहां आपको वित्तीय घाटे के खिलाफ उपयोगकर्ताओं की संपत्ति का बीमा करने की आवश्यकता है। उदाहरण के लिए, एक उपयोगकर्ता गारंटी चाहता है कि यदि किसी टोकन का मूल्यह्रास होता है, तो वह इन टोकन के लिए भुगतान की गई पूरी राशि वापस पाने में सक्षम होगा, और बीमा की उचित राशि का भुगतान करने को तैयार है।

इसे लागू करने के लिए, "बीमा टोकन" जारी करने की आवश्यकता है। फिर पॉलिसीधारक के खाते पर एक स्क्रिप्ट स्थापित की जाती है, जो केवल उन एक्सचेंजट्रांज़ैक्शन को निष्पादित करने की अनुमति देती है जो कुछ शर्तों को पूरा करते हैं।

दोहरे खर्च को रोकने के लिए, आपको उपयोगकर्ता से पॉलिसीधारक के खाते में (कुंजी, मूल्य) = (purchaseTransactionId, salesOrderId) के साथ अग्रिम रूप से डेटाट्रांसएक्शन भेजने का अनुरोध करना होगा और पहले से ही उपयोग की जा चुकी कुंजी के साथ डेटाट्रांजैक्शन भेजने पर रोक लगानी होगी।

इसलिए, उपयोगकर्ता के प्रमाण में बीमा टोकन खरीद की लेनदेन आईडी शामिल होनी चाहिए। मुद्रा जोड़ी खरीद लेनदेन के समान ही होनी चाहिए। लागत भी खरीद के समय तय की गई लागत के बराबर होनी चाहिए, बीमा की कीमत घटाकर।

यह समझा जाता है कि बाद में बीमा खाता उपयोगकर्ता से बीमा टोकन उस कीमत से कम कीमत पर नहीं खरीदता है जिस कीमत पर उसने उन्हें खरीदा था: बीमा खाता एक एक्सचेंजट्रांजैक्शन बनाता है, उपयोगकर्ता ऑर्डर पर हस्ताक्षर करता है (यदि लेनदेन सही ढंग से पूरा हो गया है), बीमा खाता दूसरे आदेश और पूरे लेनदेन पर हस्ताक्षर करता है और इसे ब्लॉकचेन पर भेजता है।

यदि कोई खरीदारी नहीं होती है, तो उपयोगकर्ता स्क्रिप्ट में वर्णित नियमों के अनुसार एक एक्सचेंजट्रांजैक्शन बना सकता है और लेनदेन को ब्लॉकचेन पर भेज सकता है। इस तरह उपयोगकर्ता बीमित टोकन की खरीद पर खर्च किए गए पैसे वापस कर सकता है।

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

एक बीमा टोकन को एक स्मार्ट संपत्ति बनाया जा सकता है, उदाहरण के लिए, तीसरे पक्ष को इसके हस्तांतरण पर रोक लगाने के लिए।

इस योजना को क्राउडफंडिंग टोकन के लिए भी लागू किया जा सकता है, जो आवश्यक राशि एकत्र नहीं होने पर मालिकों को वापस कर दिए जाते हैं।

लेन-देन कर

स्मार्ट अनुबंध उन मामलों में भी लागू होते हैं जहां कई प्रकार की संपत्तियों के साथ प्रत्येक लेनदेन पर कर एकत्र करना आवश्यक होता है। यह एक नई परिसंपत्ति स्थापित करके किया जा सकता है प्रायोजन स्मार्ट संपत्तियों के साथ लेनदेन के लिए:

1. हम फीकॉइन जारी करते हैं, जो उपयोगकर्ताओं को एक निश्चित कीमत पर भेजा जाएगा: 0,01 वेव्स = 0,001 फीकॉइन।

2. फीकॉइन और विनिमय दर के लिए प्रायोजन निर्धारित करें: 0,001 वेव्स = 0,001 फीकॉइन।

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
}

अब जब भी कोई एन स्मार्ट संपत्तियों को स्थानांतरित करता है, तो वे आपको एन/टैक्सडिवाइजर की राशि में फीकॉइन देंगे (जिसे आपसे 10 *एन/टैक्सडिवाइजर वेव्स पर खरीदा जा सकता है), और आप माइनर को एन/टैक्सडिवाइजर वेव्स देंगे। परिणामस्वरूप, आपका लाभ (कर) 9*N/करविभाजक तरंगें होगा।

आप स्मार्ट एसेट स्क्रिप्ट और 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
}

कैशबैक और लॉयल्टी कार्यक्रम

कैशबैक एक प्रकार का लॉयल्टी प्रोग्राम है जिसमें खरीदार को किसी उत्पाद या सेवा पर खर्च की गई राशि का कुछ हिस्सा वापस मिल जाता है।

स्मार्ट खाते का उपयोग करके इस मामले को लागू करते समय, हमें सबूतों की जांच उसी तरह करनी चाहिए जैसे हमने बीमा मामले में की थी। दोहरे खर्च को रोकने के लिए, उपयोगकर्ता को कैशबैक प्राप्त करने से पहले (कुंजी, मूल्य) = (purchaseTransactionId, 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

एक टिप्पणी जोड़ें