Nerapake Akun Smart Waves lan Aset Cerdas menyang Instrumen Keuangan

Nerapake Akun Smart Waves lan Aset Cerdas menyang Instrumen Keuangan

Ing sadurunge artikel Kita ndeleng sawetara kasus nggunakake akun cerdas ing bisnis, kalebu lelang lan program kesetiaan.
Dina iki kita bakal ngomong babagan carane akun cerdas lan aset cerdas bisa nambah transparansi lan linuwih instrumen finansial kayata opsi, berjangka lan tagihan.

Pilihan

Opsi minangka kontrak ijol-ijolan sing menehi hak panuku kanggo tuku aset kanthi rega tartamtu utawa sadurunge tanggal tartamtu, nanging ora mewajibake dheweke.

Implementasine opsi bisa kaya ing ngisor iki:

Kita nggunakake aset pinter kanggo pilihan dhewe minangka instrument lan akun pinter kanggo peserta sing tumindak minangka exchange lan masalah pilihan. Peserta ijol-ijolan janji bakal ngedol jumlah tartamtu saka aset tartamtu kanthi rega sellPrice antarane dhuwure blok expirationStart lan expirationEnd).

Ing kode aset pinter, kita mung bakal mriksa yen didol mung ing antarane dhuwur sing ditemtokake, lan ora bakal mriksa apa-apa liyane; kita bakal ninggalake kabeh tanggung jawab kanggo netepi aturan kasebut menyang kode peserta ijol-ijolan.

Kode aset pinter:

let expirationStart = 100000
let expirationEnd = 101440

match tx {
   case some : ExchangeTransaction | TransferTransaction =>
       height > expirationStart && height <= expirationEnd
   case _ => false
}

Kita bakal nganggep yen tumindak kasebut ditindakake kaya ing ngisor iki: peserta ijol-ijolan ngedol opsi kanggo tuku sawetara aset, lan peserta liyane bisa nerusake opsi kasebut utawa perdagangan. Kanggo ngleksanani hak tuku, panuku potensial kudu nransfer nomer pilihan sing dikarepake menyang akun penjual, yaiku, peserta ijol-ijolan. Sabanjure, dheweke nulis informasi babagan transfer rampung menyang akun negara peserta ijol-ijolan, lan mung banjur ExchangeTransaction bisa nerusake miturut kondisi tuku lan adol sing ditemtokake.

Ing kode akun pinter, kita kudu nggawe manawa ExchangeTransaction sembarang liwat iku kanggo tumindak final tuku lan sade ketemu kahanan tartamtu, lan peserta tuku persis nomer Unit sing dikirim menyang akun saka peserta exchange. Pembeli potensial kudu ngirim DataTransaction sing bener babagan transfer kasebut supaya peserta ijol-ijolan bisa ngindhari mbuwang kaping pindho. Ing DataTransaction iki, panuku nempatake, miturut kunci sing padha karo alamate, nilai sing padha karo jumlah opsi sing ditransfer menyang akun peserta ijol-ijolan, yaiku, jumlah unit aset sing bisa dituku.

Kode akun pinter:

#владелец аккаунта дает обязательство продать определенное количество юнитов ассета
#по цене 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
}

Futures ing akun pinter

Ora kaya opsi, kontrak berjangka (kontrak berjangka) dudu hak, nanging kewajiban panuku kanggo tuku aset kanthi rega sing ditemtokake dening kontrak ing titik tartamtu ing mangsa ngarep.

Umumé, nulis masa depan padha karo nulis pilihan. Ing kene aset cerdas tumindak minangka masa depan.

Sampeyan uga kudu nggawe manawa panuku lan bakul mlebu pesenan tuku. Masa depan minangka kewajiban sing kudu ditindakake ing kasus apa wae. Iki tegese yen bakul utawa peserta nolak kewajiban sing, sembarang peserta ing jaringan bisa ngirim transaksi, saéngga nglakokaké mangsa.

Skrip aset cerdas ngontrol kabeh TransferTransaction lan ExchangeTransaction saka aset berjangka, mung nyetujoni yen peserta panuku wis nggawe pesenan kanggo tuku aset berjangka saka peserta ijol-ijolan.

Pesenan iki kudu sah lan nyukupi kahanan sing ditanggepi berjangka. Kanggo ngesyahke pesenan, sampeyan bisa ngetik kabeh kolom menyang negara akun panuku bebarengan karo perwakilan byte pesenan mlebu, lan banjur nindakake validasi external.

Ing wayahe, RIDE ora ngemot fungsi asli kanggo parsing transaksi byte, nanging kalebu kabeh alat sing perlu kanggo implementasine. Mula, pangembang bisa nyoba ngetrapake fitur kasebut dhewe.

Akun multi-tanda tangan / Escrow

