
Giải thích chi tiết quy trình Rollup của OP Stack và mã tương ứng
Tuyển chọn TechFlowTuyển chọn TechFlow

Giải thích chi tiết quy trình Rollup của OP Stack và mã tương ứng
OP Stack là một ngăn xếp phát triển được chuẩn hóa, chia sẻ và mã nguồn mở, hỗ trợ cho Optimism, do Optimism Collective bảo trì.
Tác giả: Rayer
Optimism Bedrock là phiên bản hiện tại của OP Stack. Phiên bản Bedrock cung cấp các công cụ để khởi chạy chuỗi khối Optimistic Rollup chất lượng sản xuất. Tại thời điểm này, các API ở các tầng khác nhau của OP Stack vẫn còn liên kết chặt chẽ với cấu hình Rollup của Stack.
Hai dịch vụ chính đảm nhận chức năng rollup trong Op-stack:
-
op-batcher: chịu trách nhiệm đọc nội dung giao dịch trên sequencer theo từng khoảng thời gian nhất định, sau đó đóng gói (rollup) dữ liệu lên lớp DA trên chuỗi.
-
op-proposer: chịu trách nhiệm đóng gói trạng thái giao dịch vào hợp đồng.
Kiến trúc Rollup
op-batcher
Sơ đồ quy trình thực thi op-batcher

Logic thực thi loadBlocksInfoState
loadBlocksInfoState chịu trách nhiệm đọc tất cả các khối kể từ khối đã đọc lần trước, tức là những khối chưa được đọc.
Quy trình tổng thể như sau:

Mã nguồn như sau:



loadBlocksIntoState thực hiện các hành động sau đây:
1. Lấy trạng thái đồng bộ từ sequencer
2. Dòng 153: gọi hàm calculateL2BlockRangeToStore
-
calculateL2BlockRangeToStore lấy và xác định số khối bắt đầu và kết thúc của L2 cần gửi, khối bắt đầu là khối cao nhất an toàn hiện tại của L2, khối kết thúc là khối không an toàn cao nhất hiện tại của L2.
3. Dòng 164: Sau khi có khối bắt đầu và khối kết thúc cần gửi, bắt đầu lấy thông tin khối từ khối bắt đầu, gọi hàm loadBlockIntoState để lấy khối
-
loadBlockIntoState kiểm tra thông tin khối và thông tin geth, nếu không có lỗi, dòng 200, gọi hàm
AddL2Blockđể thêm khối vào danh sách blocks []*types.Block trong channelManager.
4. Dòng 165 đến 168: Kiểm tra xem khối có cần gửi lại hay không, nếu cần thì đặt l.lastStoredBlock thành eth.BlockID{}; dòng 173, ngược lại thì đặt l.lastStoredBlock thành eth.ToBlockID(block), latestBlock thành block;
5. Dòng 177: L2BlockToBlockRef trích xuất thông tin cơ bản L2BlockRef từ nguồn tham chiếu khối L2, căn cứ theo số khối để khi cần thiết quay về thông tin genesis
Logic thực thi publishStateToL1
publishStateToL1 gửi tất cả các giao dịch trong hàng đợi lên mạng Layer1 cho đến khi không còn giao dịch nào trong hàng đợi hoặc xảy ra lỗi.
Mã nguồn như sau:

1. publishStateToL1 sẽ lặp đi lặp lại việc gửi các giao dịch trong hàng đợi lên mạng Layer1.
2. Dòng 377 gọi publishTxToL1.

