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 Runtimeopen in new window 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
  • 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 Blockhashopen in new window 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í:

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 writablesigher 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ử.

Các nguồn tài liệu khác

Last Updated:
Contributors: Trần Minh Quang, tuphan-dn