Rust
Pinocchio Quantum Vault

Pinocchio Quantum Vault

9 Graduates

Vault lượng tử

Pinocchio Quantum Vault Challenge

A vault is một thành phần cơ bản trong DeFi cung cấp một cách an toàn cho người dùng để lưu trữ tài sản của họ.

Trong thử thách này, chúng ta sẽ xây dựng một vault sử dụng chữ ký Winternitz để xác minh giao dịch. Điều này đặc biệt thú vị vì chữ ký Winternitz là chữ ký hậu lượng tử đầu tiên được tích hợp trên Solana.

Nếu bạn không quen thuộc với chữ ký Winternitz, hãy bắt đầu bằng cách đọc Chữ ký Winternitz trên Solana để hiểu các khái niệm cốt lõi và mật mã cơ bản.

Trong thử thách này, chúng ta sẽ cập nhật vault lamport đơn giản mà chúng ta đã xây dựng trong Thử thách Vault Pinocchio để cho phép chữ ký Winternitz làm phương pháp xác minh cho các giao dịch.

Cài đặt

Trước khi bắt đầu, hãy đảm bảo rằng Rust và Pinocchio đã được cài đặt. Sau đó, chạy lệnh sau trong terminal của bạn:

# create workspace
cargo new blueshift-pinocchio-quantum-vault --lib --edition 2021
cd blueshift-pinocchio-quantum-vault

Thêm pinocchio, pinocchio-system, và solana-nostd-sha256solana-winternitz:

cargo add pinocchio pinocchio-system solana-nostd-sha256 solana-winternitz

Khai báo crate types trong Cargo.toml để sinh ra các tập tin triển khai trong target/deploy:

toml
[lib]
crate-type = ["lib", "cdylib"]

Bạn đã sẵn sàng để viết chương trình vault lượng tử của mình.

Mẫu

Lần này, chúng ta sẽ chia chương trình thành các module nhỏ, tập trung thay vì đặt mọi thứ vào lib.rs. Cấu trúc thư mục sẽ trông giống như sau:

text
src
├── instructions
│       ├── close.rs
│       ├── open.rs
│       ├── mod.rs
│       └── split.rs
└── lib.rs

Lưu ý: Nhớ thay đổi ID chương trình thành 22222222222222222222222222222222222222222222 vì chúng tôi sử dụng cái này để kiểm tra chương trình của bạn.

Entrypoint trong tệp lib.rs rất giống với những gì chúng tôi đã đề cập trong Khóa học Giới thiệu về Pinocchio.

rust
pub mod instructions;
use instructions::*;

use pinocchio::{
    account_info::AccountInfo, program_entrypoint, program_error::ProgramError,
    pubkey::Pubkey, ProgramResult,
};

program_entrypoint!(process_instruction);

// 22222222222222222222222222222222222222222222
pub const ID: Pubkey = [
    0x0f, 0x1e, 0x6b, 0x14, 0x21, 0xc0, 0x4a, 0x07, 
    0x04, 0x31, 0x26, 0x5c, 0x19, 0xc5, 0xbb, 0xee, 
    0x19, 0x92, 0xba, 0xe8, 0xaf, 0xd1, 0xcd, 0x07, 
    0x8e, 0xf8, 0xaf, 0x70, 0x47, 0xdc, 0x11, 0xf7, 
];

fn process_instruction(
    _program_id: &Pubkey,
    accounts: &[AccountInfo],
    instruction_data: &[u8],
) -> ProgramResult {    
    match instruction_data.split_first() {
        Some((OpenVault::DISCRIMINATOR, data)) => OpenVault::try_from((data, accounts))?.process(),
        Some((SplitVault::DISCRIMINATOR, data)) => SplitVault::try_from((data, accounts))?.process(),
        Some((CloseVault::DISCRIMINATOR, data)) => CloseVault::try_from((data, accounts))?.process(),
        _ => Err(ProgramError::InvalidInstructionData)
    }
}

Chúng tôi không cần bất kỳ thiết lập trạng thái nào ở đây, vì vậy chúng tôi chỉ cần chuyển sang việc tạo các instruction của mình.

Next PageMở Vault
HOẶC BỎ QUA ĐỂ LÀM THỬ THÁCH
Sẵn sàng làm thử thách?
Nội dung
Xem mã nguồn
Blueshift © 2025Commit: e573eab