Dipublikasikan pada tanggal 09 Feb 2022
Ditulis oleh andre cahyadi (@prosperaan)
Untuk komunitas Cardano Indonesia
Referensi:
(https://iohk.io/en/blog/posts/2021/04/13/plutus-what-you-need-to-know/)
(https://iohk.io/en/blog/posts/2021/10/28/plutus-application-backend-pab-supporting-dapp-development-on-cardano/)
(Plutus | Cardano Developer Portal)
(https://docs.cardano.org/plutus/datums-redeemers)
(https://iohk.io/en/blog/posts/2021/09/06/no-surprises-transaction-validation-on-cardano/)
(https://iohk.io/en/blog/posts/2021/09/07/no-surprises-transaction-validation-part-2/)
Plutus adalah platform pengembangan smart contract di Cardano. Plutus menggunakan Haskell sebagai bahasa pemrograman dan memungkinkan semua pengembangan dilakukan dari single Haskell library. Para developer dapat membuat decentralized applications (Dapps) yang berinteraksi dengan distributed ledger milik Cardano. Mereka juga tidak perlu menjalankan full Cardano node untuk mengetest sebuah program. Plutus smart contract sendiri dapat dibilang sebagai Haskell program.
Plutus terdiri dari 3 konsep:
a. Extended Unspent Transaction Output (EUTXO) model
b. Plutus Core - bagian yang berjalan di on-chain/blockchain dari Plutus
On-chain code ditulis dengan Plutus Core dan di-compile dengan Plutus compiler
c. Plutus Application Framework (PAF) – bagian yang berjalan di off-chain dari Plutus dan memungkinkan interaksi dengan smart contract
Off-chain code yang berjalan di node klien atau mesin user ditulis dengan PAF dan di-compile dengan GHC (Glasgow Haskell Compiler)
*Penjelasan mengapa di arsitektur Cardano ada on-chain dan off-chain dapat dilihat di post Ouroboros Hydra - Penjelasan Detail
a. EUTXO model
Sebagai pengantar, dapat dilihat di post UTXO vs Account/Balance vs EUTXO
EUTXO model menawarkan keuntungan dimana berhasil atau tidaknya sebuah transaksi bergantung kepada input dari transaksi itu sendiri dan bukan karena hal lain yang ada di blockchain. Validitas dari sebuah transaksi dapat dicek terlebih dahulu di off-chain, sebelum dikirim ke on-chain. Transaction fees pun dapat diketahui secara off-chain sebelum transaksi di-submit.
Sebuah transaksi masih dapat gagal jika ada transaksi lain yang meng-consume input UTXO yang diharapkan oleh transaksi itu (contention). Namun jika semua input UTXO-nya tetap ada, maka transaksi itu dijamin pasti berhasil. Dengan ini memungkinkan parallelism, dimana sebuah node dapat memvalidasi banyak transaksi secara paralel bersamaan asalkan transaksi – transaksi itu tidak saling meng-consume input UTXO yang sama.
Di EUTXO, ada tambahan logic dalam bentuk script (Plutus script) yang harus divalidasi. Proses ini menggunakan script interpreter (Plutus interpreter) untuk mengecek apakah script sudah memiliki argumen – argumen yang tepat, lalu kemudian menghasilkan output True or False.
Beberapa upgrade yang dilakukan sejak hard fork Alonzo untuk mendukung smart contract:
-
Script address: public address yang memiliki UTXO (menyimpan funds) dikunci dengan Plutus script
-
Datum hash: sebuah hash dari arbitrary data yang ditambahkan ke UTXO di script address. Datum hash berfungsi seperti penunjuk atau script state bahwa UTXO itu saling berbeda satu sama lain (menjamin determinism dan immutability dari UTXO tersebut)
Ketika sebuah transaksi berhasil dijalankan, meng-consume, dan spend UTXO tersebut, UTXO beserta Datum-nya dihapus dari ledger. Output terbaru dari transaksi itu harus menghasilkan UTXO yang juga memiliki Datum hash terbaru -
Setiap transaksi membawa sebuah user-specified argument yang disebut Redeemer
Ketika memproses sebuah transaksi, UTXO di dalam script address digunakan sebagai input setelah Plutus interpreter selesai memvalidasi dan mengeluarkan output True. Redeemer-lah yang digunakan sebagai kunci untuk membuka UTXO itu. Di sini terjadi arbitrary process antara Datum (datum hash harus match dengan datum value), Redeemer, dan script context (summary transaction di dalam Plutus script) sebelum akhirnya transaksi dinyatakan berhasil untuk di-input ke blockchain. -
Setiap transaksi dapat menunjukkan execution fee yang diperlukan untuk menjalankan script
-
Collateral untuk memastikan setiap transaksi dapat membayar execution fee
-
Setiap node yang menyusun script argument untuk proses validasi harus memperhatikan hal – hal berikut agar dapat melalui Plutus interpreter:
- Datum
- Redeemer
- Execution Fee
- Script Context (summary transaction)
- Melanjutkan 6 poin di atas, transaksi smart contract dengan Plutus script membutuhkan resource yang lebih besar dari simple transactions pada umumnya. Sejak hard fork Alonzo, diperkenalkanlah 2 fase proses validasi transaksi yang bertujuan untuk memastikan outcome yang dapat diprediksi dan menjamin kompensasi yang adil kepada para node yang telah bekerja melakukan validasi dan memberikan resource-nya.
- Validasi fase 1 memeriksa
a. Apakah transaksi telah dibangun secara benar?
b. Apakah private key (signature) untuk membuka public address yang berisi UTXO sudah ada?
c. Apakah susunan UTXO-nya sudah betul?
d. Apakah transaksi dimungkinkan untuk di-input ke blockchain?
e. Apakah transaksi dapat membayar execution fee?
Jika fase 1 sudah invalid, maka node tidak mendapatkan kompensasi (no fees are charged), dikarenakan tidak ada fee yang dapat diambil dari transaksi tersebut
Perhatian! Untuk network fee sendiri akan tetap selalu ada di dalam semua transaksi baik itu simple transaction maupun smart contract transaction karena untuk kebutuhan jaringan.
- Validasi fase 2, disinilah Plutus script berjalan
a. Fees akan tetap dikenakan terlepas dari berhasil atau gagalnya proses validasi.
b. Jika proses validasi script berjalan lancar (poin 1-3 di atas), fees untuk node diambil dari dalam transaksi
c. Jika proses validasi script invalid, collateral akan diambil, karena fees tidak dapat diambil dari dalam transaksi yang terkunci. Node harus tetap mendapatkan kompensasi karena sudah memproses hingga fase 2 ini.
d. Untuk collateral sendiri, hanya dalam bentuk ADA dan dapat menggunakan UTXO yang sama terus menerus dengan asumsi honest & good faith users tidak akan pernah kehilangan collateral-nya.
Kesimpulan dari 2 fase proses validasi transaksi:
Fase 1 valid, fase 2 valid → di-input ke blockchain
Fase 1 invalid, tidak ada fase 2 → transaksi gagal
Fase 1 valid, fase 2 invalid → tetap di-input ke blockchain, namun hal ini sangat kecil kemungkinannya terjadi
b. Plutus Core
Plutus Core adalah scripting language untuk penulisan on-chain code (Plutus script) yang di-generate dari Haskell compiler plugin
Dalam mengimplementasi EUTXO, penting untuk memperhatikan komponen Plutus script beserta datanya. Penulisan script harus bersifat definitif untuk menspesifikasikan dengan jelas tipe data yang digunakan baik di dalam script address, datum, maupun redeemer.
c. Plutus Application Framework (PAF)
Selain on-chain code, diperlukan juga off-chain code yang bertugas untuk membangun dan men-submit transaksi ke on-chain. Business logic dari sebuah program ditulis di PAF. Dengan adanya single Haskell library atau lebih dikenal dengan sebutan Plutus Application Backend (PAB), para developer dapat fokus ke business logic tanpa perlu terlalu banyak memikirkan low-level details.
Plutus Application Backend (PAB)
Infrastruktur untuk off-chain sendiri dapat dikatakan cukup rumit, karena harus dapat melihat ledger state, mengambil sebagian informasi dari ledger, dan menyusun semuanya untuk membangun sebuah transaksi. PAB menyediakan komponen dan environment yang dibutuhkan oleh para developer dalam mengembangkan Dapps di Cardano. Sama seperti Marlowe Playground (sandbox untuk para developer dalam membuat dan mengetest financial smart contracts), PAB memungkinkan para developer membuat dan mengetest Dapps sebelum akhirnya berlanjut ke live production.
Sumber: Blog IOHK
PAB membantu para developer dalam 2 hal:
- The Read Path: mendapatkan informasi dari ledger dan bereaksi terhadap event apapun yang terjadi di ledger
- The Write Path: membangun transaksi dengan menjalankan Plutus script
PAB juga menyediakan backend service untuk mengatur dan mengelola requirement dari Dapps seperti:
- Interaksi ke wallet backend
- Intermediary antara Dapps, node, wallet backend, dan end-users
Bukan sebuah kewajiban bagi para developer untuk menggunakan PAB dalam membuat Dapps di Cardano. Saat ini, beberapa developer dengan bantuan komunitas telah membuat tool dan API set sendiri untuk mengembangkan Dapps. Namun dengan PAB, developer tidak perlu membangun dari scratch (termasuk chain index), memiliki standard environment untuk running Dapps, tracking on-chain information saat penggunaan smart contract, dan tersedianya interfaces untuk berkomunikasi dengan external clients. Dengan begini, waktu development dapat dipersingkat, resource dapat dihemat, dan developer dapat fokus pada kualitas aplikasinya saat berjalan di on-chain.