publishTxToL1 là logic gửi một giao dịch đơn lẻ lên L1, phương thức publishTxToL1 thu thập dữ liệu cần gửi, xây dựng giao dịch và gửi lên mạng Layer1, đồng thời đưa giao dịch đã gửi vào kênh receiptCh chan TxReceipt[T].
-
Dòng 429:
l1Tip- Lấy tip hiện tại của L1 làm L1BlockRef. Giả định ngữ cảnh truyền vào là ngữ cảnh vòng đời, do đó nó được bao bọc bên trong bằng thời gian chờ mạng. -
Dòng 434:
recordL1Tip- Thay thế L1BlockRef trước đó bằng L1BlockRef mới nhất lấy được từ l1Tip -
Dòng 437:
TxData- Thu thập dữ liệu giao dịch cần rollup; TxData trả về dữ liệu tx tiếp theo cần gửi lên L1. Hiện tại, mỗi giao dịch chỉ sử dụng một khung (frame). Nếu kênh đang chờ đã đầy, nó chỉ trả về các khung còn lại của kênh đó cho đến khi gửi thành công hoàn toàn lên L1. Nếu không có khung nào đang chờ xử lý, nó sẽ trả về io.EOF. -
Dòng 447:
sendTransactiongửi giao dịch lên lớp một, đồng thời cập nhật trạng thái gửi giao dịch vào kênh receiptCh chan TxReceipt[T]; sendTransaction tạo giao dịch với «dữ liệu» đã cho và gửi nó đến địa chỉ hộp thư đến batch. Hiện tại nó sử dụng «txmgr» nền tảng để xử lý việc gửi giao dịch và quản lý giá. Đây là một phương thức chặn. Không nên gọi đồng thời.
handleReceipt
handleReceipt lấy trạng thái xử lý giao dịch từ kênh, và loại bỏ các giao dịch đã xử lý thành công khỏi kênh.
Mã nguồn như sau:
op-proposer
Sơ đồ thực thi
Chi tiết quy trình thực thi

FetchNextOutputInfo
FetchNextOutputInfo: Lấy output của khối trên L2, thuận tiện cho việc đóng gói và gửi sau này. Cấu trúc output trả về như sau:
type OutputResponse struct {Version Bytes32 json:"version"OutputRoot Bytes32 json:"outputRoot"BlockRef L2BlockRef json:"blockRef"WithdrawalStorageRoot common.Hash json:"withdrawalStorageRoot"StateRoot common.Hash json:"stateRoot"Status *SyncStatus json:"syncStatus"}
Mã nguồn như sau:

-
Dòng 224: NextBlockNumber - Lấy khoảng khối cần gửi cho đợt tiếp theo, khoảng tính toán là latestBlockNumber() + SUBMISSION_INTERVAL. Giá trị SUBMISSION_INTERVAL có thể được chỉ định khi triển khai hợp đồng L2OutputOracle.
-
Dòng 230: Gọi
FetchCurrentBlockNumberđể lấy số khối hiện tại -
Dòng 236 đến 241: Sau khi kiểm tra xong nextCheckpointBlock phù hợp quy tắc, gọi
FetchOutputđể lấy stateRoot cần gửi từ L2
Mã nguồn FetchCurrentBlockNumber như sau:

1. Dòng 254: SyncStatus - Lấy trạng thái và thông tin khối của SafeL2 và FinalizedL2 trên L2
Mã nguồn FetchOutput như sau:

2. Dòng 279: OutputAtBlock - Lấy output theo chiều cao khối, bên trong chứa stateRoot, ở đây cuối cùng gọi eth_getProof để tính toán và lấy stateRoot, quy trình gọi mã nguồn có thể tham khảo hình trên. Lưu ý: Không phải gửi stateRoot cho từng khối một lần, mà là căn cứ vào giá trị cấu hình SUBMISSION_INTERVAL để tính toán stateRoot cho một loạt khối, cuối cùng gửi stateRoot lên hợp đồng L2OutputOracle
Gửi giao dịch
-
sendTransaction: Sử dụng output để xây dựng giao dịch gửi stateRoot, gửi giao dịch lên chuỗi lớp một, chi tiết dữ liệu đóng gói giao dịch như sau
return abi.Pack( "proposeL2Output", output.OutputRoot, new(big.Int).SetUint64(output.BlockRef.Number), output.Status.CurrentL1.Hash, new(big.Int).SetUint64(output.Status.CurrentL1.Number))
Mã nguồn như sau:

Chào mừng tham gia cộng đồng chính thức TechFlow
Nhóm Telegram:https://t.me/TechFlowDaily
Tài khoản Twitter chính thức:https://x.com/TechFlowPost
Tài khoản Twitter tiếng Anh:https://x.com/BlockFlow_News















