வேவ்ஸ் ஸ்மார்ட் கணக்குகளின் பயன்பாடுகள்: ஏலம் முதல் போனஸ் திட்டங்கள் வரை

வேவ்ஸ் ஸ்மார்ட் கணக்குகளின் பயன்பாடுகள்: ஏலம் முதல் போனஸ் திட்டங்கள் வரை

பிளாக்செயின் பெரும்பாலும் கிரிப்டோகரன்சிகளுடன் மட்டுமே தொடர்புடையது, ஆனால் டிஎல்டி தொழில்நுட்பத்தின் பயன்பாட்டின் பகுதிகள் மிகவும் பரந்தவை. பிளாக்செயினின் பயன்பாட்டிற்கான மிகவும் நம்பிக்கைக்குரிய பகுதிகளில் ஒன்று ஒரு ஸ்மார்ட் ஒப்பந்தமாகும், இது தானாகவே செயல்படுத்தப்படுகிறது மற்றும் அதில் நுழைந்த தரப்பினரிடையே நம்பிக்கை தேவையில்லை.

RIDE - ஸ்மார்ட் ஒப்பந்தங்களுக்கான மொழி

அலைகள் ஸ்மார்ட் ஒப்பந்தங்களுக்கான ஒரு சிறப்பு மொழியை உருவாக்கியுள்ளது - RIDE. அதன் முழுமையான ஆவணங்கள் அமைந்துள்ளன இங்கே. மற்றும் இங்கே - இந்த தலைப்பில் கட்டுரை ஹப்ரில்.

RIDE ஒப்பந்தம் ஒரு முன்னறிவிப்பு மற்றும் வெளியீட்டாக "உண்மை" அல்லது "தவறு" என்பதை வழங்குகிறது. அதன்படி, பரிவர்த்தனை பிளாக்செயினில் பதிவு செய்யப்பட்டுள்ளது அல்லது நிராகரிக்கப்படுகிறது. ஸ்மார்ட் ஒப்பந்தம் குறிப்பிட்ட நிபந்தனைகளை முழுமையாக நிறைவேற்ற உத்தரவாதம் அளிக்கிறது. RIDE இல் உள்ள ஒப்பந்தத்திலிருந்து பரிவர்த்தனைகளை உருவாக்குவது தற்போது சாத்தியமில்லை.

இன்று இரண்டு வகையான அலைகள் ஸ்மார்ட் ஒப்பந்தங்கள் உள்ளன: ஸ்மார்ட் கணக்குகள் மற்றும் ஸ்மார்ட் சொத்துக்கள். ஸ்மார்ட் அக்கவுண்ட் என்பது வழக்கமான பயனர் கணக்கு, ஆனால் எல்லா பரிவர்த்தனைகளையும் கட்டுப்படுத்தும் ஸ்கிரிப்ட் அமைக்கப்பட்டுள்ளது. ஸ்மார்ட் கணக்கு ஸ்கிரிப்ட் இப்படி இருக்கலாம், எடுத்துக்காட்டாக:

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

tx என்பது செயலாக்கப்படும் ஒரு பரிவர்த்தனையாகும், இது பரிமாற்ற பரிவர்த்தனையாக இல்லாவிட்டால் மட்டுமே பேட்டர்ன் மேட்சிங் பொறிமுறையைப் பயன்படுத்த அனுமதிக்கிறோம். பரிவர்த்தனையின் வகையைச் சரிபார்க்க RIDE இல் உள்ள பேட்டர்ன் பொருத்தம் பயன்படுத்தப்படுகிறது. ஏற்கனவே உள்ள அனைத்து கணக்குகளையும் ஸ்மார்ட் கணக்கு ஸ்கிரிப்ட்டில் செயலாக்க முடியும் பரிவர்த்தனை வகைகள்.

ஸ்கிரிப்ட் மாறிகளை அறிவிக்கலாம், நிபந்தனைகளை முழுமையாகச் சரிபார்ப்பதற்கு "இப்போது-பிறகு" கட்டுமானங்கள் மற்றும் பிற முறைகளைப் பயன்படுத்தலாம். ஒப்பந்தத்தை நிறைவேற்றுவது தொடங்கும் முன் எளிதாகக் கணிக்கக்கூடிய, நிரூபணமான முழுமை மற்றும் சிக்கலான (செலவு) ஒப்பந்தங்கள் இருப்பதை உறுதிசெய்ய, RIDE இல் லூப்கள் அல்லது ஜம்ப் ஸ்டேட்மென்ட்கள் இல்லை.

வேவ்ஸ் கணக்குகளின் மற்ற அம்சங்களில் "நிலை" இருப்பது, அதாவது கணக்கின் நிலை ஆகியவை அடங்கும். தரவு பரிவர்த்தனைகளைப் பயன்படுத்தி (தரவு பரிவர்த்தனை) கணக்கின் நிலைக்கு நீங்கள் எண்ணற்ற ஜோடிகளை (விசை, மதிப்பு) எழுதலாம். இந்தத் தகவலை REST API மூலமாகவும் நேரடியாக ஸ்மார்ட் ஒப்பந்தத்திலும் செயலாக்க முடியும்.

