Solana Web3.js phiên bản 2.x: Cải tiến lớn cho thư viện JavaScript phong phú chức năng
Thư viện JavaScript mạnh mẽ Solana Web3.js đã chính thức phát hành phiên bản 2.x vào tháng 11 năm nay. Lần nâng cấp này mang lại những thay đổi đáng kể, chúng ta hãy tóm tắt một chút những nội dung cập nhật chính.
Mặc dù phiên bản 2.x vừa mới ra mắt và tỷ lệ sử dụng vẫn chưa phổ biến, nhưng nhiều thư viện được sử dụng rộng rãi vẫn chưa được chuyển đổi. Tuy nhiên, việc tìm hiểu trước những thay đổi này sẽ rất có lợi cho việc chuẩn bị nâng cấp trong tương lai.
So sánh phiên bản
Không thể phủ nhận rằng phiên bản cũ sử dụng đơn giản và trực tiếp hơn. Phiên bản 1.x chỉ bao gồm một gói @solana/web3.js, tất cả các chức năng đều được tập trung ở đó. Nó dựa trên thiết kế lớp, đóng gói 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 quát tất cả các chức năng mà nhà phát triển cần. Ngoài ra, trong sách nấu ăn Solana còn cung cấp mã ví dụ phong phú, thuận tiện cho nhà phát triển tìm kiếm chức năng cần thiết.
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 mà nhà phát triển thực sự sử dụng có thể chỉ là một phần nhỏ trong số đó, nhưng toàn bộ kho mã sẽ được tải xuống thiết bị của người dùng, do khối lượng mã của thư viện lớn, điều này có thể tiêu tốn một khoảng thời gian nhất định.
So với trước đây, phiên bản 2.x áp dụng tư duy thiết kế theo mô-đun. Nhóm phát triển chính thức đã tách mã nguồn hiện có thành nhiều mô-đun nhỏ, như @solana/accounts, @solana/codecs, @solana/rpc, @solana/signers, @solana/transactions, v.v. Đồng thời, phiên bản mới đã từ bỏ việc triển khai dựa trên lớp, thay vào đó là cách tiếp cận với các hàm đơn lẻ. Thiết kế này rất hữu ích trong việc tối ưu hóa 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 cơ bản đều có thể đạt được tối ưu hóa 30% về kích thước, nếu chỉ sử dụng một phần rất nhỏ chức năng, tỷ lệ tối ưu hóa có thể 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, cách để các nhà phát triển nhanh chóng tìm thấy các tính năng cần thiết trở thành một vấn đề quan trọng. Hiện tại, ít nhất tên gói có tính ngữ nghĩa tốt, từ tên gọi có thể hiểu rõ về mục đích của chúng. Điều này phần nào có thể giảm bớt khó khăn trong việc di chuyển của các nhà phát triển.
Tất nhiên, do mới được phát hành không lâu, 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. Hơn nữa, do 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 thời gian chạy (như tạo cặp khóa), mô tả trong tài liệu về những phần này không đủ, dẫn đến một số chỗ có thể khiến các nhà phát triển cảm thấy bối rối.
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 nhìn từ 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 có nhiều đầu vào và phụ thuộc bên ngoài sẽ làm tăng đáng kể khả năng xảy ra các sự kiện an ninh. 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 tận dụng nhiều hơn các chức năng cục bộ, loại bỏ việc phụ thuộc bên ngoài và sự giới thiệu của Polyfills. Mặc dù có thể có sự thay đổi trong tương lai, nhưng ít nhất 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.
Điểm thay đổi quan trọng
kết nối
Như đã đề cập trước đó, phiên bản 1.x cung cấp một lượng lớn phương pháp thông qua Connection. Tuy nhiên, chức năng chính của nó vẫ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 các yêu cầu khác nhau thông qua nó.
Trong phiên bản 2.x, đã áp dụng cách tiếp cận hàm nhiều hơn để thực hiện:
javascript
import { createSolanaRpc } from "@solana/web3.js";
const rpc = createSolanaRpc("");
Khi chúng ta gọi "sendAndConfirmTransaction" để gửi giao dịch, một yêu cầu HTTPS sẽ tự động được gửi và kết nối WSS sẽ được thiết lập, đăng ký trạng thái giao dịch, và sau khi giao dịch được xác nhận, nó sẽ trả về hash giao dịch.
cặp khóa
Phần liên quan đến khóa công và khóa riêng cũng đã có sự thay đổi đáng kể. Hai 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 số hàm.
Ví dụ, bạn có thể sử dụng "await generateKeyPair()" để tạo cặp khóa, trong khi trước đây bạn đã tạo cặp khóa trực tiếp thông qua "Keypair.generate()".
Bạn có thể đã nhận thấy rằng hàm generateKeyPair mới trả về một Promise, thay vì trả về cặp khóa trực tiếp như trước đây. Điều này là do việc triển khai mới tận dụng tối đa API Web Crypto của JavaScript, sử dụng triển khai Ed25519 nguyên bản. Nhiều phương thức của API Web Crypto là bất đồng bộ. Tuy nhiên, sự thay đổi này không phải là không thể chấp nhận, trong năm 2024 sắp tới, các lập trình viên JavaScript đã rất quen thuộc với Promise.
gửi giao dịch
Người dùng của 1.x chắc hẳn rất quen thuộc với hai lớp "Transaction" và "VersionedTransaction". Khi lần đầu tìm hiểu về Solana, mối quan hệ giữa chúng có thể khiến người ta cảm thấy bối rối.
Trong phiên bản 2.x, hai lớp này cũng không còn tồn tại.
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 tồn tại, vì vậy 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", cần gọi hàm "getTransferSolInstruction" trong "@solana-program/system".
Do không còn cung cấp class nữa, 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 thực hiện chức năng chuyển tiền của phiên bản 1.x thông qua hàm pipe:
javascript
import { pipe } from "@solana/web3.js";
import { getTransferSolInstruction } from "@solana/system-program";
Có thể thấy, giao dịch không còn được khởi xướng qua Connection nữa, mà thay vào đó là thông qua RPC Provider mà chúng tôi định nghĩa để tạo ra một hàm đặc trưng, sau đó gọi hàm đó để khởi xướng giao dịch. So với phiên bản 1.x, mã nguồn đã tăng lên một chút, nhưng ưu điểm là tính tùy chỉnh đã mạnh mẽ hơn.
Giao dịch được khởi xướng qua HTTPS RPC, sau đó được 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 cách thức mới này rất 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 thực sự đặt ra yêu cầu cao hơn về sự ổn định dịch vụ của các nhà cung cấp RPC.
React
Thú vị là, dự án @solana/web3.js còn bao gồm một thư viện có tên là @solana/react, cung cấp một số React Hook, được 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 rõ cam kết của đội ngũ Solana đối với sự phát triển và cải tiến liên tục. Nó cung cấp cho các nhà phát triển một cách tương tác hiệu quả, linh hoạt và tùy chỉnh với mạng Solana, góp phần thúc đẩy sự áp dụng và phát triển của nền tảng này.
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.
Nâng cấp lớn phiên bản 2.x của Solana Web3.js: Thiết kế mô-đun cải thiện hiệu suất và an ninh
Solana Web3.js phiên bản 2.x: Cải tiến lớn cho thư viện JavaScript phong phú chức năng
Thư viện JavaScript mạnh mẽ Solana Web3.js đã chính thức phát hành phiên bản 2.x vào tháng 11 năm nay. Lần nâng cấp này mang lại những thay đổi đáng kể, chúng ta hãy tóm tắt một chút những nội dung cập nhật chính.
Mặc dù phiên bản 2.x vừa mới ra mắt và tỷ lệ sử dụng vẫn chưa phổ biến, nhưng nhiều thư viện được sử dụng rộng rãi vẫn chưa được chuyển đổi. Tuy nhiên, việc tìm hiểu trước những thay đổi này sẽ rất có lợi cho việc chuẩn bị nâng cấp trong tương lai.
So sánh phiên bản
Không thể phủ nhận rằng phiên bản cũ sử dụng đơn giản và trực tiếp hơn. Phiên bản 1.x chỉ bao gồm một gói @solana/web3.js, tất cả các chức năng đều được tập trung ở đó. Nó dựa trên thiết kế lớp, đóng gói 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 quát tất cả các chức năng mà nhà phát triển cần. Ngoài ra, trong sách nấu ăn Solana còn cung cấp mã ví dụ phong phú, thuận tiện cho nhà phát triển tìm kiếm chức năng cần thiết.
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 mà nhà phát triển thực sự sử dụng có thể chỉ là một phần nhỏ trong số đó, nhưng toàn bộ kho mã sẽ được tải xuống thiết bị của người dùng, do khối lượng mã của thư viện lớn, điều này có thể tiêu tốn một khoảng thời gian nhất định.
So với trước đây, phiên bản 2.x áp dụng tư duy thiết kế theo mô-đun. Nhóm phát triển chính thức đã tách mã nguồn hiện có thành nhiều mô-đun nhỏ, như @solana/accounts, @solana/codecs, @solana/rpc, @solana/signers, @solana/transactions, v.v. Đồng thời, phiên bản mới đã từ bỏ việc triển khai dựa trên lớp, thay vào đó là cách tiếp cận với các hàm đơn lẻ. Thiết kế này rất hữu ích trong việc tối ưu hóa 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 cơ bản đều có thể đạt được tối ưu hóa 30% về kích thước, nếu chỉ sử dụng một phần rất nhỏ chức năng, tỷ lệ tối ưu hóa có thể 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, cách để các nhà phát triển nhanh chóng tìm thấy các tính năng cần thiết trở thành một vấn đề quan trọng. Hiện tại, ít nhất tên gói có tính ngữ nghĩa tốt, từ tên gọi có thể hiểu rõ về mục đích của chúng. Điều này phần nào có thể giảm bớt khó khăn trong việc di chuyển của các nhà phát triển.
Tất nhiên, do mới được phát hành không lâu, 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. Hơn nữa, do 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 thời gian chạy (như tạo cặp khóa), mô tả trong tài liệu về những phần này không đủ, dẫn đến một số chỗ có thể khiến các nhà phát triển cảm thấy bối rối.
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 nhìn từ 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 có nhiều đầu vào và phụ thuộc bên ngoài sẽ làm tăng đáng kể khả năng xảy ra các sự kiện an ninh. 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 tận dụng nhiều hơn các chức năng cục bộ, loại bỏ việc phụ thuộc bên ngoài và sự giới thiệu của Polyfills. Mặc dù có thể có sự thay đổi trong tương lai, nhưng ít nhất 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.
Điểm thay đổi quan trọng
kết nối
Như đã đề cập trước đó, phiên bản 1.x cung cấp một lượng lớn phương pháp thông qua Connection. Tuy nhiên, chức năng chính của nó vẫ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 các yêu cầu khác nhau thông qua nó.
Trong phiên bản 2.x, đã áp dụng cách tiếp cận hàm nhiều hơn để thực hiện:
javascript import { createSolanaRpc } from "@solana/web3.js";
const rpc = createSolanaRpc("");
Khi chúng ta gọi "sendAndConfirmTransaction" để gửi giao dịch, một yêu cầu HTTPS sẽ tự động được gửi và kết nối WSS sẽ được thiết lập, đăng ký trạng thái giao dịch, và sau khi giao dịch được xác nhận, nó sẽ trả về hash giao dịch.
cặp khóa
Phần liên quan đến khóa công và khóa riêng cũng đã có sự thay đổi đáng kể. Hai 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 số hàm.
Ví dụ, bạn có thể sử dụng "await generateKeyPair()" để tạo cặp khóa, trong khi trước đây bạn đã tạo cặp khóa trực tiếp thông qua "Keypair.generate()".
Bạn có thể đã nhận thấy rằng hàm generateKeyPair mới trả về một Promise, thay vì trả về cặp khóa trực tiếp như trước đây. Điều này là do việc triển khai mới tận dụng tối đa API Web Crypto của JavaScript, sử dụng triển khai Ed25519 nguyên bản. Nhiều phương thức của API Web Crypto là bất đồng bộ. Tuy nhiên, sự thay đổi này không phải là không thể chấp nhận, trong năm 2024 sắp tới, các lập trình viên JavaScript đã rất quen thuộc với Promise.
gửi giao dịch
Người dùng của 1.x chắc hẳn rất quen thuộc với hai lớp "Transaction" và "VersionedTransaction". Khi lần đầu tìm hiểu về Solana, mối quan hệ giữa chúng có thể khiến người ta cảm thấy bối rối.
Trong phiên bản 2.x, hai lớp này cũng không còn tồn tại.
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 tồn tại, vì vậy 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", cần gọi hàm "getTransferSolInstruction" trong "@solana-program/system".
Do không còn cung cấp class nữa, 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 thực hiện chức năng chuyển tiền của phiên bản 1.x thông qua hàm pipe:
javascript import { pipe } from "@solana/web3.js"; import { getTransferSolInstruction } from "@solana/system-program";
const transaction = pipe( createTransaction({ version: 0 }), addInstruction(getTransferSolInstruction({ từ: senderPublicKey, đến: recipientPublicKey, số lượng: lamports, })), setComputeUnitLimit(200_000), addSignature(senderSignature) );
const signature = await sendAndConfirmTransaction(rpc, transaction);
Có thể thấy, giao dịch không còn được khởi xướng qua Connection nữa, mà thay vào đó là thông qua RPC Provider mà chúng tôi định nghĩa để tạo ra một hàm đặc trưng, sau đó gọi hàm đó để khởi xướng giao dịch. So với phiên bản 1.x, mã nguồn đã tăng lên một chút, nhưng ưu điểm là tính tùy chỉnh đã mạnh mẽ hơn.
Giao dịch được khởi xướng qua HTTPS RPC, sau đó được 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 cách thức mới này rất 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 thực sự đặt ra yêu cầu cao hơn về sự ổn định dịch vụ của các nhà cung cấp RPC.
React
Thú vị là, dự án @solana/web3.js còn bao gồm một thư viện có tên là @solana/react, cung cấp một số React Hook, được 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 rõ cam kết của đội ngũ Solana đối với sự phát triển và cải tiến liên tục. Nó cung cấp cho các nhà phát triển một cách tương tác hiệu quả, linh hoạt và tùy chỉnh với mạng Solana, góp phần thúc đẩy sự áp dụng và phát triển của nền tảng này.