Aiken
Giới thiệu
Aiken là một ngôn ngữ lập trình và chuỗi công cụ mới để phát triển các hợp đồng thông minh trên chuỗi khối Cardano. Nó lấy cảm hứng từ nhiều ngôn ngữ hiện đại như Gleam, Rust và Elm, được biết đến với các thông báo lỗi thân thiện và trải nghiệm tổng thể tuyệt vời dành cho nhà phát triển.
Ngôn ngữ này được sử dụng riêng để tạo tập lệnh xác thực trên chuỗi. Bạn sẽ cần viết mã ngoại tuyến để tạo giao dịch bằng ngôn ngữ khác, chẳng hạn như Rust, Haskell, Javascript, Python, v.v.
Aiken vẫn đang trong quá trình hoàn thiện và KHÔNG được khuyến nghị sử dụng trong sản phẩm chính.
Bắt đầu
Truy cập bắt đầu với Aiken để cài đặt Aiken từ Nguồn hoặc Nix Flakes.
Bạn có thể tìm thấy hướng dẫn toàn diện để bắt đầu với Aiken trên trang web aiken-lang.org. Để biết thêm chi tiết về dự án, bạn cũng có thể muốn truy cập Aiken git repository.
Ví dụ về hợp đồng
Đây là trình xác thực cơ bản được viết bằng Aiken
use aiken/hash.{Blake2b_224, Hash}
use aiken/list
use aiken/string
use aiken/transaction.{ScriptContext}
use aiken/transaction/credential.{VerificationKey}
pub type Datum {
owner: Hash<Blake2b_224, VerificationKey>,
}
pub type Redeemer {
msg: ByteArray,
}
pub fn spend(datum: Datum, redeemer: Redeemer, context: ScriptContext) -> Bool {
let must_say_hello = string.from_bytearray(redeemer.msg) == "Hello, World!"
let must_be_signed =
list.has(context.transaction.extra_signatories, datum.owner)
must_say_hello && must_be_signed
}
Thử nghiệm
Các bài kiểm tra có thể được tạo trực tiếp trong Aiken và thực hiện chúng ngay lập tức bằng cách sử dụng lệnh "kiểm tra aiken".
Dưới đây là một ví dụ về cách xác định các bài kiểm tra như vậy:
use aiken/interval.{Finite, Interval, IntervalBound, PositiveInfinity}
test must_start_after_succeed_when_lower_bound_is_after() {
let range: ValidityRange =
Interval {
lower_bound: IntervalBound { bound_type: Finite(2), is_inclusive: True },
upper_bound: IntervalBound { bound_type: PositiveInfinity, is_inclusive: False },
}
must_start_after(range, 1)
}
test must_start_after_suceed_when_lower_bound_is_equal() {
let range: ValidityRange =
Interval {
lower_bound: IntervalBound { bound_type: Finite(2), is_inclusive: True },
upper_bound: IntervalBound { bound_type: PositiveInfinity, is_inclusive: False },
}
must_start_after(range, 2)
}
test must_start_after_fail_when_lower_bound_is_after() {
let range: ValidityRange =
Interval {
lower_bound: IntervalBound { bound_type: Finite(2), is_inclusive: True },
upper_bound: IntervalBound { bound_type: PositiveInfinity, is_inclusive: False },
}
!must_start_after(range, 3)
}