signledger


Namesignledger JSON
Version 1.0.0 PyPI version JSON
download
home_pagehttps://github.com/vipin08/signledger
SummaryImmutable audit logging with cryptographic verification for Python applications
upload_time2025-10-21 17:28:39
maintainerNone
docs_urlNone
authorVipin Kumar
requires_python>=3.8
licenseNone
keywords audit logging immutable ledger blockchain cryptography compliance security
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # SignLedger

**SignLedger** is a production-ready Python library for immutable audit logging with cryptographic verification. Built for compliance, security, and trust, SignLedger provides blockchain-inspired tamper-proof logging for critical applications.

## Features

- **Immutable Audit Logs**: Write-once, tamper-proof entries with hash chain verification
- **Cryptographic Signatures**: RSA, ECDSA, and Ed25519 digital signatures for non-repudiation
- **Hash Chain Integrity**: SHA-256/SHA-512/SHA-3 cryptographic linking of entries
- **Multiple Storage Backends**: In-memory, SQLite, PostgreSQL, MongoDB support
- **High Performance**: 2,000+ transactions per second with batch operations
- **Compression**: 50-70% storage reduction with zlib, gzip, lz4, or zstd
- **Framework Integration**: Built-in support for Django, Flask, and FastAPI
- **Thread-Safe**: Production-ready concurrent access with RLock protection
- **Type-Safe**: Full type hints and Pydantic v2 validation

## Installation

```bash
pip install signledger
```

### Optional Dependencies

```bash
# PostgreSQL backend
pip install signledger[postgresql]

# MongoDB backend
pip install signledger[mongodb]

# All backends
pip install signledger[all]

# Framework integrations
pip install signledger[django]
pip install signledger[flask]
pip install signledger[fastapi]
```

## Quick Start

```python
from signledger import Ledger
from signledger.backends import InMemoryBackend

# Create a ledger
ledger = Ledger(backend=InMemoryBackend())

# Append entries
entry = ledger.append({
    "action": "user_login",
    "user_id": "user123",
    "ip_address": "192.168.1.1"
})

# Query entries
entries = list(ledger.get_entries(limit=10))

# Verify integrity
is_valid = ledger.verify_integrity()  # Returns True

# Get statistics
stats = ledger.get_stats()
print(f"Total entries: {stats.total_entries}")
```

## Use Cases

### 1. Financial Transaction Logging

Immutable audit trails for banking and financial services compliance (SOX, PCI-DSS).

```python
from signledger import Ledger
from signledger.backends import SQLiteBackend
from signledger.crypto.signatures import RSASigner
from datetime import datetime

# Initialize ledger with signature support
signer = RSASigner()
ledger = Ledger(
    backend=SQLiteBackend("financial_audit.db"),
    enable_signatures=True
)

# Log financial transaction
entry = ledger.append(
    data={
        "transaction_id": "TXN123456",
        "account_from": "ACC001",
        "account_to": "ACC002",
        "amount": 15000.00,
        "currency": "USD",
        "timestamp": datetime.utcnow().isoformat(),
        "operator_id": "OPR789"
    },
    metadata={
        "compliance": "SOX",
        "category": "wire_transfer"
    },
    sign=True,
    signer=signer.sign
)

# Verify signature later
is_valid = signer.verify(entry.hash, entry.signature)
```

### 2. Healthcare Access Logs (HIPAA Compliance)

Track all access to protected health information (PHI) with non-repudiation.

```python
from signledger import Ledger
from signledger.backends import PostgreSQLBackend

# HIPAA-compliant audit logging
ledger = Ledger(
    backend=PostgreSQLBackend(
        host="localhost",
        database="healthcare_audit",
        user="audit_user",
        password="secure_password"
    )
)

# Log PHI access
ledger.append({
    "event_type": "PHI_ACCESS",
    "patient_id": "P123456",
    "accessed_by": "DR_SMITH",
    "access_type": "READ",
    "data_accessed": ["medical_history", "prescriptions"],
    "purpose": "treatment",
    "facility": "General Hospital"
})
```

### 3. Supply Chain Provenance

Track product journey from manufacture to delivery.

```python
from signledger import Ledger

ledger = Ledger()

# Manufacture
ledger.append({
    "event": "manufactured",
    "product_id": "PROD-2024-001",
    "batch": "BATCH-A123",
    "location": "Factory Shanghai",
    "quality_check": "PASSED"
})

# Shipping
ledger.append({
    "event": "shipped",
    "product_id": "PROD-2024-001",
    "carrier": "DHL",
    "tracking": "DHL123456789",
    "destination": "Warehouse NYC"
})

# Delivery
ledger.append({
    "event": "delivered",
    "product_id": "PROD-2024-001",
    "recipient": "John Doe",
    "signature": "base64_signature_data"
})

# Query product history
product_history = ledger.query(
    lambda e: e.data.get("product_id") == "PROD-2024-001"
)
```

