Dalam dua artikel sebelumnya, kami berbicara tentang akun pintar dan bagaimana mereka dapat digunakan untuk melakukan lelang dan membuat program loyalitas , dan juga membantu memastikan transparansi instrumen keuangan .
Sekarang kami akan mempertimbangkan aset pintar dan beberapa kasus aplikasi mereka, termasuk pembekuan aset dan membuat pembatasan transaksi di alamat yang ditentukan.Waves Smart Asset memungkinkan pengguna untuk melapisi skrip pada aset, mengikuti mekanisme yang sama seperti dengan akun cerdas. Setiap transaksi baru yang dibuat menggunakan aset pintar akan dikonfirmasi terlebih dahulu oleh skrip, dan hanya kemudian oleh blockchain.
Perlu dicatat perbedaan berikut antara aset pintar dan akun pintar:
- Tidak mungkin memverifikasi bukti dalam kode aset pintar (kami membicarakannya di artikel pertama ).
- Dalam kode akun pintar, Anda dapat memeriksa ExchangeTransaction hanya jika akun Anda adalah akun yang cocok. Jika tidak, hanya pesanan yang diperiksa. Anda tidak dapat memeriksa pesanan secara langsung dalam kode aset pintar, Anda dapat memeriksa ExchangeTransaction, dan jika perlu, ambil pesanan darinya.
- Aset cerdas, tidak seperti akun pintar, tidak memiliki status, tetapi kami masih memiliki akses ke status akun dari skrip.
Aset pintar sangat menyederhanakan penulisan kontrak, membuat implementasi banyak kasus singkat dan elegan.
Pembekuan AsetUntuk membekukan aset ke
ketinggian blok
TargetHeight tertentu, Anda cukup menetapkan nilai ini dalam skrip aset pintar berikut:
let targetHeight = 1500000 height >= targetHeight height - , .
Kondisi Pencocokan SpesifikUntuk menetapkan kecocokan tertentu seperti yang diinginkan, Anda dapat menetapkan alamatnya sebagai pengirim dalam skrip aset pintar dari formulir berikut:
match tx { case t : ExchangeTransaction => t.sender == addressFromString("3PJaDyprvekvPXPuAtxrapacuDJopgJRaU3") case _ => true }
Daftar Putih PenerimaUntuk memungkinkan token dikirim hanya ke akun tertentu - untuk membuat "daftar putih" penerima - Anda dapat menggunakan aset pintar dengan skema berikut, yang memeriksa apakah ada dalam daftar:
match tx { case t : TransferTransaction => let trustedRecipient1 = addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4") let trustedRecipient2 = addressFromString("3PLZcCJyYQnfWfzhKXRA4rteCQC9J1ewf5K") let trustedRecipient3 = addressFromString("3PHrS6VNPRtUD8MHkfkmELavL8JnGtSq5sx") t.recipient == trustedRecipient1 || t.recipient == trustedRecipient2 || t.recipient == trustedRecipient3 case _ => false }
Untuk keamanan dan konsistensi bahasa yang dapat dibuktikan, daftar tidak mengandung implementasi iterator. Oleh karena itu, didefinisikan sebagai seperangkat elemen tertentu.
Penerima daftar hitamDengan cara yang sama, untuk melarang pengiriman token ke akun tertentu, Anda dapat membuat "daftar hitam". Dalam hal ini, aset pintar yang sama persis digunakan, tetapi dengan alamat dicentang jika tidak ada dalam daftar hitam:
match tx { case t : TransferTransaction => let bannedRecipient1 = addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4") let bannedRecipient2 = addressFromString("3PLZcCJyYQnfWfzhKXRA4rteCQC9J1ewf5K") let bannedRecipient3 = addressFromString("3PHrS6VNPRtUD8MHkfkmELavL8JnGtSq5sx") t.recipient != bannedRecipient1 && t.recipient != bannedRecipient2 && t.recipient != bannedRecipient3 case _ => false }
Mengirimkan dengan izin dari penerbitMenggunakan aset cerdas, Anda juga dapat mengatur opsi untuk mengirim aset pintar hanya dengan izin dari penerbit
(label komitmen / utang ). Penerbit menyatakan persetujuannya dengan menempatkan ID transaksi dalam gaya akunnya:
match tx { case t : TransferTransaction => let issuer = extract(addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4")) #, ID isDefined(getInteger(issuer, toBase58String(t.id))) case _ => false }
Tukar hanya dengan koin tertentuAset Pintar memungkinkan izin untuk menukar hanya dengan koin tertentu. Misalnya, untuk mengizinkan pertukaran hanya dengan bitcoin, Anda dapat menggunakan kode berikut:
let BTCId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS' match tx { case t : ExchangeTransaction => t.sellOrder.assetPair.priceAsset == BTCId || t.sellOrder.assetPair.amountAsset == BTCId case _ => true }
Perdagangkan dengan harga oracleDalam skrip aset pintar, Anda dapat menetapkan izin untuk berdagang hanya dengan harga tetap di kisah oracle yang dapat diandalkan. Berikut ini contoh skrip tersebut:
let oracle = Address(base58'3PLNmokt22NrSiNvCLvwMUP84LCMJqbXwAD') let assetId = toBase58String(base58'oWgJN6YGZFtZrV8BWQ1PGktZikgg7jzGmtm16Ktyvjd') match tx { # case t: TransferTransaction | MassTransferTransaction => false case e: ExchangeTransaction => #, , let correctPrice = e.price == extract(getInteger(oracle, assetId)) #, WAVES let correctPriceAsset = !isDefined(e.sellOrder.assetPair.priceAsset) correctPrice && correctPriceAsset case _ => true }
Di sini kita dihadapkan pada momen yang tidak terlihat saat memeriksa ID aset yang dengannya perdagangan dilakukan. Faktanya adalah bahwa jika ID aset tidak ditentukan, maka kita berbicara tentang GELOMBANG. Dalam skrip, kami memastikan bahwa perdagangan dipasangkan dengan GELOMBANG, dengan cara ini.
Kenaikan harga tetapAnda dapat menetapkan harga tetap untuk aset cerdas, yang secara bertahap akan meningkat dalam proporsi tertentu. Berikut ini contoh skrip aset, yang harganya akan naik 5% setiap 1000 blok:
let startPrice = 10 let startHeight = 1000 let interval = 1000 # let raise = 5 match tx { case t: TransferTransaction | MassTransferTransaction => false case e: ExchangeTransaction => e.price == startPrice + ((height - startHeight) / interval) * (100 + raise) / 100 && !isDefined(e.sellOrder.assetPair.priceAsset) case _ => true }
Perdagangan IntervalJuga, berkat skrip, perdagangan aset cerdas dapat dibatasi pada interval yang telah ditentukan. Berikut ini contoh skrip tersebut:
let startHeight = 10000 let interval = 44000 let limit = 1500 match tx { case t: TransferTransaction | MassTransferTransaction | ExchangeTransaction => (height - startHeight) % interval < limit case _ => true }
Dalam skrip, kami memastikan bahwa tidak lebih dari
batas interval
telah berlalu sejak dimulainya perdagangan
startHeight . Panjang interval sama dengan jumlah blok yang ditentukan dalam bidang
interval .