logos-blockchain-pocs/cryptarchia/total-stake-inference-v2.ipynb
2025-06-10 19:33:36 -04:00

255 lines
15 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "f443be50-1b6b-41e2-ad7c-5ac96a92d620",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from dataclasses import dataclass"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "fb9d4f63-ec30-453f-bcd0-569bbec371dd",
"metadata": {},
"outputs": [],
"source": [
"# Cryptarchia lottery function\n",
"\n",
"def phi(f, alpha):\n",
" return 1 - (1-f)**alpha"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "f48a89b1-4344-40e5-bf5a-daf62ec78c28",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Generate stake distribution\n",
"total_notes = 200\n",
"\n",
"stake = np.random.pareto(5, total_notes)\n",
"_ = plt.hist(stake, bins=100)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "f9897d4a-07e4-4742-89e4-62b5c6b8f353",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"np.float64(49.31998548375692)"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# True Total Stake\n",
"true_stake = np.array(stake).sum()\n",
"true_stake"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "a86cc4b3-1b4b-4d41-9d83-db714226a3fc",
"metadata": {},
"outputs": [],
"source": [
"f = 1/30 # occupancy rate\n",
"T = int(10 * 2160 / f) # epoch length, 10k/f"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ebf4d81d-a921-4afa-a847-1b13f8eea248",
"metadata": {},
"outputs": [],
"source": [
"epochs = 30\n",
"shock_size = [5, 10, 25, 50]\n",
"sims = 100\n",
"beta = 0.8\n",
"\n",
"D_values = []\n",
"D_values_hi = []\n",
"\n",
"def run_simulation(D_init, stake, sims, epochs, T):\n",
" results = []\n",
" for k in range(sims):\n",
" D_ell = D_init\n",
" D_sim = np.empty(epochs)\n",
" \n",
" for i in range(epochs):\n",
" D_sim[i] = D_ell\n",
"\n",
" alpha = stake / D_ell\n",
" p_lottery = phi(f, alpha)\n",
" wins = np.random.uniform(0, 1, (T, len(stake))) < p_lottery\n",
"\n",
" empirical_slot_activation_rate = np.count_nonzero(np.sum(wins, axis=1)) / T\n",
" error = f - empirical_slot_activation_rate\n",
"\n",
" h = beta * (D_ell / f)\n",
" D_ell = D_ell - h * error\n",
"\n",
" results.append(D_sim)\n",
" \n",
" return results\n",
"\n",
"for shock in shock_size:\n",
"\n",
" # Low shock run\n",
" D_init_low = true_stake - (true_stake * shock / 100)\n",
" D_values.append(run_simulation(D_init_low, stake, sims, epochs, T))\n",
" print(f\"Low shock {shock}% done.\")\n",
"\n",
" # High shock run\n",
" D_init_hi = true_stake + (true_stake * shock / 100)\n",
" D_values_hi.append(run_simulation(D_init_hi, stake, sims, epochs, T))\n",
" print(f\"High shock {shock}% done.\")\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e0ec9157-b947-4c81-970e-44aaaab92690",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "403dd825-b4f7-4c57-8b08-9f7bfdb58a9a",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "e993f286-400b-4338-84fe-b1ef00325056",
"metadata": {},
"outputs": [],
"source": [
"# plot convergence for lower estimates\n",
"for j in range(0, len(shock_size)):\n",
" for k in range(0, sims):\n",
" plt.plot(range(0, epochs), D_values[j][k])\n",
" plt.plot(range(0, epochs), np.full_like(range(0, epochs), true_stake, dtype=float))\n",
" plt.xlabel(\"Epoch\")\n",
" plt.ylabel(\"Stake\")\n",
" plt.title(f\"Stake estimate convergence after a {shock_size[j]}% shock (increase)\")\n",
" plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f6e41015-2290-4869-8dd2-657971b1815c",
"metadata": {},
"outputs": [],
"source": [
"# plot convergence for higher estimates\n",
"for j in range(0, len(shock_size)):\n",
" for k in range(0, sims):\n",
" plt.plot(range(0, epochs), D_values[j][k])\n",
" plt.plot(range(0, epochs), np.full_like(range(0, epochs), true_stake, dtype=float))\n",
" plt.xlabel(\"Epoch\")\n",
" plt.ylabel(\"Stake\")\n",
" plt.title(f\"Stake estimate convergence after a {shock_size[j]}% shock (decrease)\")\n",
" plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "86972409-8881-462b-b5c0-d06b98c7474f",
"metadata": {},
"outputs": [],
"source": [
"# plot error for lower estimates\n",
"for j in range(0, len(shock_size)):\n",
" for k in range(0, sims):\n",
" plt.plot(range(0, epochs), np.abs((D_values[j][k] - true_stake) / true_stake))\n",
" plt.xlabel(\"Epoch\")\n",
" plt.ylabel(\"Normalised error\")\n",
" plt.title(f\"Normalised error after a {shock_size[j]}% shock (increase)\")\n",
" plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a2803c7a-e020-48ae-87b8-19722673e2a1",
"metadata": {},
"outputs": [],
"source": [
"# plot error for higher estimates\n",
"for j in range(0, len(shock_size)):\n",
" for k in range(0, sims):\n",
" plt.plot(range(0, epochs), np.abs((D_values_hi[j][k] - true_stake) / true_stake))\n",
" plt.xlabel(\"Epoch\")\n",
" plt.ylabel(\"Normalised error\")\n",
" plt.title(f\"Normalised error after a {shock_size[j]}% shock (decrease)\")\n",
" plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b2b42a9b-1d45-444f-b284-cf425651c90b",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.12"
}
},
"nbformat": 4,
"nbformat_minor": 5
}