### 4. Software Deployment Audit

Track all production deployments with approval workflows.

```python
from signledger import Ledger

ledger = Ledger()

# Log deployment
ledger.append({
    "deployment_id": "DEPLOY-2024-042",
    "application": "api-service",
    "version": "v2.3.1",
    "environment": "production",
    "deployed_by": "deploy_bot",
    "approved_by": ["alice@company.com", "bob@company.com"],
    "commit_sha": "a1b2c3d4",
    "rollback_plan": "automatic",
    "health_check": "PASSED"
})
```

### 5. Database Change Tracking

Immutable record of all database schema and data changes.

```python
from signledger import Ledger

ledger = Ledger()

# Track schema change
ledger.append({
    "change_type": "schema_migration",
    "database": "production_db",
    "migration_id": "20240101_add_user_roles",
    "sql": "ALTER TABLE users ADD COLUMN role VARCHAR(50)",
    "executed_by": "admin",
    "rollback_sql": "ALTER TABLE users DROP COLUMN role"
})
```

## Framework Integration

### Django Integration

```python
# settings.py
INSTALLED_APPS = [
    ...
    'signledger.integrations.django',
]

SIGNLEDGER = {
    'BACKEND': 'signledger.backends.PostgreSQLBackend',
    'OPTIONS': {
        'host': 'localhost',
        'database': 'audit_log',
        'user': 'postgres',
        'password': 'password'
    },
    'ENABLE_SIGNATURES': True,
    'AUTO_VERIFY': True
}

# views.py
from signledger.integrations.django import get_ledger

def transfer_money(request):
    ledger = get_ledger()

    # Perform transaction
    transaction = process_transfer(request.data)

    # Log to immutable ledger
    ledger.append({
        "action": "money_transfer",
        "user": request.user.id,
        "amount": transaction.amount,
        "status": "completed"
    })

    return JsonResponse({"status": "success"})
```

### Flask Integration

```python
from flask import Flask
from signledger import Ledger
from signledger.backends import SQLiteBackend

app = Flask(__name__)

# Initialize ledger
ledger = Ledger(backend=SQLiteBackend("audit.db"))

@app.before_request
def log_request():
    """Log all API requests"""
    from flask import request

    if request.endpoint:
        ledger.append({
            "event": "api_request",
            "method": request.method,
            "endpoint": request.endpoint,
            "ip": request.remote_addr,
            "user_agent": request.user_agent.string
        })

@app.route('/api/transfer', methods=['POST'])
def transfer():
    data = request.json

    # Process transfer
    result = process_payment(data)

    # Log transaction
    ledger.append({
        "action": "payment",
        "from": data['from_account'],
        "to": data['to_account'],
        "amount": data['amount'],
        "status": result['status']
    })

    return jsonify(result)

@app.route('/api/audit/verify', methods=['GET'])
def verify_integrity():
    """Verify ledger integrity"""
    is_valid = ledger.verify_integrity()
    stats = ledger.get_stats()

    return jsonify({
        "integrity": is_valid,
        "total_entries": stats.total_entries,
        "last_entry": stats.last_entry_time.isoformat() if stats.last_entry_time else None
    })

if __name__ == '__main__':
    app.run()
```

### FastAPI Integration

```python
from fastapi import FastAPI, HTTPException
from signledger import Ledger
from signledger.backends import PostgreSQLBackend
from pydantic import BaseModel
from datetime import datetime

app = FastAPI()

# Initialize ledger
ledger = Ledger(
    backend=PostgreSQLBackend(
        host="localhost",
        database="audit_db",
        user="postgres",
        password="password"
    )
)

class Transaction(BaseModel):
    from_account: str
    to_account: str
    amount: float
    description: str

@app.post("/api/transaction")
async def create_transaction(txn: Transaction):
    """Process and audit a transaction"""

    # Log transaction
    entry = await ledger.append_async({
        "type": "transaction",
        "from": txn.from_account,
        "to": txn.to_account,
        "amount": txn.amount,
        "description": txn.description,
        "timestamp": datetime.utcnow().isoformat()
    })

    return {
        "transaction_id": entry.id,
        "hash": entry.hash,
        "timestamp": entry.timestamp
    }

@app.get("/api/audit/entries")
async def get_audit_entries(limit: int = 100):
    """Retrieve recent audit entries"""
    entries = list(ledger.get_entries(limit=limit))

    return {
        "entries": [
            {
                "id": e.id,
                "timestamp": e.timestamp.isoformat(),
                "data": e.data,
                "hash": e.hash
            }
            for e in entries
        ]
    }

@app.get("/api/audit/verify")
async def verify_audit_integrity():
    """Verify ledger integrity"""
    try:
        is_valid = await ledger.verify_integrity_async()
        stats = ledger.get_stats()

        return {
            "valid": is_valid,
            "total_entries": stats.total_entries,
            "first_entry": stats.first_entry_time.isoformat() if stats.first_entry_time else None,
            "last_entry": stats.last_entry_time.isoformat() if stats.last_entry_time else None
        }
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))
```