Akun multi-tandha ngidini sawetara pangguna kanggo ngatur aset bebarengan (contone, transaksi karo aset mung bisa ditindakake yen telu saka papat pangguna duwe tanda tangan). Kanggo nggawe akun multi-signature ing basa RIDE, kita bisa nggunakake bukti transaksi.

Akun multi-signature uga bisa digunakake minangka akun escrow ing ngendi dana ditahan nganti pihak-pihak ing kontrak nepaki kewajiban.

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

Token curated registry (TCR)

Akeh platform pamblokiran duwe masalah karo aset beracun. Contone, alamat apa wae sing wis mbayar komisi bisa nggawe aset ing Waves.

Masalah nglindhungi pangguna lan pamblokiran dhewe saka aset beracun bisa ditanggulangi dening registri curated token (TCR) sing digawe dening pemegang token.

Kanggo milih token tartamtu sing bakal ditambahake ing dhaptar, sing nduweni menehi tawaran sing padha karo bagean saka jumlah token sing diterbitake. A token kalebu ing ndhaftar yen mayoritas sing nduweni milih kanggo.

Ing conto kita, kita ngidini pangguna nambah token menyang dhaptar kanggo pertimbangan (sajrone periode "tantangan") nggunakake tombol kunci negara = asset_name, mung yen nilai count saiki = 0.

Uga, pangguna kudu duwe imbangan non-nol token iki ing dompete. Banjur teka periode voting, sajrone pangguna bisa milih saben aset ing dompet, nanging mung sapisan, menehi rating saka 1 nganti 10. Voting pangguna diwakili dening tombol saka formulir 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
}

Ragad langganan

Ing conto iki, kita bakal ndeleng panggunaan akun cerdas kanggo nggawe pembayaran biasa kanggo produk utawa layanan ing interval tartamtu - "biaya langganan".
Yen pangguna nyedhiyakake akun pinter (liwat bukti transaksi) kanthi ID TransferTransaction kanthi jumlah dana sing ditransfer, dheweke bisa nulis {kunci: alamat, nilai:) menyang negara akun bener}.

Iki tegese pangguna konfirmasi langganan produk utawa layanan kasebut. Nalika langganan kadaluwarsa, pangguna jaringan bisa nyetel nilai ing jejere tombol sing cocog ing negara kasebut palsu.

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
}

Pilih

Akun pinter bisa digunakake kanggo ngleksanakake voting ing blockchain. Conto bakal milih kanggo laporan duta paling apik ing program duta. Negara akun digunakake minangka platform kanggo ngrekam swara kanggo pilihan tartamtu.

Ing conto iki, mung sing wis tuku token "voting" khusus sing diijini milih. Peserta ngirim DataTransaction luwih dhisik kanthi pasangan (kunci, nilai) = (purchaseTransactionId, buyTransactionId). Nyetel nilai liyane kanggo tombol iki dilarang. Nggunakake alamat lan pilihan voting, sampeyan bisa nyetel DataEntry mung sapisan. Voting mung bisa ing wektu tartamtu.

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 of exchange

Cathetan promissory minangka kewajiban ditulis sing mbutuhake salah siji pihak kanggo mbayar jumlah tetep liyane nalika dikarepake utawa ing tanggal sing wis ditemtokake.

Ing conto kita, kita nggunakake akun cerdas, tanggal kadaluwarsa sing cocog karo tanggal pambayaran tagihan.

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
}

Simpenan

Deposit yaiku penempatan dana ing bank ing kondisi tartamtu (term, bunga).
Ing conto kita, fungsi bank ditindakake dening akun cerdas. Sawise sawetara blok, sing cocog karo periode simpenan, pangguna bisa ngasilake dhuwit kanthi kapentingan. Skrip kasebut nemtokake dhuwur blok (finalHeight), sawise tekan pangguna bisa mbatalake dhuwit saka akun kasebut.

heightUnit - jumlah pamblokiran ing siji unit wektu (contone, sasi, taun, etc.). Pisanan kita mriksa entri kanthi pasangan (kunci, nilai) = (initialTransferTransaction, futureDataTransaction). Pangguna banjur kudu ngirim TransferTransaction kanthi informasi sing bener babagan jumlah simpenan lan kapentingan sing ditampa kanggo periode simpenan. Informasi iki dicenthang nglawan TransferTransaction asli, sing ana ing bukti TransferTransaction saiki. depositDivisor punika nomer kuwalik saka simpenan nuduhake (yen simpenan ditampa ing 10%, simpenan nuduhake 0,1, lan 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)
}

Ing artikel katelu lan pungkasan ing seri iki, kita bakal ndeleng luwih akeh panggunaan aset cerdas, kalebu pembekuan lan watesan transaksi kanggo alamat tartamtu.

Source: www.habr.com

Tuku hosting sing dipercaya kanggo situs kanthi proteksi DDoS, server VPS VDS 🔥 Tuku hosting situs web sing bisa dipercaya nganggo proteksi DDoS, server VPS VDS | ProHoster