Dalam artikel sebelumnya , kami melihat beberapa kasus menggunakan akun pintar dalam bisnis - termasuk program lelang dan loyalitas.
Hari ini kita akan berbicara tentang bagaimana akun pintar dan aset pintar dapat meningkatkan transparansi dan keandalan instrumen keuangan seperti opsi, futures, dan tagihan.
OpsiOpsi adalah kontrak bursa yang memberi pembeli hak untuk membeli aset pada harga tertentu atau sebelum tanggal tertentu, tetapi tidak mewajibkannya untuk melakukannya.
Pelaksanaan opsi dapat sebagai berikut:
Kami menggunakan aset pintar untuk opsi itu sendiri sebagai alat dan akun pintar untuk peserta yang bertindak sebagai pertukaran dan mengeluarkan opsi. Anggota bursa berjanji bahwa ia akan menjual sejumlah tertentu dari aset tertentu dengan harga jual. Harga antara ketinggian kedaluwarsa Mulai dan blok kedaluwarsa).
Dalam kode aset cerdas, kami cukup memverifikasi bahwa aset itu hanya diperdagangkan di antara ketinggian yang ditunjukkan, dan kami tidak akan memeriksa yang lain, kami akan meninggalkan semua tanggung jawab untuk mematuhi aturan dengan kode peserta pertukaran.
Kode Aset Cerdas:let expirationStart = 100000 let expirationEnd = 101440 match tx { case some : ExchangeTransaction | TransferTransaction => height > expirationStart && height <= expirationEnd case _ => false }
Kami berasumsi bahwa tindakannya adalah sebagai berikut: anggota bursa menjual opsi untuk pembelian beberapa aset, dan seluruh peserta dapat mentransfer opsi ini atau memperdagangkannya. Untuk menggunakan haknya untuk membeli, pembeli potensial harus mentransfer jumlah opsi yang diinginkan ke akun penjual, yaitu peserta pertukaran. Kemudian ia menuliskan informasi tentang transfer yang selesai ke status akun anggota bursa dan hanya kemudian ExchangeTransaction akan dapat melewati kondisi pembelian dan penjualan yang ditentukan.
Dalam kode akun pintar, kita harus memastikan bahwa setiap transaksi ExchangeTransaksi untuk tindakan pembelian dan penjualan akhir memenuhi persyaratan yang ditentukan, dan peserta membeli persis jumlah unit yang dia kirim ke akun peserta pertukaran. Pembeli potensial harus mengirim DataTransaction yang benar tentang transfer yang terjadi, sehingga anggota pertukaran dapat menghindari pengeluaran ganda. Dalam Transaksi Data ini, pembeli memberikan kunci yang sama dengan alamatnya, nilai yang sama dengan jumlah opsi yang ditransfer ke akun anggota bursa, yaitu jumlah unit aset yang dapat ia beli.Kode Akun Cerdas: # # 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 = extract(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 order : Order => #, let correctAssetPair = order.assetPair.amountAsset == amountAsset && order.assetPair.priceAsset == priceAsset let correctPrice = order.price == sellPrice # - let d = transactionById(order.proofs[2]) match d{ case dataTx : DataTransaction => let buyOrderSender = dataTx.data[0].key toBase58String(order.sender.bytes) == buyOrderSender && order.amount == extract(getInteger(dataTx.data, buyOrderSender)) case _ => false } && order.sender == this && correctAssetPair && correctPrice && height > expirationStart && height <= expirationEnd case _ => false }
Akun Cerdas BerjangkaTidak seperti opsi, futures (kontrak berjangka) bukan hak, tetapi kewajiban pembeli untuk membeli aset dengan harga tetap pada titik tertentu di masa depan.
Secara umum, implementasi futures mirip dengan penerapan opsi. Di sini, aset pintar bertindak sebagai masa depan.
Anda juga harus memastikan bahwa pembeli dan penjual menandatangani pesanan pembelian. Futures adalah kewajiban yang harus dipenuhi dalam hal apa pun. Ini berarti bahwa jika penjual atau peserta menolak kewajibannya, setiap peserta jaringan dapat mengirim transaksi, sehingga melaksanakan masa depan.
Smart Asset Script mengontrol semua Futures TransactionTransaction dan ExchangeTransaction Asset, menyetujuinya hanya jika Anggota Pembelian telah membuat pesanan untuk pembelian Futures Aset di masa depan dari Anggota Bursa.
Pesanan ini harus valid dan memenuhi persyaratan penerbitan berjangka. Untuk memeriksa pesanan, Anda dapat memasukkan semua bidangnya ke dalam status akun pembeli bersama dengan representasi byte dari pesanan yang ditandatangani, dan kemudian memvalidasi dari luar.
Saat ini, RIDE tidak mengandung fungsi asli untuk mem-parsing byte transaksi, tetapi mencakup semua alat yang diperlukan untuk implementasinya. Oleh karena itu, pengembang dapat mencoba mengimplementasikan fitur ini sendiri.
Akun / Escrow Multi-SignedAkun dengan multi-signature memungkinkan beberapa pengguna untuk bersama-sama mengelola aset (misalnya, transaksi dengan aset hanya dapat dimungkinkan jika tiga dari empat pengguna memiliki tanda tangan). Untuk membuat akun dengan banyak tanda tangan dalam bahasa RIDE, kami dapat menggunakan bukti transaksi.
Akun dengan multi-tanda tangan juga dapat digunakan untuk rekening escrow, di mana uang disimpan sampai para pihak dalam perjanjian memenuhi kewajiban mereka.
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
Registri yang dikelola Token (TCR)Pada banyak platform blockchain, ada masalah aset beracun. Misalnya, alamat apa pun yang telah membayar komisi dapat membuat aset di Waves.
Registri kurasi token (TCR) yang dihasilkan oleh pemegang token membantu memecahkan masalah melindungi pengguna dan blockchain dari aset beracun.
Untuk memberikan suara untuk menambahkan token tertentu ke daftar, pemegang membuat taruhan sama dengan bagian tokennya dari jumlah total yang dikeluarkan. Token disertakan dalam registri jika sebagian besar pemegangnya memilihnya.
Dalam contoh kami, kami mengizinkan pengguna untuk menambahkan token ke daftar untuk dipertimbangkan (selama periode "tantangan") dengan kunci dari kunci = status asset_name, hanya jika nilai saat ini dihitung = 0.
Selain itu, pengguna di dompet harus memiliki saldo token yang tidak nol ini. Kemudian datang periode pemungutan suara di mana pengguna dapat memberikan suara untuk setiap aset di dompetnya, tetapi hanya sekali, memberikan peringkat 1 sampai 10. Suara pengguna diwakili oleh kunci dari form 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 }
Biaya berlanggananDalam contoh ini, kami akan mempertimbangkan penggunaan akun pintar untuk melakukan pembayaran reguler untuk suatu produk atau layanan pada interval yang telah ditentukan - "biaya bulanan".
Jika pengguna memberikan akun pintar (melalui bukti transaksi) dengan ID TransferTransaction dengan jumlah dana yang diperlukan ditransfer, ia dapat menulis {key: address, value:
true } ke dalam status akun.
Ini berarti bahwa pengguna mengkonfirmasi berlangganan ke produk atau layanan. Ketika langganan kedaluwarsa, setiap pengguna jaringan dapat mengatur kunci yang sesuai dalam statusnya ke
false .
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 }
VotingAkun pintar dapat digunakan untuk menerapkan pemungutan suara di blockchain. Contohnya adalah pemungutan suara untuk laporan duta besar terbaik dalam kerangka program duta besar. Status akun digunakan sebagai platform untuk merekam suara untuk satu atau opsi lain.
Dalam contoh ini, pemungutan suara hanya diperbolehkan bagi mereka yang membeli token "pemungutan suara" khusus. Peserta mengirimkan DataTransaction di muka dengan sepasang (kunci, nilai) = (purchaseTransactionId, buyTransactionId). Menetapkan nilai berbeda untuk kunci ini dilarang. Menggunakan alamat dan opsi pemungutan suara Anda, Anda dapat menginstal DataEntry hanya sekali. Voting hanya dimungkinkan selama periode yang ditentukan.
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 exchangeBill of exchange adalah kewajiban tertulis di mana satu pihak harus membayar yang lain jumlah yang tetap pada saat permintaan atau pada tanggal yang telah ditentukan.
Dalam contoh kami, akun pintar digunakan, tanggal kedaluwarsa yang sesuai dengan tanggal pembayaran 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 }
SetoranDeposit - penempatan dana di bank pada kondisi tertentu (jangka waktu, persentase).
Dalam contoh kami, fungsi bank dilakukan oleh akun pintar. Setelah sejumlah blok, yang sesuai dengan jangka waktu setoran, pengguna dapat mengembalikan uangnya dengan persentase. Script mengatur ketinggian blok (finalHeight), setelah itu pengguna dapat menarik uang dari akun.
heightUnit - jumlah blok dalam satu unit waktu (misalnya, bulan, tahun, dll.). Pertama, kami memeriksa entri dengan pasangan (kunci, nilai) = (initialTransferTransaction, futureDataTransaction). Kemudian, pengguna harus mengirim TransferTransaksi dengan informasi yang benar tentang jumlah setoran dan bunga yang timbul untuk periode setoran. Informasi ini diperiksa terhadap TransferTransaksi asli yang terkandung dalam bukti TransferTransaksi saat ini. depositDivisor adalah angka yang terbalik dengan bagian dari setoran (jika setoran diterima pada 10%, bagian dari setoran adalah 0,1, dan depositDevisor = 1 / 0,1 = 10).
let depositDivisor = 10 let heightUnit = 1000 let finalHeight = 100000 let this = extract(tx.sender) 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) }
Pada artikel ketiga dan terakhir dalam seri ini, kita akan melihat lebih banyak opsi untuk menggunakan aset pintar, termasuk membekukan dan membatasi transaksi untuk alamat tertentu.