### Celery Integration

```python
from celery import Celery
from signledger import Ledger
from signledger.backends import RedisBackend

app = Celery('tasks', broker='redis://localhost:6379')
ledger = Ledger(backend=RedisBackend(host='localhost', port=6379))

@app.task
def process_order(order_id):
    """Process order and log to audit trail"""

    # Process order
    result = handle_order(order_id)

    # Log to ledger
    ledger.append({
        "task": "process_order",
        "order_id": order_id,
        "status": result['status'],
        "processed_at": datetime.utcnow().isoformat()
    })

    return result
```

### Simple Python Program

```python
from signledger import Ledger
from signledger.backends import InMemoryBackend
from datetime import datetime

def main():
    # Create ledger
    ledger = Ledger(backend=InMemoryBackend())

    # Simulate user activities
    activities = [
        {"user": "alice", "action": "login", "ip": "192.168.1.10"},
        {"user": "alice", "action": "view_document", "doc_id": "DOC123"},
        {"user": "bob", "action": "login", "ip": "192.168.1.11"},
        {"user": "alice", "action": "edit_document", "doc_id": "DOC123"},
        {"user": "bob", "action": "delete_document", "doc_id": "DOC456"},
    ]

    # Log activities
    for activity in activities:
        activity["timestamp"] = datetime.utcnow().isoformat()
        entry = ledger.append(activity)
        print(f"Logged: {entry.id} - {activity['action']}")

    # Query specific user's activities
    alice_activities = ledger.query(
        lambda e: e.data.get("user") == "alice"
    )

    print(f"\nAlice's activities: {len(alice_activities)}")
    for entry in alice_activities:
        print(f"  - {entry.data['action']} at {entry.timestamp}")

    # Verify integrity
    is_valid = ledger.verify_integrity()
    print(f"\nLedger integrity: {'VALID' if is_valid else 'INVALID'}")

    # Get statistics
    stats = ledger.get_stats()
    print(f"Total entries: {stats.total_entries}")
    print(f"First entry: {stats.first_entry_time}")
    print(f"Last entry: {stats.last_entry_time}")

if __name__ == "__main__":
    main()
```

## Advanced Features

### Batch Operations

```python
from signledger.core.batch import BatchProcessor

# High-throughput batch processing
batch = BatchProcessor(ledger, batch_size=1000)

for i in range(10000):
    batch.add_entry({"transaction_id": f"TXN{i}", "amount": i * 100})

batch.flush()  # Commit remaining entries
```

### Compression

```python
from signledger.compression import Compressor

# Enable compression for storage optimization
ledger = Ledger(
    backend=SQLiteBackend("audit.db"),
    compression=Compressor(algorithm="zstd", level=3)
)
```

### Merkle Tree Verification

```python
from signledger.crypto.merkle import MerkleTree

# Build Merkle tree from entries
entries = list(ledger.get_entries())
merkle_tree = MerkleTree()

for entry in entries:
    merkle_tree.add_leaf(entry.hash)

merkle_tree.build()

# Get Merkle root
root_hash = merkle_tree.get_root()

# Verify specific entry
proof = merkle_tree.get_proof(0)
is_valid = merkle_tree.verify_proof(proof, entries[0].hash, root_hash)
```

### Cryptographic Signatures

```python
from signledger.crypto.signatures import RSASigner, ECDSASigner, Ed25519Signer

# RSA signatures
rsa_signer = RSASigner(key_size=2048)
entry = ledger.append(
    {"action": "critical_operation"},
    sign=True,
    signer=rsa_signer.sign
)

# ECDSA signatures (faster, smaller)
ecdsa_signer = ECDSASigner(curve="secp256k1")
entry = ledger.append(
    {"action": "blockchain_transaction"},
    sign=True,
    signer=ecdsa_signer.sign
)

# Ed25519 signatures (modern, fast)
ed_signer = Ed25519Signer()
entry = ledger.append(
    {"action": "secure_message"},
    sign=True,
    signer=ed_signer.sign
)
```

## Storage Backends

### SQLite (Default for Small-Medium Deployments)

