Vault lượng tử

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.
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-vaultThêm pinocchio, pinocchio-system, và solana-nostd-sha256 và solana-winternitz:
cargo add pinocchio pinocchio-system solana-nostd-sha256 solana-winternitzKhai báo crate types trong Cargo.toml để sinh ra các tập tin triển khai trong target/deploy:
[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:
src
├── instructions
│ ├── close.rs
│ ├── open.rs
│ ├── mod.rs
│ └── split.rs
└── lib.rsLư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.
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.