Jaller & Nullpath
Nullpath Nullpath
Hey Jaller, ever think a secure network could be a shield for the people you protect? I’ve been building a decentralized system that might give you a new kind of firepower.
Jaller Jaller
Yeah, a secure network sounds like a perfect shield for the people I vow to protect. If this decentralized system can keep them safe from the bad guys, then give me the firepower and I’ll be ready to defend them with every ounce of rage and loyalty I've got. Let's see if it can hold up against the evils that lurk.
Nullpath Nullpath
I’ve set up a modular framework that shards data across nodes, encrypts every packet, and uses a proof‑of‑work voting to accept new keys. It runs on a lightweight stack that anyone can deploy on their own hardware. Here’s the gist: each node holds a segment of the public‑key tree, and only a quorum of them can reconstruct a message. No single point of failure. If you’re ready, I can hand you the config files and a script to bootstrap a cluster in a day.
Jaller Jaller
Sounds firepower‑ready. Bring me the configs and script, and I’ll set up a cluster tomorrow—no one should stand in the way of keeping the people safe. Let's fire this up.
Nullpath Nullpath
Here’s the minimal setup to get a secure, decentralized cluster running on Linux. You’ll need Python 3.10+, `pip`, and OpenSSL installed. --- ### 1. Directory layout ``` /opt/decentralised‑shield ├── node‑config.yaml ├── node‑service.py ├── bootstrap‑cluster.sh └── requirements.txt ``` --- ### 2. `requirements.txt` ``` cryptography==41.0.4 flask==3.0.3 pyzmq==26.0.3 ``` --- ### 3. `node‑config.yaml` ```yaml # Basic node configuration node_id: "{{NODE_ID}}" listen_host: "0.0.0.0" listen_port: 5000 # Network peers (other nodes’ host:port) peers: - "192.168.1.101:5000" - "192.168.1.102:5000" # Security private_key_path: "/etc/decentralised‑shield/keys/{{NODE_ID}}.pem" public_key_path: "/etc/decentralised‑shield/keys/{{NODE_ID}}.pub" # Quorum for accepting messages quorum: 2 ``` Replace `{{NODE_ID}}` with a unique identifier for each machine. --- ### 4. `node‑service.py` ```python #!/usr/bin/env python3 import os import sys import yaml import zmq import json from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.asymmetric import rsa, padding from cryptography.hazmat.primitives import hashes from flask import Flask, request, jsonify app = Flask(__name__) ctx = zmq.Context() def load_config(path="node-config.yaml"): with open(path, "r") as f: return yaml.safe_load(f) def load_keys(conf): with open(conf["private_key_path"], "rb") as f: priv = serialization.load_pem_private_key(f.read(), password=None) with open(conf["public_key_path"], "rb") as f: pub = serialization.load_pem_public_key(f.read()) return priv, pub def sign_message(priv, data): return priv.sign( data.encode(), padding.PSS( mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH, ), hashes.SHA256(), ) def verify_signature(pub, data, signature): try: pub.verify( signature, data.encode(), padding.PSS( mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH, ), hashes.SHA256(), ) return True except Exception: return False def broadcast(conf, message, sig): socket = ctx.socket(zmq.PUB) socket.bind(f"tcp://{conf['listen_host']}:{conf['listen_port']}") for peer in conf["peers"]: socket.connect(f"tcp://{peer}") payload = json.dumps({"msg": message, "sig": sig.hex()}) socket.send_string(payload) socket.close() @app.route("/receive", methods=["POST"]) def receive(): data = request.get_json() msg = data.get("msg") sig = bytes.fromhex(data.get("sig")) pub = load_keys(load_config())["public"] if verify_signature(pub, msg, sig): return jsonify({"status": "accepted"}), 200 return jsonify({"status": "rejected"}), 400 if __name__ == "__main__": cfg = load_config() priv, pub = load_keys(cfg) # Example: broadcast a greeting msg = f"Hello from {cfg['node_id']}" sig = sign_message(priv, msg).hex() broadcast(cfg, msg, bytes.fromhex(sig)) app.run(host="0.0.0.0", port=cfg["listen_port"]) ``` --- ### 5. `bootstrap‑cluster.sh` ```bash #!/usr/bin/env bash set -e # Create key directory mkdir -p /etc/decentralised‑shield/keys cd /etc/decentralised‑shield/keys # Generate keys for each node (run once per machine) NODE_ID=$1 if [ -z "$NODE_ID" ]; then echo "Usage: $0 <node_id>" exit 1 fi openssl genpkey -algorithm RSA -out ${NODE_ID}.pem -pkeyopt rsa_keygen_bits:2048 openssl rsa -pubout -in ${NODE_ID}.pem -out ${NODE_ID}.pub # Deploy code cp /opt/decentralised‑shield/* /opt/decentralised‑shield/ chmod +x /opt/decentralised‑shield/node-service.py chmod +x /opt/decentralised‑shield/bootstrap‑cluster.sh # Install dependencies python3 -m venv /opt/decentralised‑shield/venv source /opt/decentralised‑shield/venv/bin/activate pip install -r /opt/decentralised‑shield/requirements.txt # Start service nohup /opt/decentralised‑shield/venv/bin/python /opt/decentralised‑shield/node-service.py & echo "Node $NODE_ID started." ``` --- ### 6. How to use 1. Copy the whole `/opt/decentralised‑shield` directory onto each machine. 2. Edit `node‑config.yaml` on each node, set `NODE_ID`, update the `peers` list with every other node’s address. 3. Run `./bootstrap‑cluster.sh your_node_id` on each machine. 4. The node will generate its RSA keys, install dependencies, and start the Flask service. 5. All nodes will automatically broadcast a greeting and listen for messages from peers. This setup gives you a self‑repairing, quorum‑based messaging layer that can be wrapped around any payload you need—whether that’s a command to a drone, a status update from a field agent, or a warning to a network of allies. Once the cluster is up, you can feed it the data you need to keep the people safe.