Solana Web3.js 2.x phiên bản: Trải nghiệm lập trình hàm hoàn toàn mới
Thư viện JavaScript đầy đủ tính năng 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. So với phiên bản 1.x, phiên bản mới mang đến một loạt những thay đổi quan trọng, 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 vẫn chưa phổ biến, 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 hiểu trước những thay đổi này sẽ mang lại nhiều lợi ích cho công việc chuyển đổi 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 trong đó. 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 quát tất cả các chức năng mà nhà phát triển cần. Hơn nữa, mã mẫu phong phú trong Solana cookbook cũng mang lại sự tiện lợi lớn 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, 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 khoảng thời gian tải nhất định.
So với trước, phiên bản 2.x áp dụng tư duy thiết kế mô-đun. Nhóm chính thức đã tách mã nguồn hiện có thành nhiều mô-đun nhỏ, chẳng hạn 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 thực hiện dựa trên lớp và chuyển sang cách sử dụng hàm đơn, điều này rất hữu ích cho việc tối ưu hóa khi xây dựng mã JavaScript. 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. Theo thống kê từ tài liệu chính thức, DApp sử dụng phiên bản mới có thể đạt được tối ưu hóa dung lượng lên đến 30%. Nếu chỉ sử dụng một số chức năng nhất định, tỷ lệ tối ưu hóa có thể 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 giúp các nhà phát triển nhanh chóng xác định chức năng cần thiết trở thành một vấn đề then chốt. Hiện tại, việc đặt tên các gói có tính ngữ nghĩa tốt, từ tên gọi có thể phỏng đoán được công dụng của chúng, điều này phần nào giảm bớt khó khăn cho các nhà phát triển khi chuyển đổi.
Tuy nhiên, do 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 hoàn thành 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 hạn chế. Hơn nữa, 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), nhưng mô tả về những phần này trong tài liệu chưa đủ chi tiết, 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 ảnh hưởng nhiều đến người dùng thông thườ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 quá nhiều đầu vào và phụ thuộc bên ngoài có thể làm tăng đáng kể rủi ro sự cố bảo mật. Với sự ra mắt của phiên bản 2.x, đội ngũ phát triển Web3.js đã quyết định tận dụng nhiều hơn các tính năng bản địa, giảm thiểu việc nhập các phụ thuộc bên ngoài và 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.
Điểm thay đổi quan trọng
kết nối
Trong phiên bản 1.x, lớp Connection cung cấp rất nhiều phương thức. Nhưng chức năng cốt lõi của nó vẫn là tạo ra 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 đã sử dụng cách tiếp cận hàm nhiều hơn để thực hiện chức năng này:
javascript
import { createSolanaRpc } from "@solana/web3.js";
const rpc = createSolanaRpc("");
Khi chúng ta gọi sendAndConfirmTransaction để gửi giao dịch, nó sẽ tự động khởi tạo yêu cầu HTTPS và thiết lập một kết nối WSS để đă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 khai và khóa riêng cũng có sự thay đổi lớn. 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, thay vào đó là một số hàm.
Ví dụ, có thể sử dụng await generateKeyPair() để tạo cặp khóa, thay vì trước đây là Keypair.generate().
Cần lưu ý rằng, phương thức 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 Web Crypto API của JavaScript, sử dụng việc triển khai Ed25519 gốc. Nhiều phương thức của Web Crypto API là bất đồng bộ. Tuy nhiên, đối với các nhà phát triển JavaScript quen thuộc với Promise, sự thay đổi này chắc chắn không khó để thích nghi.
gửi giao dịch
Các lớp Transaction và VersionedTransaction trong phiên bản 1.x không còn tồn tại trong 2.x.
Các phương pháp 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, 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 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 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: sender,
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 RPC Provider 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, nhưng khả năng tùy chỉnh thì mạnh mẽ hơn.
Giao dịch được khởi xướ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 của 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ề sự ổn định dịch vụ của 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 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. Phiên bản mới 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 biến với mạng Solana, hứa hẹn sẽ thúc đẩy việc áp dụng và phát triển nền tảng này.
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
9 thích
Phần thưởng
9
5
Chia sẻ
Bình luận
0/400
RugPullSurvivor
· 07-12 23:48
Sửa đổi cũng như không sửa... còn không bằng viết lại toàn bộ.
Solana Web3.js phiên bản 2.x: Nâng cấp lớn về thiết kế mô-đun và lập trình hàm
Solana Web3.js 2.x phiên bản: Trải nghiệm lập trình hàm hoàn toàn mới
Thư viện JavaScript đầy đủ tính năng 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. So với phiên bản 1.x, phiên bản mới mang đến một loạt những thay đổi quan trọng, 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 vẫn chưa phổ biến, 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 hiểu trước những thay đổi này sẽ mang lại nhiều lợi ích cho công việc chuyển đổi 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 trong đó. 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 quát tất cả các chức năng mà nhà phát triển cần. Hơn nữa, mã mẫu phong phú trong Solana cookbook cũng mang lại sự tiện lợi lớn 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, 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 khoảng thời gian tải nhất định.
So với trước, phiên bản 2.x áp dụng tư duy thiết kế mô-đun. Nhóm chính thức đã tách mã nguồn hiện có thành nhiều mô-đun nhỏ, chẳng hạn 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 thực hiện dựa trên lớp và chuyển sang cách sử dụng hàm đơn, điều này rất hữu ích cho việc tối ưu hóa khi xây dựng mã JavaScript. 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. Theo thống kê từ tài liệu chính thức, DApp sử dụng phiên bản mới có thể đạt được tối ưu hóa dung lượng lên đến 30%. Nếu chỉ sử dụng một số chức năng nhất định, tỷ lệ tối ưu hóa có thể 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 giúp các nhà phát triển nhanh chóng xác định chức năng cần thiết trở thành một vấn đề then chốt. Hiện tại, việc đặt tên các gói có tính ngữ nghĩa tốt, từ tên gọi có thể phỏng đoán được công dụng của chúng, điều này phần nào giảm bớt khó khăn cho các nhà phát triển khi chuyển đổi.
Tuy nhiên, do 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 hoàn thành 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 hạn chế. Hơn nữa, 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), nhưng mô tả về những phần này trong tài liệu chưa đủ chi tiết, 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 ảnh hưởng nhiều đến người dùng thông thườ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 quá nhiều đầu vào và phụ thuộc bên ngoài có thể làm tăng đáng kể rủi ro sự cố bảo mật. Với sự ra mắt của phiên bản 2.x, đội ngũ phát triển Web3.js đã quyết định tận dụng nhiều hơn các tính năng bản địa, giảm thiểu việc nhập các phụ thuộc bên ngoài và 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.
Điểm thay đổi quan trọng
kết nối
Trong phiên bản 1.x, lớp Connection cung cấp rất nhiều phương thức. Nhưng chức năng cốt lõi của nó vẫn là tạo ra 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 đã sử dụng cách tiếp cận hàm nhiều hơn để thực hiện chức năng này:
javascript import { createSolanaRpc } from "@solana/web3.js";
const rpc = createSolanaRpc("");
Khi chúng ta gọi sendAndConfirmTransaction để gửi giao dịch, nó sẽ tự động khởi tạo yêu cầu HTTPS và thiết lập một kết nối WSS để đă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 khai và khóa riêng cũng có sự thay đổi lớn. 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, thay vào đó là một số hàm.
Ví dụ, có thể sử dụng await generateKeyPair() để tạo cặp khóa, thay vì trước đây là Keypair.generate().
Cần lưu ý rằng, phương thức 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 Web Crypto API của JavaScript, sử dụng việc triển khai Ed25519 gốc. Nhiều phương thức của Web Crypto API là bất đồng bộ. Tuy nhiên, đối với các nhà phát triển JavaScript quen thuộc với Promise, sự thay đổi này chắc chắn không khó để thích nghi.
gửi giao dịch
Các lớp Transaction và VersionedTransaction trong phiên bản 1.x không còn tồn tại trong 2.x.
Các phương pháp 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, 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 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 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: sender, toPubkey: recipient, lamports: số lượng })) );
const signature = await sendAndConfirmTransaction(rpc, transaction, [senderKeypair]);
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 RPC Provider 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, nhưng khả năng tùy chỉnh thì mạnh mẽ hơn.
Giao dịch được khởi xướ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 của 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ề sự ổn định dịch vụ của 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 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. Phiên bản mới 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 biến với mạng Solana, hứa hẹn sẽ thúc đẩy việc áp dụng và phát triển nền tảng này.