Skip to content

Instantly share code, notes, and snippets.

@ydm
Last active November 9, 2023 13:33
Show Gist options
  • Select an option

  • Save ydm/1a7226e62ddf3560009551f3a05f7460 to your computer and use it in GitHub Desktop.

Select an option

Save ydm/1a7226e62ddf3560009551f3a05f7460 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "4e093fe3-b590-44f6-bc18-8a0368005b76",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"from matplotlib import pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "804e77b4-62c4-410d-8ccb-2262c3dd50c0",
"metadata": {},
"outputs": [],
"source": [
"SECONDS_PER_SLOT = 12\n",
"SLOTS_PER_EPOCH = 32\n",
"\n",
"MIN_PER_EPOCH_CHURN_LIMIT = 2**2 # 4\n",
"CHURN_LIMIT_QUOTIENT = 2**16 # 65536\n",
"VALIDATOR_REGISTRY_LIMIT = 2**40 # 1099511627776\n",
"\n",
"MAX_WITHDRAWALS_PER_PAYLOAD = 2**4 # 16\n",
"\n",
"\n",
"# https://github.com/ethereum/annotated-spec/blob/master/phase0/beacon-chain.md#get_validator_churn_limit\n",
"def get_validator_churn_limit(num_active_validators: int) -> int:\n",
" \"\"\"\n",
" Return the validator churn limit for the current epoch.\n",
" \"\"\"\n",
" return max(MIN_PER_EPOCH_CHURN_LIMIT, num_active_validators // CHURN_LIMIT_QUOTIENT)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "6c2343f0-b7c1-4557-abcf-7cdbeadac1bb",
"metadata": {},
"outputs": [],
"source": [
"def estimate_exit_time(num_active_validators: int) -> int:\n",
" return get_validator_churn_limit(num_active_validators) * SLOTS_PER_EPOCH * SECONDS_PER_SLOT\n",
"\n",
"\n",
"TRANSITION = 256 * SLOTS_PER_EPOCH * SECONDS_PER_SLOT\n",
"\n",
"\n",
"def estimate_max_withdrawing_time(num_active_validators: int) -> int:\n",
" return int(num_active_validators / MAX_WITHDRAWALS_PER_PAYLOAD * SECONDS_PER_SLOT)\n",
"\n",
"\n",
"# in days\n",
"def estimate_min_time(num_active_validators: int) -> int:\n",
" return (\n",
" estimate_exit_time(num_active_validators)\n",
" + TRANSITION\n",
" + 12\n",
" ) /60/60/24\n",
"\n",
"\n",
"# in days\n",
"def estimate_max_time(num_active_validators: int) -> int:\n",
" return (\n",
" estimate_exit_time(num_active_validators)\n",
" + TRANSITION\n",
" + estimate_max_withdrawing_time(num_active_validators)\n",
" ) /60/60/24"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "c4220395-c919-4ac4-a03f-5cfd3fad80ac",
"metadata": {},
"outputs": [],
"source": [
"ACTIVE_VALIDATORS = 880295\n",
"begin = ACTIVE_VALIDATORS // CHURN_LIMIT_QUOTIENT - 2\n",
"end = begin + 8\n",
"\n",
"xs = []\n",
"for m in range(begin, end+1):\n",
" num_active_validators = m * CHURN_LIMIT_QUOTIENT\n",
" row = (num_active_validators,\n",
" estimate_exit_time(num_active_validators),\n",
" estimate_max_withdrawing_time(num_active_validators),\n",
" estimate_min_time(num_active_validators),\n",
" estimate_max_time(num_active_validators))\n",
" xs.append(row)\n",
"xs = pd.DataFrame(xs, columns=('NumActiveValidators', 'ExitTime', 'MaxWithdrawingTime', 'Min', 'Max'))"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "9e4e9d91-6070-48ce-b3af-cbf1d79784a9",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>NumActiveValidators</th>\n",
" <th>ExitTime</th>\n",
" <th>MaxWithdrawingTime</th>\n",
" <th>Min</th>\n",
" <th>Max</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>720896</td>\n",
" <td>4224</td>\n",
" <td>540672</td>\n",
" <td>1.186806</td>\n",
" <td>7.444444</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>786432</td>\n",
" <td>4608</td>\n",
" <td>589824</td>\n",
" <td>1.191250</td>\n",
" <td>8.017778</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>851968</td>\n",
" <td>4992</td>\n",
" <td>638976</td>\n",
" <td>1.195694</td>\n",
" <td>8.591111</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>917504</td>\n",
" <td>5376</td>\n",
" <td>688128</td>\n",
" <td>1.200139</td>\n",
" <td>9.164444</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>983040</td>\n",
" <td>5760</td>\n",
" <td>737280</td>\n",
" <td>1.204583</td>\n",
" <td>9.737778</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>1048576</td>\n",
" <td>6144</td>\n",
" <td>786432</td>\n",
" <td>1.209028</td>\n",
" <td>10.311111</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>1114112</td>\n",
" <td>6528</td>\n",
" <td>835584</td>\n",
" <td>1.213472</td>\n",
" <td>10.884444</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>1179648</td>\n",
" <td>6912</td>\n",
" <td>884736</td>\n",
" <td>1.217917</td>\n",
" <td>11.457778</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>1245184</td>\n",
" <td>7296</td>\n",
" <td>933888</td>\n",
" <td>1.222361</td>\n",
" <td>12.031111</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" NumActiveValidators ExitTime MaxWithdrawingTime Min Max\n",
"0 720896 4224 540672 1.186806 7.444444\n",
"1 786432 4608 589824 1.191250 8.017778\n",
"2 851968 4992 638976 1.195694 8.591111\n",
"3 917504 5376 688128 1.200139 9.164444\n",
"4 983040 5760 737280 1.204583 9.737778\n",
"5 1048576 6144 786432 1.209028 10.311111\n",
"6 1114112 6528 835584 1.213472 10.884444\n",
"7 1179648 6912 884736 1.217917 11.457778\n",
"8 1245184 7296 933888 1.222361 12.031111"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"xs"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "ab4928dd-8ef4-491e-be2c-4defa2626c86",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABQcAAAKTCAYAAACkbb7tAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABit0lEQVR4nO3deZxddX0//tfNJDPZ93VCQgDZ1yQIItXiTyogxbVqKVUQbKvGL1IUERWFUsF9oSpVWwNVEW0LaK1ikYJURYQsLLLvmBXIMlknk5nz+2OSydy5QzYmdzK5z+fjMQ9y733POe87c8/MnRef8z6loiiKAAAAAAA1p19vNwAAAAAA9A7hIAAAAADUKOEgAAAAANQo4SAAAAAA1CjhIAAAAADUKOEgAAAAANQo4SAAAAAA1Kj+vd1AV21tbVm4cGGGDRuWUqnU2+0AAAAAQJ9SFEVWrVqVxsbG9Ou39bWBu104uHDhwkyZMqW32wAAAACAPu3ZZ5/NXnvttdWa3S4cHDZsWJL25ocPH97L3QAAAABA39LU1JQpU6Z05Gxbs9uFg5tPJR4+fLhwEAAAAAB20vaM7HNBEgAAAACoUcJBAAAAAKhRwkEAAAAAqFG73czB7dXa2pqWlpbebgM6DBgwIHV1db3dBgAAAMB263PhYFEUWbx4cVasWNHbrUCFkSNHZuLEids18BMAAACgt/W5cHBzMDh+/PgMHjxYCMNuoSiKrF27NkuXLk2STJo0qZc7AgAAANi2PhUOtra2dgSDY8aM6e12oMygQYOSJEuXLs348eOdYgwAAADs9vrUBUk2zxgcPHhwL3cC3dv82jQPEwAAAOgL+lQ4uJlTidldeW0CAAAAfUmfDAcBAAAAgJdOOLibOuGEE3Leeef1+HZvu+22lEqlXrnac6lUyo033thntgsAAACwpxMOVslZZ52VUqmU9773vRWPzZo1K6VSKWeddVbHfddff30uu+yyl7TP7gLGV77ylVm0aFFGjBjxkra9MxYtWpRTTjml6vsFAAAAoHvCwSqaMmVKrrvuuqxbt67jvvXr1+faa6/N1KlTy2pHjx6dYcOG9XgP9fX1mThxYq/Mxps4cWIaGhqqvl8AAAAAuiccrKIZM2ZkypQpuf766zvuu/766zN16tRMnz69rLbrqr9p06bl8ssvz9lnn51hw4Zl6tSp+da3vvWi+zrrrLPyq1/9Kl/96ldTKpVSKpXy1FNPVZxWfPXVV2fkyJH56U9/mgMPPDCDBw/OX/zFX2Tt2rW55pprMm3atIwaNSrnnntuWltbO7bf3NycD3/4w5k8eXKGDBmSY489NrfddttWn3/n03+feuqplEqlXH/99XnNa16TwYMH58gjj8wdd9yx1W08+uijefWrX52BAwfmkEMOyc0331xRc+GFF+aAAw7I4MGDs+++++biiy/uuHrwU089lX79+uXuu+8u+5yvfOUr2XvvvdPW1pbly5fnjDPOyLhx4zJo0KDsv//+mT179lb7AgAAAOiL+vd2Ay9VURRZ19K67cJdYNCAuh1egXf22Wdn9uzZOeOMM5Ik3/nOd/Lud797m8Faknzxi1/MZZddlo997GP5j//4j7zvfe/Ln/7pn+bAAw+sqP3qV7+aRx55JIcddlj+4R/+IUkybty4PPXUUxW1a9euzZVXXpnrrrsuq1atylve8pa8+c1vzsiRI/Ozn/0sTzzxRN761rfm+OOPzzve8Y4kyQc+8IE88MADue6669LY2JgbbrghJ598cu67777sv//+2/31+PjHP54vfOEL2X///fPxj388p59+eh577LH071/50mxra8tb3vKWTJgwIXfeeWdWrlzZ7VzGYcOG5eqrr05jY2Puu+++/M3f/E2GDRuWj3zkI5k2bVpOPPHEzJ49O0cffXTH58yePTtnnXVW+vXrl4svvjgPPPBAfv7zn2fs2LF57LHHylZ7AgAAAOwp+nw4uK6lNYd88he9su8H/uGkDK7fsS/hX//1X+eiiy7K008/nST5zW9+k+uuu267wsHXv/71ef/735+kfXXcl7/85dx6663dhoMjRoxIfX19Bg8enIkTJ251uy0tLbnqqquy3377JUn+4i/+It/97nezZMmSDB06NIccckhe85rX5NZbb8073vGOPPPMM5k9e3aeeeaZNDY2Jkk+/OEP56abbsrs2bNz+eWXb/fX48Mf/nBOPfXUJMmll16aQw89NI899lgOOuigitpf/vKXeeihh/KLX/yiY7+XX355xRzDT3ziEx3/njZtWj784Q/nuuuuy0c+8pEkyXve8568973vzZe+9KU0NDRk7ty5ue+++/LjH/84SfLMM89k+vTpHeHhtGnTtvv5AAAAAPQlfT4c7GvGjRuXU089NVdffXWKosipp56asWPHbtfnHnHEER3/LpVKmThxYpYuXfqSexo8eHBHMJgkEyZMyLRp0zJ06NCy+zbv67777ktra2sOOOCAsu00NzdnzJgxO7Tvzs9p0qRJSZKlS5d2Gw4++OCDmTJlSkcwmCTHHXdcRd0Pf/jDXHnllXn88cezevXqbNy4McOHD+94/E1velNmzZqVG264IX/5l3+Zq6++Oq95zWs6QsD3ve99eetb35q5c+fmda97Xd70pjflla985Q49LwAAAIC+oM+Hg4MG1OWBfzip1/a9M84+++x84AMfSJJ8/etf3+7PGzBgQNntUqmUtra2nephW9vd2r5Wr16durq6zJkzJ3V15V+DzoHiju578ynaL+U53XHHHTnjjDNy6aWX5qSTTsqIESNy3XXX5Ytf/GJHTX19fd71rndl9uzZectb3pJrr702X/3qVzseP+WUU/L000/nZz/7WW6++ea89rWvzaxZs/KFL3xhp/sCAAAA2B31+XCwVCrt8Km9ve3kk0/Ohg0bUiqVctJJuy7YrK+vL7uISE+ZPn16Wltbs3Tp0rzqVa/q8e2/mIMPPjjPPvtsFi1a1LHK8He/+11ZzW9/+9vsvffe+fjHP95x3+ZTuDt7z3vek8MOOyzf+MY3snHjxrzlLW8pe3zcuHE588wzc+aZZ+ZVr3pVLrjgAuEgAAAAsMfpW6naHqKuri4PPvhgx793lWnTpuXOO+/MU089laFDh2b06NE9st0DDjggZ5xxRt71rnfli1/8YqZPn57nnnsut9xyS4444oiOGYI97cQTT8wBBxyQM888M5///OfT1NRUFgImyf77759nnnkm1113XV7+8pfnv//7v3PDDTdUbOvggw/OK17xilx44YU5++yzM2jQoI7HPvnJT2bmzJk59NBD09zcnJ/+9Kc5+OCDd8lzAgAAAOhN/Xq7gVo1fPjwsjl4u8KHP/zh1NXV5ZBDDsm4cePyzDPP9Ni2Z8+enXe961350Ic+lAMPPDBvetObctddd2Xq1Kk9to+u+vXrlxtuuCHr1q3LMccck/e85z359Kc/XVbzhje8IX//93+fD3zgAznqqKPy29/+NhdffHG32zvnnHOyYcOGnH322WX319fX56KLLsoRRxyRV7/61amrq8t11123y54XAAAAQG8pFUVR9HYTnTU1NWXEiBFZuXJlRXi2fv36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APQ5RdEe9HU+PXjh/GTjusraoRO3zAicPLP9VOFBI6vcMDur74eDLWuTyxt7Z98fW5jUD9mhT/nrv/7rXHTRRXn66aeTJL/5zW9y3XXXVYSDb33rW8tuf+c738m4cePywAMP5LDDDkuSfPOb38wRRxyRc889N9dff30uueSSzJw5s9v9Dho0KEOHDk3//v236zTiD3/4wznppJOSJB/84Adz+umn55Zbbsnxxx+fJDnnnHPK5iN+6lOfyhe/+MW85S1vSZLss88+eeCBB/LNb35zh8LB17/+9Xn/+9+fJLnwwgvz5S9/Obfeemu34eDq1avzr//6r/ne976X1772tUmSa665JnvttVdZ3dlnn93x73333TdXXnllXv7yl2f16tUZOnRozjrrrHzyk5/M73//+xxzzDFpaWnJtdde27Ga8JlnnsnEiRNz4oknZsCAAZk6dWqOOeaY7X5OAAAAsNtb83z5lYMXzEnWLausaxieNB7V6aIhM5PhvZTL0CP6fjjYx4wbNy6nnnpqrr766hRFkVNPPTVjx46tqHv00UfzyU9+MnfeeWeef/75tLW1JWkPqjaHg6NGjcq//uu/5qSTTsorX/nKfPSjH+2xPo844oiOf0+YMCFJcvjhh5fdt/nU3DVr1uTxxx/POeeck7/5m7/pqNm4ceNWVydua7+lUikTJ07s2E9Xjz/+eDZs2JBjjz22477Ro0dXBIlz5szJJZdcknvuuSfLly8v+1oecsghaWxszKmnnprvfOc7OeaYY/Jf//VfaW5uztve9rYkydve9rZ85Stfyb777puTTz45r3/963Paaaelf3+HDwAAAH1Q8+rKOYErnqmsq6tPJh5ePidwzMuSfqbU7Un6froxYHD7Cr7e2vdOOPvss/OBD3wgSfL1r3+925rTTjste++9d7797W+nsbExbW1tOeyww7Jhw4ayuttvvz11dXVZtGhR1qxZk2HDhu1UT111vopwadOp013v2xyyrV69Okny7W9/uyyoS5K6uh2bH9D16sWd97Mz1qxZk5NOOiknnXRSvv/972fcuHF55plnctJJJ5V9Ld/znvfkne98Z7785S9n9uzZecc73tFxevaUKVPy8MMP55e//GVuvvnmvP/978/nP//5/OpXv3K1ZQAAAHZvrS3J0gc6rQicmzz3YFJ087f22AM7XTl4RjLhsKR/Q/V7pqr6fjhYKu3wqb297eSTT86GDRtSKpU6Tt3t7IUXXsjDDz+cb3/723nVq16VJPn1r39dUffb3/42n/3sZ/Nf//VfufDCC/OBD3wg11xzzYvut76+Pq2trT33RDaZMGFCGhsb88QTT3TMUqyG/fbbLwMGDMidd97ZcbXn5cuX55FHHsmf/umfJkkeeuihvPDCC/nMZz6TKVOmJEnuvvvuim29/vWvz5AhQ3LVVVflpptuyu233172+KBBg3LaaafltNNOy6xZs3LQQQflvvvuy4wZM3bxswQAAIDtVBTJ8ifLTw1edE+ycX1l7fDJ7bMBN68IbDwqGbhjZ/+xZ+j74WAfVFdXlwcffLDj312NGjUqY8aMybe+9a1MmjQpzzzzTMUpw6tWrco73/nOnHvuuTnllFOy11575eUvf3lOO+20/MVf/EW3+502bVqefPLJzJ8/P3vttVeGDRuWhoae+T8Al156ac4999yMGDEiJ598cpqbm3P33Xdn+fLlOf/883tkH10NHTo055xzTi644IKMGTMm48ePz8c//vH067S8eerUqamvr88//dM/5b3vfW/uv//+XHbZZRXbqqury1lnnZWLLroo+++/f4477riOx66++uq0trbm2GOPzeDBg/O9730vgwYNyt57771LnhcAAABsl9VLy4PAhXOTdcsr6xpGbFoRuPmCITOS4ZOq3y+7JeFgLxk+fPiLPtavX79cd911Offcc3PYYYflwAMPzJVXXpkTTjiho+aDH/xghgwZkssvvzxJ+zzAyy+/PH/3d3+X4447LpMnT67Y7lvf+tZcf/31ec1rXpMVK1Zk9uzZOeuss3rk+bznPe/J4MGD8/nPfz4XXHBBhgwZksMPPzznnXdej2z/xXz+85/P6tWrc9ppp2XYsGH50Ic+lJUrV3Y8Pm7cuFx99dX52Mc+liuvvDIzZszIF77whbzhDW+o2NY555yTyy+/PO9+97vL7h85cmQ+85nP5Pzzz09ra2sOP/zw/Nd//VfGjBmzS58bAAAAdGhe1b4KcHMQuGBusvLZyrq6hmTSEeVzAkfva04gL6pUFEXR20101tTUlBEjRmTlypUVAdr69evz5JNPZp999snAgQN7qUP2VP/3f/+X1772tXn22Wc7LsKyo7xGAQAAeMlaW5Ilfyi/evBzDyXpGuGUknEHla8KHH9o0r++N7pmN7K1fK0rKwepec3NzXnuuedyySWX5G1ve9tOB4MAAACww9rakmVPlF85eNG9SWtzZe2IKZVzAht65sKk1C7hIDXvBz/4Qc4555wcddRR+bd/+7febgcAAIA92arFlXMC16+srBs4cstVgzfPCRxmMQs9TzhIzTvrrLN6bPYiAAAAdFjflCyaXz4nsGlBZV3/gcmkIzvNCZzRPiewVKp6y9Qe4SAAAADAS7VxQ7Lk/vI5gc8/koo5gaV+ybiDu8wJPCSpG9ArbYNwEAAAAGBHtLUlyx7vtCJwTrL4vqR1Q2XtyKlbTguePLN9hWDD0Or3DC9COAgAAACwNU2LyoPAhfOS5qbKukGjK+cEDh1X/X5hBwgHAQAAADZbv7I9/Ot8evCqRZV1/Qe1Xy24sdPpwaOmmRNInyMcBAAAAGrTxuZk8f3lqwJfeLSyrtQvGX9oMnn6ppWBM9vnBtaJVej7vIoBAACAPV9bW3vwVzYn8P6kraWydtS0LnMCj0jqh1S9ZagG4SA75ZJLLsmNN96Y+fPn7/Q2SqVSbrjhhrzpTW/qsb4AAAAgRZE0LewyJ3B+smFVZe3gsZVzAoeMqXrL0FuEg1W0ePHifPrTn85///d/Z8GCBRk/fnyOOuqonHfeeXnta1/b2+29KCEeAAAAu7V1yyvnBK5eUlk3YHDSOL09CNy8KnDkVHMCqWnCwSp56qmncvzxx2fkyJH5/Oc/n8MPPzwtLS35xS9+kVmzZuWhhx7aqe0WRZHW1tb071/+rdywYUPq6+t7ovU+pVafNwAAQM1oWZ8svq98VeCyxyvrSnXJhEPLVwWOPdCcQOiiX283UCve//73p1Qq5fe//33e+ta35oADDsihhx6a888/P7/73e+StAeIpVKp7FTdFStWpFQq5bbbbkuS3HbbbSmVSvn5z3+emTNnpqGhIb/+9a9zwgkn5AMf+EDOO++8jB07NieddFKS5P77788pp5ySoUOHZsKECXnnO9+Z559/vmP7J5xwQs4999x85CMfyejRozNx4sRccsklHY9PmzYtSfLmN785pVKp43Znt99+ewYMGJDFixeX3X/eeeflVa961Va/Ls8//3ze/OY3Z/Dgwdl///3zk5/8pOzx7el/Z543AAAAfUBba7L0wWTe95Kf/n3yzVcnV0xO/vXE5KYLk/t+tCUYHLVPcvjbkpOuSM7+n+SiPybv/b/ktK8kM97VHhQKBqFCnw8Hi6LI2pa1vfJRFMV29bhs2bLcdNNNmTVrVoYMqRxgOnLkyB1+3h/96Efzmc98Jg8++GCOOOKIJMk111yT+vr6/OY3v8k///M/Z8WKFfn//r//L9OnT8/dd9+dm266KUuWLMnb3/72sm1dc801GTJkSO6888587nOfyz/8wz/k5ptvTpLcddddSZLZs2dn0aJFHbc7e/WrX51999033/3udzvua2lpyfe///2cffbZW30el156ad7+9rfn3nvvzetf//qcccYZWbZsWZLsUP8787wBAADYjRRFsuLZ5A83Jv9zcTL71OQzU5NvvCL58azk7u8ki+5J2jYmQ8YlB5ySvObjyV//Z/KRJ5MPzk/e+i/Jce9Pph6b1A/u7WcEfUKfj8zXbVyXY689tlf2fedf3ZnBA7b9w+axxx5LURQ56KCDemzf//AP/5A/+7M/K7tv//33z+c+97mO2//4j/+Y6dOn5/LLL++47zvf+U6mTJmSRx55JAcccECS5IgjjsinPvWpjm187Wtfyy233JI/+7M/y7hx45K0B5gTJ0580X7OOeeczJ49OxdccEGS5L/+67+yfv36bQZyZ511Vk4//fQkyeWXX54rr7wyv//973PyySfna1/72nb1v7PPGwAAgF60dlmycO6WGYEL5iRrnqusqx9aOSdwxF7mBEIP6fPhYF+wvSsMd8TRRx9dcd/MmTPLbt9zzz259dZbM3To0Iraxx9/vCwc7GzSpElZunTpDvVz1lln5ROf+ER+97vf5RWveEWuvvrqvP3tb+92pWRnnfc9ZMiQDB8+vGPf29v/zj5vAAAAqqRlXbLo3vI5gcufrKzr1z+ZcNiWGYGTZyZjD0j61VW/Z6gRfT4cHNR/UO78qzt7bd/bY//990+pVNrmRUf69Ws/y7tzmNjS0tJtbXehW9f7Vq9endNOOy2f/exnK2onTZrU8e8BAwaUPVYqldLW1rbVXrsaP358TjvttMyePTv77LNPfv7zn3fMSdyare17e/vf2ecNAADALtDWmjz3UHkQuOSBpGitrB3zsvYAcPOKwImHJwMGVr9nqGF9PhwslUrbdWpvbxo9enROOumkfP3rX8+5555bEWatWLEiI0eO7DiFd9GiRZk+fXqSlF2cZEfNmDEj//mf/5lp06ZV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XhRFPvnJT2bSpEkZNGhQTjzxxDz66KNl21m2bFnOOOOMDB8+PCNHjsw555yT1atXl9Xce++9edWrXpWBAwdmypQp+dznPlfRz7//+7/noIMOysCBA3P44YfnZz/7Wdnj29ML7C5WrVqV8847L3vvvXcGDRqUV77ylbnrrrs6Hndswfa5/fbbc9ppp6WxsTGlUik33nhj2eN97Vjanl6gGrZ1bF1//fV53etelzFjxqRUKmX+/PkV2/A3GFTa2rHV0tKSCy+8MIcffniGDBmSxsbGvOtd78rChQvLtuH3Fn1WsYstXbq0WLRoUcfHzTffXCQpbr311qIoiuK9731vMWXKlOKWW24p7r777uIVr3hF8cpXvrLj8zdu3FgcdthhxYknnljMmzev+NnPflaMHTu2uOiiizpqnnjiiWLw4MHF+eefXzzwwAPFP/3TPxV1dXXFTTfd1FFz3XXXFfX19cV3vvOd4g9/+EPxN3/zN8XIkSOLJUuWdNRsqxfYXXz6058uxowZU/z0pz8tnnzyyeLf//3fi6FDhxZf/epXO2o+85nPFCNGjChuvPHG4p577ine8IY3FPvss0+xbt26jpqTTz65OPLII4vf/e53xf/93/8VL3vZy4rTTz+94/GVK1cWEyZMKM4444zi/vvvL37wgx8UgwYNKr75zW921PzmN78p6urqis997nPFAw88UHziE58oBgwYUNx333071AvsLt7+9rcXhxxySPGrX/2qePTRR4tPfepTxfDhw4s//vGPRVE4tmB7/exnPys+/vGPF9dff32RpLjhhhvKHu9rx9K2eoFq2dax9W//9m/FpZdeWnz7298ukhTz5s2r2Ia/waDS1o6tFStWFCeeeGLxwx/+sHjooYeKO+64ozjmmGOKmTNnlm3D7y36ql0eDnb1wQ9+sNhvv/2Ktra2YsWKFcWAAQOKf//3f+94/MEHHyySFHfccUdRFO0HaL9+/YrFixd31Fx11VXF8OHDi+bm5qIoiuIjH/lIceihh5bt5x3veEdx0kknddw+5phjilmzZnXcbm1tLRobG4srrriiKIpiu3qB3cWpp55anH322WX3veUtbynOOOOMoiiKoq2trZg4cWLx+c9/vuPxFStWFA0NDcUPfvCDoiiK4oEHHiiSFHfddVdHzc9//vOiVCoVCxYsKIqiKL7xjW8Uo0aN6jjWiqIoLrzwwuLAAw/suP32t7+9OPXUU8t6OfbYY4u/+7u/2+5eYHexdu3aoq6urvjpT39adv+MGTOKj3/8444t2Eld/8jqa8fS9vQCvaG7cHCzJ598sttw0N9gsG1bO7Y2+/3vf18kKZ5++umiKPzeom+r6szBDRs25Hvf+17OPvvslEqlzJkzJy0tLTnxxBM7ag466KBMnTo1d9xxR5LkjjvuyOGHH54JEyZ01Jx00klpamrKH/7wh46aztvYXLN5Gxs2bMicOXPKavr165cTTzyxo2Z7eoHdxStf+crccssteeSRR5Ik99xzT37961/nlFNOSZI8+eSTWbx4cdnrecSIETn22GPLjq2RI0fm6KOP7qg58cQT069fv9x5550dNa9+9atTX1/fUXPSSSfl4YcfzvLlyztqtnb8bU8vsLvYuHFjWltbM3DgwLL7Bw0alF//+teOLeghfe1Y2p5eoK/wNxj0jJUrV6ZUKmXkyJFJ/N6ib6tqOHjjjTdmxYoVOeuss5IkixcvTn19fcfBtNmECROyePHijprOv5Q2P775sa3VNDU1Zd26dXn++efT2trabU3nbWyrF9hdfPSjH81f/uVf5qCDDsqAAQMyffr0nHfeeTnjjDOSbDk2tvWaHz9+fNnj/fv3z+jRo3vk+Ov8+LZ6gd3FsGHDctxxx+Wyyy7LwoUL09ramu9973u54447smjRIscW9JC+dixtTy/QV/gbDF669evX58ILL8zpp5+e4cOHJ/F7i76tquHgv/7rv+aUU05JY2NjNXcLe5wf/ehH+f73v59rr702c+fOzTXXXJMvfOELueaaa3q7Nejzvvvd76YoikyePDkNDQ258sorc/rpp6dfv6r+ygQAYDfU0tKSt7/97SmKIldddVVvtwM9omp/6Tz99NP55S9/mfe85z0d902cODEbNmzIihUrymqXLFmSiRMndtR0vVrV5tvbqhk+fHgGDRqUsWPHpq6urtuaztvYVi+wu7jgggs6Vg8efvjheec735m///u/zxVXXJFky7Gxrdf80qVLyx7fuHFjli1b1iPHX+fHt9UL7E7222+//OpXv8rq1avz7LPP5ve//31aWlqy7777Oragh/S1Y2l7eoG+wt9gsPM2B4NPP/10br755o5Vg4nfW/RtVQsHZ8+enfHjx+fUU0/tuG/mzJkZMGBAbrnllo77Hn744TzzzDM57rjjkiTHHXdc7rvvvrIX9uaD8JBDDumo6byNzTWbt1FfX5+ZM2eW1bS1teWWW27pqNmeXmB3sXbt2opVTHV1dWlra0uS7LPPPpk4cWLZ67mpqSl33nln2bG1YsWKzJkzp6Pmf//3f9PW1pZjjz22o+b2229PS0tLR83NN9+cAw88MKNGjeqo2drxtz29wO5oyJAhmTRpUpYvX55f/OIXeeMb3+jYgh7S146l7ekF+gp/g8HO2RwMPvroo/nlL3+ZMWPGlD3u9xZ9WjWuetLa2lpMnTq1uPDCCysee+9731tMnTq1+N///d/i7rvvLo477rjiuOOO63h848aNxWGHHVa87nWvK+bPn1/cdNNNxbhx44qLLrqoo+aJJ54oBg8eXFxwwQXFgw8+WHz9618v6urqiptuuqmj5rrrrisaGhqKq6++unjggQeKv/3bvy1GjhxZdgWubfUCu4szzzyzmDx5cvHTn/60ePLJJ4vrr7++GDt2bPGRj3yko+Yzn/lMMXLkyOLHP/5xce+99xZvfOMbu728/fTp04s777yz+PWvf13sv//+ZZe3X7FiRTFhwoTine98Z3H//fcX1113XTF48ODim9/8ZkfNb37zm6J///7FF77wheLBBx8sPvWpTxUDBgwo7rvvvh3qBXYXN910U/Hzn/+8eOKJJ4r/+Z//KY488sji2GOPLTZs2FAUhWMLtteqVauKefPmFfPmzSuSFF/60peKefPmdVzVsa8dS9vqBaplW8fWCy+8UMybN6/47//+7yJJcd111xXz5s0rFi1a1LENf4NBpa0dWxs2bCje8IY3FHvttVcxf/78YtGiRR0fna887PcWfVVVwsFf/OIXRZLi4Ycfrnhs3bp1xfvf//5i1KhRxeDBg4s3v/nNZb+4iqIonnrqqeKUU04pBg0aVIwdO7b40Ic+VLS0tJTV3HrrrcVRRx1V1NfXF/vuu28xe/bsin390z/9UzF16tSivr6+OOaYY4rf/e53O9wL7A6ampqKD37wg8XUqVOLgQMHFvvuu2/x8Y9/vOwXU1tbW3HxxRcXEyZMKBoaGorXvva1FcfgCy+8UJx++unF0KFDi+HDhxfvfve7i1WrVpXV3HPPPcWf/MmfFA0NDcXkyZOLz3zmMxX9/OhHPyoOOOCAor6+vjj00EOL//7v/y57fHt6gd3FD3/4w2Lfffct6uvri4kTJxazZs0qVqxY0fG4Ywu2z6233lokqfg488wzi6Loe8fS9vQC1bCtY2v27NndPv6pT32qYxv+BoNKWzu2nnzyyW4fS1LceuutHdvwe4u+qlQURVGFBYoAAAAAwG7GpRcBAAAAoEYJBwEAAACgRgkHAQAAAKBGCQcBAAAAoEYJBwEAAACgRgkHAQAAAKBGCQcBAAAAoEYJBwEAAACgRgkHAQAAAKBGCQcBAAAAoEYJBwEAAACgRv3/vDuutSphkP0AAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 1600x800 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots(figsize=(16, 8))\n",
"ax.ticklabel_format(style='plain')\n",
"ax.plot(xs.NumActiveValidators, xs.Min, label='Min time in days')\n",
"ax.plot(xs.NumActiveValidators, xs.Max, label='Max time in days');\n",
"ax.plot(\n",
" [xs.NumActiveValidators[0],\n",
" ACTIVE_VALIDATORS,\n",
" ACTIVE_VALIDATORS],\n",
" [estimate_max_time(ACTIVE_VALIDATORS),\n",
" estimate_max_time(ACTIVE_VALIDATORS),\n",
" estimate_min_time(ACTIVE_VALIDATORS)],\n",
" label='Currently here',\n",
")\n",
"ax.legend();"
]
}
],
"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.10"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment