Skip to content

Variabel Global

Unit yang tersedia secara global

Literal bilangan bulat dapat menggunakan sufiks unit moneter atau sementara untuk menambahkan nilai semantik ke bilangan bulat ini dan untuk menyederhanakan aritmatika. Saat satuan ini digunakan, bilangan bulat yang mendasarinya secara otomatis dikalikan dengan nilai satuan. Unit sats, finney, bits dan bitcoin digunakan untuk menunjukkan nilai moneter, sedangkan unit seconds, minutes, hours, days dan weeks digunakan untuk menunjukkan waktu.

:::peringatan Berhati-hatilah saat menggunakan satuan ini dalam perhitungan kalender yang tepat, karena tidak setiap tahun sama dengan 365 hari dan bahkan tidak setiap menit memiliki 60 detik karena detik kabisat. :::

Contohnya

require(1 sats == 1);
require(1 finney == 10);
require(1 bit == 100);
require(1 bitcoin == 1e8);

require(1 seconds == 1);
require(1 minutes == 60 seconds);
require(1 hours == 60 minutes);
require(1 days == 24 hours);
require(1 weeks == 7 days);

Variabel kunci waktu global

Bitcoin Cash memiliki dukungan untuk berbagai jenis kunci waktu, yang dapat digunakan untuk menentukan kondisi berbasis waktu di dalam kontrak Bitcoin Cash. Kunci waktu ini dapat dipisahkan oleh tiga atribut utama: lokasi, penargetan, dan metrik. Lokasi dapat berupa tingkat transaksi atau tingkat kontrak, tetapi kunci tingkat kontrak juga mengharuskan Anda untuk menggunakan kunci tingkat transaksi yang sesuai. Penargetannya bisa relatif (mis. setidaknya 4 jam telah berlalu) atau absolut (mis. nomor blok setidaknya 600.000). Metrik dapat berupa blok atau detik.

Sulit untuk sepenuhnya memahami seluk-beluk kunci waktu, jadi jika Anda baru memulai, disarankan untuk memulai dengan versi yang paling sederhana: kunci waktu berbasis blok absolut. Jika Anda ingin mempelajari penggunaan kunci waktu yang lebih canggih, James Prestwich menulis artikel terbaik yang menjelaskan kunci waktu dalam Bitcoin yang juga sepenuhnya berlaku untuk Bitcoin Cash.

tx.waktu

tx.time digunakan untuk membuat kunci waktu absolut. Nilai tx.time dapat mewakili nomor blok transaksi pembelanjaan atau stempel waktunya. Saat membandingkannya dengan nilai di bawah 500.000.000, ini diperlakukan sebagai nomor blok, sedangkan nilai yang lebih tinggi diperlakukan sebagai stempel waktu.

Karena keterbatasan Skrip Bitcoin yang mendasarinya, tx.time hanya dapat digunakan dengan cara berikut:

require(tx.time >= <expression>);

karena cara kerja kunci waktu, kunci waktu yang sesuai perlu ditambahkan ke transaksi. CashScript SDK secara otomatis menyetel kunci waktu tingkat transaksi ini ke nomor blok terbaru, karena ini adalah kasus penggunaan yang paling umum. Jika Anda perlu menggunakan nomor blok atau stempel waktu yang berbeda, ini harus diteruskan ke CashScript SDK menggunakan fungsi withTime(). Jika default cocok dengan kasus penggunaan Anda, tidak diperlukan tindakan tambahan.

:::catatan tx.time sesuai dengan kolom nLocktime dari transaksi saat ini dan opcode OP_CHECKLOCKTIMEVERIFY. :::

tx.usia

tx.age digunakan untuk membuat kunci waktu relatif. Nilai tx.age dapat mewakili sejumlah blok, atau sejumlah potongan, yaitu 512 detik. Kunci waktu tingkat transaksi yang sesuai menentukan mana dari dua opsi yang digunakan.

Karena keterbatasan Skrip Bitcoin yang mendasarinya, tx.age hanya dapat digunakan dengan cara berikut:

require(tx.age >= <expression>);

Karena cara kerja kunci waktu, kunci waktu yang sesuai perlu ditambahkan ke transaksi. Hal ini dapat dilakukan di CashScript SDK menggunakan fungsi withAge(). Namun, nilai yang diteruskan ke fungsi ini akan selalu diperlakukan sebagai sejumlah blok, jadi saat ini tidak didukung untuk menggunakan tx.age sebagai sejumlah potongan kedua.

:::catatan tx.age sesuai dengan kolom nSequence dari UTXO saat ini dan opcode OP_CHECKSEQUENCEVERIFY. :::

Variabel introspeksi

