Upload documentation/whitepaper.md with huggingface_hub
Browse files- documentation/whitepaper.md +1079 -0
documentation/whitepaper.md
ADDED
|
@@ -0,0 +1,1079 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# COLDSTAR: A Python-Based Air-Gapped Cold Wallet Tool for Solana
|
| 2 |
+
|
| 3 |
+
**Technical Whitepaper - Current Implementation**
|
| 4 |
+
|
| 5 |
+
---
|
| 6 |
+
|
| 7 |
+
**Version:** 1.0.0
|
| 8 |
+
**Author:** </Syrem>
|
| 9 |
+
**Organization:** ChainLabs Technologies
|
| 10 |
+
**Date:** December 2025
|
| 11 |
+
**License:** MIT License (Open Source)
|
| 12 |
+
|
| 13 |
+
---
|
| 14 |
+
|
| 15 |
+
## Abstract
|
| 16 |
+
|
| 17 |
+
Coldstar is an open-source, command-line cold wallet management tool for the Solana blockchain that prioritizes security through air-gapped transaction signing. This whitepaper describes the current implementation—a Python-based CLI application that enables users to create bootable USB cold wallets, generate Ed25519 keypairs offline, and sign transactions without network exposure. By leveraging Alpine Linux as a minimal operating system and industry-standard cryptographic libraries, Coldstar provides enterprise-grade security with full code transparency and reproducibility.
|
| 18 |
+
|
| 19 |
+
**Key Features:**
|
| 20 |
+
- Complete air-gap isolation during private key generation and transaction signing
|
| 21 |
+
- Minimal Alpine Linux (~50MB) bootable USB creation
|
| 22 |
+
- Python-based terminal interface with rich UI components
|
| 23 |
+
- Ed25519 cryptographic operations using audited libraries
|
| 24 |
+
- Offline transaction signing with online broadcasting separation
|
| 25 |
+
- Cross-platform support (Windows, Linux, macOS)
|
| 26 |
+
|
| 27 |
+
---
|
| 28 |
+
|
| 29 |
+
## Table of Contents
|
| 30 |
+
|
| 31 |
+
1. [Introduction](#1-introduction)
|
| 32 |
+
2. [System Architecture](#2-system-architecture)
|
| 33 |
+
3. [Implementation Details](#3-implementation-details)
|
| 34 |
+
4. [Security Model](#4-security-model)
|
| 35 |
+
5. [User Guide](#5-user-guide)
|
| 36 |
+
6. [Cryptographic Operations](#6-cryptographic-operations)
|
| 37 |
+
7. [Threat Analysis](#7-threat-analysis)
|
| 38 |
+
8. [Performance & Scalability](#8-performance--scalability)
|
| 39 |
+
9. [Conclusion](#9-conclusion)
|
| 40 |
+
|
| 41 |
+
---
|
| 42 |
+
|
| 43 |
+
## 1. Introduction
|
| 44 |
+
|
| 45 |
+
### 1.1 Motivation
|
| 46 |
+
|
| 47 |
+
The security of cryptocurrency holdings fundamentally depends on private key protection. Despite advances in wallet technology, users face a critical dilemma: hot wallets (online) offer convenience but expose keys to network attacks, while cold storage (offline) provides security at the cost of usability. Hardware wallets attempt to bridge this gap but introduce vendor dependencies, closed-source firmware risks, and cost barriers.
|
| 48 |
+
|
| 49 |
+
### 1.2 Coldstar's Solution
|
| 50 |
+
|
| 51 |
+
Coldstar addresses these challenges through a software-defined cold wallet approach:
|
| 52 |
+
|
| 53 |
+
- **No Proprietary Hardware:** Works with commodity USB drives ($5-10)
|
| 54 |
+
- **Full Transparency:** 100% open-source Python codebase
|
| 55 |
+
- **Air-Gap Architecture:** Private keys never touch internet-connected systems
|
| 56 |
+
- **Minimal OS:** Alpine Linux reduces attack surface to ~50MB
|
| 57 |
+
- **Developer-Friendly:** Command-line interface for power users and automation
|
| 58 |
+
|
| 59 |
+
### 1.3 Scope of This Document
|
| 60 |
+
|
| 61 |
+
This whitepaper documents the **current implementation** (v1.0) of Coldstar—a Python CLI tool. It covers:
|
| 62 |
+
- Architecture and component design
|
| 63 |
+
- Cryptographic implementation details
|
| 64 |
+
- Security model and threat mitigation
|
| 65 |
+
- Operational procedures and workflows
|
| 66 |
+
- Performance characteristics
|
| 67 |
+
|
| 68 |
+
This document does NOT cover future enhancements or planned features. It represents a snapshot of the production-ready system as deployed.
|
| 69 |
+
|
| 70 |
+
---
|
| 71 |
+
|
| 72 |
+
## 2. System Architecture
|
| 73 |
+
|
| 74 |
+
### 2.1 High-Level Overview
|
| 75 |
+
|
| 76 |
+
Coldstar employs a three-component architecture:
|
| 77 |
+
|
| 78 |
+
```
|
| 79 |
+
┌────────────────────────────────────────────────────────────────┐
|
| 80 |
+
│ HOST SYSTEM (Online) │
|
| 81 |
+
│ ┌──────────────────────────────────────────────────────────┐ │
|
| 82 |
+
│ │ Coldstar CLI Application │ │
|
| 83 |
+
│ │ • Python 3.11+ │ │
|
| 84 |
+
│ │ • Rich terminal UI │ │
|
| 85 |
+
│ │ • USB device management │ │
|
| 86 |
+
│ │ • Solana RPC communication │ │
|
| 87 |
+
│ │ • Transaction broadcasting │ │
|
| 88 |
+
│ └──────────────────────────────────────────────────────────┘ │
|
| 89 |
+
└────────────────────────────────────────────────────────────────┘
|
| 90 |
+
│
|
| 91 |
+
│ USB Transfer (manual)
|
| 92 |
+
▼
|
| 93 |
+
┌────────────────────────────────────────────────────────────────┐
|
| 94 |
+
│ AIR-GAPPED SYSTEM (Offline) │
|
| 95 |
+
│ ┌──────────────────────────────────────────────────────────┐ │
|
| 96 |
+
│ │ Bootable USB Cold Wallet │ │
|
| 97 |
+
│ │ • Alpine Linux v3.19 (minimal rootfs) │ │
|
| 98 |
+
│ │ • Keypair stored in /wallet/keypair.json │ │
|
| 99 |
+
│ │ • Transaction signing scripts │ │
|
| 100 |
+
│ │ • Network drivers blacklisted │ │
|
| 101 |
+
│ └──────────────────────────────────────────────────────────┘ │
|
| 102 |
+
└────────────────────────────────────────────────────────────────┘
|
| 103 |
+
│
|
| 104 |
+
│ File-based transfer (manual)
|
| 105 |
+
▼
|
| 106 |
+
┌────────────────────────────────────────────────────────────────┐
|
| 107 |
+
│ SOLANA NETWORK (Public) │
|
| 108 |
+
│ • Mainnet / Devnet / Testnet │
|
| 109 |
+
│ • RPC endpoints for balance queries │
|
| 110 |
+
│ • Transaction broadcasting │
|
| 111 |
+
└────────────────────────────────────────────────────────────────┘
|
| 112 |
+
```
|
| 113 |
+
|
| 114 |
+
### 2.2 Component Breakdown
|
| 115 |
+
|
| 116 |
+
#### 2.2.1 CLI Application (Python)
|
| 117 |
+
|
| 118 |
+
The command-line interface provides the following functionality:
|
| 119 |
+
|
| 120 |
+
**Core Modules:**
|
| 121 |
+
|
| 122 |
+
| Module | Responsibility | Lines of Code |
|
| 123 |
+
|--------|---------------|---------------|
|
| 124 |
+
| `main.py` | Application entry point, menu orchestration | ~980 |
|
| 125 |
+
| `src/wallet.py` | Keypair generation, storage, loading | ~140 |
|
| 126 |
+
| `src/transaction.py` | Transaction creation, signing, serialization | ~210 |
|
| 127 |
+
| `src/network.py` | Solana RPC client, balance queries | ~150 |
|
| 128 |
+
| `src/usb.py` | USB device detection, mounting | ~200 |
|
| 129 |
+
| `src/iso_builder.py` | Alpine Linux ISO creation | ~250 |
|
| 130 |
+
| `src/ui.py` | Terminal UI components (Rich library) | ~240 |
|
| 131 |
+
| `config.py` | Configuration constants | ~50 |
|
| 132 |
+
|
| 133 |
+
**Total: ~2,220 lines of Python code**
|
| 134 |
+
|
| 135 |
+
**Dependencies:**
|
| 136 |
+
- `rich` - Terminal UI rendering
|
| 137 |
+
- `questionary` - Interactive prompts
|
| 138 |
+
- `solana` - Solana Python SDK
|
| 139 |
+
- `solders` - Rust-based Solana types (faster, safer)
|
| 140 |
+
- `pynacl` - Ed25519 cryptographic operations
|
| 141 |
+
- `httpx` - Async HTTP client for RPC
|
| 142 |
+
- `base58` - Address encoding
|
| 143 |
+
|
| 144 |
+
#### 2.2.2 USB Cold Wallet Device
|
| 145 |
+
|
| 146 |
+
**Operating System:** Alpine Linux v3.19 x86_64
|
| 147 |
+
|
| 148 |
+
**Filesystem Layout:**
|
| 149 |
+
```
|
| 150 |
+
/
|
| 151 |
+
├── wallet/ # Keypair storage
|
| 152 |
+
│ ├── keypair.json # Ed25519 private key (64 bytes as JSON array)
|
| 153 |
+
│ └── pubkey.txt # Base58-encoded public key
|
| 154 |
+
├── inbox/ # Unsigned transactions (copied from host)
|
| 155 |
+
├── outbox/ # Signed transactions (copied to host)
|
| 156 |
+
├── scripts/
|
| 157 |
+
│ └── sign_tx.sh # Transaction signing helper script
|
| 158 |
+
├── boot/ # GRUB bootloader
|
| 159 |
+
├── etc/
|
| 160 |
+
│ ├── network.blacklist # Disabled kernel modules
|
| 161 |
+
│ └── fstab # Filesystem mounting rules
|
| 162 |
+
└── [Alpine Linux minimal rootfs]
|
| 163 |
+
```
|
| 164 |
+
|
| 165 |
+
**Size:** ~50MB (vs. ~4GB for Ubuntu Server)
|
| 166 |
+
|
| 167 |
+
**Security Customizations:**
|
| 168 |
+
- Network kernel modules blacklisted (`e1000`, `iwlwifi`, `r8169`, etc.)
|
| 169 |
+
- Read-only root filesystem
|
| 170 |
+
- No package manager accessible
|
| 171 |
+
- Minimal process footprint
|
| 172 |
+
|
| 173 |
+
#### 2.2.3 Data Flow
|
| 174 |
+
|
| 175 |
+
**Wallet Creation Flow:**
|
| 176 |
+
1. CLI detects USB device → Confirms with user
|
| 177 |
+
2. CLI downloads Alpine rootfs → Validates checksum
|
| 178 |
+
3. CLI creates custom ISO with wallet structure
|
| 179 |
+
4. User flashes ISO to USB using external tool (Rufus, dd, balenaEtcher)
|
| 180 |
+
5. User boots air-gapped PC from USB
|
| 181 |
+
6. Boot script generates Ed25519 keypair → Stores in `/wallet/`
|
| 182 |
+
7. Public key displayed on screen → User records it
|
| 183 |
+
|
| 184 |
+
**Transaction Signing Flow:**
|
| 185 |
+
1. User creates transaction on online host (CLI)
|
| 186 |
+
2. CLI builds unsigned transaction → Saves to file
|
| 187 |
+
3. User manually copies file to USB `/inbox/` (physical transfer)
|
| 188 |
+
4. User boots USB on air-gapped system
|
| 189 |
+
5. User runs `sign_tx.sh` script → Signs with private key
|
| 190 |
+
6. Signed transaction written to `/outbox/`
|
| 191 |
+
7. User copies signed TX back to online host
|
| 192 |
+
8. CLI broadcasts signed transaction → Solana network
|
| 193 |
+
|
| 194 |
+
---
|
| 195 |
+
|
| 196 |
+
## 3. Implementation Details
|
| 197 |
+
|
| 198 |
+
### 3.1 Keypair Management (`src/wallet.py`)
|
| 199 |
+
|
| 200 |
+
**Generation:**
|
| 201 |
+
```python
|
| 202 |
+
from solders.keypair import Keypair
|
| 203 |
+
|
| 204 |
+
class WalletManager:
|
| 205 |
+
def generate_keypair(self) -> Tuple[Keypair, str]:
|
| 206 |
+
"""Generate Ed25519 keypair using OS entropy."""
|
| 207 |
+
self.keypair = Keypair() # Uses /dev/urandom on Linux/macOS
|
| 208 |
+
public_key = str(self.keypair.pubkey())
|
| 209 |
+
return self.keypair, public_key
|
| 210 |
+
```
|
| 211 |
+
|
| 212 |
+
**Storage Format:**
|
| 213 |
+
```json
|
| 214 |
+
[
|
| 215 |
+
123, 45, 67, 89, 12, 34, ... // 64-byte array
|
| 216 |
+
// Bytes 0-31: Ed25519 seed (private key)
|
| 217 |
+
// Bytes 32-63: Public key (derived)
|
| 218 |
+
]
|
| 219 |
+
```
|
| 220 |
+
|
| 221 |
+
**Security Measures:**
|
| 222 |
+
- File permissions: `chmod 600` (owner read/write only)
|
| 223 |
+
- Keypair never logged or transmitted over network
|
| 224 |
+
- Optional: User can encrypt keypair file with GPG
|
| 225 |
+
|
| 226 |
+
### 3.2 Transaction Operations (`src/transaction.py`)
|
| 227 |
+
|
| 228 |
+
**Creating Unsigned Transactions:**
|
| 229 |
+
```python
|
| 230 |
+
def create_transfer_transaction(
|
| 231 |
+
self,
|
| 232 |
+
from_pubkey: str,
|
| 233 |
+
to_pubkey: str,
|
| 234 |
+
amount_sol: float,
|
| 235 |
+
recent_blockhash: str
|
| 236 |
+
) -> Optional[bytes]:
|
| 237 |
+
"""Build unsigned SOL transfer transaction."""
|
| 238 |
+
from_pk = Pubkey.from_string(from_pubkey)
|
| 239 |
+
to_pk = Pubkey.from_string(to_pubkey)
|
| 240 |
+
lamports = int(amount_sol * LAMPORTS_PER_SOL)
|
| 241 |
+
blockhash = Hash.from_string(recent_blockhash)
|
| 242 |
+
|
| 243 |
+
# Create transfer instruction
|
| 244 |
+
transfer_ix = transfer(TransferParams(
|
| 245 |
+
from_pubkey=from_pk,
|
| 246 |
+
to_pubkey=to_pk,
|
| 247 |
+
lamports=lamports
|
| 248 |
+
))
|
| 249 |
+
|
| 250 |
+
# Build message and transaction
|
| 251 |
+
message = Message.new_with_blockhash([transfer_ix], from_pk, blockhash)
|
| 252 |
+
tx = Transaction.new_unsigned(message)
|
| 253 |
+
|
| 254 |
+
self.unsigned_tx = bytes(tx)
|
| 255 |
+
return self.unsigned_tx
|
| 256 |
+
```
|
| 257 |
+
|
| 258 |
+
**Signing Transactions:**
|
| 259 |
+
```python
|
| 260 |
+
def sign_transaction(self, keypair: Keypair) -> Optional[bytes]:
|
| 261 |
+
"""Sign transaction with Ed25519 keypair."""
|
| 262 |
+
if not self.unsigned_tx:
|
| 263 |
+
return None
|
| 264 |
+
|
| 265 |
+
# Deserialize unsigned transaction
|
| 266 |
+
tx = Transaction.from_bytes(self.unsigned_tx)
|
| 267 |
+
|
| 268 |
+
# Sign message
|
| 269 |
+
tx.sign([keypair], tx.message.recent_blockhash)
|
| 270 |
+
|
| 271 |
+
self.signed_tx = bytes(tx)
|
| 272 |
+
return self.signed_tx
|
| 273 |
+
```
|
| 274 |
+
|
| 275 |
+
### 3.3 Network Communication (`src/network.py`)
|
| 276 |
+
|
| 277 |
+
**RPC Client:**
|
| 278 |
+
```python
|
| 279 |
+
from solana.rpc.async_api import AsyncClient
|
| 280 |
+
from solana.rpc.commitment import Confirmed
|
| 281 |
+
|
| 282 |
+
class SolanaNetwork:
|
| 283 |
+
def __init__(self, rpc_url: str = SOLANA_RPC_URL):
|
| 284 |
+
self.rpc_url = rpc_url
|
| 285 |
+
self.client = AsyncClient(rpc_url, commitment=Confirmed)
|
| 286 |
+
|
| 287 |
+
async def get_balance(self, public_key: str) -> Optional[float]:
|
| 288 |
+
"""Query wallet balance in SOL."""
|
| 289 |
+
pubkey = Pubkey.from_string(public_key)
|
| 290 |
+
response = await self.client.get_balance(pubkey)
|
| 291 |
+
|
| 292 |
+
if response.value is not None:
|
| 293 |
+
return response.value / LAMPORTS_PER_SOL
|
| 294 |
+
return None
|
| 295 |
+
|
| 296 |
+
async def broadcast_transaction(self, signed_tx: bytes) -> Optional[str]:
|
| 297 |
+
"""Submit signed transaction to network."""
|
| 298 |
+
response = await self.client.send_raw_transaction(signed_tx)
|
| 299 |
+
return str(response.value) if response.value else None
|
| 300 |
+
```
|
| 301 |
+
|
| 302 |
+
**Supported Networks:**
|
| 303 |
+
- Mainnet-Beta: `https://api.mainnet-beta.solana.com`
|
| 304 |
+
- Devnet: `https://api.devnet.solana.com`
|
| 305 |
+
- Testnet: `https://api.testnet.solana.com`
|
| 306 |
+
- Custom RPC: Configurable in `config.py`
|
| 307 |
+
|
| 308 |
+
### 3.4 USB Device Management (`src/usb.py`)
|
| 309 |
+
|
| 310 |
+
**Detection (Windows):**
|
| 311 |
+
```python
|
| 312 |
+
def detect_usb_devices_windows(self) -> List[Dict]:
|
| 313 |
+
"""Use WMIC to detect USB drives."""
|
| 314 |
+
cmd = 'wmic diskdrive where "InterfaceType=\'USB\'" get Caption,DeviceID,Size'
|
| 315 |
+
result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
|
| 316 |
+
|
| 317 |
+
devices = []
|
| 318 |
+
for line in result.stdout.splitlines()[1:]:
|
| 319 |
+
if line.strip():
|
| 320 |
+
parts = line.split()
|
| 321 |
+
devices.append({
|
| 322 |
+
'device': parts[-2],
|
| 323 |
+
'model': ' '.join(parts[:-2]),
|
| 324 |
+
'size': self._format_size(int(parts[-1]))
|
| 325 |
+
})
|
| 326 |
+
return devices
|
| 327 |
+
```
|
| 328 |
+
|
| 329 |
+
**Detection (Linux):**
|
| 330 |
+
```python
|
| 331 |
+
def detect_usb_devices_linux(self) -> List[Dict]:
|
| 332 |
+
"""Use lsblk to detect USB drives."""
|
| 333 |
+
cmd = ['lsblk', '-d', '-o', 'NAME,SIZE,TRAN,MODEL', '-J']
|
| 334 |
+
result = subprocess.run(cmd, capture_output=True, text=True)
|
| 335 |
+
|
| 336 |
+
devices = []
|
| 337 |
+
data = json.loads(result.stdout)
|
| 338 |
+
for device in data.get('blockdevices', []):
|
| 339 |
+
if device.get('tran') == 'usb':
|
| 340 |
+
devices.append({
|
| 341 |
+
'device': f"/dev/{device['name']}",
|
| 342 |
+
'size': device['size'],
|
| 343 |
+
'model': device.get('model', 'Unknown')
|
| 344 |
+
})
|
| 345 |
+
return devices
|
| 346 |
+
```
|
| 347 |
+
|
| 348 |
+
### 3.5 ISO Building (`src/iso_builder.py`)
|
| 349 |
+
|
| 350 |
+
**Alpine Linux Acquisition:**
|
| 351 |
+
```python
|
| 352 |
+
def download_alpine_rootfs(self):
|
| 353 |
+
"""Download and verify Alpine Linux minimal rootfs."""
|
| 354 |
+
url = ALPINE_MINIROOTFS_URL
|
| 355 |
+
output_file = self.work_dir / "alpine-minirootfs.tar.gz"
|
| 356 |
+
|
| 357 |
+
# Download with progress bar
|
| 358 |
+
with httpx.stream("GET", url) as response:
|
| 359 |
+
total = int(response.headers.get("content-length", 0))
|
| 360 |
+
with open(output_file, "wb") as f:
|
| 361 |
+
for chunk in response.iter_bytes():
|
| 362 |
+
f.write(chunk)
|
| 363 |
+
|
| 364 |
+
# Verify checksum (if available)
|
| 365 |
+
self._verify_checksum(output_file)
|
| 366 |
+
return output_file
|
| 367 |
+
```
|
| 368 |
+
|
| 369 |
+
**Customization Process:**
|
| 370 |
+
```python
|
| 371 |
+
def create_cold_wallet_iso(self, output_path: str):
|
| 372 |
+
"""Build bootable ISO with cold wallet structure."""
|
| 373 |
+
# 1. Extract Alpine rootfs
|
| 374 |
+
self._extract_rootfs()
|
| 375 |
+
|
| 376 |
+
# 2. Create wallet directory structure
|
| 377 |
+
create_wallet_structure(self.rootfs_dir)
|
| 378 |
+
|
| 379 |
+
# 3. Blacklist network modules
|
| 380 |
+
self._blacklist_network_drivers()
|
| 381 |
+
|
| 382 |
+
# 4. Add signing scripts
|
| 383 |
+
self._install_signing_scripts()
|
| 384 |
+
|
| 385 |
+
# 5. Install Solana CLI tools
|
| 386 |
+
self._install_solana_cli()
|
| 387 |
+
|
| 388 |
+
# 6. Create bootloader
|
| 389 |
+
self._create_grub_bootloader()
|
| 390 |
+
|
| 391 |
+
# 7. Generate ISO image
|
| 392 |
+
self._generate_iso(output_path)
|
| 393 |
+
```
|
| 394 |
+
|
| 395 |
+
### 3.6 User Interface (`src/ui.py`)
|
| 396 |
+
|
| 397 |
+
**Terminal Rendering:**
|
| 398 |
+
```python
|
| 399 |
+
from rich.console import Console
|
| 400 |
+
from rich.panel import Panel
|
| 401 |
+
from rich.table import Table
|
| 402 |
+
|
| 403 |
+
def print_wallet_info(public_key: str, balance: Optional[float] = None):
|
| 404 |
+
"""Display wallet information in formatted panel."""
|
| 405 |
+
table = Table(box=DOUBLE, show_header=False, border_style="cyan")
|
| 406 |
+
table.add_column("Field", style="dim")
|
| 407 |
+
table.add_column("Value", style="green bold")
|
| 408 |
+
|
| 409 |
+
table.add_row("Public Key", public_key)
|
| 410 |
+
if balance is not None:
|
| 411 |
+
table.add_row("Balance", f"{balance:.9f} SOL")
|
| 412 |
+
|
| 413 |
+
panel = Panel(
|
| 414 |
+
table,
|
| 415 |
+
title="[bold cyan]WALLET INFORMATION[/bold cyan]",
|
| 416 |
+
border_style="cyan"
|
| 417 |
+
)
|
| 418 |
+
console.print(panel)
|
| 419 |
+
```
|
| 420 |
+
|
| 421 |
+
**Interactive Menus:**
|
| 422 |
+
```python
|
| 423 |
+
import questionary
|
| 424 |
+
|
| 425 |
+
def select_menu_option(options: List[str], message: str) -> str:
|
| 426 |
+
"""Display interactive selection menu."""
|
| 427 |
+
return questionary.select(
|
| 428 |
+
message,
|
| 429 |
+
choices=options,
|
| 430 |
+
style=CUSTOM_STYLE
|
| 431 |
+
).ask()
|
| 432 |
+
```
|
| 433 |
+
|
| 434 |
+
---
|
| 435 |
+
|
| 436 |
+
## 4. Security Model
|
| 437 |
+
|
| 438 |
+
### 4.1 Threat Model
|
| 439 |
+
|
| 440 |
+
**Assumptions:**
|
| 441 |
+
1. **Host PC is compromised:** Assume malware, keyloggers, network sniffers
|
| 442 |
+
2. **Network is adversarial:** Assume MITM attacks, DNS hijacking
|
| 443 |
+
3. **USB device is physically secure:** User maintains custody
|
| 444 |
+
4. **Air-gapped PC is clean:** No network connectivity, trusted hardware
|
| 445 |
+
|
| 446 |
+
**Trust Boundaries:**
|
| 447 |
+
- **Trusted Zone:** Air-gapped USB device, private keys
|
| 448 |
+
- **Untrusted Zone:** Online host PC, network infrastructure
|
| 449 |
+
- **Transfer Mechanism:** Manual file copying (physical air-gap)
|
| 450 |
+
|
| 451 |
+
### 4.2 Security Principles
|
| 452 |
+
|
| 453 |
+
#### Principle 1: Air-Gap Isolation
|
| 454 |
+
|
| 455 |
+
**Implementation:**
|
| 456 |
+
- Private keys generated ONLY on air-gapped device
|
| 457 |
+
- No network drivers loaded on Alpine Linux
|
| 458 |
+
- Physical separation between online and offline systems
|
| 459 |
+
- Manual file transfer prevents automated exfiltration
|
| 460 |
+
|
| 461 |
+
**Threat Mitigation:**
|
| 462 |
+
- ✅ Remote key theft impossible (no network)
|
| 463 |
+
- ✅ Malware cannot auto-exfiltrate keys
|
| 464 |
+
- ✅ Zero-day network exploits ineffective
|
| 465 |
+
|
| 466 |
+
#### Principle 2: Minimal Attack Surface
|
| 467 |
+
|
| 468 |
+
**Implementation:**
|
| 469 |
+
- Alpine Linux: ~50MB (vs. ~4GB Ubuntu)
|
| 470 |
+
- Only essential packages included
|
| 471 |
+
- No SSH daemon, no package manager, no unnecessary services
|
| 472 |
+
- Read-only filesystem prevents tampering
|
| 473 |
+
|
| 474 |
+
**Threat Mitigation:**
|
| 475 |
+
- ✅ Fewer vulnerabilities (smaller codebase)
|
| 476 |
+
- ✅ Limited post-exploitation options
|
| 477 |
+
- ✅ Reduced zero-day exposure
|
| 478 |
+
|
| 479 |
+
#### Principle 3: Code Transparency
|
| 480 |
+
|
| 481 |
+
**Implementation:**
|
| 482 |
+
- 100% open-source Python code (MIT License)
|
| 483 |
+
- No obfuscated binaries or compiled executables
|
| 484 |
+
- Reproducible ISO builds (checksums published)
|
| 485 |
+
- Community audit capability
|
| 486 |
+
|
| 487 |
+
**Threat Mitigation:**
|
| 488 |
+
- ✅ Supply chain backdoors detectable
|
| 489 |
+
- ✅ Hidden vulnerabilities discoverable
|
| 490 |
+
- ✅ Independent verification possible
|
| 491 |
+
|
| 492 |
+
#### Principle 4: Cryptographic Best Practices
|
| 493 |
+
|
| 494 |
+
**Implementation:**
|
| 495 |
+
- Ed25519 signatures (industry standard)
|
| 496 |
+
- NaCl library (audited, constant-time)
|
| 497 |
+
- OS entropy source (`/dev/urandom`)
|
| 498 |
+
- Deterministic signing (RFC 8032)
|
| 499 |
+
|
| 500 |
+
**Threat Mitigation:**
|
| 501 |
+
- ✅ Timing attacks prevented
|
| 502 |
+
- ✅ Weak RNG avoided
|
| 503 |
+
- ✅ Signature forgery infeasible (2^128 security)
|
| 504 |
+
|
| 505 |
+
### 4.3 Attack Vectors & Mitigations
|
| 506 |
+
|
| 507 |
+
| Attack | Likelihood | Impact | Mitigation | Effectiveness |
|
| 508 |
+
|--------|------------|--------|------------|---------------|
|
| 509 |
+
| **Malware on Host PC** | High | Critical | Keys never on host; only signed TXs transferred | ✅ Very High |
|
| 510 |
+
| **Compromised Alpine ISO** | Very Low | Critical | Checksum verification; reproducible builds | ✅ High |
|
| 511 |
+
| **Evil Maid (USB tampering)** | Low | High | Tamper-evident seals; boot verification | ⚠️ Medium |
|
| 512 |
+
| **Side-Channel (timing)** | Very Low | Medium | Constant-time crypto (NaCl) | ✅ High |
|
| 513 |
+
| **Physical USB Theft** | Low | Critical | Backup USB in separate location | ⚠️ Medium |
|
| 514 |
+
| **Transaction Substitution** | Medium | High | User verifies recipient on air-gapped screen | ✅ High |
|
| 515 |
+
| **Dependency Supply Chain** | Low | High | Pin package versions; verify hashes | ✅ Medium |
|
| 516 |
+
|
| 517 |
+
### 4.4 Operational Security Recommendations
|
| 518 |
+
|
| 519 |
+
**Best Practices:**
|
| 520 |
+
1. **Generate keys on truly air-gapped PC** - Never connected to internet
|
| 521 |
+
2. **Verify Alpine ISO checksum** - Compare against published SHA-256
|
| 522 |
+
3. **Use dedicated USB drive** - Don't reuse for other purposes
|
| 523 |
+
4. **Create backup USB** - Store in separate physical location
|
| 524 |
+
5. **Verify transaction details** - Check recipient address on air-gapped display
|
| 525 |
+
6. **Keep Python environment isolated** - Use virtual environment for CLI
|
| 526 |
+
7. **Update dependencies carefully** - Pin versions, audit changes
|
| 527 |
+
|
| 528 |
+
---
|
| 529 |
+
|
| 530 |
+
## 5. User Guide
|
| 531 |
+
|
| 532 |
+
### 5.1 Installation
|
| 533 |
+
|
| 534 |
+
**System Requirements:**
|
| 535 |
+
- Python 3.11 or higher
|
| 536 |
+
- Windows 10+, macOS 11+, or Linux (kernel 5.0+)
|
| 537 |
+
- 4GB+ USB drive for cold wallet
|
| 538 |
+
- Administrator/root privileges (for USB operations)
|
| 539 |
+
|
| 540 |
+
**Step 1: Install Python Dependencies**
|
| 541 |
+
```bash
|
| 542 |
+
pip install rich questionary solana solders pynacl httpx aiofiles base58
|
| 543 |
+
```
|
| 544 |
+
|
| 545 |
+
**Step 2: Clone Repository**
|
| 546 |
+
```bash
|
| 547 |
+
git clone https://github.com/ExpertVagabond/coldstar-colosseum.git
|
| 548 |
+
cd coldstar
|
| 549 |
+
```
|
| 550 |
+
|
| 551 |
+
**Step 3: Verify Installation**
|
| 552 |
+
```bash
|
| 553 |
+
python main.py
|
| 554 |
+
```
|
| 555 |
+
|
| 556 |
+
### 5.2 Creating a Cold Wallet USB
|
| 557 |
+
|
| 558 |
+
**Workflow:**
|
| 559 |
+
|
| 560 |
+
1. **Launch CLI:**
|
| 561 |
+
```bash
|
| 562 |
+
python main.py
|
| 563 |
+
```
|
| 564 |
+
|
| 565 |
+
2. **Select "Flash Cold Wallet OS to USB"**
|
| 566 |
+
- CLI will download Alpine Linux rootfs (~50MB)
|
| 567 |
+
- Customize filesystem with wallet structure
|
| 568 |
+
- Generate bootable ISO
|
| 569 |
+
|
| 570 |
+
3. **Flash ISO to USB:**
|
| 571 |
+
- **Windows:** Use Rufus or balenaEtcher
|
| 572 |
+
- **macOS:** Use balenaEtcher or `dd`
|
| 573 |
+
- **Linux:** Use `dd` command:
|
| 574 |
+
```bash
|
| 575 |
+
sudo dd if=output/solana-cold-wallet.iso of=/dev/sdX bs=4M status=progress
|
| 576 |
+
sudo sync
|
| 577 |
+
```
|
| 578 |
+
|
| 579 |
+
4. **First Boot (Air-Gapped):**
|
| 580 |
+
- Boot dedicated PC from USB
|
| 581 |
+
- Alpine Linux loads automatically
|
| 582 |
+
- Keypair generated on first boot
|
| 583 |
+
- Public key displayed on screen → **WRITE THIS DOWN**
|
| 584 |
+
|
| 585 |
+
### 5.3 Creating and Signing Transactions
|
| 586 |
+
|
| 587 |
+
**Transaction Flow:**
|
| 588 |
+
|
| 589 |
+
**Step 1: Create Unsigned Transaction (Online)**
|
| 590 |
+
```bash
|
| 591 |
+
python main.py
|
| 592 |
+
# Select: "Create Unsigned Transaction"
|
| 593 |
+
# Enter recipient address: 5hP8g7...
|
| 594 |
+
# Enter amount: 1.5 SOL
|
| 595 |
+
# → Unsigned TX saved to file
|
| 596 |
+
```
|
| 597 |
+
|
| 598 |
+
**Step 2: Transfer to USB (Manual)**
|
| 599 |
+
```bash
|
| 600 |
+
# Copy unsigned transaction file to USB /inbox/
|
| 601 |
+
cp unsigned_tx.bin /media/usb/inbox/
|
| 602 |
+
```
|
| 603 |
+
|
| 604 |
+
**Step 3: Sign Transaction (Air-Gapped)**
|
| 605 |
+
```bash
|
| 606 |
+
# Boot USB on air-gapped PC
|
| 607 |
+
# Run signing script
|
| 608 |
+
cd /wallet
|
| 609 |
+
./sign_tx.sh /inbox/unsigned_tx.bin
|
| 610 |
+
|
| 611 |
+
# → Signed TX saved to /outbox/signed_tx.bin
|
| 612 |
+
# → Verify recipient address on screen before confirming
|
| 613 |
+
```
|
| 614 |
+
|
| 615 |
+
**Step 4: Transfer Back to Host (Manual)**
|
| 616 |
+
```bash
|
| 617 |
+
# Copy signed transaction from USB to host
|
| 618 |
+
cp /media/usb/outbox/signed_tx.bin ~/signed_tx.bin
|
| 619 |
+
```
|
| 620 |
+
|
| 621 |
+
**Step 5: Broadcast Transaction (Online)**
|
| 622 |
+
```bash
|
| 623 |
+
python main.py
|
| 624 |
+
# Select: "Broadcast Signed Transaction"
|
| 625 |
+
# → TX submitted to Solana network
|
| 626 |
+
# → Transaction signature displayed
|
| 627 |
+
```
|
| 628 |
+
|
| 629 |
+
### 5.4 Checking Wallet Balance
|
| 630 |
+
|
| 631 |
+
**Method 1: Via CLI (Online)**
|
| 632 |
+
```bash
|
| 633 |
+
python main.py
|
| 634 |
+
# Select: "View Wallet Information"
|
| 635 |
+
# Enter public key: 7gX...
|
| 636 |
+
# → Balance displayed
|
| 637 |
+
```
|
| 638 |
+
|
| 639 |
+
**Method 2: Solana Explorer**
|
| 640 |
+
```
|
| 641 |
+
https://explorer.solana.com/address/YOUR_PUBLIC_KEY?cluster=devnet
|
| 642 |
+
```
|
| 643 |
+
|
| 644 |
+
---
|
| 645 |
+
|
| 646 |
+
## 6. Cryptographic Operations
|
| 647 |
+
|
| 648 |
+
### 6.1 Ed25519 Key Generation
|
| 649 |
+
|
| 650 |
+
**Algorithm:** Edwards-curve Digital Signature Algorithm (EdDSA)
|
| 651 |
+
|
| 652 |
+
**Process:**
|
| 653 |
+
1. **Entropy Collection:** 256 bits from `/dev/urandom`
|
| 654 |
+
2. **Seed Derivation:** SHA-512(entropy) → 512-bit hash
|
| 655 |
+
3. **Scalar Clamping:** Ensure scalar is in valid range
|
| 656 |
+
4. **Public Key:** Scalar multiplication on Curve25519 (Edwards form)
|
| 657 |
+
|
| 658 |
+
**Security Properties:**
|
| 659 |
+
- **Key Size:** 256 bits (32 bytes)
|
| 660 |
+
- **Security Level:** 128-bit classical, ~64-bit quantum
|
| 661 |
+
- **Signature Size:** 512 bits (64 bytes)
|
| 662 |
+
- **Signature Time:** ~0.1ms on modern CPU
|
| 663 |
+
- **Verification Time:** ~0.3ms on modern CPU
|
| 664 |
+
|
| 665 |
+
### 6.2 Transaction Signing
|
| 666 |
+
|
| 667 |
+
**Signing Process:**
|
| 668 |
+
1. **Message Hash:** SHA-512(message)
|
| 669 |
+
2. **Nonce Generation:** Deterministic (RFC 8032)
|
| 670 |
+
```
|
| 671 |
+
nonce = SHA-512(hash(privkey_suffix) || message)
|
| 672 |
+
```
|
| 673 |
+
3. **R Calculation:** R = nonce * G (base point)
|
| 674 |
+
4. **Challenge:** h = SHA-512(R || pubkey || message)
|
| 675 |
+
5. **Signature:** s = (nonce + h * privkey) mod L
|
| 676 |
+
|
| 677 |
+
**Signature Format:**
|
| 678 |
+
```
|
| 679 |
+
[R (32 bytes) || s (32 bytes)] = 64 bytes total
|
| 680 |
+
```
|
| 681 |
+
|
| 682 |
+
**Verification (by Solana validators):**
|
| 683 |
+
```
|
| 684 |
+
s * G == R + h * pubkey
|
| 685 |
+
```
|
| 686 |
+
|
| 687 |
+
### 6.3 Encoding Schemes
|
| 688 |
+
|
| 689 |
+
**Base58 (Public Keys):**
|
| 690 |
+
- Alphabet: `123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz`
|
| 691 |
+
- Omits: `0`, `O`, `I`, `l` (visually ambiguous)
|
| 692 |
+
- Example: `7gX8jK...` (43-44 characters)
|
| 693 |
+
|
| 694 |
+
**Base64 (Transaction Data):**
|
| 695 |
+
- Used for JSON-RPC transmission
|
| 696 |
+
- More compact than hex
|
| 697 |
+
- Standard Base64 alphabet
|
| 698 |
+
|
| 699 |
+
**JSON Array (Keypair Storage):**
|
| 700 |
+
```json
|
| 701 |
+
[123, 45, 67, ...] // 64 bytes
|
| 702 |
+
```
|
| 703 |
+
- Compatible with Solana CLI format
|
| 704 |
+
- Easy to parse in any language
|
| 705 |
+
|
| 706 |
+
---
|
| 707 |
+
|
| 708 |
+
## 7. Threat Analysis
|
| 709 |
+
|
| 710 |
+
### 7.1 Sophisticated Attack Scenarios
|
| 711 |
+
|
| 712 |
+
#### Scenario 1: Compromised Host PC with Transaction Manipulation
|
| 713 |
+
|
| 714 |
+
**Attack:**
|
| 715 |
+
1. Malware intercepts transaction creation
|
| 716 |
+
2. Replaces recipient address with attacker's address
|
| 717 |
+
3. User unknowingly copies malicious TX to USB
|
| 718 |
+
4. User signs attacker's transaction
|
| 719 |
+
|
| 720 |
+
**Mitigation:**
|
| 721 |
+
- ✅ Air-gapped system displays full transaction details before signing
|
| 722 |
+
- ✅ User MUST verify recipient address on offline screen
|
| 723 |
+
- ✅ Signing script shows: From, To, Amount
|
| 724 |
+
- ⚠️ **User Responsibility:** Visual verification is critical
|
| 725 |
+
|
| 726 |
+
**Effectiveness:** High (requires user vigilance)
|
| 727 |
+
|
| 728 |
+
#### Scenario 2: Backdoored Alpine Linux ISO
|
| 729 |
+
|
| 730 |
+
**Attack:**
|
| 731 |
+
1. Attacker compromises download server or MITM attack
|
| 732 |
+
2. Replaces legitimate ISO with backdoored version
|
| 733 |
+
3. Backdoor exfiltrates private key during generation
|
| 734 |
+
4. Key sent via covert channel (if user later connects USB online)
|
| 735 |
+
|
| 736 |
+
**Mitigation:**
|
| 737 |
+
- ✅ SHA-256 checksum verification built into CLI
|
| 738 |
+
- ✅ Published checksums on multiple channels (GitHub, website)
|
| 739 |
+
- ✅ Reproducible builds (community can rebuild and compare)
|
| 740 |
+
- ✅ Offline key generation (no network = no exfiltration during creation)
|
| 741 |
+
|
| 742 |
+
**Effectiveness:** Very High
|
| 743 |
+
|
| 744 |
+
#### Scenario 3: Evil Maid Attack (Physical USB Tampering)
|
| 745 |
+
|
| 746 |
+
**Attack:**
|
| 747 |
+
1. Attacker gains temporary physical access to USB
|
| 748 |
+
2. Replaces signing script with key-logging version
|
| 749 |
+
3. Next signing operation captures private key
|
| 750 |
+
4. Attacker retrieves USB later to extract key
|
| 751 |
+
|
| 752 |
+
**Mitigation:**
|
| 753 |
+
- ⚠️ Read-only filesystem prevents script modification (partial)
|
| 754 |
+
- ⚠️ Tamper-evident seals on USB (user must check)
|
| 755 |
+
- ⚠️ Boot integrity verification (not implemented in v1.0)
|
| 756 |
+
- ❌ No secure element (like hardware wallets have)
|
| 757 |
+
|
| 758 |
+
**Effectiveness:** Medium (depends on user vigilance)
|
| 759 |
+
|
| 760 |
+
### 7.2 Comparison to Alternatives
|
| 761 |
+
|
| 762 |
+
#### vs. Hardware Wallets (Ledger/Trezor)
|
| 763 |
+
|
| 764 |
+
| Aspect | Coldstar | Hardware Wallets |
|
| 765 |
+
|--------|----------|------------------|
|
| 766 |
+
| **Cost** | $5-10 (USB) | $50-200 |
|
| 767 |
+
| **Transparency** | 100% open-source | Partial (Trezor) to None (Ledger) |
|
| 768 |
+
| **Physical Security** | Standard USB | Secure element (Ledger only) |
|
| 769 |
+
| **Supply Chain** | Reproducible builds | Manufacturer trust |
|
| 770 |
+
| **Attack Surface** | ~50MB OS | ~1-2MB firmware |
|
| 771 |
+
| **Portability** | Requires PC | Standalone device |
|
| 772 |
+
| **Setup Complexity** | High (bootable USB) | Low (plug-and-play) |
|
| 773 |
+
|
| 774 |
+
**Verdict:** Coldstar trades convenience for transparency and cost. Hardware wallets are more portable but require manufacturer trust.
|
| 775 |
+
|
| 776 |
+
#### vs. Paper Wallets
|
| 777 |
+
|
| 778 |
+
| Aspect | Coldstar | Paper Wallets |
|
| 779 |
+
|--------|----------|---------------|
|
| 780 |
+
| **Security** | Offline signing | Keys printed on paper |
|
| 781 |
+
| **Usability** | CLI + scripts | Manual key entry |
|
| 782 |
+
| **Backup** | Multiple USB copies | Photocopy |
|
| 783 |
+
| **Signing** | Ed25519 (fast) | Requires import to hot wallet |
|
| 784 |
+
| **Attack Surface** | Alpine Linux | None (paper) |
|
| 785 |
+
|
| 786 |
+
**Verdict:** Paper wallets are simpler but require importing keys to sign (defeats cold storage). Coldstar allows true offline signing.
|
| 787 |
+
|
| 788 |
+
---
|
| 789 |
+
|
| 790 |
+
## 8. Performance & Scalability
|
| 791 |
+
|
| 792 |
+
### 8.1 Performance Metrics
|
| 793 |
+
|
| 794 |
+
**Keypair Generation:**
|
| 795 |
+
- **Time:** ~50-100ms
|
| 796 |
+
- **CPU Usage:** Minimal (single-threaded)
|
| 797 |
+
- **Memory:** <10MB
|
| 798 |
+
|
| 799 |
+
**Transaction Signing:**
|
| 800 |
+
- **Time:** ~5-10ms (Ed25519 signature)
|
| 801 |
+
- **CPU Usage:** Minimal
|
| 802 |
+
- **Memory:** <5MB
|
| 803 |
+
|
| 804 |
+
**ISO Building:**
|
| 805 |
+
- **Time:** ~2-5 minutes (depends on download speed)
|
| 806 |
+
- **Disk Space:** ~150MB temporary, 50MB final ISO
|
| 807 |
+
- **Network:** ~50MB download (Alpine rootfs)
|
| 808 |
+
|
| 809 |
+
**Transaction Broadcasting:**
|
| 810 |
+
- **Time:** ~1-2 seconds (RPC network latency)
|
| 811 |
+
- **Success Rate:** >99% on Devnet/Mainnet
|
| 812 |
+
- **Retry Logic:** Exponential backoff on failure
|
| 813 |
+
|
| 814 |
+
### 8.2 Scalability Considerations
|
| 815 |
+
|
| 816 |
+
**CLI Tool:**
|
| 817 |
+
- Single-user application (no concurrency needed)
|
| 818 |
+
- Stateless operations (no database)
|
| 819 |
+
- Minimal resource requirements
|
| 820 |
+
|
| 821 |
+
**USB Device:**
|
| 822 |
+
- Supports standard PC hardware (x86_64)
|
| 823 |
+
- RAM requirement: 512MB minimum
|
| 824 |
+
- Boot time: ~30 seconds on modern hardware
|
| 825 |
+
|
| 826 |
+
**Network:**
|
| 827 |
+
- Dependent on Solana RPC endpoint performance
|
| 828 |
+
- Public endpoints may rate-limit (60 req/min typical)
|
| 829 |
+
- Recommendation: Use private RPC for high volume
|
| 830 |
+
|
| 831 |
+
---
|
| 832 |
+
|
| 833 |
+
## 9. Conclusion
|
| 834 |
+
|
| 835 |
+
### 9.1 Summary
|
| 836 |
+
|
| 837 |
+
Coldstar v1.0 provides a production-ready, open-source cold wallet solution for Solana that prioritizes security through air-gap isolation. By leveraging industry-standard cryptography (Ed25519), minimal operating systems (Alpine Linux), and transparent Python code, it offers an accessible alternative to proprietary hardware wallets.
|
| 838 |
+
|
| 839 |
+
**Key Achievements:**
|
| 840 |
+
- ✅ Complete air-gap separation between key storage and network access
|
| 841 |
+
- ✅ Minimal attack surface (~50MB Alpine Linux)
|
| 842 |
+
- ✅ Full code transparency (100% open-source)
|
| 843 |
+
- ✅ Cost-effective ($5-10 USB drive)
|
| 844 |
+
- ✅ Cross-platform CLI (Windows, macOS, Linux)
|
| 845 |
+
|
| 846 |
+
**Trade-offs:**
|
| 847 |
+
- ⚠️ Higher setup complexity vs. hardware wallets
|
| 848 |
+
- ⚠️ Requires user vigilance (transaction verification)
|
| 849 |
+
- ⚠️ Less portable (needs PC for signing)
|
| 850 |
+
|
| 851 |
+
### 9.2 Use Cases
|
| 852 |
+
|
| 853 |
+
**Ideal For:**
|
| 854 |
+
- Long-term HODLers prioritizing security over convenience
|
| 855 |
+
- Developers and power users comfortable with CLI tools
|
| 856 |
+
- Organizations requiring auditable security solutions
|
| 857 |
+
- Users seeking vendor-independent cold storage
|
| 858 |
+
- Educational purposes (understanding cold wallet internals)
|
| 859 |
+
|
| 860 |
+
**Not Ideal For:**
|
| 861 |
+
- Frequent traders (signing overhead too high)
|
| 862 |
+
- Non-technical users (complexity barrier)
|
| 863 |
+
- Mobile-only users (requires desktop PC)
|
| 864 |
+
|
| 865 |
+
### 9.3 Project Status
|
| 866 |
+
|
| 867 |
+
**Current Version:** 1.0.0 (Production-Ready)
|
| 868 |
+
|
| 869 |
+
**Supported Features:**
|
| 870 |
+
- ✅ Ed25519 keypair generation
|
| 871 |
+
- ✅ Offline transaction signing
|
| 872 |
+
- ✅ Solana Devnet/Mainnet support
|
| 873 |
+
- ✅ USB device detection (Windows/Linux)
|
| 874 |
+
- ✅ Bootable ISO creation
|
| 875 |
+
- ✅ Balance checking
|
| 876 |
+
- ✅ SOL transfer transactions
|
| 877 |
+
- ✅ Devnet airdrops
|
| 878 |
+
|
| 879 |
+
**Known Limitations:**
|
| 880 |
+
- ❌ No SPL token support
|
| 881 |
+
- ❌ No multi-signature support
|
| 882 |
+
- ❌ No passphrase encryption (manual GPG required)
|
| 883 |
+
- ❌ No boot integrity verification
|
| 884 |
+
- ❌ Manual file transfer between systems
|
| 885 |
+
|
| 886 |
+
### 9.4 Contributing
|
| 887 |
+
|
| 888 |
+
**How to Contribute:**
|
| 889 |
+
- Report bugs: GitHub Issues
|
| 890 |
+
- Submit patches: Pull Requests
|
| 891 |
+
- Security vulnerabilities: [GitHub Security Advisory](https://github.com/ExpertVagabond/coldstar-colosseum/security/advisories/new) (responsible disclosure)
|
| 892 |
+
- Documentation improvements: Edit `README.md` or this whitepaper
|
| 893 |
+
|
| 894 |
+
**Development Setup:**
|
| 895 |
+
```bash
|
| 896 |
+
git clone https://github.com/ExpertVagabond/coldstar-colosseum.git
|
| 897 |
+
cd coldstar
|
| 898 |
+
python -m venv venv
|
| 899 |
+
source venv/bin/activate # or `venv\Scripts\activate` on Windows
|
| 900 |
+
pip install -r local_requirements.txt
|
| 901 |
+
python main.py
|
| 902 |
+
```
|
| 903 |
+
|
| 904 |
+
### 9.5 Final Remarks
|
| 905 |
+
|
| 906 |
+
Cold storage is not about convenience—it's about security. Coldstar embraces this philosophy by prioritizing air-gap isolation and code transparency over user-friendliness. For users willing to invest time in proper setup and operational procedures, it offers a robust, verifiable, and cost-effective solution for securing Solana assets.
|
| 907 |
+
|
| 908 |
+
**Your keys, your responsibility. Open source, open trust.**
|
| 909 |
+
|
| 910 |
+
---
|
| 911 |
+
|
| 912 |
+
## Appendix A: Technical Specifications
|
| 913 |
+
|
| 914 |
+
### A.1 System Requirements
|
| 915 |
+
|
| 916 |
+
**Development/Host System:**
|
| 917 |
+
- **OS:** Windows 10+, macOS 11+, Linux (Ubuntu 20.04+)
|
| 918 |
+
- **Python:** 3.11 or higher
|
| 919 |
+
- **RAM:** 4GB minimum
|
| 920 |
+
- **Disk Space:** 500MB for CLI + temporary ISO build files
|
| 921 |
+
- **Network:** Required for RPC communication and Alpine download
|
| 922 |
+
|
| 923 |
+
**Air-Gapped System (USB Boot):**
|
| 924 |
+
- **Architecture:** x86_64 (Intel/AMD)
|
| 925 |
+
- **RAM:** 512MB minimum (1GB recommended)
|
| 926 |
+
- **USB Port:** USB 2.0 or higher
|
| 927 |
+
- **BIOS:** Legacy or UEFI boot support
|
| 928 |
+
- **Display:** Required for transaction verification
|
| 929 |
+
|
| 930 |
+
**USB Drive:**
|
| 931 |
+
- **Capacity:** 4GB minimum (8GB recommended for overhead)
|
| 932 |
+
- **Speed:** USB 2.0+ (faster for boot times)
|
| 933 |
+
- **Format:** Will be overwritten during flashing
|
| 934 |
+
|
| 935 |
+
### A.2 Cryptographic Parameters
|
| 936 |
+
|
| 937 |
+
| Parameter | Value | Standard |
|
| 938 |
+
|-----------|-------|----------|
|
| 939 |
+
| **Signature Algorithm** | Ed25519 | RFC 8032 |
|
| 940 |
+
| **Curve** | Curve25519 (Edwards form) | - |
|
| 941 |
+
| **Hash Function** | SHA-512 | FIPS 180-4 |
|
| 942 |
+
| **Private Key Size** | 256 bits (32 bytes) | - |
|
| 943 |
+
| **Public Key Size** | 256 bits (32 bytes) | - |
|
| 944 |
+
| **Signature Size** | 512 bits (64 bytes) | - |
|
| 945 |
+
| **Security Level** | 128-bit classical | - |
|
| 946 |
+
| **Quantum Resistance** | ~64-bit | NIST estimate |
|
| 947 |
+
| **Library** | PyNaCl (libsodium) | Audited |
|
| 948 |
+
|
| 949 |
+
### A.3 Network Configuration
|
| 950 |
+
|
| 951 |
+
**Solana Networks:**
|
| 952 |
+
|
| 953 |
+
| Network | RPC Endpoint | Purpose |
|
| 954 |
+
|---------|--------------|---------|
|
| 955 |
+
| **Devnet** | https://api.devnet.solana.com | Testing, airdrops |
|
| 956 |
+
| **Testnet** | https://api.testnet.solana.com | Validator testing |
|
| 957 |
+
| **Mainnet-Beta** | https://api.mainnet-beta.solana.com | Production |
|
| 958 |
+
|
| 959 |
+
**Transaction Costs:**
|
| 960 |
+
- Base fee: 5,000 lamports (0.000005 SOL)
|
| 961 |
+
- Signature fee: 5,000 lamports per signature
|
| 962 |
+
- Priority fees: Optional (user-configurable)
|
| 963 |
+
|
| 964 |
+
**Blockhash Validity:**
|
| 965 |
+
- ~150 seconds (150 blocks @ 1 block/sec)
|
| 966 |
+
- Transactions must be broadcast within this window
|
| 967 |
+
|
| 968 |
+
### A.4 File Formats
|
| 969 |
+
|
| 970 |
+
**Keypair Storage (`keypair.json`):**
|
| 971 |
+
```json
|
| 972 |
+
[
|
| 973 |
+
123, 45, 67, 89, ..., 234 // 64 bytes as decimal array
|
| 974 |
+
]
|
| 975 |
+
```
|
| 976 |
+
|
| 977 |
+
**Public Key (`pubkey.txt`):**
|
| 978 |
+
```
|
| 979 |
+
7gX8jK9pQvZjR3mN4sT6uV2wA1bC3dE4fG5hH6iJ7kK8
|
| 980 |
+
```
|
| 981 |
+
Base58-encoded, 43-44 characters
|
| 982 |
+
|
| 983 |
+
**Unsigned Transaction:**
|
| 984 |
+
Binary format (Solana `Transaction` serialized)
|
| 985 |
+
|
| 986 |
+
**Signed Transaction:**
|
| 987 |
+
Binary format (Solana `Transaction` with signatures)
|
| 988 |
+
|
| 989 |
+
---
|
| 990 |
+
|
| 991 |
+
## Appendix B: Glossary
|
| 992 |
+
|
| 993 |
+
| Term | Definition |
|
| 994 |
+
|------|------------|
|
| 995 |
+
| **Air-Gap** | Physical isolation of a computer from networks |
|
| 996 |
+
| **Alpine Linux** | Minimal, security-focused Linux distribution |
|
| 997 |
+
| **Base58** | Binary-to-text encoding (Bitcoin-style) |
|
| 998 |
+
| **Blockhash** | Cryptographic hash of recent block (anti-replay) |
|
| 999 |
+
| **CLI** | Command-Line Interface |
|
| 1000 |
+
| **Cold Wallet** | Cryptocurrency wallet with keys stored offline |
|
| 1001 |
+
| **Ed25519** | Elliptic curve signature scheme (faster than ECDSA) |
|
| 1002 |
+
| **Evil Maid** | Physical tampering attack while device unattended |
|
| 1003 |
+
| **Lamports** | Smallest unit of SOL (1 SOL = 10^9 lamports) |
|
| 1004 |
+
| **NaCl** | "Networking and Cryptography Library" (libsodium) |
|
| 1005 |
+
| **RPC** | Remote Procedure Call (API for blockchain) |
|
| 1006 |
+
| **Signing** | Creating digital signature with private key |
|
| 1007 |
+
|
| 1008 |
+
---
|
| 1009 |
+
|
| 1010 |
+
## Appendix C: Security Audit Checklist
|
| 1011 |
+
|
| 1012 |
+
**For Independent Auditors:**
|
| 1013 |
+
|
| 1014 |
+
- [ ] Verify SHA-256 checksum of Alpine Linux download
|
| 1015 |
+
- [ ] Review `src/wallet.py` for key generation logic
|
| 1016 |
+
- [ ] Inspect `src/transaction.py` for signing implementation
|
| 1017 |
+
- [ ] Check file permissions on `keypair.json` (should be 0600)
|
| 1018 |
+
- [ ] Verify network blacklist in ISO build process
|
| 1019 |
+
- [ ] Test air-gap isolation (no network drivers loaded)
|
| 1020 |
+
- [ ] Review entropy source (`/dev/urandom`)
|
| 1021 |
+
- [ ] Check for hardcoded secrets or backdoors
|
| 1022 |
+
- [ ] Verify Ed25519 implementation (PyNaCl)
|
| 1023 |
+
- [ ] Test transaction signing correctness
|
| 1024 |
+
- [ ] Review RPC communication for leaks
|
| 1025 |
+
- [ ] Check for timing attack vulnerabilities
|
| 1026 |
+
- [ ] Verify reproducible ISO build process
|
| 1027 |
+
|
| 1028 |
+
---
|
| 1029 |
+
|
| 1030 |
+
## Appendix D: References
|
| 1031 |
+
|
| 1032 |
+
1. **EdDSA Specification:** Bernstein, D. J., et al. "High-speed high-security signatures." RFC 8032, 2017.
|
| 1033 |
+
2. **Solana Documentation:** https://docs.solana.com
|
| 1034 |
+
3. **Alpine Linux Security:** https://alpinelinux.org/about/
|
| 1035 |
+
4. **NaCl Cryptography:** https://nacl.cr.yp.to/
|
| 1036 |
+
5. **Python Solana SDK:** https://github.com/michaelhly/solana-py
|
| 1037 |
+
6. **Solders (Rust):** https://github.com/kevinheavey/solders
|
| 1038 |
+
|
| 1039 |
+
---
|
| 1040 |
+
|
| 1041 |
+
## Appendix E: License
|
| 1042 |
+
|
| 1043 |
+
**MIT License**
|
| 1044 |
+
|
| 1045 |
+
```
|
| 1046 |
+
Copyright (c) 2025 ChainLabs Technologies
|
| 1047 |
+
|
| 1048 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
| 1049 |
+
of this software and associated documentation files (the "Software"), to deal
|
| 1050 |
+
in the Software without restriction, including without limitation the rights
|
| 1051 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
| 1052 |
+
copies of the Software, and to permit persons to whom the Software is
|
| 1053 |
+
furnished to do so, subject to the following conditions:
|
| 1054 |
+
|
| 1055 |
+
The above copyright notice and this permission notice shall be included in all
|
| 1056 |
+
copies or substantial portions of the Software.
|
| 1057 |
+
|
| 1058 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
| 1059 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
| 1060 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
| 1061 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
| 1062 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
| 1063 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
| 1064 |
+
SOFTWARE.
|
| 1065 |
+
```
|
| 1066 |
+
|
| 1067 |
+
---
|
| 1068 |
+
|
| 1069 |
+
**Contact & Support:**
|
| 1070 |
+
- **GitHub:** https://github.com/ExpertVagabond/coldstar-colosseum
|
| 1071 |
+
- **Issues:** https://github.com/ExpertVagabond/coldstar-colosseum/issues
|
| 1072 |
+
- **Email:** syrem@chainlabs.uno
|
| 1073 |
+
|
| 1074 |
+
---
|
| 1075 |
+
|
| 1076 |
+
*Document Version: 1.0.0*
|
| 1077 |
+
*Last Updated: December 24, 2025*
|
| 1078 |
+
*Coldstar Version: 1.0.0*
|
| 1079 |
+
|