Solana Web3.js phiên bản 2.x: Cập nhật lớn cho thư viện JavaScript đầy đủ tính năng
Solana Web3.js là một thư viện JavaScript mạnh mẽ, đã chính thức ra mắt phiên bản 2.x vào tháng 11. So với phiên bản 1.x, phiên bản mới mang đến nhiều thay đổi quan trọng, bài viết này sẽ tóm tắt những cập nhật chính.
Mặc dù phiên bản 2.x vừa mới được phát hành và hiện tại lượng sử dụng không cao, nhiều thư viện được sử dụng rộng rãi vẫn chưa được di chuyển, nhưng việc hiểu những thay đổi này là rất quan trọng cho công việc di chuyển trong tương lai.
So sánh phiên bản
Không thể phủ nhận rằng phiên bản cũ dễ sử dụng và trực tiếp hơn. Phiên bản 1.x chỉ bao gồm một gói @solana/web3.js, chứa tất cả các tính năng. Nó dựa trên thiết kế lớp, bao bọc nhiều thao tác thông dụng. Ví dụ, lớp Connection cung cấp hàng chục phương thức, gần như bao trùm tất cả các chức năng mà nhà phát triển cần. Hơn nữa, mã ví dụ phong phú trong Solana cookbook mang lại nhiều tiện lợi cho các nhà phát triển.
Tuy nhiên, thiết kế này cũng mang lại một số vấn đề. Mặc dù các chức năng thực tế mà các nhà phát triển sử dụng có thể chỉ chiếm một phần rất nhỏ, nhưng toàn bộ mã nguồn sẽ được tải xuống thiết bị của người dùng, và do khối lượng mã của thư viện rất lớn, điều này có thể dẫn đến một số độ trễ khi tải.
Phiên bản 2.x đã áp dụng một phương pháp khác. Nhóm chính thức đã phân tách kho mã nguồn cũ thành nhiều mô-đun nhỏ, như @solana/accounts, @solana/codecs, @solana/rpc, @solana/signers và @solana/transactions. Đồng thời, phiên bản mới đã từ bỏ việc triển khai dựa trên lớp và chủ yếu sử dụng cách thức hàm đơn. Thay đổi này mang lại lợi ích lớn cho việc tối ưu hóa khi xây dựng mã JavaScript, mã không sử dụng sẽ bị xóa và không được tải xuống thiết bị của người dùng. Theo thống kê từ tài liệu chính thức, các DApp sử dụng phiên bản mới thường đạt được tối ưu hóa kích thước 30%, đối với các ứng dụng chỉ sử dụng một lượng nhỏ chức năng, tỷ lệ tối ưu hóa thậm chí còn cao hơn.
Sự thay đổi này cũng đặt ra yêu cầu cao hơn về chất lượng tài liệu của đội ngũ Solana. Làm thế nào để giúp các nhà phát triển nhanh chóng tìm thấy chức năng cần thiết trở thành một vấn đề then chốt. Hiện tại, có vẻ như tên gói phiên bản mới có ý nghĩa tốt, từ tên có thể hiểu đại khái về công dụng của nó, điều này phần nào giảm bớt khó khăn cho việc chuyển đổi của các nhà phát triển.
Tuy nhiên, do phiên bản mới vừa được phát hành, nhiều dự án vẫn chưa thực hiện việc di chuyển. Các ví dụ về phiên bản 2.x trên Solana Cookbook cũng tương đối ít. Ngoài ra, phiên bản mới có xu hướng sử dụng các chức năng tích hợp sẵn trong runtime (như tạo cặp khóa), nhưng tài liệu mô tả về những phần này chưa đầy đủ, dẫn đến việc các nhà phát triển có thể cảm thấy bối rối trong một số khía cạnh.
Một đặc điểm quan trọng khác của phiên bản 2.x là không phụ thuộc. Điều này có thể không quan trọng đối với nhiều người dùng, nhưng với cuộc tấn công chuỗi cung ứng xảy ra vào đầu tháng 12 năm nay trên phiên bản @solana/web3.js 1.95.5 và 1.95.6, việc giảm thiểu đầu vào và sự phụ thuộc bên ngoài có thể giảm đáng kể khả năng xảy ra sự cố bảo mật. Với việc phát hành phiên bản 2.x, nhóm phát triển Web3.js đã quyết định sử dụng nhiều hơn các chức năng bản địa, loại bỏ sự phụ thuộc bên ngoài và việc giới thiệu Polyfills. Mặc dù có thể có sự thay đổi trong tương lai, nhưng hiện tại phiên bản 2.x đã loại bỏ tất cả các phụ thuộc bên ngoài.
Thay đổi chính
cách kết nối
Trong phiên bản 1.x, lớp Connection cung cấp nhiều phương thức. Chức năng chính của nó là tạo một bộ gửi yêu cầu thông qua cấu hình địa chỉ yêu cầu RPC, sau đó gửi nhiều yêu cầu khác nhau thông qua nó.
Phiên bản 2.x đã áp dụng phương pháp hàm nhiều hơn:
javascript
import { createSolanaRpc } from "@solana/web3.js";
const rpc = createSolanaRpc("");
Khi gọi sendAndConfirmTransaction để gửi giao dịch, sẽ tự động thực hiện yêu cầu HTTPS và thiết lập kết nối WSS để đăng ký trạng thái giao dịch, và sẽ trả về hash giao dịch sau khi giao dịch được xác nhận.
xử lý khóa
Xử lý liên quan đến khóa công khai và khóa riêng đã có những thay đổi đáng kể. Các lớp Keypair và PublicKey thường được sử dụng trong phiên bản 1.x không còn tồn tại, mà đã được thay thế bằng một loạt các hàm.
Ví dụ, bây giờ bạn có thể sử dụng await generateKeyPair() để tạo cặp khóa, thay vì Keypair.generate() như trước đây.
Điều đáng chú ý là, hàm generateKeyPair mới trả về một Promise, thay vì trả về cặp khóa trực tiếp. Điều này là do việc triển khai mới tối đa hóa việc sử dụng API Crypto Web JavaScript, sử dụng triển khai Ed25519 gốc. Nhiều phương thức của API Crypto Web đều là bất đồng bộ. Tuy nhiên, đối với các nhà phát triển JavaScript hiện đại quen thuộc với Promise, sự thay đổi này không quá khó chấp nhận.
Gửi giao dịch
Các lớp Transaction và VersionedTransaction quen thuộc trong phiên bản 1.x không còn tồn tại trong 2.x.
Các phương thức liên quan đến System Program được cung cấp trong phiên bản cũ cũng không còn được giữ lại, do đó các phương thức tĩnh trên lớp SystemProgram cần được nhập từ nơi khác.
Ví dụ, lệnh transfer bây giờ cần gọi hàm getTransferSolInstruction trong @solana-program/system.
Do vì không còn cung cấp lớp, Web3.js đã cung cấp hình thức pipe thường được sử dụng trong lập trình hàm. Dưới đây là ví dụ về việc sử dụng hàm pipe để thực hiện chức năng chuyển tiền của phiên bản 1.x.
javascript
import { pipe } from "@solana/web3.js";
import { getTransferSolInstruction } from "@solana/system-program";
const transaction = pipe(
createTransaction({ version: 0 }),
addInstruction(getTransferSolInstruction({
fromPubkey: người gửi,
toPubkey: recipient,
lamports: số lượng
}))
);
Có thể thấy, giao dịch không còn được khởi xướng thông qua Connection nữa, mà là thông qua nhà cung cấp RPC mà chúng tôi đã định nghĩa để tạo ra một hàm cụ thể, sau đó gọi hàm đó để khởi xướng giao dịch. So với phiên bản 1.x, số lượng mã đã tăng lên một chút, nhưng cung cấp khả năng tùy chỉnh mạnh mẽ hơn.
Giao dịch được khởi xướng thông qua HTTPS RPC, sau đó xác nhận kết quả giao dịch thông qua việc đăng ký WSS RPC. Có thể cảm nhận rằng phương thức mới ngày càng phụ thuộc vào WSS, tin rằng trong tương lai việc ứng dụng WSS sẽ ngày càng rộng rãi, điều này cũng đặt ra yêu cầu cao hơn về độ ổn định dịch vụ của các nhà cung cấp RPC.
React hỗ trợ
Đáng chú ý là, trong dự án @solana/web3.js còn có một thư viện tên là @solana/react, cung cấp một số React Hook, tích hợp các chức năng như signIn.
Tóm tắt
Việc phát hành phiên bản 2.x của @solana/web3.js thể hiện quyết tâm cải tiến và phát triển không ngừng của đội ngũ Solana. Phiên bản mới cung cấp cho các nhà phát triển một cách hiệu quả, linh hoạt và tùy chỉnh để tương tác với mạng Solana, qua đó giúp thúc đẩy việc áp dụng và phát triển nền tảng này. Mặc dù hiện tại vẫn đang ở giai đoạn đầu, nhưng với sự chuyển đổi của nhiều dự án và sự thích ứng của cộng đồng, tin rằng phiên bản 2.x sẽ đóng vai trò lớn hơn trong tương lai.
Trang này có thể chứa nội dung của bên thứ ba, được cung cấp chỉ nhằm mục đích thông tin (không phải là tuyên bố/bảo đảm) và không được coi là sự chứng thực cho quan điểm của Gate hoặc là lời khuyên về tài chính hoặc chuyên môn. Xem Tuyên bố từ chối trách nhiệm để biết chi tiết.
Cải tiến lớn của phiên bản 2.x Web3.js Solana: Tách chức năng và nâng cao hiệu suất không phụ thuộc.
Solana Web3.js phiên bản 2.x: Cập nhật lớn cho thư viện JavaScript đầy đủ tính năng
Solana Web3.js là một thư viện JavaScript mạnh mẽ, đã chính thức ra mắt phiên bản 2.x vào tháng 11. So với phiên bản 1.x, phiên bản mới mang đến nhiều thay đổi quan trọng, bài viết này sẽ tóm tắt những cập nhật chính.
Mặc dù phiên bản 2.x vừa mới được phát hành và hiện tại lượng sử dụng không cao, nhiều thư viện được sử dụng rộng rãi vẫn chưa được di chuyển, nhưng việc hiểu những thay đổi này là rất quan trọng cho công việc di chuyển trong tương lai.
So sánh phiên bản
Không thể phủ nhận rằng phiên bản cũ dễ sử dụng và trực tiếp hơn. Phiên bản 1.x chỉ bao gồm một gói @solana/web3.js, chứa tất cả các tính năng. Nó dựa trên thiết kế lớp, bao bọc nhiều thao tác thông dụng. Ví dụ, lớp Connection cung cấp hàng chục phương thức, gần như bao trùm tất cả các chức năng mà nhà phát triển cần. Hơn nữa, mã ví dụ phong phú trong Solana cookbook mang lại nhiều tiện lợi cho các nhà phát triển.
Tuy nhiên, thiết kế này cũng mang lại một số vấn đề. Mặc dù các chức năng thực tế mà các nhà phát triển sử dụng có thể chỉ chiếm một phần rất nhỏ, nhưng toàn bộ mã nguồn sẽ được tải xuống thiết bị của người dùng, và do khối lượng mã của thư viện rất lớn, điều này có thể dẫn đến một số độ trễ khi tải.
Phiên bản 2.x đã áp dụng một phương pháp khác. Nhóm chính thức đã phân tách kho mã nguồn cũ thành nhiều mô-đun nhỏ, như @solana/accounts, @solana/codecs, @solana/rpc, @solana/signers và @solana/transactions. Đồng thời, phiên bản mới đã từ bỏ việc triển khai dựa trên lớp và chủ yếu sử dụng cách thức hàm đơn. Thay đổi này mang lại lợi ích lớn cho việc tối ưu hóa khi xây dựng mã JavaScript, mã không sử dụng sẽ bị xóa và không được tải xuống thiết bị của người dùng. Theo thống kê từ tài liệu chính thức, các DApp sử dụng phiên bản mới thường đạt được tối ưu hóa kích thước 30%, đối với các ứng dụng chỉ sử dụng một lượng nhỏ chức năng, tỷ lệ tối ưu hóa thậm chí còn cao hơn.
Sự thay đổi này cũng đặt ra yêu cầu cao hơn về chất lượng tài liệu của đội ngũ Solana. Làm thế nào để giúp các nhà phát triển nhanh chóng tìm thấy chức năng cần thiết trở thành một vấn đề then chốt. Hiện tại, có vẻ như tên gói phiên bản mới có ý nghĩa tốt, từ tên có thể hiểu đại khái về công dụng của nó, điều này phần nào giảm bớt khó khăn cho việc chuyển đổi của các nhà phát triển.
Tuy nhiên, do phiên bản mới vừa được phát hành, nhiều dự án vẫn chưa thực hiện việc di chuyển. Các ví dụ về phiên bản 2.x trên Solana Cookbook cũng tương đối ít. Ngoài ra, phiên bản mới có xu hướng sử dụng các chức năng tích hợp sẵn trong runtime (như tạo cặp khóa), nhưng tài liệu mô tả về những phần này chưa đầy đủ, dẫn đến việc các nhà phát triển có thể cảm thấy bối rối trong một số khía cạnh.
Một đặc điểm quan trọng khác của phiên bản 2.x là không phụ thuộc. Điều này có thể không quan trọng đối với nhiều người dùng, nhưng với cuộc tấn công chuỗi cung ứng xảy ra vào đầu tháng 12 năm nay trên phiên bản @solana/web3.js 1.95.5 và 1.95.6, việc giảm thiểu đầu vào và sự phụ thuộc bên ngoài có thể giảm đáng kể khả năng xảy ra sự cố bảo mật. Với việc phát hành phiên bản 2.x, nhóm phát triển Web3.js đã quyết định sử dụng nhiều hơn các chức năng bản địa, loại bỏ sự phụ thuộc bên ngoài và việc giới thiệu Polyfills. Mặc dù có thể có sự thay đổi trong tương lai, nhưng hiện tại phiên bản 2.x đã loại bỏ tất cả các phụ thuộc bên ngoài.
Thay đổi chính
cách kết nối
Trong phiên bản 1.x, lớp Connection cung cấp nhiều phương thức. Chức năng chính của nó là tạo một bộ gửi yêu cầu thông qua cấu hình địa chỉ yêu cầu RPC, sau đó gửi nhiều yêu cầu khác nhau thông qua nó.
Phiên bản 2.x đã áp dụng phương pháp hàm nhiều hơn:
javascript import { createSolanaRpc } from "@solana/web3.js";
const rpc = createSolanaRpc("");
Khi gọi sendAndConfirmTransaction để gửi giao dịch, sẽ tự động thực hiện yêu cầu HTTPS và thiết lập kết nối WSS để đăng ký trạng thái giao dịch, và sẽ trả về hash giao dịch sau khi giao dịch được xác nhận.
xử lý khóa
Xử lý liên quan đến khóa công khai và khóa riêng đã có những thay đổi đáng kể. Các lớp Keypair và PublicKey thường được sử dụng trong phiên bản 1.x không còn tồn tại, mà đã được thay thế bằng một loạt các hàm.
Ví dụ, bây giờ bạn có thể sử dụng await generateKeyPair() để tạo cặp khóa, thay vì Keypair.generate() như trước đây.
Điều đáng chú ý là, hàm generateKeyPair mới trả về một Promise, thay vì trả về cặp khóa trực tiếp. Điều này là do việc triển khai mới tối đa hóa việc sử dụng API Crypto Web JavaScript, sử dụng triển khai Ed25519 gốc. Nhiều phương thức của API Crypto Web đều là bất đồng bộ. Tuy nhiên, đối với các nhà phát triển JavaScript hiện đại quen thuộc với Promise, sự thay đổi này không quá khó chấp nhận.
Gửi giao dịch
Các lớp Transaction và VersionedTransaction quen thuộc trong phiên bản 1.x không còn tồn tại trong 2.x.
Các phương thức liên quan đến System Program được cung cấp trong phiên bản cũ cũng không còn được giữ lại, do đó các phương thức tĩnh trên lớp SystemProgram cần được nhập từ nơi khác.
Ví dụ, lệnh transfer bây giờ cần gọi hàm getTransferSolInstruction trong @solana-program/system.
Do vì không còn cung cấp lớp, Web3.js đã cung cấp hình thức pipe thường được sử dụng trong lập trình hàm. Dưới đây là ví dụ về việc sử dụng hàm pipe để thực hiện chức năng chuyển tiền của phiên bản 1.x.
javascript import { pipe } from "@solana/web3.js"; import { getTransferSolInstruction } from "@solana/system-program";
const transaction = pipe( createTransaction({ version: 0 }), addInstruction(getTransferSolInstruction({ fromPubkey: người gửi, toPubkey: recipient, lamports: số lượng })) );
const signature = await rpc.sendTransaction(transaction);
Có thể thấy, giao dịch không còn được khởi xướng thông qua Connection nữa, mà là thông qua nhà cung cấp RPC mà chúng tôi đã định nghĩa để tạo ra một hàm cụ thể, sau đó gọi hàm đó để khởi xướng giao dịch. So với phiên bản 1.x, số lượng mã đã tăng lên một chút, nhưng cung cấp khả năng tùy chỉnh mạnh mẽ hơn.
Giao dịch được khởi xướng thông qua HTTPS RPC, sau đó xác nhận kết quả giao dịch thông qua việc đăng ký WSS RPC. Có thể cảm nhận rằng phương thức mới ngày càng phụ thuộc vào WSS, tin rằng trong tương lai việc ứng dụng WSS sẽ ngày càng rộng rãi, điều này cũng đặt ra yêu cầu cao hơn về độ ổn định dịch vụ của các nhà cung cấp RPC.
React hỗ trợ
Đáng chú ý là, trong dự án @solana/web3.js còn có một thư viện tên là @solana/react, cung cấp một số React Hook, tích hợp các chức năng như signIn.
Tóm tắt
Việc phát hành phiên bản 2.x của @solana/web3.js thể hiện quyết tâm cải tiến và phát triển không ngừng của đội ngũ Solana. Phiên bản mới cung cấp cho các nhà phát triển một cách hiệu quả, linh hoạt và tùy chỉnh để tương tác với mạng Solana, qua đó giúp thúc đẩy việc áp dụng và phát triển nền tảng này. Mặc dù hiện tại vẫn đang ở giai đoạn đầu, nhưng với sự chuyển đổi của nhiều dự án và sự thích ứng của cộng đồng, tin rằng phiên bản 2.x sẽ đóng vai trò lớn hơn trong tương lai.