Transactions
Người dùng có thể gọi Program bằng cách tạo và gửi một Transaction đến mạng lưới Solana. Một Transaction có thể chứa nhiều instruction bên trong, và mỗi instruction có thể tương tác với các Program khác nhau. Khi một Transaction được gửi đi, Solana Runtime sẽ xử lý các instruction bên trong Transaction theo thứ tự và tuần tự. Nếu có bất kỳ instruction nào xảy ra lỗi, toàn bộ Transaction sẽ được xem là lỗi.
Có thể bạn chưa biết
Những điều có thể bạn chưa biết
- Các instruction là những đơn vị thực thi nhỏ nhất trên Solana
- Mỗi instruction sẽ chứa:
program_id
của Program mục tiêu- Một mảng tất cả
accounts
mà instruction muốn đọc hoặc ghi - Một mảng byte
instruction_data
cung cấp dữ liệu đầu vào cụ thể cho Program
- Nhiều instruction có thể được đóng gói trong một Transaction duy nhất
- Mỗi Transaction có thể chứa:
- Một mảng tất cả
accounts
mà Transaction muốn đọc hoặc ghi - Một hoặc nhiều
instructions
blockhash
hiện tại- Một hoặc nhiều
signatures
- Một mảng tất cả
- Các instruction sẽ được thực thi tuần tự và theo thứ tự trong Transaction
- Nếu có bất kỳ instruction nào xảy ra lỗi, toàn bộ giao dịch sẽ được xem là lỗi
- Transaction có giới hạn dung lượng là 1232 bytes
Chi tiết
Solana Runtime yêu cầu instruction và Transaction phải khai báo một danh sách tất cả các Account mà chúng cần đọc hoặc ghi dữ liệu. Bằng cách yêu cầu những Account này trước, Solana Runtime có thể song song hoá quá trình thực thi xuyên suốt tất cả các Transaction.
Khi một Transaction được gửi vào mạng lưới, Solana Runtime sẽ xử lý các instructions của nó tuần tự từng instruction một theo thứ tự khai báo bên trong Transaction. Với mỗi instruction, Program được truy vấn sẽ lấy dữ liệu từ instruction và thực thi trên các Account tương ứng trong instruction đó. Program hoặc là trả về kết quả thành công, hoặc là với kết quả lỗi với mã lỗi tương ứng. Với bất kỳ lỗi nào được trả ra, toàn bộ Transaction sẽ kết thúc với lỗi ngay lập tức.
Bất kỳ Transaction nào mà thay đổi dữ liệu của Account hay rút lamports ra từ Account thì đều cần yêu cầu chữ ký của owner
trong Account. Bất kỳ Account nào khi cần được sửa đổi đều phải đánh dấu là writable
trong instruction tương ứng. Một Account có thể được nạp thêm lamports mà không cần xin phép, chỉ cần người trả phí cho Transaction đủ khả năng chi trả phí thuê và phí giao dịch.
Trước khi gửi đi, tất cả các Transaction phải tham chiếu Blockhash mới nhất. Blockhash được dùng để chống trùng lặp và loại bỏ các giao dịch quá hạn. Thời hạn tối đa cho một Transaction là không quá 150 blocks so với Blockhash được ghi, và khoảng chừng 1 phút 19 giây theo ước tính tại thời điểm cuốn sách được viết.
Phí
Mạng Solana sẽ thu 2 loại phí:
- Phí giao dịch cho việc lan truyền Transaction (Hay thường được gọi là phí gas ở các blockchain khác)
- Phí thuê vùng nhớ dữ liệu cho Account
Trên Solana, phí giao dịch thường bất biến, nghĩa là không có khái niệm về đánh phí theo thị trường nơi mà người dùng có thể trả phí cao hơn mặt bằng để tăng cơ hội được ưu tiên thực thi Transaction trước. Tại thời điểm tác giả viết, phí giao dịch được xác định bằng số lượng chữ ký bên trong Transaction (cụ thể là lamports_per_signature
), và không phải bằng số bước tính toán cho Transaction đó. Điều đó được lý giải bởi vì luôn có một giới hạn trần là 1232 bytes cho mọi Transaction.
Tất cả Transaction yêu cầu ít nhất một Account là writable
để ký Transaction đó. Một khi được gửi, Account trả phí với nhãn writable
và sigher
sẽ được tuần tự hoá trước tiên. Account này sẽ chi trả các chi phí phát sinh của Transaction cho dù Transaction thành công hay thất bại. Nếu Account trả phí không đủ số dư để trả phí giao dịch, Transaction sẽ bị bỏ qua.
Tại thời điểm được viết, 50% phí giao dịch sẽ được thưởng cho Validator để sinh ra block, trong khi 50% còn lại sẽ được đốt. Bằng cơ cấu như vậy, Validator được khuyến khích phải xử lý càng nhiều Transaction càng tốt trong thời hạn được đề cử.