ஒவ்வொரு பரிவர்த்தனையிலும் ஒரு வரிசை சான்றுகள் இருக்கலாம், அதில் பங்கேற்பாளரின் கையொப்பம், தேவையான பரிவர்த்தனையின் ஐடி போன்றவற்றை உள்ளிடலாம்.

RIDE மூலம் பணிபுரிகிறது இங்கே ஒப்பந்தத்தின் தொகுக்கப்பட்ட காட்சியைக் காண உங்களை அனுமதிக்கிறது (அது தொகுக்கப்பட்டிருந்தால்), புதிய கணக்குகளை உருவாக்கவும், அதற்கான ஸ்கிரிப்ட்களை அமைக்கவும், அத்துடன் கட்டளை வரி வழியாக பரிவர்த்தனைகளை அனுப்பவும்.

கணக்கை உருவாக்குதல், அதில் ஸ்மார்ட் ஒப்பந்தத்தை நிறுவுதல் மற்றும் பரிவர்த்தனைகளை அனுப்புதல் உள்ளிட்ட முழுச் சுழற்சிக்கு, நீங்கள் REST API உடன் தொடர்புகொள்வதற்கு நூலகத்தைப் பயன்படுத்தலாம் (உதாரணமாக, C#, C, Java, JavaScript, Python, Rust, Elixir) . IDE உடன் பணிபுரியத் தொடங்க, புதிய பொத்தானைக் கிளிக் செய்யவும்.

ஸ்மார்ட் ஒப்பந்தங்களைப் பயன்படுத்துவதற்கான சாத்தியக்கூறுகள் பரந்த அளவில் உள்ளன: சில முகவரிகளுக்கு ("கருப்பு பட்டியல்") பரிவர்த்தனைகளைத் தடைசெய்வது முதல் சிக்கலான dApps வரை.

இப்போது வணிகத்தில் ஸ்மார்ட் ஒப்பந்தங்களைப் பயன்படுத்துவதற்கான குறிப்பிட்ட எடுத்துக்காட்டுகளைப் பார்ப்போம்: ஏலம், காப்பீடு மற்றும் விசுவாசத் திட்டங்களை உருவாக்கும் போது.

ஏலங்கள்

வெற்றிகரமான ஏலத்திற்கான நிபந்தனைகளில் ஒன்று வெளிப்படைத்தன்மை: பங்கேற்பாளர்கள் ஏலங்களைக் கையாளுவது சாத்தியமில்லை என்று உறுதியாக இருக்க வேண்டும். பிளாக்செயினுக்கு நன்றி செலுத்துவதன் மூலம் இதை அடைய முடியும், அங்கு அனைத்து பந்தயங்கள் மற்றும் அவை செய்யப்பட்ட நேரம் பற்றிய மாறாத தரவு அனைத்து பங்கேற்பாளர்களுக்கும் கிடைக்கும்.

வேவ்ஸ் பிளாக்செயினில், டேட்டா டிரான்சாக்ஷன் மூலம் ஏலக் கணக்கு நிலையில் ஏலங்களை பதிவு செய்யலாம்.

தொகுதி எண்களைப் பயன்படுத்தி ஏலத்தின் தொடக்க மற்றும் முடிவு நேரத்தையும் அமைக்கலாம்: அலைகள் பிளாக்செயினில் தொகுதி உருவாக்கத்தின் அதிர்வெண் தோராயமாக சமமாக இருக்கும் 60 வினாடிகள்.

1. ஆங்கிலம் ஏறுவரிசை விலை ஏலம்

ஆங்கில ஏலத்தில் பங்கேற்பாளர்கள் ஒருவருக்கொருவர் போட்டி போட்டு ஏலம் விடுகிறார்கள். ஒவ்வொரு புதிய பந்தயமும் முந்தையதை விட அதிகமாக இருக்க வேண்டும். கடைசி ஏலத்தை விட அதிக ஏலதாரர்கள் இல்லாதபோது ஏலம் முடிவடைகிறது. இந்த வழக்கில், அதிக ஏலம் எடுத்தவர் குறிப்பிட்ட தொகையை வழங்க வேண்டும்.

ஒரு ஏல விருப்பமும் உள்ளது, அதில் விற்பனையாளர் லாட்டிற்கான குறைந்தபட்ச விலையை நிர்ணயிக்கிறார், மேலும் இறுதி விலை அதை விட அதிகமாக இருக்க வேண்டும். இல்லையெனில், லாட் விற்கப்படாமல் உள்ளது.

இந்த எடுத்துக்காட்டில், ஏலத்திற்காக பிரத்யேகமாக உருவாக்கப்பட்ட கணக்குடன் நாங்கள் வேலை செய்கிறோம். ஏல காலம் 3000 தொகுதிகள், மற்றும் லாட்டின் ஆரம்ப விலை 0,001 அலைகள். ஒரு பங்கேற்பாளர் "விலை" மற்றும் அவர்களின் ஏலத்தின் மதிப்புடன் டேட்டா பரிவர்த்தனையை அனுப்புவதன் மூலம் ஏலத்தை வைக்கலாம்.

புதிய ஏலத்தின் விலை இந்த விசைக்கான தற்போதைய விலையை விட அதிகமாக இருக்க வேண்டும், மேலும் பங்கேற்பாளர் தனது கணக்கில் குறைந்தபட்சம் [new_bid + கமிஷன்] டோக்கன்களை வைத்திருக்க வேண்டும். ஏலதாரரின் முகவரி DataTransaction இல் உள்ள "அனுப்புபவர்" புலத்தில் பதிவு செய்யப்பட வேண்டும், மேலும் தற்போதைய ஏலத் தொகுதியின் உயரம் ஏல காலத்திற்குள் இருக்க வேண்டும்.

ஏலத்தின் முடிவில் பங்கேற்பாளர் அதிக விலையை நிர்ணயித்திருந்தால், அவர் குறிப்பிட்ட விலை மற்றும் நாணய ஜோடியில் தொடர்புடைய தொகைக்கு பணம் செலுத்த ஒரு பரிமாற்ற பரிவர்த்தனையை அனுப்பலாம்.

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, sellOrderId) உடன் முன்கூட்டியே டேட்டா பரிவர்த்தனையை அனுப்புமாறு பயனரைக் கோர வேண்டும் மற்றும் ஏற்கனவே பயன்படுத்தப்பட்ட ஒரு விசையுடன் டேட்டா பரிவர்த்தனைகளை அனுப்புவதைத் தடைசெய்ய வேண்டும்.

