Skip to content

Note: Dimodifikasi untuk menggunakan @radiantblockchian/radjs untuk testnet/superAssetR100.js

sCrypt Project Boilerplate

Build Status

Prasyarat

Pastikan Anda telah menginstal sCrypt IDE. sCrypt IDE adalah alat bagi pengembang untuk menulis, menguji, menerapkan, memanggil, dan men-debug smart contract sCrypt.

Panduan

sCrypt adalah bahasa pemrograman tingkat tinggi untuk menulis kontrak pintar di Bitcoin SV. Proyek ini memberikan contoh untuk membantu pengembang mempelajari dan mengintegrasikan kontrak pintar sCrypt ke proyek berbasis Javascript mereka. Prosedur yang kami rekomendasikan untuk mengembangkan aplikasi berbasis kontrak cerdas adalah sebagai berikut:

  1. Pengembangan dan Pengujian Kontrak

  2. Integrasi Kontrak dan Peluncuran Aplikasi

Setelah mengembangkan dan menguji unit smart contract, langkah selanjutnya adalah mengintegrasikannya ke dalam aplikasi Anda yang ditulis dalam bahasa lain seperti Javascript atau Python. Uji integrasi harus dijalankan di Bitcoin SV Testnet atau Scaling Test Network(STN) sebelum meluncurkan aplikasi ke publik pada mainnet.

Mulai cepat

npm install
npm test

Tata letak direktori

Untuk setiap kontrak x, file sumber ada di contracts/x.scrypt, file pengujian ada di tests/js/x.scrypttest.js, dan file penerapan ada di testnet/x.js . . ├── contracts # sCrypt contract files │ ├── accumulatorMultiSig.scrypt # Accumulator MultiSig │ ├── ackermann.scrypt # Ackermann function │ ├── acs.scrypt # A contract which can be spent by anyone but only to a specific address │ ├── advancedCounter.scrypt # Use external UTXOs to pay counter contract tx fees using sighash ANYONECANPAY │ ├── advancedTokenSale.scrypt # Sambe as above, but for token sale contract │ ├── asm.scrypt # Embed Script directly into sCrypt using inline assembly │ ├── auction.scrypt # Auction on Bitcoin │ ├── binaryOption.scrypt # A binary option contract │ ├── cltv.scrypt # CheckLockTimeVerify without OP_CLTV │ ├── cointoss.scrypt # Fair BitCoin Toss using Blum's Protocol │ ├── cointossxor.scrypt # Fair BitCoin Toss using XOR │ ├── conwaygol.scrypt # Conway’s Game of Life │ ├── counter.scrypt # Count the number of times a function has been called to showcase stateful contract │ ├── ec.scrypt # Elliptic curve point add/multipliy │ ├── ecdsa.scrypt # ECDSA Signature Verification │ ├── demo.scrypt # "hello world" contract │ ├── faucet.scrypt # rate-limited onchain faucet │ ├── forward.scrypt # P2P Bitcoin-Settled Derivatives: Forward Contracts │ ├── hashpuzzlep2pkh.scrypt # combining hash puzzle and p2pkh contracts │ ├── kaggle.scrypt # Kaggle Competitions on Bitcoin │ ├── lottery.scrypt # lottery │ ├── mast.scrypt # Merklized Abstract Syntax Tree │ ├── merkleToken.scrypt # Token based on Merkle Tree │ ├── merkleTree.scrypt # Merkle Tree validation and updating │ ├── nonFungibleToken.scrypt # non-fungible token │ ├── oracle.scrypt # ECDSA-based Oracles │ ├── p2pkh.scrypt # p2pkh contract written in sCrypt │ ├── p2sh.scrypt # p2sh after Genesis │ ├── perceptron.scrypt # AI/perceptron │ ├── perceptron2.scrypt # Outsource perceptron training │ ├── rabin.scrypt # Rabin signature to import off-chain data into a contract via oracle │ ├── recurring.scrypt # Recurring Payments │ ├── rpuzzle.scrypt # R-Puzzle │ ├── schnorr.scrypt # Schnorr signatures │ ├── rps.scrypt # Rock Paper Scissors │ ├── simpleBVM.scrypt # A simple Bitcoin Script interpreter: a Bitcoin VM inside a BVM │ ├── spvToken.scrypt # Peer-to-peer Tokens │ ├── statecounter.scrypt # Stateful Contract │ ├── stateStruct.scrypt # Recommended way to implement a stateful contract using struct │ ├── sudoku.scrypt # Sudoku │ ├── svd.scrypt # Machine Learning using Singular Value Decomposition as an example │ ├── tictactoe.scrypt # TicTacToe onchain p2p gaming │ ├── timedcommit.scrypt # Bitcoin Smart Contract 2.0: Trustless contracting by combining on-chain and off-chain transactions │ ├── token.scrypt # Layer-1 tokens by storing token map as contract state in a single UTXO │ ├── tokenSale.scrypt # Selling tokens for bitcoins using atomic swap │ ├── tokenSwap.scrypt # Merkle tree-based token and bitcoin swap Token swap │ ├── tokenUtxo.scrypt # fungible token │ ├── treeSig.scrypt # Tree signatures │ └── util.scrypt # utility functions and constants ├── testnet # examples to deploy contract and call its function on testnet └── fixture └── autoGen # contract description json files └── tests # contract test files ├── js # Javascript unit tests └── ts # Typescript unit tests

