Bài viết
Chia sẻ kiến thức của bạn.
How to Properly Use the Sui SDK for Frontend Integration?
I'm building a frontend (React/Next.js) for a Sui dApp and need to interact with the blockchain—fetching objects, sending transactions, and listening to events. I’ve tried using the @mysten/sui.js SDK, but I’m running into issues:
Wallet Connection: Sometimes, the wallet doesn’t return the user’s address after connecting.
Transaction Handling: Transactions fail silently or return vague errors.
RPC Limits: I get rate-limited or timeouts when fetching large datasets.
Real-Time Updates: How can I listen for on-chain events (e.g., NFT mints, balance changes)?
What I’ve tried:
✔ Basic SuiClient setup with mainnet and testnet RPCs.
✔ Using useWallet() from @mysten/dapp-kit for wallet integration.
✔ Manual transaction signing with signAndExecuteTransactionBlock.
Questions:
What’s the recommended way to initialize the Sui SDK in a frontend app?
How do I handle errors gracefully (e.g., RPC failures, wallet rejections)?
Are there best practices for optimizing queries (batching, caching, etc.)?
How can I subscribe to real-time updates (e.g., new transactions, object changes)?
- Sui
- SDKs and Developer Tools
Câu trả lời
2Chuyên gia trả lời:
- Khởi tạo SDK Sui SDK @mysten /sui.js phải được cấu hình với điểm cuối RPC đáng tin cậy. Đối với các ứng dụng sản xuất, hãy xem xét:
RPC mặc định:
ts
import { SuiClient, getFullnodeUrl } from '@mysten/sui.js/client';
const client = new SuiClient({ url: getFullnodeUrl('mainnet') });
RPC dự phòng: Sử dụng các dịch vụ như Nhà cung cấp RPC Sui để tránh giới hạn tỷ lệ.
Để tích hợp ví, hãy sử dụng @mysten /dapp-kit:
tsx
import { createNetworkConfig, SuiClientProvider, WalletProvider } from '@mysten/dapp-kit';
import { getFullnodeUrl } from '@mysten/sui.js/client';
const { networkConfig } = createNetworkConfig({
mainnet: { url: getFullnodeUrl('mainnet') },
testnet: { url: getFullnodeUrl('testnet') },
});
function App() {
return (
<SuiClientProvider networks={networkConfig} defaultNetwork="mainnet">
<WalletProvider autoConnect>
<YourApp />
</WalletProvider>
</SuiClientProvider>
);
}
- Xử lý giao dịch và lỗi Luôn bao bọc các giao dịch trong xử lý lỗi:
t
try {
const tx = await signAndExecuteTransactionBlock({
transactionBlock: txBlock,
options: { showEffects: true },
});
console.log("Tx Digest:", tx.digest);
} catch (err) {
console.error("Tx Failed:", err.message);
// Handle specific errors (e.g., user rejection, insufficient gas)
}
Các lỗi thường gặp:
“Người dùng đã từ chối yêu cầu” → Cửa sổ bật lên Ví đã bị đóng.
“Vượt ngân sách gas” → Tăng ngân sách gas với txblock.setgasBudget ().
“Object not found” → Kiểm tra xem ID đối tượng có chính xác và vẫn tồn tại không.
- Tối ưu hóa cuộc gọi RPC Yêu cầu theo lô: Sử dụng MultiGetObjects để tìm nạp nhiều đối tượng trong một cuộc gọi.
Bộ nhớ đệm: Sử dụng React Query hoặc SWR để lưu trữ các phản hồi RPC:
ts
import { useSuiClientQuery } from '@mysten/dapp-kit';
const { data } = useSuiClientQuery('getObject', {
id: objectId,
options: { showContent: true },
});
Phân trang: Đối với các tập dữ liệu lớn, sử dụng Suix_GetDynamicFields với con trỏ.
- Cập nhật thời gian thực Sử dụng WebSockets hoặc bỏ phiếu:
Đăng ký WebSocket (nâng cao):
ts
const unsubscribe = client.subscribeEvent({
filter: { sender: '0x123...' },
onMessage(event) { console.log("New event:", event); },
});
//Dọn dẹp khi tháo gỡ return () => hủy đăng ký (); Thăm dò ý kiến bằng móc:
ts
useSuiClientSubscription('subscribeEvent', {
filter: { eventType: 'ExampleEvent' },
onData(event) { console.log("Event:", event); },
});
Mẹo chuyên nghiệp
- Sử dụng @mysten /dapp-kit cho các móc ví được xây dựng sẵn.
- Đặt ngân sách gas tùy chỉnh cho các giao dịch phức tạp.
- Theo dõi tình trạng RPC - chuyển điểm cuối nếu phản hồi chậm.
- Kiểm tra trên Testnet trước khi triển khai mainnet.
###1. Khởi tạo SDK được đề xuất
Đối với React cấp độ sản xuất hoặc dApp Next.js, ngăn xếp được đề xuất kết hợp ba gói chính. Thiết lập này tách sự tương tác blockchain cấp thấp với quản lý trạng thái ứng dụng. [1, 2, 3]
*** Thư viện cốt lõi**:
*@mysten/sui.js
: SDK TypeScript nền tảng cho tất cả các tương tác mạng Sui trực tiếp. [4]
*@mysten/dapp-kit
: Thư viện React chính với các hook và các thành phần để kết nối ví và lấy dữ liệu. [2, 5, 6]
*@tanstack/react-query
: Một phụ thuộc bắt buộc để xử @mysten/dapp-kit
lý bộ nhớ đệm, tìm nạp lại và quản lý dữ liệu trên chuỗi dưới dạng trạng thái máy chủ. [1, 7]
*** Thiết lập nhà cung cấp**: Bọc thành phần gốc của ứng dụng với các nhà cung cấp này theo đúng thứ tự để đảm bảo tất cả các hook hoạt động bình thường. [3, 4]
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { SuiClientProvider, WalletProvider, createNetworkConfig } from '@mysten/dapp-kit';
import { getFullnodeUrl } from '@mysten/sui/client';
import '@mysten/dapp-kit/dist/index.css';
const queryClient = new QueryClient();
const { networkConfig } = createNetworkConfig({
mainnet: { url: getFullnodeUrl('mainnet') },
testnet: { url: getFullnodeUrl('testnet') },
});
function AppRoot() {
return (
<QueryClientProvider client={queryClient}>
<SuiClientProvider networks={networkConfig} defaultNetwork="mainnet">
<WalletProvider autoConnect>
{/* Your Application Components */}
</WalletProvider>
</SuiClientProvider>
</QueryClientProvider>
);
}
```
###**2. Xử lý lỗi duyên cảm**
Xử lý lỗi một cách hiệu quả là rất quan trọng đối với trải nghiệm người dùng. Đây là cách quản lý các vấn đề phổ biến.
***Lỗi kết nối ví: Vấn đề địa chỉ ví không khả dụng ngay sau khi kết nối thường là vấn đề trạng thái không đồng bộ.
***Giải pháp**: Luôn kiểm tra xem `account`đối tượng được trả về bởi `useCurrentAccount()`hook có phải là null hay không. Khi lấy dữ liệu phụ thuộc vào địa chỉ, hãy sử dụng `enabled:!!account`tùy chọn trong `useSuiClientQuery`để ngăn truy vấn chạy cho đến khi địa chỉ có sẵn. [3]
*** Lỗi giao dịch**: Lỗi RPC thô thường khó hiểu. Sử dụng `suiclient-error-decoder`thư viện để dịch chúng thành các tin nhắn có thể đọc được. [8, 9]
*** Chiến lượng**: Phối hợp với nhà phát triển hợp đồng thông minh của bạn để xác định bản đồ mã lỗi. `try...catch`Trong giao diện của bạn, hãy sử dụng bản đồ này với bộ giải mã để phân tích các lỗi mắc phải trong một khối.
<!-- end list -->
```typescript
import { useSignAndExecuteTransactionBlock } from '@mysten/dapp-kit';
import { SuiClientErrorDecoder } from 'suiclient-error-decoder';
// 1. Define your custom error map
const myErrorMap = { 1: "Mint limit has been reached." };
const errorDecoder = new SuiClientErrorDecoder({ customErrorCodes: myErrorMap });
// 2. Wrap your transaction call
const { mutateAsync: signAndExecute } = useSignAndExecuteTransactionBlock();
async function handleMint(txb) {
try {
await signAndExecute({ transactionBlock: txb });
console.log("Transaction successful!");
} catch (error) {
const decodedError = errorDecoder.parseError(error);
// Display decodedError.message to the user
console.error(decodedError.message);
}
}
```
*** Lỗi phổ biến**:
*`"User rejected the request"`: Người dùng đóng cửa sổ bật lên ví. [10, 11]
*`"InsufficientGas"`: Ngân sách gas quá thấp. Hãy để ví tự động đặt ngân sách; tránh cài đặt thủ công trừ khi cần thiết.
###**3. Tối ưu hóa truy cập**
Để tránh giới hạn tốc độ RPC và cải thiện hiệu suất, hãy sử dụng kết hợp phân lô, phân trang và bộ nhớ đệm.
***Động**: Thay vì lấy từng đối tượng một, hãy sử dụng `sui_multiGetObjects`để truy xuất dữ liệu cho tối đa 50 ID đối tượng trong một yêu cầu duy nhất. Điều này làm giảm đáng kể lưu lượng mạng.
`suix_getDynamicFields`***Trangination**: Đối với các tập dữ liệu lớn như trường động của đối tượng, hãy sử dụng các điểm cuối được phân trang như. Các điểm cuối này sử dụng con trỏ để tìm nạp dữ liệu từng trang, ngăn chặn thời gian chờ.
***Caching**: `useSuiClientQuery`Hook từ `@mysten/dapp-kit`tự động lưu các phản hồi vào bộ nhớ đệm. [1, 5] Để tối ưu hóa hơn nữa, hãy đặt một `staleTime`cho dữ liệu không thay đổi thường xuyên (ví dụ: siêu dữ liệu NFT). Điều này yêu cầu React Query phục vụ dữ liệu được lưu trong bộ nhớ cache trong một khoảng thời gian xác định trước khi lấy lại, giảm các cuộc gọi RPC dư thừa. [7, 12, 13]
```typescript
const { data } = useSuiClientQuery(
'getObject',
{ id: objectId, options: { showContent: true } },
{ staleTime: 10 * 60 * 1000 } // Cache is fresh for 10 minutes
);
```
*** Nhà cung cấp RPC**: Đối với các ứng dụng sản xuất, hãy sử dụng nhà cung cấp RPC chuyên dụng như QuickNode, Ankr hoặc Chainstack để đảm bảo độ tin cậy và tránh giới hạn tỷ lệ nghiêm ngặt của các điểm cuối công cộng. [14, 15, 16]
###**4. Cập nhật thời gian thực**
Có ba phương pháp chính để nghe các sự kiện trên chuỗi, mỗi phương pháp có sự đánh đổi khác nhau.
1.** Thăm dòng**: Phương pháp đơn giản nhất. Sử dụng `useSuiClientQuery`với a `refetchInterval`để định kỳ yêu cầu mạng cập nhật. Điều này phù hợp với dữ liệu không quan trọng trong đó độ trễ vài giây là chấp nhận được. [17]
2.** Đăng ký WebSocket**: Phương pháp này cung cấp các bản cập nhật thời gian thực, độ trễ thấp. Tuy nhiên, API WebSocket Sui JSON-RPC chính thức không được sử dụng, vì vậy bạn phải sử dụng nhà cung cấp RPC bên thứ ba cung cấp hỗ trợ WebSocket. [18, 19] Bạn có thể sử dụng `client.subscribeEvent`để nghe các sự kiện cụ thể và phải quản lý vòng đời đăng ký một cách cẩn thận trong một `useEffect`hook React để ngăn chặn rò rỉ bộ nhớ. [20, 21, 22]
```typescript
useEffect(() => {
const unsubscribe = await client.subscribeEvent({
filter: { MoveEventModule: { package: '0x...', module: 'my_module' } },
onMessage: (event) => {
console.log("New event:", event);
},
});
// Cleanup on component unmount
return () => {
unsubscribe();
};
},);
```
3.** Chỉ mục tùy chỉnh**: Giải pháp mạnh mẽ và đáng tin cậy nhất cho các ứng dụng quan trọng. Trình lập chỉ mục là một dịch vụ phụ trợ chuyên dụng xử lý tất cả dữ liệu trên chuỗi và lưu trữ nó trong cơ sở dữ liệu được tối ưu hóa. Điều này cho phép các truy vấn phức tạp, độ trễ thấp mà không thể thực hiện được với API RPC tiêu chuẩn. Cách tiếp cận này được khuyến nghị cho các nền tảng DeFi, chơi game hoặc phân tích cấp độ sản xuất. [9, 23, 24]
Bạn có biết câu trả lời không?
Hãy đăng nhập và chia sẻ nó.
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Kiếm phần của bạn từ 1000 Sui
Tích lũy điểm danh tiếng và nhận phần thưởng khi giúp cộng đồng Sui phát triển.

- ... SUIBigSneh+1396
- ... SUISuiLover+1333
- ... SUI0xduckmove+1207
- ... SUIThorfin+1202
- ... SUIPaul+1030
- ... SUIOwen+970
- ... SUIharry phan+847
- Tại sao BCS yêu cầu thứ tự trường chính xác để khử chuỗi khi cấu trúc Move có các trường được đặt tên?53
- Nhiều lỗi xác minh nguồn” trong các ấn phẩm về mô-đun Sui Move - Giải quyết lỗi tự động43
- Giao dịch Sui thất bại: Đối tượng được dành riêng cho giao dịch khác25
- Làm thế nào để các ràng buộc về khả năng tương tác với các trường động trong các bộ sưu tập không đồng nhất?05