எனவே, பயனரின் சான்றுகள் காப்பீட்டு டோக்கன் வாங்குதலின் பரிவர்த்தனை ஐடியைக் கொண்டிருக்க வேண்டும். கரன்சி ஜோடி கொள்முதல் பரிவர்த்தனையில் உள்ளதைப் போலவே இருக்க வேண்டும். விலையும் வாங்கும் போது நிர்ணயிக்கப்பட்ட தொகைக்கு சமமாக இருக்க வேண்டும், காப்பீட்டின் விலையை கழித்து.

காப்பீட்டுக் கணக்கு பயனரிடமிருந்து காப்பீட்டு டோக்கன்களை அவர் வாங்கியதை விடக் குறைவான விலையில் வாங்குகிறது என்பது புரிந்து கொள்ளப்படுகிறது: காப்பீட்டுக் கணக்கு ஒரு பரிமாற்ற பரிவர்த்தனையை உருவாக்குகிறது, பயனர் ஆர்டரில் கையொப்பமிடுகிறார் (பரிவர்த்தனை சரியாக முடிந்தால்), காப்பீட்டு கணக்கு இரண்டாவது ஆர்டரையும் முழு பரிவர்த்தனையையும் கையொப்பமிட்டு பிளாக்செயினுக்கு அனுப்புகிறது.

எந்த வாங்குதலும் நிகழவில்லை என்றால், ஸ்கிரிப்ட்டில் விவரிக்கப்பட்டுள்ள விதிகளின்படி பயனர் ஒரு பரிவர்த்தனை பரிவர்த்தனையை உருவாக்கி, பரிவர்த்தனையை பிளாக்செயினுக்கு அனுப்பலாம். இதன் மூலம், காப்பீடு செய்யப்பட்ட டோக்கன்களை வாங்குவதற்கு செலவழித்த பணத்தை பயனர் திருப்பித் தரலாம்.

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. நாங்கள் 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 (10 *N/taxDivisor WAVES இல் உங்களிடமிருந்து வாங்கக்கூடிய) தொகையில் FeeCoin ஐ வழங்குவார்கள், மேலும் நீங்கள் மைனர் 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
}

கேஷ்பேக் மற்றும் லாயல்டி திட்டங்கள்

கேஷ்பேக் என்பது ஒரு வகை விசுவாசத் திட்டமாகும், இதில் வாங்குபவர் ஒரு தயாரிப்பு அல்லது சேவையில் செலவழித்த தொகையின் ஒரு பகுதியை திரும்பப் பெறுகிறார்.

ஸ்மார்ட் கணக்கைப் பயன்படுத்தி இந்த வழக்கை செயல்படுத்தும்போது, ​​காப்பீட்டு வழக்கில் நாம் செய்ததைப் போலவே ஆதாரங்களையும் சரிபார்க்க வேண்டும். இரட்டைச் செலவுகளைத் தடுக்க, கேஷ்பேக்கைப் பெறுவதற்கு முன், பயனர் (முக்கிய, மதிப்பு) = (purchaseTransactionId, cashbackTransactionId) உடன் தரவுப் பரிமாற்றத்தை அனுப்ப வேண்டும்.

DataTransactionஐப் பயன்படுத்தி ஏற்கனவே உள்ள விசைகளுக்கும் தடை விதிக்க வேண்டும். கேஷ்பேக் டிவைசர் - கேஷ்பேக் பங்கால் வகுக்கப்படும் அலகு. அந்த. கேஷ்பேக் பங்கு 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

கருத்தைச் சேர்