Cara menulis tes untuk kontrak sCrypt

Langkah-langkah utama untuk menulis tes sCrypt dicontohkan oleh tests/demo.scrypttest.js.

  1. Instal dan impor/wajibkan scryptlib libary, yang merupakan SDK javascript untuk mengintegrasikan kontrak cerdas sCrypt.
npm install scryptlib
import { buildContractClass } from 'scryptlib';
  1. Gunakan fungsi buildContractClass yang diimpor untuk mendapatkan kontrak yang tercermin, yang memiliki properti dan metode yang sama seperti yang ditentukan dalam kontrak sCrypt yang ditentukan.
// build a contract class
// either by compiling the contract from scratch
const Demo = buildContractClass(compileContract('demo.scrypt'))
// or from contract desc file if it's already generated from compilation
const Demo = buildContractClass(loadDesc('demo_desc.json'))

Perhatikan bahwa demo_desc.json adalah nama file deskripsi dari kontrak yang dikompilasi, yang akan dihasilkan secara otomatis jika Anda menjalankan npm run watch dan namanya mengikuti aturan $contractName_desc.json.

  1. Inisialisasi kontrak.
demo = new Demo(4, 7);
  1. Tulis pengujian untuk kontrak yang dibuat seperti yang akan Anda lakukan di Javascript.
const result = demo.add(7 + 4).verify()
expect(result.success, result.error).to.be.true

Cara menjalankan pengujian secara lokal

Jalankan menggunakan sCrypt IDE

Jalankan file tes unit dalam menu konteks editor/explorer.

Screenshot

Catatan: File pengujian harus diakhiri dengan .scrypttest.js atau .scrypttest.ts, jika tidak, opsi "Jalankan Pengujian sCrypt" tidak akan muncul di menu.

Jalankan dari konsol

Pengujian juga dapat dijalankan dari konsol dengan mengeksekusi npm test, seperti pengujian Javascript/TypeScript biasa.

Cara menerapkan kontrak dan berinteraksi dengannya

Men-deploy dengan menulis kode javascript/typescript

  1. Berikan kunci pribadi dengan dana di privateKey.js
const key = '$YOUR_PRIVATE_KEY_HERE'
  1. Menyebarkan kontrak dan memanggil fungsinya dengan mengeluarkan
node testnet/demo.js

Output seperti berikut ini akan muncul di console. Dan Anda telah berhasil menerapkan kontrak dan memanggil fungsinya di Bitcoin. Manis!

locking txid:      8d58ff9067f5fa893b5c695179559e108ebf850d0ce4fd1e42bc872417ffd424
unlocking txid:    c60b57e93551a6c52282801130649c6a97edcca5d2b28b8b4ae2afe0ee59bf79
Succeeded on testnet

sangat disarankan untuk menguji kontrak Anda di testnet terlebih dahulu, sebelum menerapkannya di mainnet. Secara default, penerapan ada di testnet. Untuk beralih ke mainnet, cukup modifikasi API_PREFIX di helper.js.

const API_PREFIX = 'https://api.whatsonchain.com/v1/bsv/main'
// const API_PREFIX = 'https://api.whatsonchain.com/v1/bsv/test' for Testnet
// const API_PREFIX = 'https://api.whatsonchain.com/v1/bsv/stn' for Scaling Test Net

Sebelum men-deploy kontrak, pastikan kontrak terbaru telah dikompilasi ke file json deskripsi, yang akan di-deploy. Ini dapat dilakukan secara otomatis dengan menjalankan proses daemon dengan perintah npm run watch. Ini akan memantau perubahan file kontrak dan mengkompilasi ulang bila diperlukan. Semua file deskripsi yang dihasilkan terletak di testnet/fixture/autoGen. Pastikan itu sesuai dengan kontrak sebelum penerapan.

Deploy dengan menggunakan sCrypt IDE fitur deploy

IDE menyediakan antarmuka UI universal. Anda dapat menerapkan kontrak dengan satu klik hanya dengan mengisi parameter yang relevan. Anda dapat memanggil fungsi publik dari kontrak dengan mengklik tombol tanpa menulis sebaris kode pun.

Screenshot