Chủ đề thịnh hành
#
Bonk Eco continues to show strength amid $USELESS rally
#
Pump.fun to raise $1B token sale, traders speculating on airdrop
#
Boop.Fun leading the way with a new launchpad on Solana.
Tuần trước, @redacted_noah đã gửi một bài rant về việc Zero Copy™️ trên @anchorlang là alpha hoàn hảo cho mọi lập trình viên @solana
Tôi nghĩ rằng zero copy chỉ được sử dụng cho những tài khoản rất lớn
Tôi nhận ra rằng tôi không biết tại sao đôi khi tôi lại sử dụng nó
Tôi quyết định tìm hiểu sâu, hãy để tôi dẫn bạn theo 👇

@SuperteamFRANCE @SuperteamJapan Trước tiên, tại sao chúng ta lại nói về việc phân tích dữ liệu Zero copy?
Bộ phân tích dữ liệu mặc định của Anchor được gọi là Borsh.
Khi gọi một lệnh Anchor, Borsh sẽ sao chép dữ liệu tài khoản của bạn vào một cấu trúc Borsh (vào một vị trí bộ nhớ gọi là "heap", sẽ nói thêm về điều này sau)
Khi bạn bao gồm một tài khoản trong hướng dẫn của mình, bạn sử dụng định dạng trông như thế này.

Khi sử dụng zero copy, mã của bạn sẽ trông như thế này.

Vậy thực sự có chuyện gì đang xảy ra ở đó?
Điều này không rõ ràng ngay từ đầu!
Đầu tiên, chúng ta cần hiểu cách Solana sử dụng dữ liệu ứng dụng Rust của nó: heap, stack và không gian "zero copy".
1. Stack:
Đây là nơi chúng ta lưu trữ các kiểu dữ liệu đơn giản và cục bộ.
Bạn có 4KiB không gian cho mỗi stack, mỗi lần gọi hàm sẽ nhận được 4KiB phân bổ riêng.
"Lỗi vi phạm truy cập trong khung stack X tại địa chỉ XXXXX có kích thước X." là loại lỗi bạn nhận được khi vượt quá kích thước stack tối đa.
Trong Anchor, cách sửa lỗi đầu tiên cho lỗi này là sử dụng một `Box` để di chuyển dữ liệu từ stack sang "heap" 👇

2. Heap trong Solana:
Các chương trình chạy trong BPF VM với heap mặc định là 32KB. Đây là một lần cấp phát cho một lần gọi toàn bộ.
Đây là nơi bạn sẽ lưu trữ các kiểu dữ liệu động hơn (Vec, String)
Việc giải mã các tài khoản với Borsh sao chép dữ liệu vào heap, nhanh chóng chiếm dụng không gian.
3. Zero copy:
Nếu bạn phải bỏ qua heap và stack vì ngân sách dữ liệu của bạn bị vượt quá (nhiều CPI, với các tài khoản lớn) bạn sẽ sử dụng Zero copy.
Zero copy cho phép bạn làm việc với dữ liệu mà không cần phải cấp phát hay sao chép nó trước bằng cách bỏ qua quá trình giải mã.
Khi nào Zero copy có ý nghĩa?
1. Dữ liệu lớn
2. Làm việc với nhiều CPI
Hãy tiếp tục:
1. Dữ liệu lớn
Giả sử bạn muốn theo dõi một danh sách các ví ngay trong trạng thái của bạn để có thể thực hiện các kiểm tra hoàn toàn trên chuỗi (nếu bạn cần làm điều này, hãy tìm hiểu về cây merkle 😅, đây không phải là cách để làm điều đó)
Giống như trong một cuộc xổ số, lưu trữ địa chỉ của từng người tham gia trước khi thực hiện buổi rút thăm cuối cùng và chọn một người chiến thắng.
Điều này sẽ dễ dàng vượt quá 32kb bộ nhớ. Một người tham gia = 32 byte, vì vậy nếu bạn dự định thành công và phân bổ không gian cho 1000 người tham gia, điều này đã tiêu tốn toàn bộ kích thước heap (32 000 byte)
Trong tình huống này, bạn có thể sử dụng Zero copy để vượt qua giới hạn và cho phép làm việc với các tài khoản lớn hơn mà không chạm vào giới hạn heap hay stack.
LÀM THẾ NÀO ĐỂ SỬA?
Đơn giản! Chỉ cần sử dụng Zero Copy ở mọi nơi.
Nó dễ như thế này 👇 (thêm thuộc tính macro #[account("zero_copy")] vào tài khoản RootEscrow)
NHƯNG Zero Copy đi kèm với một thách thức khác, lý do mà Anchor đã chọn Borsh ngay từ đầu: căn chỉnh byte.

Căn chỉnh byte là một kỹ thuật cấp thấp mà mọi lập trình viên Solana nên hiểu, sử dụng zero copy hay không
Nó yêu cầu các cấu trúc phải an toàn với zero-copy thông qua bytemuck (căn chỉnh byte có thể gây ra panic nếu không được xử lý đúng cách)
Tôi sẽ công bố một chủ đề khác về chủ đề *hấp dẫn* này sớm thôi 🔥
Trong thời gian chờ đợi, hãy xem @legendsdotfun, sản phẩm mà tôi đã xây dựng từ giữa tháng Chín và tham gia vào hackathon @colosseum Cypherpunk.
Đăng ký sản phẩm của bạn, cho điểm upvote cho những đội mới đầy hứa hẹn.
Hãy cùng nhau làm cho mỗi huyền thoại solana tỏa sáng 🤝
Cảm ơn rất nhiều đến những người tuyệt vời:
- @redacted_noah
- @blockiosaurus
- @0xIchigo
Đã giúp đọc và chỉnh sửa chủ đề khám phá trực tiếp này!
6,11K
Hàng đầu
Thứ hạng
Yêu thích

