Solana Web3.js phiên bản 2.x: Tính năng mạnh mẽ hơn, hiệu suất tối ưu hơn
Thư viện JavaScript phong phú chức năng Solana Web3.js đã chính thức ra mắt phiên bản 2.x vào tháng 11 năm nay. Phiên bản mới này có nhiều thay đổi so với phiên bản 1.x, bài viết này sẽ tóm tắt những thay đổi chính.
Mặc dù phiên bản 2.x vừa mới được phát hành và mức sử dụng chưa cao, nhiều thư viện được sử dụng rộng rãi vẫn chưa chuyển đổi, nhưng việc hiểu những thay đổi này sẽ giúp ích cho công việc di chuyển trong tương lai.
So sánh phiên bản
Phiên bản 1.x sử dụng khá đơn giản, chỉ có một gói: @solana/web3.js, tất cả các chức năng đều tập trung trong đó. Nó dựa trên thiết kế lớp, bao gồm rất nhiều thao tác phổ biến. 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 cần thiết 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 mà các nhà phát triển thực sự 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, do khối lượng mã lớn, có thể dẫn đến một khoảng thời gian tải nhất định.
So với trước đây, phiên bản 2.x đã tách mã nguồn 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 đó sử dụng nhiều hơn các hàm đơn. Thiết kế này có lợi cho việc tối ưu hóa mã JavaScript trong quá trình xây dựng, mã không được sử dụng sẽ bị xóa và không được tải xuống thiết bị của người dùng. Thống kê từ tài liệu chính thức cho thấy, các DApp sử dụng phiên bản mới thường có thể đạt được tối ưu hóa kích thước khoảng 30%, nếu chỉ sử dụng một số ít chức năng, tỷ lệ tối ưu hóa có thể cao hơn.
Sự thay đổi này đã đặt ra những thách thức mới cho việc viết tài liệu của nhóm Solana, làm thế nào để các nhà phát triển nhanh chóng tìm thấy các chức năng cần thiết trở thành một vấn đề quan trọng. Tuy nhiên, hiện tại, việc đặt tên cho các gói có tính ngữ nghĩa tốt, từ tên gọi có thể hiểu đại khái về mục đích của chúng, điều này đã phần nào giảm bớt độ khó cho các nhà phát triển trong việc chuyển đổi.
Do vì phiên bản mới vừa được phát hành không lâu, nhiều dự án vẫn chưa thực hiện việc chuyển đổi. Ví dụ về phiên bản 2.x trên Solana Cookbook cũng còn khá ít. Hơn nữa, phiên bản mới có xu hướng sử dụng các chức năng được tích hợp sẵn trong runtime (như tạo cặp khóa), nhưng tài liệu mô tả về các phần này còn thiếu, 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 có 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 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 các 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 sự cố an ninh. Với sự phát hành của 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 gốc, loại bỏ việc đưa vào các phụ thuộc bên ngoài và Polyfills. Mặc dù có thể sẽ 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.
Điểm thay đổi quan trọng
kết nối
Trong phiên bản 1.x, Connection cung cấp nhiều phương thức. Nhưng 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 việc 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ó.
Phiên bản 2.x đã được thực hiện theo cách 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 phát đi yêu cầu HTTPS và thiết lập kết nối WSS để đăng ký trạng thái giao dịch, khi giao dịch được xác nhận sẽ trả về mã giao dịch.
cặp khóa
Phần liên quan đến khóa công khai và khóa riêng cũng có sự thay đổi lớn. 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ây giờ bạn có thể sử dụng await generateKeyPair() để tạo cặp khóa, trong khi trước đây bạn đã tạo bằng Keypair.generate().
Cần lưu ý rằng, 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ận dụng tối đa API Web Crypto của JavaScript, với việc sử dụng thực thi Ed25519 gốc. Nhiều phương thức trong API Web Crypto là bất đồng bộ. Tuy nhiên, sự thay đổi này không phải là điều không thể chấp nhận, vào cuối năm 2024 sắp tới, các nhà phát triển JavaScript đã rất quen thuộc với Promise.
Gửi giao dịch
Hai lớp Transaction và VersionedTransaction trong phiên bản 1.x không còn tồn tại trong phiên bản 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 tồn tại, vì vậy tất cả 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 không còn cung cấp lớp, Web3.js cung cấp dạng 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 mà trước đây là 1.x:
javascript
import { pipe } from "@solana/web3.js";
import { getTransferSolInstruction } from "@solana-program/system";
Có thể thấy, giao dịch không còn được khởi xướng qua Connection nữa, mà là thông qua RPC Provider mà chúng tôi định nghĩa để tạo ra một hàm đặc biệt, sau đó gọi hàm đó để khởi xướng giao dịch. So với phiên bản 1.x, lượng mã đã tăng lên, nhưng tính 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 này rất phụ thuộc vào WSS, tin rằng trong tương lai ứng dụng WSS sẽ ngày càng rộng rãi, điều này thực sự đặt ra yêu cầu cao hơn về độ ổn định dịch vụ của nhà cung cấp RPC.
React
Đá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 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 hiệu quả, linh hoạt và tùy chỉnh để tương tác với mạng Solana, góp phần thúc đẩy việc áp dụng và phát triển 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.
13 thích
Phần thưởng
13
6
Chia sẻ
Bình luận
0/400
BrokenDAO
· 12giờ trước
Nâng cấp thì rất tuyệt, nhưng ai dám nhảy vào trước?
Xem bản gốcTrả lời0
MetaverseVagabond
· 12giờ trước
Ổn rồi, giờ viết mã thấy thoải mái hơn.
Xem bản gốcTrả lời0
NonFungibleDegen
· 12giờ trước
tăng giá af trên solana tbh... v2 sẽ gửi nó ser
Xem bản gốcTrả lời0
GasFeeNightmare
· 12giờ trước
Đêm khuya vẫn đang theo dõi xu hướng gas của sol... Khi nào mới có thể giảm xuống 1gwei?
Solana Web3.js 2.x phát hành: Thiết kế mô-đun nâng cao hiệu suất và an ninh
Solana Web3.js phiên bản 2.x: Tính năng mạnh mẽ hơn, hiệu suất tối ưu hơn
Thư viện JavaScript phong phú chức năng Solana Web3.js đã chính thức ra mắt phiên bản 2.x vào tháng 11 năm nay. Phiên bản mới này có nhiều thay đổi so với phiên bản 1.x, bài viết này sẽ tóm tắt những thay đổi chính.
Mặc dù phiên bản 2.x vừa mới được phát hành và mức sử dụng chưa cao, nhiều thư viện được sử dụng rộng rãi vẫn chưa chuyển đổi, nhưng việc hiểu những thay đổi này sẽ giúp ích cho công việc di chuyển trong tương lai.
So sánh phiên bản
Phiên bản 1.x sử dụng khá đơn giản, chỉ có một gói: @solana/web3.js, tất cả các chức năng đều tập trung trong đó. Nó dựa trên thiết kế lớp, bao gồm rất nhiều thao tác phổ biến. 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 cần thiết 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 mà các nhà phát triển thực sự 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, do khối lượng mã lớn, có thể dẫn đến một khoảng thời gian tải nhất định.
So với trước đây, phiên bản 2.x đã tách mã nguồn 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 đó sử dụng nhiều hơn các hàm đơn. Thiết kế này có lợi cho việc tối ưu hóa mã JavaScript trong quá trình xây dựng, mã không được sử dụng sẽ bị xóa và không được tải xuống thiết bị của người dùng. Thống kê từ tài liệu chính thức cho thấy, các DApp sử dụng phiên bản mới thường có thể đạt được tối ưu hóa kích thước khoảng 30%, nếu chỉ sử dụng một số ít chức năng, tỷ lệ tối ưu hóa có thể cao hơn.
Sự thay đổi này đã đặt ra những thách thức mới cho việc viết tài liệu của nhóm Solana, làm thế nào để các nhà phát triển nhanh chóng tìm thấy các chức năng cần thiết trở thành một vấn đề quan trọng. Tuy nhiên, hiện tại, việc đặt tên cho các gói có tính ngữ nghĩa tốt, từ tên gọi có thể hiểu đại khái về mục đích của chúng, điều này đã phần nào giảm bớt độ khó cho các nhà phát triển trong việc chuyển đổi.
Do vì phiên bản mới vừa được phát hành không lâu, nhiều dự án vẫn chưa thực hiện việc chuyển đổi. Ví dụ về phiên bản 2.x trên Solana Cookbook cũng còn khá ít. Hơn nữa, phiên bản mới có xu hướng sử dụng các chức năng được tích hợp sẵn trong runtime (như tạo cặp khóa), nhưng tài liệu mô tả về các phần này còn thiếu, 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 có 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 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 các 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 sự cố an ninh. Với sự phát hành của 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 gốc, loại bỏ việc đưa vào các phụ thuộc bên ngoài và Polyfills. Mặc dù có thể sẽ 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.
Điểm thay đổi quan trọng
kết nối
Trong phiên bản 1.x, Connection cung cấp nhiều phương thức. Nhưng 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 việc 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ó.
Phiên bản 2.x đã được thực hiện theo cách 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 phát đi yêu cầu HTTPS và thiết lập kết nối WSS để đăng ký trạng thái giao dịch, khi giao dịch được xác nhận sẽ trả về mã giao dịch.
cặp khóa
Phần liên quan đến khóa công khai và khóa riêng cũng có sự thay đổi lớn. 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ây giờ bạn có thể sử dụng await generateKeyPair() để tạo cặp khóa, trong khi trước đây bạn đã tạo bằng Keypair.generate().
Cần lưu ý rằng, 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ận dụng tối đa API Web Crypto của JavaScript, với việc sử dụng thực thi Ed25519 gốc. Nhiều phương thức trong API Web Crypto là bất đồng bộ. Tuy nhiên, sự thay đổi này không phải là điều không thể chấp nhận, vào cuối năm 2024 sắp tới, các nhà phát triển JavaScript đã rất quen thuộc với Promise.
Gửi giao dịch
Hai lớp Transaction và VersionedTransaction trong phiên bản 1.x không còn tồn tại trong phiên bản 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 tồn tại, vì vậy tất cả 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 không còn cung cấp lớp, Web3.js cung cấp dạng 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 mà trước đây là 1.x:
javascript import { pipe } from "@solana/web3.js"; import { getTransferSolInstruction } from "@solana-program/system";
const transaction = pipe( createTransaction({ version: 0 }), addInstruction( getTransferSolInstruction({ fromPublicKey, toPublicKey, lamports, }) ) );
Có thể thấy, giao dịch không còn được khởi xướng qua Connection nữa, mà là thông qua RPC Provider mà chúng tôi định nghĩa để tạo ra một hàm đặc biệt, sau đó gọi hàm đó để khởi xướng giao dịch. So với phiên bản 1.x, lượng mã đã tăng lên, nhưng tính 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 này rất phụ thuộc vào WSS, tin rằng trong tương lai ứng dụng WSS sẽ ngày càng rộng rãi, điều này thực sự đặt ra yêu cầu cao hơn về độ ổn định dịch vụ của nhà cung cấp RPC.
React
Đá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 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 hiệu quả, linh hoạt và tùy chỉnh để tương tác với mạng Solana, góp phần thúc đẩy việc áp dụng và phát triển nền tảng này.