Năm 2024, Solana bất ngờ nổi lên, TVL tăng vọt từ một tỷ đô la Mỹ vào đầu năm lên gần năm tỷ đô la Mỹ hiện nay, trở thành công ty đại chúng lớn thứ tư xích.
So với Ethereum, Solana mang đến trải nghiệm vượt trội cho người dùng với tốc độ nhanh hơn và mức phí thấp hơn. Cơ chế đồng thuận dựa trên POH và chế độ thực hiện giao dịch không đồng bộ của nó cung cấp cho các nhà phát triển hiệu suất chuỗi khối thông lượng cao và độ trễ thấp, khiến nó trở thành nền tảng ưa thích cho các ứng dụng phi tập trung khác nhau.
BlockSec đã lên kế hoạch đặc biệt cho loạt bài viết "Chơi với Solana", bao gồm các khái niệm cơ bản về Solana, hướng dẫn thực tế để xem và phân tích các giao dịch Solana cũng như hướng dẫn cách viết hợp đồng thông minh Solana, v.v.
Là số đầu tiên của loạt bài này, bài viết này sẽ giới thiệu sâu các khái niệm chính trong mạng Solana, bao gồm cơ chế hoạt động, mô hình tài khoản và các giao dịch cũng như viết Đặt nền móng cho các hợp đồng Solana đúng đắn và hiệu quả.
eBPF: Nền tảng thực hiện giao dịch Solana
Để viết và thực hiện các hợp đồng thông minh, blockchain thường yêu cầu một bộ ngôn ngữ lập trình và môi trường điện toán hoàn chỉnh Turing.
Những người bạn quen thuộc với Ethereum nên biết rằng các hợp đồng thông minh trên Ethereum thường được viết bằng ngôn ngữ cấp cao Solidity và mã byte được tạo bởi trình biên dịch Solidity chạy trên Trong một môi trường được gọi là Máy ảo Ethereum.
Solana không chọn phát triển môi trường và ngôn ngữ ảo mới mà tận dụng tối đa các công nghệ xuất sắc hiện có. Máy ảo eBPF (Bộ lọc gói Berkeley mở rộng), ban đầu được sử dụng để mở rộng các chức năng của nhân Linux, đã được Solana chọn và sử dụng làm môi trường thực thi cơ bản.
Vậy lợi thế của eBPF so với EVM là gì?
So với EVM, chỉ hỗ trợ thực thi được diễn giải, eBPF có thể chuyển đổi trực tiếp mã byte thành một máy mà bộ xử lý có thể thực thi trực tiếp trong quá trình biên dịch đúng lúc (JIT ) để chạy chương trình hiệu quả hơn.
eBPF có bộ hướng dẫn hiệu quả và cơ sở hạ tầng hoàn thiện. Các nhà phát triển chỉ cần sử dụng ngôn ngữ Rust để viết hợp đồng thông minh. Khung biên dịch LLVM cung cấp phần phụ trợ eBPF, có thể biên dịch trực tiếp các chương trình được viết bằng ngôn ngữ Rust này thành mã byte có thể chạy trên máy ảo eBPF.
Mô hình tài khoản của Solana
1. cấu trúc tài khoản
Dữ liệu trên Solana được lưu trữ dưới dạng tài khoản. Như được hiển thị trong hình bên dưới, chúng ta có thể coi tất cả dữ liệu trong Solana là cơ sở dữ liệu cặp khóa-giá trị khổng lồ. Chìa khóa của cơ sở dữ liệu là địa chỉ của tài khoản. Đối với tài khoản "ví" (tức là tài khoản do người dùng Solana trực tiếp kiểm soát thông qua cặp khóa công khai và riêng tư), địa chỉ này là Sử dụng khóa chung được tạo bởi hệ thống chữ ký Ed25519 và giá trị; của cơ sở dữ liệu là thông tin cụ thể của tài khoản, bao gồm số dư và các thông tin liên quan khác.
Solana sử dụng cấu trúc có tên AccountInfo để mô tả một tài khoản có thành phần được hiển thị trong hình bên dưới.
Mỗi tài khoản trong Solana có bốn trường. Ở đây chúng tôi giải thích từng cái một.
Trường dữ liệu lưu trữ dữ liệu liên quan đến tài khoản. Nếu tài khoản là một chương trình (tức là hợp đồng thông minh), nó thực sự lưu trữ mã byte eBPF. Mặt khác, định dạng thông tin trong Dữ liệu thường do người tạo tài khoản xác định.
Trường có thể thực thi được sử dụng để xác định xem tài khoản có phải là chương trình hay không. Cần lưu ý rằng không giống như Ethereum, các chương trình trong Solana có thể được cập nhật.
Trường Lamports ghi lại số dư Solana token trong tài khoản này. Lamports thực chất là đơn vị nhỏ nhất của SOL Token (1 SOL = 1 tỷ Lamports).
Trường chủ sở hữu cho biết chủ sở hữu của tài khoản hiện tại. Ở Solana, mọi tài khoản đều có một “Chủ sở hữu”. Ví dụ: chủ sở hữu của tất cả các tài khoản "ví" là Chương trình Hệ thống, một tài khoản đặc biệt trên mạng Solana chịu trách nhiệm tạo tài khoản và các chức năng khác. Chủ tài khoản là người duy nhất có thể sửa đổi dữ liệu tài khoản và khấu trừ số dư Lamports (nhưng bất kỳ ai cũng có thể thêm Lamports, tức là thực hiện các chức năng chuyển vào tài khoản).
2. Tài khoản Solana được xác định trước
Solana có một tập hợp các chương trình đang chạy được xác định trước có tên là Chương trình gốc, được triển khai tại các địa chỉ cố định. Khi mạng Solana được nâng cấp, các chương trình được xác định trước này cũng có thể được cập nhật. Chúng ta có thể hiểu các chương trình này là các hàm API và thư viện cung cấp các hàm cụ thể trong mạng Solana.
Trong Chương trình gốc, một chương trình mà các nhà phát triển thường cần tương tác là Chương trình hệ thống. Chương trình hệ thống cung cấp cho nhà phát triển một số hướng dẫn (Instructions) và chúng ta có thể hiểu mỗi hướng dẫn như một phương pháp độc lập. Ví dụ: nhà phát triển có thể sử dụng lệnh CreateAccount để tạo tài khoản mới hoặc sử dụng lệnh Transfer để chuyển Lamports sang tài khoản khác.
Một chương trình gốc phổ biến khác là chương trình Trình tải BPF. Nó là chủ sở hữu của tất cả các tài khoản chương trình khác và chịu trách nhiệm triển khai, cập nhật và thực thi các chương trình cụ thể. Khi một tài khoản "ví" cần cập nhật một chương trình mà nó đã triển khai, việc này thực sự được thực hiện bằng cách ủy thác cho chương trình BPF Loader. Sau cùng, chỉ chủ sở hữu chương trình mới có quyền trực tiếp sửa đổi dữ liệu.
Ngoài Chương trình gốc, Solana còn cung cấp một bộ tài khoản có tên Sysvar. Họ cung cấp các chương trình trên Solana thông tin và các biến toàn cục liên quan đến trạng thái mạng Solana hiện tại, chẳng hạn như đồng hồ hiện tại, hàm băm khối gần đây nhất, v.v.
3. Tiền thuê tài khoản
Trên chuỗi Solana, Mỗi tài khoản cần duy trì số lượng Lamport nhất định ở mức tối thiểu, được gọi là rent. Không giống như khái niệm tiền thuê trong đời thực, tiền thuê trên Solana có thể thu hồi được. Để đảm bảo dữ liệu của tài khoản trên chuỗi có sẵn, tài khoản cần nắm giữ số lượng Lamport tương ứng. Số tiền thuê liên quan đến quy mô không gian lưu trữ trên chuỗi của tài khoản.
Bất kỳ giao dịch nào cố gắng giảm số dư tài khoản xuống dưới số tiền thuê sẽ không thành công trừ khi giao dịch đó trực tiếp giảm số dư tài khoản xuống 0. Thao tác này cho biết tiền thuê tài khoản đã được thu hồi và khi kết thúc thực hiện giao dịch, Solana sẽ làm trống không gian lưu trữ của tài khoản tương ứng thông qua việc thu gom rác.
- ? Xem Tài khoản Solana trong trình duyệt của bạn
Để giúp mọi người hiểu rõ hơn về các khái niệm liên quan, chúng tôi đã tạo một tài khoản chương trình bằng dự án "Hello World" do Solana cung cấp, có thể được sử dụng thông qua Solana Sử dụng trình duyệt blockchain Solscan để xem thông tin liên quan củacác tài khoản sau?.
CJWhxB4qEWBv9eGYUkTN881bNDMDkLbzH1FmdwqLLhoe
Như trong hình trên, trước tiên chúng ta có thể thấy rằng tài khoản đã được trình duyệt Solana đánh dấu là "Chương trình". Khi tài khoản được tạo, một phần Lamports đã được khấu trừ khỏi số dư của người gửi dưới dạng tiền thuê tài khoản, vì vậy chúng tôi có thể thấy rằng trường Số dư SOL của nó không trống.
Thứ hai, vì chúng ta đang tạo một chương trình nên trường Có thể thực thi của nó là Có. Có thể có điều gì đó khó hiểu ở đây, đó là bạn đọc có thể thấy trường Data lưu trữ địa chỉ chứ không phải chương trình eBPF. Chúng tôi đã đề cập trước đó rằng Solana cho phép các trình cập nhật và nó thực sự thực hiện điều này thông qua chế độ "proxy". Vì Solana không cho phép sửa đổi trực tiếp tài khoản chương trình nên nó tạo một tài khoản dữ liệu để lưu trữ chương trình eBPF và chỉ lưu địa chỉ của tài khoản dữ liệu trong trường Dữ liệu của tài khoản chương trình. Bất cứ khi nào cần cập nhật chương trình, bạn chỉ cần sửa đổi trường Dữ liệu trong tài khoản dữ liệu. Chúng tôi sử dụng Solscan để xem tài khoản trong trường Dữ liệu có thể thực thi và thấy rằng tài khoản đó được đánh dấu là "Tài khoản dữ liệu có thể thực thi chương trình" và trường Dữ liệu của nó lưu trữ chương trình thực tế:
Trở lại hình trước chúng ta tìm được Chủ nhân trường trong Thông tin thêm Đối với Trình tải BPF, điều này nhất quán với những gì chúng tôi đã mô tả trong phần trước.
Ngoài ra còn có một trường tên là "Quyền nâng cấp" trong Tổng quan. Nó có nghĩa là gì?
Như chúng tôi đã đề cập trước đó, tài khoản "ví" cập nhật chương trình bằng cách ủy thác Trình tải BPF và trước khi cập nhật, Trình tải BPF cần Xác minh rằng hiệu trưởng đã cập nhật quyền. Vì trường Chủ sở hữu của tài khoản chương trình đã là Trình tải BPF nên không còn chỗ để lưu trữ thông tin này. Do đó, Solana chọn lưu trữ thông tin này trong trường Dữ liệu của tài khoản dữ liệu. chương trình, đó là "Quyền nâng cấp" ở đây. Hình bên dưới thể hiện mối quan hệ giữa tài khoản chương trình và tài khoản dữ liệu. Bạn có thể thấy trường Dữ liệu của tài khoản dữ liệu bao gồm hai phần thông tin là địa chỉ ví và mã eBPF.
Các giao dịch và hướng dẫn của Solana
Ở Solana, người dùng cũng thực thi các chương trình bằng cách phát hành các giao dịch (Giao dịch). Điều đặc biệt là Solana có thể thực hiện song song các giao dịch này, đây cũng là lý do quan trọng khiến nó có thể cung cấp tốc độ giao dịch nhanh như chớp. Tiếp theo, hãy xem các giao dịch của Solana được thiết kế như thế nào.
Giao dịch Solana bao gồm chữ ký và nội dung thư. Một giao dịch có thể chứa nhiều chữ ký. Nội dung thông báo của giao dịch bao gồm bốn phần, như thể hiện trong hình bên dưới.
Thông tin tiêu đề (Tiêu đề) và Mảng địa chỉ tài khoản (Mảng địa chỉ tài khoản nhỏ gọn) của thông báo chỉ định tất cả các tài khoản liên quan đến giao dịch và tài khoản trong Đặc điểm của giao dịch: bao gồm liệu tài khoản có cung cấp chữ ký hay không và liệu nó có được viết trong quá trình thực hiện hay không. Sử dụng thông tin này, Solana có thể xác minh chữ ký được cung cấp bởi các tài khoản tương ứng và thực hiện các giao dịch song song không liên quan đến cùng một nhóm tài khoản.
Block Hash (Blockhash gần đây) gần đây nhất là dấu thời gian của giao dịch. Mạng Solana sẽ đảm bảo rằng các giao dịch đến từ 150 khối cuối cùng, nếu không giao dịch sẽ bị coi là hết hạn và sẽ không được thực hiện.
Mảng hướng dẫn thu gọn (Mảng hướng dẫn nhỏ gọn) là phần quan trọng nhất của giao dịch và chứa một hoặc nhiều hướng dẫn. Một lệnh thực chất là một lời gọi tới một thủ tục do một chương trình cung cấp. Hướng dẫn bao gồm ba trường, như minh họa trong hình sau:
p>
Trường đầu tiên, Chỉ mục ID chương trình, chỉ định người nhận hướng dẫn, tức là chương trình trên chuỗi cần xử lý hướng dẫn. Nó không trực tiếp lưu trữ địa chỉ 32 byte mà đặt địa chỉ đó vào mảng địa chỉ tài khoản trong nội dung thư. Trường này sử dụng chỉ số byte để chỉ ra vị trí của nó trong mảng, thực hiện một kiểu ghép kênh không gian.
Tương tự như trường đầu tiên, trường thứ hai là một mảng Nhỏ gọn gồm các chỉ mục địa chỉ tài khoản, chỉ định việc xử lý Tất cả các tài khoản liên quan đến hướng dẫn này.
Trường cuối cùng là một mảng byte, là thông tin bổ sung mà chương trình cần để xử lý lệnh. Nó có thể được hiểu là một tham số của hàm.
Cần lưu ý rằng Solana sẽ xử lý tất cả các hướng dẫn trong giao dịch một cách tuần tự và đảm bảo rằng việc thực hiện giao dịch là nguyên tử. Điều này có nghĩa là tất cả các lệnh trong giao dịch đều không thành công hoặc đều được thực hiện thành công. Sẽ không có trường hợp một số lệnh được thực hiện thành công và một số lệnh không thành công.
- ? Xem Giao dịch Solana trong trình duyệt của bạn
Chúng tôi sử dụng trình duyệt Solana khác để xem các giao dịch của tài khoản chương trình đã tạo trước đó?. Bạn có thể xem chữ ký giao dịch Solana, hàm băm khối gần đây và các thông tin khác trong phần Tổng quan:
3uKQ85Lpsnwb5D6CgUntoMyJX3tSaeGb4pjUoMaMyNVqQNPp5PRG1kJEEEk3YNdWLYEMZGmoJ5Rowgon8hZzwL9D
Thông tin đầu vào tài khoản liệt kê tất cả các tài khoản liên quan đến giao dịch hiện tại và đặc điểm của các tài khoản liên quan trong giao dịch . Chúng ta có thể thấy rằng ngoài người gửi, tài khoản chương trình và các địa chỉ khác, còn có hai tài khoản Chương trình gốc và Sysvar.
Vì giao dịch là giao dịch tạo chương trình đơn giản nên nó chỉ chứa hai hướng dẫn. Người nhận hướng dẫn đầu tiên là Chương trình hệ thống, chịu trách nhiệm tạo tài khoản chương trình; hướng dẫn thứ hai Người nhận là Trình tải BPF, chịu trách nhiệm ghi mã eBPF được triển khai thực tế vào tài khoản dữ liệu và ghi địa chỉ của nó vào trường Dữ liệu của tài khoản chương trình.
Tóm tắt
Hợp đồng thông minh trên Solana được phát triển bằng ngôn ngữ Rust và chạy trên máy ảo eBPF. Nó tuân theo mô hình tài khoản và các tài khoản trên chuỗi cần duy trì tiền thuê để đảm bảo tính sẵn có của dữ liệu. Một giao dịch bao gồm một hoặc nhiều hướng dẫn xác định rõ ràng tất cả các tài khoản mà nó phụ thuộc vào, cho phép các giao dịch được xử lý song song, cải thiện thông lượng và giảm độ trễ phản hồi. Những đặc điểm này cùng nhau thúc đẩy sự phát triển nhanh chóng của Solana, khiến nó trở thành một trong những nền tảng blockchain phổ biến nhất.