Men-deploy kontrak yang dapat diprogram

Universal Ledger mendukung kontrak yang dapat diprogram yang dapat di-deploy dalam jaringan untuk mengotomatiskan dan menegakkan perjanjian di antara peserta yang tertarik.

Tutorial ini menunjukkan kepada developer langkah-langkah yang diperlukan untuk mengembangkan, men-deploy, dan berinteraksi dengan kontrak yang dapat diprogram di jaringan Universal Ledger.

Sebelum memulai

Untuk menyelesaikan tutorial ini, Anda memerlukan:

  • Di konsol, aktifkan Cloud Shell. Google Cloud

    Aktifkan Cloud Shell

  • Akun pengguna Universal Ledger dengan ROLE_CONTRACT_CREATOR. Akun ini akan menjadi pemilik kontrak.

  • Satu atau beberapa akun pengguna Universal Ledger dengan ROLE_CONTRACT_PARTICIPANT. Akun ini dapat berupa akun yang sama dengan pemilik kontrak.

  • Secara opsional, Siapkan Universal Ledger CLI agar dapat menandatangani dan mengirimkan transaksi atas nama akun pengguna ini.

Peran Universal Ledger dapat ditetapkan ke Akun Pengguna saat dibuat oleh Pengelola Akunnya, pada saat CreateAccount transaksi dikirimkan, atau diubah nanti melalui AddRoles transaksi jika akun sudah ada. Untuk tujuan eksperimen, Anda juga dapat menggunakan Universal Ledger CLI untuk Mengelola akun.

Menyiapkan lingkungan Anda

Untuk menyederhanakan penyiapan, tutorial ini ditulis untuk lingkungan default yang disediakan dalam sesi Cloud Shell. Anda mungkin perlu mengubah perintah ini jika menggunakan lingkungan yang berbeda.

Compiler gculpyc mengambil kode sumber yang ditulis dalam bahasa GCULpy dan menghasilkan bytecode untuk Universal Ledger.

Jalankan setiap perintah berikut untuk menarik image Docker gculpyc, menentukan alias untuk menjalankan program biner, dan mengonfirmasi bahwa program biner berfungsi.

docker pull us-docker.pkg.dev/gcul-artifacts/images/client/gculpyc:preview
alias gculpyc="docker run --rm -i --user $(id -u):$(id -g) \
    --volume .:/workspace --workdir /workspace \
    us-docker.pkg.dev/gcul-artifacts/images/client/gculpyc:preview"
gculpyc --help

Menulis kontrak

GCULpy adalah bahasa yang digunakan untuk menulis kontrak untuk Universal Ledger. GCULpy adalah subset Python yang diketik secara statis, yang dioptimalkan untuk logika kontrak yang jelas, dapat diaudit, dan mudah dipahami. Desain ini memprioritaskan penulisan kode yang aman dan membatasi perilaku yang tidak terduga atau tidak aman. Untuk mengetahui detail selengkapnya, lihat Referensi bahasa GCULpy.

Karena GCULpy adalah subset Python yang ketat, Anda dapat terus menggunakan lingkungan pengembangan terintegrasi (IDE) pilihan Anda bersama dengan alur kerja dan praktik pengembangan yang ada.

Sebagai contoh, kode Anda dapat terlihat seperti berikut:

import gcul

class Counter(gcul.Contract):
    """Example contract implementing a counter."""

    value: int

    def increment(self) -> None:
        """Increments the counter value by 1."""
        self.value += 1

Salin kode contoh ini dan simpan ke dalam file bernama counter.py.

Menguji secara lokal

Dalam waktu dekat, developer akan memiliki akses ke lingkungan simulasi lokal. Disediakan sebagai bagian dari modul Python gcul, modul ini dirancang untuk menyediakan fungsi yang diperlukan untuk mensimulasikan jaringan Universal Ledger secara native dalam lingkungan Python. Dengan demikian, Anda dapat menjalankan kontrak secara lokal dan menulis pengujian unit menggunakan framework pengujian pilihan Anda, sehingga memastikan keandalan dan kebenaran kontrak Anda sebelum deployment.

Mengompilasi kontrak

Kompilasi kode sumber kontrak sebelumnya ke dalam bytecode menggunakan perintah gculpyc berikut:

gculpyc --source_file counter.py --output_file counter.bin

Men-deploy kontrak

Deploy kontrak ke jaringan Universal Ledger dengan mengirimkan transaksi CreateContract yang ditandatangani oleh akun pengguna yang memiliki ROLE_CONTRACT_CREATOR.

Jika menggunakan Universal Ledger CLI, Anda dapat melakukannya dengan menjalankan perintah:

ul-cli contracts create \
    --alias counter-contract \
    --sender OWNER_ALIAS \
    counter.bin

Ganti kode berikut:

  • OWNER_ALIAS: alias akun pengguna dengan ROLE_CONTRACT_CREATOR.

Saat transaksi diselesaikan, output perintah ini akan menyertakan ID kontrak yang baru di-deploy. Contoh:

Contract created: 1:CTR:005XvYfiSm3913Jwv4y8HVQucStJ2Ev15Sar6A1kNNX10

Memanggil metode kontrak

Setelah kontrak di-deploy, akun pengguna mana pun yang memiliki ROLE_CONTRACT_PARTICIPANT dapat mengirimkan InvokeContractMethod InvokeContractMethod untuk memanggil salah satu metode publik dalam kontrak.

Jika menggunakan Universal Ledger CLI, Anda dapat melakukannya dengan menjalankan perintah:

ul-cli contracts invoke \
    --alias counter-contract \
    --method-name increment \
    --sender PARTICIPANT_ALIAS

Ganti kode berikut:

  • PARTICIPANT_ALIAS: alias akun pengguna dengan ROLE_CONTRACT_PARTICIPANT.

Membaca status kontrak

Untuk mengakhiri tutorial ini, Anda dapat mengirimkan permintaan QueryAccount untuk membaca dan memverifikasi status kontrak yang disimpan di ledger. Ini adalah metode API yang sama yang digunakan untuk membuat kueri dan mengambil detail akun Universal Ledger.

Dengan menggunakan Universal Ledger CLI, Anda dapat menjalankan:

ul-cli accounts describe --alias counter-contract

Tindakan ini akan mengonfirmasi bahwa nilai penghitung kini ditetapkan ke 1, sehingga menghasilkan output seperti:

Account: 1:CTR:005XvYfiSm3913Jwv4y8HVQucStJ2Ev15Sar6A1kNNX10
Contract account details:
  Owner: 1:USR:XCL:022uF6cVkTJBaa6pViqTuYqP4455jnRbRc4bWannZGg0b
  Contract fields:
    value: int64_value:1

  Balances:
    None

Langkah berikutnya