Fungsionalitas introspeksi digunakan untuk membuat kontrak perjanjian. Perjanjian adalah teknik yang digunakan untuk membatasi pengeluaran uang di dalam kontrak pintar. Kasus penggunaan utama dari ini adalah membatasi alamat di mana uang dapat dikirim dan jumlah yang dikirim. Untuk mengeksplorasi kemungkinan penggunaan perjanjian di dalam kontrak pintar, baca [Panduan Perjanjian CashScript][panduan-perjanjian].

this.activeInputIndex

int this.activeInputIndex

Selama validasi transaksi BCH, setiap input transaksi dievaluasi secara berurutan, dan kode kontrak dievaluasi dalam konteks input yang berbeda. this.activeInputIndex mewakili indeks input yang saat ini sedang dievaluasi. Ini dapat digunakan bersamaan dengan properti di bawah tx.inputs.

this.activeBytecode

bytes this.activeBytecode

Selama validasi transaksi BCH, setiap input transaksi dievaluasi secara berurutan, dan kode kontrak dievaluasi dalam konteks input yang berbeda. this.activeBytecode mewakili bytecode kontrak dari input yang saat ini sedang dievaluasi.

tx.version

int tx.version

Mewakili versi transaksi saat ini. Versi transaksi yang berbeda dapat memiliki perbedaan fungsi. Saat ini hanya ada versi 1 dan 2, dimana hanya versi 2 yang mendukung BIP68.

tx.locktime

int tx.locktime

Rmewakili bidang nLocktime dari transaksi.

:::catatan tx.locktime mirip dengan variabel global tx.time. Direkomendasikan untuk hanya menggunakan tx.locktime untuk menambahkan nLocktime ke keadaan simulasi dan tx.time di semua kasus lainnya. :::

tx.inputs

Merupakan daftar input dari transaksi yang dievaluasi. Ini adalah array, dan tidak dapat digunakan sendiri. Anda perlu mengakses input dengan indeks tertentu dan menentukan properti yang ingin Anda akses.

tx.inputs.length

int tx.inputs.length

Mewakili jumlah input dalam transaksi.

tx.inputs[i].value

int tx.inputs[i].value

Mewakili nilai masukan tertentu (dalam satoshi).

tx.inputs[i].lockingBytecode

bytes tx.inputs[i].lockingBytecode

Mewakili bytecode penguncian (scriptPubKey) dari input tertentu.

tx.inputs[i].unlockingBytecode

bytes tx.inputs[i].unlockingBytecode

Mewakili bytecode pembuka kunci (scriptSig) dari input tertentu.

tx.inputs[i].outpointTransactionHash

bytes32 tx.inputs[i].outpointTransactionHash

Mewakili hash transaksi outpoint di mana input tertentu awalnya dikunci.

tx.inputs[i].outpointIndex

int tx.inputs[i].outpointIndex

Mewakili indeks outpoint tempat input tertentu awalnya dikunci.

tx.inputs[i].sequenceNumber

int tx.inputs[i].sequenceNumber

Mewakili nomor nSequence dari input tertentu.

tx.outputs

Merupakan daftar output dari transaksi yang dievaluasi. Ini adalah array, dan tidak dapat digunakan sendiri. Anda perlu mengakses output dengan indeks tertentu dan menentukan properti yang ingin Anda akses.

tx.outputs.length

int tx.outputs.length

Mewakili jumlah output dalam transaksi.

tx.outputs[i].value

int tx.outputs[i].value

Mewakili nilai output tertentu (dalam satoshi).

tx.outputs[i].lockingBytecode

bytes tx.outputs[i].lockingBytecode

Mewakili bytecode penguncian (scriptPubKey) dari output tertentu.

Membangun bytecode penguncian

Salah satu kasus penggunaan utama dari perjanjian adalah menegakkan hasil transaksi (di mana uang dikirim). Untuk membantu menerapkan output ini, ada sejumlah objek LockingBytecode yang dapat dibuat instance-nya. Bytecode penguncian ini kemudian dapat dibandingkan dengan bytecode penguncian output transaksi.

Contoh

bytes25 lockingBytecode = new LockingBytecodeP2PKH(pkh);
int value = 10000;
require(tx.outputs[0].lockingBytecode == lockingBytecode);
require(tx.outputs[0].value == value);

LockingBytecodeP2PKH

new LockingBytecodeP2PKH(bytes20 pkh): bytes25

Membuat bytecode penguncian P2PKH baru untuk hash kunci publik pkh.

LockingBytecodeP2SH

new LockingBytecodeP2SH(bytes20 scriptHash): bytes23

Membuat bytecode penguncian P2SH baru untuk hash skrip scriptHash.

LockingBytecodeNullData

new LockingBytecodeNullData(bytes[] chunks): bytes

Membuat bytecode penguncian OP_RETURN baru dengan chunks sebagai data OP_RETURN-nya.