```python
from signledger.backends import SQLiteBackend

ledger = Ledger(backend=SQLiteBackend("audit.db"))
```

### PostgreSQL (Recommended for Production)

```python
from signledger.backends import PostgreSQLBackend

ledger = Ledger(
    backend=PostgreSQLBackend(
        host="localhost",
        port=5432,
        database="audit_log",
        user="postgres",
        password="secure_password"
    )
)
```

### MongoDB (Document-Oriented)

```python
from signledger.backends import MongoDBBackend

ledger = Ledger(
    backend=MongoDBBackend(
        host="localhost",
        port=27017,
        database="audit_db",
        collection="ledger_entries"
    )
)
```

### In-Memory (Testing/Development)

```python
from signledger.backends import InMemoryBackend

ledger = Ledger(backend=InMemoryBackend())
```

## Performance

SignLedger is optimized for high-throughput audit logging:

- **Write Performance**: 2,000+ entries/second (batch mode: 10,000+/sec)
- **Read Performance**: 50,000+ entries/second with caching
- **Verification**: Full integrity check of 100,000 entries in ~2 seconds
- **Storage Efficiency**: 50-70% reduction with compression
- **Memory Usage**: ~1MB per 1,000 entries (without compression)

## Security

- **Immutability**: Entries cannot be modified after creation (Pydantic frozen models)
- **Hash Chain**: Tamper detection through cryptographic linking
- **Digital Signatures**: Non-repudiation with RSA/ECDSA/Ed25519
- **Integrity Verification**: Automatic or on-demand verification
- **Thread Safety**: Production-ready concurrent access protection

## Requirements

- Python 3.8+
- pydantic >= 2.0.0
- cryptography >= 41.0.0

## License

MIT License

## Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

## Support

- GitHub Issues: https://github.com/vipin08/signledger/issues
- Documentation: https://github.com/vipin08/signledger

## Changelog

### Version 1.0.0 (Initial Release)

- Immutable audit logging with hash chain verification
- Multiple storage backends (SQLite, PostgreSQL, MongoDB, In-Memory)
- Cryptographic signatures (RSA, ECDSA, Ed25519)
- Framework integrations (Django, Flask, FastAPI)
- Batch operations for high-throughput scenarios
- Compression support (zlib, gzip, lz4, zstd)
- Thread-safe operations
- Full type hints and Pydantic v2 validation

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/vipin08/signledger",
    "name": "signledger",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "audit logging immutable ledger blockchain cryptography compliance security",
    "author": "Vipin Kumar",
    "author_email": "vipin08@example.com",
    "download_url": null,
    "platform": null,
    "description": "# SignLedger\n\n**SignLedger** is a production-ready Python library for immutable audit logging with cryptographic verification. Built for compliance, security, and trust, SignLedger provides blockchain-inspired tamper-proof logging for critical applications.\n\n## Features\n\n- **Immutable Audit Logs**: Write-once, tamper-proof entries with hash chain verification\n- **Cryptographic Signatures**: RSA, ECDSA, and Ed25519 digital signatures for non-repudiation\n- **Hash Chain Integrity**: SHA-256/SHA-512/SHA-3 cryptographic linking of entries\n- **Multiple Storage Backends**: In-memory, SQLite, PostgreSQL, MongoDB support\n- **High Performance**: 2,000+ transactions per second with batch operations\n- **Compression**: 50-70% storage reduction with zlib, gzip, lz4, or zstd\n- **Framework Integration**: Built-in support for Django, Flask, and FastAPI\n- **Thread-Safe**: Production-ready concurrent access with RLock protection\n- **Type-Safe**: Full type hints and Pydantic v2 validation\n\n## Installation\n\n```bash\npip install signledger\n```\n\n### Optional Dependencies\n\n```bash\n# PostgreSQL backend\npip install signledger[postgresql]\n\n# MongoDB backend\npip install signledger[mongodb]\n\n# All backends\npip install signledger[all]\n\n# Framework integrations\npip install signledger[django]\npip install signledger[flask]\npip install signledger[fastapi]\n```\n\n## Quick Start\n\n```python\nfrom signledger import Ledger\nfrom signledger.backends import InMemoryBackend\n\n# Create a ledger\nledger = Ledger(backend=InMemoryBackend())\n\n# Append entries\nentry = ledger.append({\n    \"action\": \"user_login\",\n    \"user_id\": \"user123\",\n    \"ip_address\": \"192.168.1.1\"\n})\n\n# Query entries\nentries = list(ledger.get_entries(limit=10))\n\n# Verify integrity\nis_valid = ledger.verify_integrity()  # Returns True\n\n# Get statistics\nstats = ledger.get_stats()\nprint(f\"Total entries: {stats.total_entries}\")\n```\n\n## Use Cases\n\n### 1. Financial Transaction Logging\n\nImmutable audit trails for banking and financial services compliance (SOX, PCI-DSS).\n\n```python\nfrom signledger import Ledger\nfrom signledger.backends import SQLiteBackend\nfrom signledger.crypto.signatures import RSASigner\nfrom datetime import datetime\n\n# Initialize ledger with signature support\nsigner = RSASigner()\nledger = Ledger(\n    backend=SQLiteBackend(\"financial_audit.db\"),\n    enable_signatures=True\n)\n\n# Log financial transaction\nentry = ledger.append(\n    data={\n        \"transaction_id\": \"TXN123456\",\n        \"account_from\": \"ACC001\",\n        \"account_to\": \"ACC002\",\n        \"amount\": 15000.00,\n        \"currency\": \"USD\",\n        \"timestamp\": datetime.utcnow().isoformat(),\n        \"operator_id\": \"OPR789\"\n    },\n    metadata={\n        \"compliance\": \"SOX\",\n        \"category\": \"wire_transfer\"\n    },\n    sign=True,\n    signer=signer.sign\n)\n\n# Verify signature later\nis_valid = signer.verify(entry.hash, entry.signature)\n```\n\n### 2. Healthcare Access Logs (HIPAA Compliance)\n\nTrack all access to protected health information (PHI) with non-repudiation.\n\n```python\nfrom signledger import Ledger\nfrom signledger.backends import PostgreSQLBackend\n\n# HIPAA-compliant audit logging\nledger = Ledger(\n    backend=PostgreSQLBackend(\n        host=\"localhost\",\n        database=\"healthcare_audit\",\n        user=\"audit_user\",\n        password=\"secure_password\"\n    )\n)\n\n# Log PHI access\nledger.append({\n    \"event_type\": \"PHI_ACCESS\",\n    \"patient_id\": \"P123456\",\n    \"accessed_by\": \"DR_SMITH\",\n    \"access_type\": \"READ\",\n    \"data_accessed\": [\"medical_history\", \"prescriptions\"],\n    \"purpose\": \"treatment\",\n    \"facility\": \"General Hospital\"\n})\n```\n\n### 3. Supply Chain Provenance\n\nTrack product journey from manufacture to delivery.\n\n```python\nfrom signledger import Ledger\n\nledger = Ledger()\n\n# Manufacture\nledger.append({\n    \"event\": \"manufactured\",\n    \"product_id\": \"PROD-2024-001\",\n    \"batch\": \"BATCH-A123\",\n    \"location\": \"Factory Shanghai\",\n    \"quality_check\": \"PASSED\"\n})\n\n# Shipping\nledger.append({\n    \"event\": \"shipped\",\n    \"product_id\": \"PROD-2024-001\",\n    \"carrier\": \"DHL\",\n    \"tracking\": \"DHL123456789\",\n    \"destination\": \"Warehouse NYC\"\n})\n\n# Delivery\nledger.append({\n    \"event\": \"delivered\",\n    \"product_id\": \"PROD-2024-001\",\n    \"recipient\": \"John Doe\",\n    \"signature\": \"base64_signature_data\"\n})\n\n# Query product history\nproduct_history = ledger.query(\n    lambda e: e.data.get(\"product_id\") == \"PROD-2024-001\"\n)\n```\n\n### 4. Software Deployment Audit\n\nTrack all production deployments with approval workflows.\n\n```python\nfrom signledger import Ledger\n\nledger = Ledger()\n\n# Log deployment\nledger.append({\n    \"deployment_id\": \"DEPLOY-2024-042\",\n    \"application\": \"api-service\",\n    \"version\": \"v2.3.1\",\n    \"environment\": \"production\",\n    \"deployed_by\": \"deploy_bot\",\n    \"approved_by\": [\"alice@company.com\", \"bob@company.com\"],\n    \"commit_sha\": \"a1b2c3d4\",\n    \"rollback_plan\": \"automatic\",\n    \"health_check\": \"PASSED\"\n})\n```\n\n### 5. Database Change Tracking\n\nImmutable record of all database schema and data changes.\n\n```python\nfrom signledger import Ledger\n\nledger = Ledger()\n\n# Track schema change\nledger.append({\n    \"change_type\": \"schema_migration\",\n    \"database\": \"production_db\",\n    \"migration_id\": \"20240101_add_user_roles\",\n    \"sql\": \"ALTER TABLE users ADD COLUMN role VARCHAR(50)\",\n    \"executed_by\": \"admin\",\n    \"rollback_sql\": \"ALTER TABLE users DROP COLUMN role\"\n})\n```\n\n## Framework Integration\n\n### Django Integration\n\n```python\n# settings.py\nINSTALLED_APPS = [\n    ...\n    'signledger.integrations.django',\n]\n\nSIGNLEDGER = {\n    'BACKEND': 'signledger.backends.PostgreSQLBackend',\n    'OPTIONS': {\n        'host': 'localhost',\n        'database': 'audit_log',\n        'user': 'postgres',\n        'password': 'password'\n    },\n    'ENABLE_SIGNATURES': True,\n    'AUTO_VERIFY': True\n}\n\n# views.py\nfrom signledger.integrations.django import get_ledger\n\ndef transfer_money(request):\n    ledger = get_ledger()\n\n    # Perform transaction\n    transaction = process_transfer(request.data)\n\n    # Log to immutable ledger\n    ledger.append({\n        \"action\": \"money_transfer\",\n        \"user\": request.user.id,\n        \"amount\": transaction.amount,\n        \"status\": \"completed\"\n    })\n\n    return JsonResponse({\"status\": \"success\"})\n```\n\n### Flask Integration\n\n```python\nfrom flask import Flask\nfrom signledger import Ledger\nfrom signledger.backends import SQLiteBackend\n\napp = Flask(__name__)\n\n# Initialize ledger\nledger = Ledger(backend=SQLiteBackend(\"audit.db\"))\n\n@app.before_request\ndef log_request():\n    \"\"\"Log all API requests\"\"\"\n    from flask import request\n\n    if request.endpoint:\n        ledger.append({\n            \"event\": \"api_request\",\n            \"method\": request.method,\n            \"endpoint\": request.endpoint,\n            \"ip\": request.remote_addr,\n            \"user_agent\": request.user_agent.string\n        })\n\n@app.route('/api/transfer', methods=['POST'])\ndef transfer():\n    data = request.json\n\n    # Process transfer\n    result = process_payment(data)\n\n    # Log transaction\n    ledger.append({\n        \"action\": \"payment\",\n        \"from\": data['from_account'],\n        \"to\": data['to_account'],\n        \"amount\": data['amount'],\n        \"status\": result['status']\n    })\n\n    return jsonify(result)\n\n@app.route('/api/audit/verify', methods=['GET'])\ndef verify_integrity():\n    \"\"\"Verify ledger integrity\"\"\"\n    is_valid = ledger.verify_integrity()\n    stats = ledger.get_stats()\n\n    return jsonify({\n        \"integrity\": is_valid,\n        \"total_entries\": stats.total_entries,\n        \"last_entry\": stats.last_entry_time.isoformat() if stats.last_entry_time else None\n    })\n\nif __name__ == '__main__':\n    app.run()\n```\n\n### FastAPI Integration\n\n```python\nfrom fastapi import FastAPI, HTTPException\nfrom signledger import Ledger\nfrom signledger.backends import PostgreSQLBackend\nfrom pydantic import BaseModel\nfrom datetime import datetime\n\napp = FastAPI()\n\n# Initialize ledger\nledger = Ledger(\n    backend=PostgreSQLBackend(\n        host=\"localhost\",\n        database=\"audit_db\",\n        user=\"postgres\",\n        password=\"password\"\n    )\n)\n\nclass Transaction(BaseModel):\n    from_account: str\n    to_account: str\n    amount: float\n    description: str\n\n@app.post(\"/api/transaction\")\nasync def create_transaction(txn: Transaction):\n    \"\"\"Process and audit a transaction\"\"\"\n\n    # Log transaction\n    entry = await ledger.append_async({\n        \"type\": \"transaction\",\n        \"from\": txn.from_account,\n        \"to\": txn.to_account,\n        \"amount\": txn.amount,\n        \"description\": txn.description,\n        \"timestamp\": datetime.utcnow().isoformat()\n    })\n\n    return {\n        \"transaction_id\": entry.id,\n        \"hash\": entry.hash,\n        \"timestamp\": entry.timestamp\n    }\n\n@app.get(\"/api/audit/entries\")\nasync def get_audit_entries(limit: int = 100):\n    \"\"\"Retrieve recent audit entries\"\"\"\n    entries = list(ledger.get_entries(limit=limit))\n\n    return {\n        \"entries\": [\n            {\n                \"id\": e.id,\n                \"timestamp\": e.timestamp.isoformat(),\n                \"data\": e.data,\n                \"hash\": e.hash\n            }\n            for e in entries\n        ]\n    }\n\n@app.get(\"/api/audit/verify\")\nasync def verify_audit_integrity():\n    \"\"\"Verify ledger integrity\"\"\"\n    try:\n        is_valid = await ledger.verify_integrity_async()\n        stats = ledger.get_stats()\n\n        return {\n            \"valid\": is_valid,\n            \"total_entries\": stats.total_entries,\n            \"first_entry\": stats.first_entry_time.isoformat() if stats.first_entry_time else None,\n            \"last_entry\": stats.last_entry_time.isoformat() if stats.last_entry_time else None\n        }\n    except Exception as e:\n        raise HTTPException(status_code=500, detail=str(e))\n```\n\n### Celery Integration\n\n```python\nfrom celery import Celery\nfrom signledger import Ledger\nfrom signledger.backends import RedisBackend\n\napp = Celery('tasks', broker='redis://localhost:6379')\nledger = Ledger(backend=RedisBackend(host='localhost', port=6379))\n\n@app.task\ndef process_order(order_id):\n    \"\"\"Process order and log to audit trail\"\"\"\n\n    # Process order\n    result = handle_order(order_id)\n\n    # Log to ledger\n    ledger.append({\n        \"task\": \"process_order\",\n        \"order_id\": order_id,\n        \"status\": result['status'],\n        \"processed_at\": datetime.utcnow().isoformat()\n    })\n\n    return result\n```\n\n### Simple Python Program\n\n```python\nfrom signledger import Ledger\nfrom signledger.backends import InMemoryBackend\nfrom datetime import datetime\n\ndef main():\n    # Create ledger\n    ledger = Ledger(backend=InMemoryBackend())\n\n    # Simulate user activities\n    activities = [\n        {\"user\": \"alice\", \"action\": \"login\", \"ip\": \"192.168.1.10\"},\n        {\"user\": \"alice\", \"action\": \"view_document\", \"doc_id\": \"DOC123\"},\n        {\"user\": \"bob\", \"action\": \"login\", \"ip\": \"192.168.1.11\"},\n        {\"user\": \"alice\", \"action\": \"edit_document\", \"doc_id\": \"DOC123\"},\n        {\"user\": \"bob\", \"action\": \"delete_document\", \"doc_id\": \"DOC456\"},\n    ]\n\n    # Log activities\n    for activity in activities:\n        activity[\"timestamp\"] = datetime.utcnow().isoformat()\n        entry = ledger.append(activity)\n        print(f\"Logged: {entry.id} - {activity['action']}\")\n\n    # Query specific user's activities\n    alice_activities = ledger.query(\n        lambda e: e.data.get(\"user\") == \"alice\"\n    )\n\n    print(f\"\\nAlice's activities: {len(alice_activities)}\")\n    for entry in alice_activities:\n        print(f\"  - {entry.data['action']} at {entry.timestamp}\")\n\n    # Verify integrity\n    is_valid = ledger.verify_integrity()\n    print(f\"\\nLedger integrity: {'VALID' if is_valid else 'INVALID'}\")\n\n    # Get statistics\n    stats = ledger.get_stats()\n    print(f\"Total entries: {stats.total_entries}\")\n    print(f\"First entry: {stats.first_entry_time}\")\n    print(f\"Last entry: {stats.last_entry_time}\")\n\nif __name__ == \"__main__\":\n    main()\n```\n\n## Advanced Features\n\n### Batch Operations\n\n```python\nfrom signledger.core.batch import BatchProcessor\n\n# High-throughput batch processing\nbatch = BatchProcessor(ledger, batch_size=1000)\n\nfor i in range(10000):\n    batch.add_entry({\"transaction_id\": f\"TXN{i}\", \"amount\": i * 100})\n\nbatch.flush()  # Commit remaining entries\n```\n\n### Compression\n\n```python\nfrom signledger.compression import Compressor\n\n# Enable compression for storage optimization\nledger = Ledger(\n    backend=SQLiteBackend(\"audit.db\"),\n    compression=Compressor(algorithm=\"zstd\", level=3)\n)\n```\n\n### Merkle Tree Verification\n\n```python\nfrom signledger.crypto.merkle import MerkleTree\n\n# Build Merkle tree from entries\nentries = list(ledger.get_entries())\nmerkle_tree = MerkleTree()\n\nfor entry in entries:\n    merkle_tree.add_leaf(entry.hash)\n\nmerkle_tree.build()\n\n# Get Merkle root\nroot_hash = merkle_tree.get_root()\n\n# Verify specific entry\nproof = merkle_tree.get_proof(0)\nis_valid = merkle_tree.verify_proof(proof, entries[0].hash, root_hash)\n```\n\n### Cryptographic Signatures\n\n```python\nfrom signledger.crypto.signatures import RSASigner, ECDSASigner, Ed25519Signer\n\n# RSA signatures\nrsa_signer = RSASigner(key_size=2048)\nentry = ledger.append(\n    {\"action\": \"critical_operation\"},\n    sign=True,\n    signer=rsa_signer.sign\n)\n\n# ECDSA signatures (faster, smaller)\necdsa_signer = ECDSASigner(curve=\"secp256k1\")\nentry = ledger.append(\n    {\"action\": \"blockchain_transaction\"},\n    sign=True,\n    signer=ecdsa_signer.sign\n)\n\n# Ed25519 signatures (modern, fast)\ned_signer = Ed25519Signer()\nentry = ledger.append(\n    {\"action\": \"secure_message\"},\n    sign=True,\n    signer=ed_signer.sign\n)\n```\n\n## Storage Backends\n\n### SQLite (Default for Small-Medium Deployments)\n\n```python\nfrom signledger.backends import SQLiteBackend\n\nledger = Ledger(backend=SQLiteBackend(\"audit.db\"))\n```\n\n### PostgreSQL (Recommended for Production)\n\n```python\nfrom signledger.backends import PostgreSQLBackend\n\nledger = Ledger(\n    backend=PostgreSQLBackend(\n        host=\"localhost\",\n        port=5432,\n        database=\"audit_log\",\n        user=\"postgres\",\n        password=\"secure_password\"\n    )\n)\n```\n\n### MongoDB (Document-Oriented)\n\n```python\nfrom signledger.backends import MongoDBBackend\n\nledger = Ledger(\n    backend=MongoDBBackend(\n        host=\"localhost\",\n        port=27017,\n        database=\"audit_db\",\n        collection=\"ledger_entries\"\n    )\n)\n```\n\n### In-Memory (Testing/Development)\n\n```python\nfrom signledger.backends import InMemoryBackend\n\nledger = Ledger(backend=InMemoryBackend())\n```\n\n## Performance\n\nSignLedger is optimized for high-throughput audit logging:\n\n- **Write Performance**: 2,000+ entries/second (batch mode: 10,000+/sec)\n- **Read Performance**: 50,000+ entries/second with caching\n- **Verification**: Full integrity check of 100,000 entries in ~2 seconds\n- **Storage Efficiency**: 50-70% reduction with compression\n- **Memory Usage**: ~1MB per 1,000 entries (without compression)\n\n## Security\n\n- **Immutability**: Entries cannot be modified after creation (Pydantic frozen models)\n- **Hash Chain**: Tamper detection through cryptographic linking\n- **Digital Signatures**: Non-repudiation with RSA/ECDSA/Ed25519\n- **Integrity Verification**: Automatic or on-demand verification\n- **Thread Safety**: Production-ready concurrent access protection\n\n## Requirements\n\n- Python 3.8+\n- pydantic >= 2.0.0\n- cryptography >= 41.0.0\n\n## License\n\nMIT License\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n## Support\n\n- GitHub Issues: https://github.com/vipin08/signledger/issues\n- Documentation: https://github.com/vipin08/signledger\n\n## Changelog\n\n### Version 1.0.0 (Initial Release)\n\n- Immutable audit logging with hash chain verification\n- Multiple storage backends (SQLite, PostgreSQL, MongoDB, In-Memory)\n- Cryptographic signatures (RSA, ECDSA, Ed25519)\n- Framework integrations (Django, Flask, FastAPI)\n- Batch operations for high-throughput scenarios\n- Compression support (zlib, gzip, lz4, zstd)\n- Thread-safe operations\n- Full type hints and Pydantic v2 validation\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Immutable audit logging with cryptographic verification for Python applications",
    "version": "1.0.0",
    "project_urls": {
        "Bug Reports": "https://github.com/vipin08/signledger/issues",
        "Homepage": "https://github.com/vipin08/signledger",
        "Source": "https://github.com/vipin08/signledger"
    },
    "split_keywords": [
        "audit",
        "logging",
        "immutable",
        "ledger",
        "blockchain",
        "cryptography",
        "compliance",
        "security"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5ca8227679b940afd8f6ee2366de36e713f36f6cd3018ecca15128fa246a126c",
                "md5": "3c1cfffb217109ad0f80f67b1626bde7",
                "sha256": "38e30873d2fdfae71c0644a4f9567522783eab161b1c9188850b512d9b144dfe"
            },
            "downloads": -1,
            "filename": "signledger-1.0.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "3c1cfffb217109ad0f80f67b1626bde7",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 65194,
            "upload_time": "2025-10-21T17:28:39",
            "upload_time_iso_8601": "2025-10-21T17:28:39.544570Z",
            "url": "https://files.pythonhosted.org/packages/5c/a8/227679b940afd8f6ee2366de36e713f36f6cd3018ecca15128fa246a126c/signledger-1.0.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-21 17:28:39",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "vipin08",
    "github_project": "signledger",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "signledger"
}
        
Elapsed time: 2.39364s