diff --git a/analysis/profitability-leios.ipynb b/analysis/profitability-leios.ipynb index 5d9d891f2..9d6c7887c 100644 --- a/analysis/profitability-leios.ipynb +++ b/analysis/profitability-leios.ipynb @@ -1310,6 +1310,8 @@ "), .(\n", " `Cloud hosting`,\n", " `Transaction rate [tx/s]`,\n", + " `Throughput [TxkB/s]`=1.400*`Transaction rate [tx/s]`,\n", + " `Throughput [TxMB/s]`=0.001400*`Transaction rate [tx/s]`,\n", " `Allocation [%/100]`\n", ")]\n" ] @@ -1527,6 +1529,140 @@ "source": [ "ggsave(\"leios-forecast-sqrt-fill.svg\", units=\"in\", dpi=150, width=8, height=6)" ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "10902600-2bfe-460f-8cf4-931444b2f86d", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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\ntWp18eJFh8NRsuntt9/u3LlzSkpK8YWiI9sJecvr9YruwuVyCS9kMpEL/cVzW0n+02P3KbeM\nN95448KFC6+99hrHccuXL+/Vq9fo0aM5jitjX2UUSQgRHiK571pz2cVDKON59YG98t+uiDey\nsowBf8IoxABQGyDYhZdnn322oKDgww8/vG+51+vdu3evRqO5b+6Hli1bEkIuX75cfOGlS5cI\nIa1atRK+LD5lBfnfuS5CiHBz2/nz54u3Xrx4MYiyyy7DYrFcvXq1WbNm//jHP77//vvMzMzE\nxMR9+/YdOHAgiH0JhCct7ou5AV7ehVDD86rkr2WXL4g3MkxGwhDMAwsAtQSCXXiZOnVqq1at\nFi1a9Omnn/oX+ny+N95447fffps5c6ZcLi/ev1mzZu3atVuzZk1BQYGwJD8/f82aNQ8++GDT\npk0JIWq1OiUlxX9u7Ouvv75586bwesCAAUajccmSJf4ThOfOndu3b18QZZddxunTp9u2bfvR\nRx8JTREREaNHjyZ/TJz3pc9y9ejRIyYm5r333vOP/3L48OH7QiqECeV3h+Tnz4g28QyT2X9I\nYcPGoq0AANLDU7HhRSaT7du379FHH33yySfffffdbt26MQzzww8/nD9/vlu3bosXL76vP8Mw\n77777qhRo7p27frUU0/xPL9ly5asrKwNGzYIV0IHDx68ePHisWPHTpgw4fr166tWrerRo4cw\nhlxkZOTChQvnzp3brVu3Rx991Gw2b9y4sVevXj/88ENFyy67jJ49ezZr1mzBggXnz59v3779\n1atXd+/e3axZswEDBhBCDAYDIWTFihUjR47s27dvgHvUarVvv/32s88+26dPn3HjxmVnZ3/y\nyScJCQnnzp2raPFQpymPH1Oc+km0iac0q89A+wNNpa0IAKAsOGMXdtq0aXPy5MnXX3+9qKjo\nk08++fzzz/V6/fvvv//TTz+J3uI2fPjwH3/8sVWrVh999NHHH3/cpk2bn376yT+I3YIFC15+\n+eVffvnl5ZdfPnXq1K5du6ZOndqzZ0+hdc6cOdu2bTMYDO++++6xY8cWL168bNmyIUOGlHZn\nWxnKKEOr1SYlJY0aNerQoUNvvPHG4cOHx40bd/ToUSHSTZw4cdCgQe+///5nn31W7l5YlvUP\n8jd16tSdO3eyLLt06dLz589/8cUXffv2xXAnYUVx5qTix6PibZRm9+pva9pC0oIAAMpDQ2De\n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\nvn79+pgxY8aNG5eamvqXv/zl2LFjhJAZM2ZMmTKFEPLWW2/NmTOn+GbnzZsnhLYVK1bMmDGD\nEHLo0KG//e1vHMc988wzkyZNopQuXrx4//79/lWOHDmycOHCtm3bPvXUUx6P5+233166dGmA\n38V9uxs2bBgh5PDhw/4Ohw4d8nq9jzzySMl1N23aNG/ePLPZPGnSpI4dO65cuXLz5s3+1uvX\nr0+YMOHMmTPDhw9/+umnCwsLZ8+e/dlnn/k7HDx4cNmyZRMnTly5cmW7du0WLVq0evXqANfN\nz8+fM2fO4MGDN2/e/OKLL+7du/ett94KpKrXX3997dq1LVq0mDZtWsuWLTdt2uRf8T6l9Sx5\ngEhFDn259X/zzTczZ860WCxTpkyJj49ftmzZunXrSpZXoSMFdQLO2AGEI+pxqw4niTbld+rq\n0eokriesHDlyJD09nRDC87zZbD58+HB2dvaUKVOioqKEDikpKYsWLXr00UeFPv/6178iIyO3\nb98u3IH3zDPPTJw4cdmyZX379m3VqpVwa91DDz30wAMPFN9Lu3btmjZtSgjp2rVrREQEIWT/\n/v1qtfo///mPsJ0XX3xx4MCBP/30k/9P+LVr1z755JMuXboQQqZNmzZjxoxPP/30iSeeaNy4\ncbnfVMndtWrV6tChQ0JAIYQcOHAgLi5O2HhxBQUFa9asadeu3X//+1/h1sDx48dPmjTJ3+Gd\nd97RarU7d+4UNvvcc889//zzy5cvHzlypHBq6tSpU3v27PHv3ePxbNiw4bHHHouOji533V9/\n/XX16tX9+vUjhEyYMOHYsWMnTpwotyq73X7kyJEnnnji73//u7Bk2rRpP//8M8/z9I9DeZfR\ns+Q7VqFDL5w+LK1+j8ezfPnytm3bbtq0SalUEkIGDRr03HPPsSx73/vfpEmTAI8U1BU4YwcQ\njhQ/fketlpLLXZFRZsweVs2OHDmyevXq1atXr1mzZvv27Xq9fu7cuXPnzvV30Gq1/ouJ6enp\nv/322+OPP+5/rsJgMEyaNOnmzZu3bt2q0H7/8Y9/JCcn+7fjdDq9Xq/T6fR36Nq1q//PuVKp\nnDVrFsdxQlAIwrBhwy5dupSRkUEIycvL+/nnn0eOHElLTGFy+vRpu92emJjof+CjXbt2gwYN\nEl7b7faTJ09OnDjRH31Yln3qqaecTueZM2eEJd26dRMSkmDSpEkul+v7778PZF2dTiekIkH9\n+vWFN6TsqiilPM+fPXvW/0Dr2rVrDx06VPK7C7ynoKKHvrT6L1y4kJ6e/vTTTwupjhDSq1ev\ndu3aie40wCMFdQXO2AGEHTYnu7SB67J69MPsYdVt8eLFxZ+KLalevXr+27lu375NCGnVqlXx\nDsKXd+7c8d8XFYiIiIjU1NQ9e/bcvHnz9u3bV65csdvtJTfrJ+QAoYAgDB069MMPPzxy5Mjk\nyZO/+eYbn88nenVP2H7btm2LL2zTps2hQ4cIIUKCWbVqVckx9vLz84UX970JwpdpaWmBrBsb\nGytafNlVabXaWbNmrV69euDAgZ06dXr44YcTEhJEn3UIvKegooe+7PqFs7l+zZs3/+2330p2\nDvBIQV2BYAcQZnhe+Y34wHWW1g+66sVIXxHcR6VS+V8LD73eRzibUtFxRrZt2/bvf/+7fv36\nXbt27dOnT2Ji4uLFi8vof9/zthXVokWL5s2bHzp0aPLkyUlJSW3atGnZsmXJbiUvDhJC/OFG\nLpcTQp5++uni56UETZo0EV7c9z4Iz6B4vd5A1pXJxP8Ill0VIWT69OlDhw5NTk4+ceLEJ598\n8vHHH/fp02fVqlUlNxh4T1LxQ19a/cKbcN9ZN9FvigR8pKCuwKVYgPAi//Ucm3635HJOrcl7\nqJv09UDZhDvnbty4UXyh8KU/nQTC4XAsX758xIgRX3/99eLFi6dOndqrVy/hz7/f1atXi38p\nPIlZob3cZ+jQoWfPnr1y5covv/zy5z//WbSP8A3et+tr164Vb2VZtkcxLVu2ZFnWaDTe11lw\n5coVYcVA1i1N2VXZ7fbr16/HxcVNnz5948aNR48enTRp0o8//njkyP2DBwXes7Qagjv0Qoff\nf/+9+MLU1NTS+gdypKCuQLADCCPU4VAdOyzalNO1FycP8twMVJ+GDRu2bNly+/btVqtVWGKz\n2bZu3dqkSZMAI5dw4ictLc3tdj/wwAP+006nTp3KyMgoPpnE2bNnT568d43e7XavXr1ao9GU\nPN0VyO4EQ4cO9fl88+fPJ4SMHDlStH+3bt10Ot26dev8d/tdv35duOJJCFGr1X369Pniiy/8\nF095nl+4cOFLL73kP1l17ty54mWvWbNGoVD06dMnkHVLU3ZVKSkp48aNipVhLQAAIABJREFU\n2759u/ClTqcTbr8reY4tkJ6iZ+ZI5Q59x44dTSbT5s2b/dn97NmzFy5cKK1/IEcK6gpcigUI\n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\nLM/zS5cuPXfunGjl6enpK1asuHDhgsViadOmzV//+teBAweW+z688sorycnJR48ejYyMFDp7\nPJ7+/fu3a9duw4YN91Wr0WiGDRs2f/58vV7/7bffVubNf+GFFwghs2bNWrFixcWLFxs1apSY\nmDhkyJD333//8OHDubm5nTp1WrhwYcOGDSvz3ZV8/8v6IEKdVc6/k+7cuVNy4Y0bNzp37iy8\n/tOf/vT7779XfV0AUEHU6VB+f0S0Kadbb76OnBSBch08eHDZsmUTJ05cuXJlu3btFi1atHr1\naqHp5MmTkydPvn79+pgxY8aNG5eamvqXv/zl2LH/e5ImPz9/zpw5gwcP3rx584svvrh37963\n3nqrtB3l5uZOnTq1fv36M2bMaNWq1Z49e955551AdvT666+vXbu2RYsW06ZNa9my5aZNm4S9\nzJs37/HHHyeErFixQvSG7DLK++abb2bOnGmxWKZMmRIfH79s2bJ169aVVvn169cnTJhw5syZ\n4cOHP/3004WFhbNnz/7ss8/K3dHw4cN9Pt93333n73n8+HG73T569OiSe7l9+/aCBQsSEhIS\nExP/P3t3Hh9Fff8P/DMzOzN7ZDfZDUcSCBDYJJCDgBDBUoWvREqJVhQ8UJT6rQXP1qvWSm0f\n2opBtParCLZQwQL9Vi32a+UQQY2JHOGWQwg3cufaHJs9Z+bz+2M1P2Q2ySTZnWyS1/Phw0d4\n7zGvXRL2nc/M5/Pp+Jt/6tSpl19++aGHHlq1apXZbP71r3997733EkIWLVo0b9687du3P//8\n8x18da2+/9A9tDJil5OT88gjjzzzzDNWq7WpOHr06L///e/33HMPIeTdd9/Nz8+PbkYA0EDY\nUsJ4Peq6e0CaJ7m//nkgSnbs2PHhhx8OGjSIEDJ69OhgMPj222/ffvvtiYmJL7/8st1uf/fd\nd0MDTvfdd99tt932yiuv/PCHPwydQNy/f/+iRYtCF0ZPmzatpKRk27ZtzR2oqqpq7ty5d955\nJyFkxowZd999d1lZGSGEUtrCgTwez2effTZjxoxnnnkm9Dw///nPt2/fTikdNmxYU+yEhAT1\nEZuLFwwGX3311aFDh/79738XRZEQcv3118+ePZvjuLDJi4qKLBbLv/71r9BRZs+e/dBDD736\n6qtTpkwJjZA1d6Brr73WYrF8+umnTSs8bNiwwWg03nDDDeqjHD58+Pe///306dNbfU+0vPnf\nfPPN4sWLU1NTCSGzZs36xS9+YbVaH3/8cULIgAEDRo8e3XTCt92vrtX3H7qHVn6J37lz56FD\nh5xO51tvvSVJUqj4P//zP/v373c6nU6ns7S09LXXXot+TgBoCVtVIezZoa4rHFc1+hr980D0\n5Ofnhz6eQ+68806/319aWnr+/PkjR47ccccdTacRbTbbnXfeefLkydOnT4cqcXFxTdPdCCF9\n+/b1+XzNHUgUxVDXEpKRkeH1egkhLR+IYRhK6e7du5umXi5ZsmTTpk2MhnV2mou3b9++8+fP\nz5o1K9TVEUKuueaaYcOGhX0St9tdVlZ22223NfUuHMfNnDnT5/Pt2rWr5QOJojhhwoStW7d6\nPB5CSCAQ+PzzzwsKCiwWi/pAFoul6SR4x9/8lJSUUFdHCMnMzAy9xqZbMzMzQ3fuyKuDHqKV\nEbv09PQPPvigtLT0ySeffP311xcsWFBYWDh8+PCDBw/++9//VhTllltuSUrCAgoAnUz8fCMJ\ntwqDK3tE0BKnfx6InrS0NPUfz50798033xBC0tPTL7819MczZ86E7tamf65TUlIMhv//GdE0\naaDVAz388MOLFi36r//6r7y8vFGjRo0fP3748OFajthcvNARhwwZcnlx8ODBR44cUd851Egt\nXLhw4cKFV9xUU1PT8oEIIZMnT167du2XX345adKk0HnYm2++Oew9e/furf09afmghBCT6cr9\nYC6vNLXFHXx10BNomjxx7bXXlpWV/e///u9DDz3kdDpfeeWVkSNHzpkzJ9rhAEALw7Fyw6nj\n6rpkiavNydM/D0SW//urEl6x4kYwGCSESJJEw82GDjUETQ+5vFFrVdPw2BVaPdCcOXNuuOGG\njRs3btu27Z133vnrX/86bty4hQsXtnr05u4Qeo1XjPk1dx6W53lCyKxZsy4ftQoZOHBgywci\nhIwbNy4uLu7TTz+dNGnShg0b+vTpc/XVV4e9p9FobPo64m9+czr46qAn0Ho9NcMwd911V3l5\n+Q033HD99df/9Kc/PXfuXFSTAYAmsiwWbwx7S9WosQqHf+K7niuWwA2NBjU5evTo5X88dOgQ\nISQ1NTV0Iu/48e+1+KE/Nn3kR0TLB3K73ceOHUtOTp4zZ86yZcuKi4vvvPPOzZs3f/ZZ+Jk9\nWoTyXzFR79SpUy3E4zhuzGWcTifHcfHx8a0ei+f5iRMnlpSUNDY2FhcX33TTTVpWY9H5zW/3\nq4OeoPXvV0mS5s+ff+ONNxYVFRkMhmeeeebIkSMWiyUrK+u5555zu906pASA5gg7t7KuGnXd\n2ze5YWAbdo6BGCGK4qlTp5qGebZu3Xry5MnL77B3797QJAZCSCAQWLx4sSAI48aN69evn9Pp\nfPfdd+vr60O3NjQ0rFq1auDAgZHtLVo+0OHDh2+55ZZ33303dFNcXNz1119Pvj+mFXZ8qwXD\nhw93OBwrVqwIDd0RQnbv3t3c6nEmk2ncuHEffPBB06lJSunvfve7xx57TONQ1uTJk91u95/+\n9Kfm5sOq6fbmd/zVkba//9C1tP59cN999xUXF99xxx2LFi06cODAypUre/fu/eabbz766KO/\n+tWvnE7nCy+8MHv2bB2yAsAVmEa3sO1LdZ0yTGX+D/TPAx03duzYv/zlL48++uiPfvSjM2fO\nrFq1auTIkdXV1U136NOnz8MPP3zLLbckJiZ++umnhw8fnjNnTuiyql/96lcPP/zw7bfffuON\nNzIMs3bt2kuXLr3++uvNnbVsH5ZlWzhQTk5O//79Fy5ceOTIEafT+c0333z22WfJycmhqQCh\nBRaWL19+7bXXjh49WuMRTSbT448//txzz82cObOgoKC2tnb16tVXXXXVgQMHwt7/iSeeuPfe\ne6dNmzZ16lSDwVBaWnrw4MHnn38+dB6zVWPHjo2Pj3///fdzc3M17qvZ8nui8WVq1JFX1773\nH7qWVhq7M2fOrFy5cv369ZMnTy4oKPjxj3/84osvhn7/GDp06EcfffTZZ589+eSTaOwAOoVY\n8ikTCKjr9RlZfnui/nmg4+bMmePz+davX793797c3NxXX321srJy+/btTXe46aabBg8e/I9/\n/OPUqVODBg1qWnGDEPKDH/xg5cqVCxcu/Ne//hVaXmT+/PlNa+SqsSxrNrdnP5IWDmQ0Gt96\n662FCxeWlZVt2LChV69e48ePf+CBB0IrcUycOPGjjz76xz/+UVtb22pjcXm8qVOnxsXFLVu2\n7O233x46dOi8efOOHj3a3CqqGRkZ77333muvvbZmzRq3252env766683LeHb6vtgMBgKCgpW\nr16tcbiu1fdEy0FbxjBM08zcjry6Nr3/0EUxLQ/JbtmyZdy4cRcvXuzbt++lS5eSkpJKSkqu\nuGZTUZTO3RCmqqqqE4/exGKxSJLkD7f5uhYOh6NpaL2t7HY7y7KX/07fJgkJCXV1de0bnLfZ\n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\nyM7OjtYHD/XAi+5RAV5htHY7/xaCP5+k6xEbxtkvLduhXaEEQUh0DBCClStX1tbWtigcP378\n1VdffezYsddff/3HH3+UyWT9+vWrrq7WarXRrT1QFRzH1dbWfvPNNzzPDx48uKamJuwBLe++\n++7zzz//1ltvDabeQLz9wv797383H6JTNMIoRh5MGDFqwFaOimh98DAOvJi2bbsVamu3828h\npPNJerRV5Ge/9GiH9gyJHQAAAECawDN2AAAAAGkCiR0AAABAmkBiBwAAAJAmkNgBAAAApAkk\ndgAAAABpAokdAAAAQJpAYgcAAACQJpDYAQAAAKQJJHYAAAAAaQKJHQBER3V1NRVYly5dCCFX\nXnnlwIEDEx0pIYmLpHfv3t4GmTRpUjAt1gqdTjdp0iTRRdOmTWuxN4PBUFVVtXPnzhZrulyu\n7OzspqamQLVMmDDBu4fevXuH+mEBIP7YRAcAAGmiqqqqsLDQ+/r48ePLli0bOnToRRdd5C3R\n6/WJCy2u5s+fP3369IaGhqysLNEVBg4c+OCDD3bu3Pmnn36KaYtNnDjRuxObzbZ58+aPP/54\n7dq127Zta56irV+/vl+/fq1MvnznnXcOHz587ty5TqczwngAIA6Q2AFAdIwcOXLkyJHe11u3\nbl22bNlll132yCOPJDaqJGQwGK6//npCSL9+/WLaYvfee2/nzp19bxcvXjx+/Pinn356xYoV\nvsJVq1aNGDGilZ3079+/f//+y5YtO3r0aLQCA4DYwa1YAEg6v//++7fffpvoKNLNnXfemZGR\nUV9f7ysRBGH16tXXXHNNAqMCgOhCYgcA8bZr167KysqcnJz8/Pyamhqj0egtv/LKK2+44Ya3\n3367pKTkxhtv9BZu3779qquuysvLy8/Pv+qqq7777jvffvr3719VVdV8z1VVVc3vM65Zs2bY\nsGFarXbw4MGLFy9+5plnNBpNMJFQFPX666+/++67Q4cOzczMHDJkyLJly4Kp95JLLpk+fToh\nJDs7+/bbb4+wobZv386yrHeHXk8++STDMJs2bWqxptlsHjx4sE6n83+Kzsdms9nt9oqKiub7\n79ChQ3FxsXcPDz/8cJcuXZRKZefOne+//36r1Rph/AAQf0jsACCuTpw4cdlll5WWlj722GM9\nevR4/fXXmycuhw4dGjt27LXXXnv//fcTQtauXXv++ed///331dXV1dXV+/fvP++889auXRtM\nRe+8887VV1/d1NR07733VlRUTJ48ecGCBcFH8tZbbz388MP33HPPJ5980r9//+rq6rlz57ZZ\n6YIFCyZMmEAIWbVqVeQ3VQcMGHDfffctWLBgx44dhJBDhw49/vjjkydPvvDCC5uvZrfbKysr\nDxw48Nlnn/Xv399/Px6P5+DBg6NGjZLL5aNGjfKVr1y58tprr/W+HjVq1NNPP923b98ZM2Z0\n7979mWeemTp1aoTxA0ACCAAA0bZlyxZCyJw5c1qUX3HFFYSQxYsXe9/yPN+vX7/S0tLmS2tr\na71vOY4rLy83GAynT5/2ljQ0NBgMhj59+vA8LwhCv379Kisrm++/srKyvLxcEASn01lcXDxw\n4EC73e5dtHr1akKIWq0OJhJCCMMwhw8f9u359ttvV6vV3khaqVcQhGeeeYYQ0tDQINoy5eXl\nI0aMCL7F7HZ7165dKyoq3G73sGHDysrKrFard5FWq73nnnucTufll1+uUqk2bdrk2ypQTvbh\nhx8233mvXr12794tCILRaKQoasqUKb5Fl1xySdeuXUU/IAAkM1yxA4C4UqvVY8aM8b6mKKpP\nnz42m823VKvVjh492vv66NGj+/btmzBhQnZ2trckKytr/Pjxe/bsOXbsWOu1bNmy5eeff542\nbZpcLveWVFVV9ejRI/hILrvssuY9DyZOnGixWD7//PMwPnIk5HL5kiVLdu7cOXz48A0bNixd\nulSpVPqWut3uG2+88bPPPps1a9YFF1zQYtuJEyfO/J+xY8dmZGTcdNNNy5cv9y49fPiw1Wrt\n06cPIYSiKELIpk2bzpw541365ZdfHjx4MB6fEACiCr1iASCuSkpKGIbxvaXpc/68NBgMvpLD\nhw8TQsrLy5uv4H1bX19fUlLSSi3ebXv27Nm8sGfPnr/88kuQkXTt2tX/7U8//dRKpTFy0UUX\nTZgw4eWXX7777rtb3IRdtmyZTCbT6/WLFi2aNGmSTCZrvrRFr9hHH330oosuuvPOOy+77LKC\ngoJVq1b57sNqNJrZs2fPmjWroKDgvPPOu+CCC6qqqoYMGRKHTwcA0YUrdgAQV75LaKIUCoXv\ntSAI/it40y+PxyO6uW+sNZfLRf53IcqneRrXZiQcxzV/691hi0L/emPEe4Vy165dLdpEIpGs\nWbPmqaeeqq+vnzdvXus7KS4uvu+++1wuV11dHfEb6OQf//jHnj17ZsyYwXHc/PnzzzvvvGuu\nuSbQ5wWApIXEDgCSVFlZGSFk//79zQu///57QohvVgae55sv9V6oI/+7wHbgwIHmS0O6t7h3\n797mb729TX0XwALVGwvLly//5JNPJk+evHnz5kWLFjVfNGrUqPPOO2/s2LEDBw6cO3dum0PN\nZWZmEkIyMjJOnz594MAB3/U/o9F48ODBTp06zZo1a+PGjb///ntNTc1//vOfTz/9NDafCQBi\nBYkdACSpTp069ejR45VXXmlsbPSWnD179pVXXunZs6f3PqxCoThw4IDvqtJ///vfI0eOeF8P\nHjw4Nzd3wYIF3itthJB169bt3r07+No3bNiwYcMG72uHwzFnzhylUnnppZe2Xq9Pi8wvbL/+\n+uvUqVNvu+22559/fsSIEQ899NCJEyd8S73XL2mafumll5xO57Rp01rZFcdxK1as0Ol0gwYN\n+vjjj6+88kqW/eNpnO3bt3fv3v3VV1/1vtVqtd7B7aL1KQAgbvCMHQAkKZqmn3322aqqqgED\nBtx2222CILz55psnT56sra31JjSXXnrpnDlzRowYcf311x8+fHjhwoWDBw/2jr6mUqnmzp07\nduzYCy644Lrrrjt16tTy5cuHDh26a9euIGs3GAxXXHHFmDFjcnJyPvzwwz179jz++OP5+fmt\n10sIycjIIIQ899xzV111VYtH4sJw5513siz73HPPEUJefPHFHj16TJw4cdWqVS1WGzhw4Nix\nY1977bVPP/30yiuv9Ba+8MILvnnJLBbLF1988f33369YsUKr1a5cudLXSYUQMmTIkE6dOs2c\nOXP37t29evU6ePDgypUrO3XqNGzYsAjjB4A4Q2IHAMnriiuu2Lx586OPPuq9mNS/f//33nvv\nL3/5i3fpzJkzrVbru+++u2nTpkGDBn3wwQf19fXbtm3zLh0zZkxmZubTTz/9r3/9q6Ki4sMP\nP1y3bl3w90yrq6tLS0sXLlx46NChHj161NbWVldXB1Ovd4zl559/3mQyRZjYrVix4pNPPlmx\nYoW3X3BhYeGcOXOmTp363nvv3XDDDS1Wnjt37gcffDB58uR9+/Z5S1544QXfUpVKdfnll7/6\n6quDBg2y2+0bN278f//v/zVfumbNmkcfffSLL754++238/Pzr7vuun/84x/eJBUAUggl+ngy\nAEBK4ziuqalJpVI17yFx6623HjlyxNt1oHUURc2cOfPxxx+PemC9e/cuKyv76KOPor7nmKqq\nqjp69GiL5w4BIAnhGTsASEMOh6OgoKD5OL0nT55cuXJlZWVlAqMCAIg13IoFgDSkUqnuuOOO\nxYsXezyev/71r42NjfPnz2dZdty4cYkOjfz222+rVq3q1KmTd3DgJLd79+6jR4/+/vvviQ4E\nAIKCK3YAkJ5efPHFxx9/fNOmTTU1NfPmzevdu/fOnTtzcnISHRfZunXriBEjXnvttUQHEpRF\nixaNGDFi+/btiQ4EAIKCZ+wAAAAA0gSu2AEAAACkCSR2AAAAAGkCiR0AAABAmkBiBwAAAJAm\nkNgBAAAApAkkdgAAAABpAokdAAAAQJpAYgcAAACQJpDYAQAAAKSJ/w+bXD6KIO+qMwAAAABJ\nRU5ErkJggg==", + "text/plain": [ + "plot without title" + ] + }, + "metadata": { + "image/png": { + "height": 420, + "width": 420 + } + }, + "output_type": "display_data" + } + ], + "source": [ + "ggplot(interpResults, aes(x=`Throughput [TxkB/s]`, y=`Revenue / expense ratio [%]`, color=`Cloud hosting`)) +\n", + " geom_ribbon(\n", + " data=dcast(interpResults, `Throughput [TxkB/s]` ~ `Cloud hosting`, value.var=\"Revenue / expense ratio [%]\"),\n", + " aes(x=`Throughput [TxkB/s]`, ymin=`Premium`, ymax=`Value`),\n", + " color=NA, y=NA, fill=\"lightgray\"\n", + " ) +\n", + " annotate(\"text\", label=\"Profitability depends strongly\\nupon hosting environment\", x=700, y=280) +\n", + " geom_line(linewidth=2) +\n", + " geom_hline(yintercept=100, color=\"blue\") +\n", + " annotate(\"text\", label=\"Break-even\", x=800, y=100, color=\"blue\", hjust=1, vjust=-1) +\n", + " scale_x_sqrt(breaks=c(25,50,75,100,150,200,250,500,750,1000)) +\n", + "# ggtitle(\n", + "# \"SPO profitability under Leios, without rewards from the Reserve\",\n", + "# subtitle=\"Notional approximate forecast mostly based on \\\"business as usual\\\" assumptions\"\n", + "# ) +\n", + " theme(legend.position=c(0.2,0.8))" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "02a4fd43-a5d8-4dbf-9f7c-8d4c58b39f4a", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ggsave(\"leios-forecast-sqrt-fill-cip.png\", units=\"in\", dpi=150, width=8, height=6)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "a1a0a489-04ff-4cc7-8152-b97e020252d2", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ggsave(\"leios-forecast-sqrt-fill-cip.svg\", units=\"in\", dpi=150, width=8, height=6)" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "3b255d8b-8b0a-453c-bd94-7ce26bdbcfaf", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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\n8/nnnz/Q7na7d+3apdFoHrj3Q9OmTQkhly9fLtp46dIlQkizZs2Ep0VvWUH+u6+LECKc3Hbu\n3LmivRcvXqxA2aWXYbFYrl692qhRo3//+99Hjx5NS0ubMGHCjz/+uHfv3gqsSyBcafFAzC3j\n4V0INDyvStgju3xevJNhUuP64j6wAFBNINgFl/Hjxzdr1mz+/PnffPONt9Hj8bz77rvXrl2b\nMmWKXC4vunyjRo2io6NXrlyZk5MjtJjN5pUrVz766KMNGzYkhKjV6sTERO++sT179ty6dUt4\n3LNnT6PRuHDhQu8OwrNnz/74448VKLv0Mk6dOtWyZcsvv/xS6AoJCRkyZAj5e+J8IH0+VKdO\nnSIiIj755BPv/C8HDx58IKRCkFD+ckB+7rRoF88waT365tetL9oLACA9XBUbXGQy2Y8//vjU\nU089++yzH3/8cWxsLMMwv/7667lz52JjYxcsWPDA8gzDfPzxx4MHD+7QocNzzz3H8/zGjRvT\n09PXrl0rHAnt06fPggULhg0bNnLkyBs3bixfvrxTp07CHHKhoaHz5s2bNWtWbGzsU089lZub\nu27dui5duvz666/lLbv0Mjp37tyoUaO5c+eeO3euVatWV69e3bFjR6NGjXr27EkIMRgMhJCl\nS5cOGjSoW7duZVyjVqv94IMPXn755a5duw4fPjwjI+Prr7+Oi4s7e/ZseYuHGk157Iji5O+i\nXTyl6V172R5pKG1FAAClwR67oNOiRYsTJ0688847BQUFX3/99XfffafX6z/99NPff/9d9BS3\nAQMG/Pbbb82aNfvyyy+/+uqrFi1a/P77795J7ObOnTtjxow///xzxowZJ0+e3L59+/jx4zt3\n7iz0zpw5c/PmzQaD4eOPPz5y5MiCBQsWL17ct2/fks5sK0UpZWi12vj4+MGDBx84cODdd989\nePDg8OHDDx8+LES6UaNG9e7d+9NPP/32228fuhaWZb2T/I0fP37btm0syy5atOjcuXPff/99\nt27dMN1JUFGcPqH47bB4H6UZXXpYGzaRtCAAgIehAXDf96ysrKouwZfUajUhRPT6hrLAJLo+\nwXFcbm6uVqstGnbHjh1769atY8eOib6k7N/D0NBQhmG8k7P4lclkeuBKZ3+glIaFhblcrqJ3\nCqlxtFqt2+32Xv0jv3hOFb+LlPATMqNjV0uLVhJWBwA1QGSkFBMeFd0HURz22AGIcDgcderU\n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\n+Xzxdo9Ckdke10xAIDAajZW59YvEala1EAAqclXszp074+LicnNzCwoKevXq9eOPP/q8LACo\nCJ5XHownYvcJNLd5nFPjPhMQCHbs2HHkyBGGqRmzOohWm52dff68yB9gAJX3kHPsRM2fP/+1\n11775JNPCCEvvfTSu+++O3jwYF8XBgDlJj//J5uWUrzdaQzJbdFK+npAMqNGjQoPDy96zGTW\nrFmJiYk//fQTISQmJmbevHkhISGbN29OTExs3LjxyJEjR4wY4V34ypUry5Ytu3z5MiGkZcuW\n06ZN886KMGXKFJZl33zzzc8///zUqVMcx3Xv3n327NkGg6GkYm7cuPHZZ5+dO3eOUtqtW7c3\n33zTu3ApK7Lb7WvWrImPj09LSwsPD+/Tp8/UqVO1Wu348eNPnjxJCOnevXv//v2XLFlS9Ey+\nh5Z37Nix1atXX7lypUGDBsOGDeN5ftGiRWfPnhWtPCUlZenSpefPn7dYLC1atHjxxRd79er1\n0M/hjTfeSEhIOHz4sPf2nS6Xq0ePHtHR0WvXrn2gWo1G079//zlz5uj1+p9//rkyH/6rr75K\nCJk2bdrSpUsvXrxYr169CRMm9O3b99NPPz148GBWVlbbtm3nzZtXt27dyry74p9/aV9EqAYe\n8hfP3bt3izfevHmzXbt2wuN//OMff/31l+/rAoByog678ugh0a7M2Cf4GrJ7A/xk3759ixcv\nHjVq1LJly6Kjo+fPn79ixQqh68SJE2PHjr1x48bQoUOHDx+elJT0/PPPHznyf9ffmM3mmTNn\n9unTZ8OGDa+99tquXbvef//9klaUlZU1fvz42rVrT548uVmzZjt37vzwww/LsqJ33nln1apV\nTZo0mThxYtOmTdevXy+sZfbs2c888wwhZOnSpaKncZdS3v79+6dMmWKxWMaNGxcTE7N48eLV\nq1eXVPmNGzdGjhx5+vTpAQMGvPDCC/n5+dOnT//2228fuqIBAwZ4PJ5ffvnFu+SxY8dsNtuQ\nIUOKr+XOnTtz586Ni4ubMGFC5T/8pKSkjz76aOrUqZs2bdJoNP/617/GjRtHCFmxYsXChQv/\n+OOP9957r5Lv7qGfP1Q3D9lj17p161dfffWtt97S6/Xexg4dOqxfv/75558nhGzZsiU2Nta/\nNQJAGSiOHaH2guLttvqNCqLqSV8PVCsnT57cuXNnw4YNCSEdOnRwuVxr1659+umnw8LCPvro\no9DQ0C1btgg7nF566aVRo0YtXry4W7duwgHECxcurFixQjideuTIkUeOHDl+/HhJK8rKypoz\nZ87o0aMJIWPGjBk7duyJEycIITzPl7KigoKCQ4cOjRkz5q233hLGmThx4h9//MHzfHR0tLfs\nkJCQ4mssqTyXy7VkyZKWLVuuX79eqVQSQnr37v3KK6+wLCta+YcffqjVardt2yas5ZVXXpk6\ndeqSJUsGDRok7CEraUXdu3fXarUHDx70zguxb98+lUrVr1+/4mtJTEycP3/+U0899dDPpCwf\n/p07d1auXPnII48QQl544YXp06fr9foZM2YQQurXr9+hQwfvAd8Kv7uHfv5Q3Tzkj/hTp05d\nuXKladOmX3zxhdvtFho//fTTCxcuNG3atGnTpkePHl26dKn/6wSA0jBZGYo/TxZv97BsVocu\n0tcD1U1sbKzw61kwevTowsLCo0ePpqSkXLt27ZlnnvEeRjQYDKNHj75169bt27eFFp1O571I\njhBSu3Zth8NR0oqUSqWQWgTNmze32+2EkNJXRCnlef7MmTPeSy9XrVp14P+zd+fxUZX3/sCf\ns89MJpNMSCALAQJZIAsJYgBLFa5ESokW3Iui1lsL1qV171Vqe7UWQ6nVq4i1Uok/oLfVYltl\nkYIagixhX4UAYZE922SZzHrOeX5/jOYiZ5JMkpkzM8nn/fLlK/nO5MwnIZBvnvMsGzYwAezO\n01G8/fv3nz9//r777vN1dYSQa665ZtSoUX4vYrfbq6qqbr/99vbeheO42bNnu1yuXbt2df5C\nkiRNnjx569atDoeDEOLxeD7//POSkpKYmBjtC8XExLTfBO/9Fz81NdXX1RFCcnJyfJ9j+6M5\nOTm+J/fms4Oo08WIXVZW1ocffrhp06Ynn3zy9ddfX7hwYWlp6ejRow8dOvSPf/xDVdWbb745\nORkbKACEmfT5euJvPwVbXpE3xqx/Hog0GRkZ2nfPnTv31VdfEUKysrIuf9T37pkzZ3xP69Y/\n8qmpqTz/fz9Z2hcNdPlCDz/88OLFi//jP/6jsLBw7NixkyZNGj16dCCv2FE83yuOGDHi8uLw\n4cOPHj2qfbKvkVq0aNGiRYuueKixsbHzFyKETJs2bfXq1V988cXUqVN992FnzJjh95lJSUmB\nf006f1FCiNF45Skyl1fa2+JefnYQXQJaPHHttddWVVX97//+70MPPZSZmfn73/9+zJgxc+fO\n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\nRbmn+JwyZUqD/aelpRUVFe3Zs6fBhna7PSEhoaamxttxx40b59pDXl7eNZ49AAQPG+oAACCy\nFRUVpaenu16fOXNm6dKlffv2vfHGG10lcXFxoQstqObNmzdt2rSqqqr4+HjJFXr16vXEE0+0\nbdv2xIkTzb9iZ86c2bFjR+/evesXiqK4evVqz5XHjx/v2q3FYtm6devnn3++fv36nTt31k/R\nNm7c2L1790bmRR0zZszAgQNfeuklm83mS4QAEBJI7ACgWYYMGTJkyBDX6+3bty9duvTmm29+\n+umnQxtVGEpLS7vrrrsIId27d2/mFaNpWq/Xr1ixokFit3379nPnziUlJdnt9vrlU6dObdu2\nrXtx8eLFY8eOffnll5cvX+4uXLNmTXFxcSMH7dGjR48ePZYuXXrq1CnfQwWAIMOjWAAIF+fP\nn9+xY0eoo4gANE3ffvvtK1asaFC+atWqhISEPn36NL75mDFjdDrd8ePH3SWiKK5du/b222/3\nf6wAEFxI7AAgSPbu3VtYWJiYmJiSklJaWlpbW+sqHzx48N133/3hhx9mZWXdc889rsJdu3bd\neuutycnJKSkpt9566w8//ODeT48ePYqKiurvuaioqP5TxXXr1vXr1y82NrZ3796LFy9+5ZVX\ntFqtL5FQFPXuu+9+/PHHffv2jYmJue6665YuXerLcfv37z9t2jRCSEJCwvDhw5t5oXbt2sWy\nrGuHLi+++CLDMFu2bHGX3HXXXSdOnNi7d2/9DVeuXFlcXMyyV3kUY7FYrFZrfn5+/SO2atUq\nMzOTEGI0Gp966ql27dqpVKq2bds+9thjZrO5mWcEAEGDxA4AguHs2bM333xzdnb2zJkzO3Xq\n9O6779ZPXI4dO/bggw/ecccdjz32GCFk/fr1ffr0+fHHH0tKSkpKSg4dOnT99devX7/elwN9\n9NFHt912W01NzdSpU/Pz8ydOnLhgwQLfI/nggw+eeuqpRx555IsvvujRo0dJSclLL7101YMu\nWLBg3LhxhJA1a9Y0/zF0z549H3300QULFuzevZsQcuzYseeff37ixIk33HCDe52BAwdqtdr6\nlXYHDhyorKx0P+SV5HQ6jx49OmLECIVCMWLECHf56tWr77jjDtfrESNGvPzyy926dZs+fXrH\njh1feeWVyZMnN/OMACB4RAAAP9m2bRshZM6cOQ3KBw0aRAhZvHixa1EQhO7du2dnZ9d/t6ys\nzLXI83xubm5aWtrFixddJVVVVWlpaV27dhUEQRTF7t27FxYW1t9/YWFhbm6uKIo2my0zM7NX\nr15Wq9X11tq1awkhGo3Gl0gIIQzDVFZWuvc8fPhwjUbjiqSR44qi+MorrxBCqqqqJK9Mbm5u\ncXGx71fMarW2b98+Pz/f4XD069cvJyfHbDa73ho2bBjLsqIo3nfffZ06dXJvMnv2bJ1OZ7PZ\n/va3v8XGxroKveVkK1eurH+4Ll267Nu3TxTF2tpaiqImTZrkfqt///7t27eXPGUACEOosQOA\nYNBoNKNGjXK9piiqa9euFovF/W5sbOzIkSNdr0+dOnXw4MFx48YlJCS4SuLj48eOHbt///7T\np083fpRt27b9/PPPU6ZMUSgUrpKioqJOnTr5HsnNN99cv5/B+PHjTSbTV1991YRTbg6FQrFk\nyZI9e/YMHDhw06ZN5eXlKpWqwTpDhgw5fPjw4cOHXYsrV64sLCzkOM5zb+PHj5/xPw8++KBO\np7v33nuXLVvmereystJsNnft2pUQQlEUIWTLli2XLl1yvfvNN98cPXo0QKcJAH6HxA4AgiEr\nK4thGPciTV/x45OWluYuqaysJITk5ubWX8G1WL+9vyTXtp07d65f2GCx8Ujat2/vuXjixInG\njxsIN95447hx47777rtx48bVfwjrNnjwYKVS6Xoae+LEiX379rl63XqaOnXq8/+zZMmSAwcO\nJCcnjxkz5ty5c4SQNWvWuJ/DarXa2bNn79mzJzU1tV+/fk8//bSrThEAIgUSOwAIBncVmiSl\nUul+LUqNu+tKv5xOp+Tm7pHVXMN8uKqd3OqncVeNhOf5+ouuHTYo9DxugLhqKPfu3St5TdRq\n9S233OJK7FatWqVUKl0Pmq8qMzPz0UcftdvtFRUVxGOgk2eeeWb//v3Tp0/neX7evHnXX3/9\n7bff7u0KAEC4QWIHAOElJyeHEHLo0KH6hT/++CMhxD0rgyAI9d91VdSR/1WwHTlypP671/Qk\n8cCBA/UXXTM0uB/OejtuICxbtuyLL76YOHHi1q1bFy1aJLnOXXfdtXfv3hMnTqxcuXLQoEGe\nj2u9iYmJIYTodLqLFy8eOXLEXSNYW1t79OjRNm3azJo1a/PmzefPny8tLf3ss8++/PJLv5wU\nAAQaEjsACC9t2rTp1KnTW2+9VV1d7Sq5fPnyW2+91blz56ysLEKIUqk8cuSIuw7pP//5z8mT\nJ12ve/funZSUtGDBAvcIvRs2bNi3b5/vR9+0adOmTZtcr+vq6ubMmaNSqQYMGND4cd0aZH5N\ndu7cucmTJw8bNuy1114rLi5+8sknz54967laYWGhTCZbuHDhtm3bGu8PWx/P88uXL9fr9QUF\nBZ9//vngwYPdI6Ts2rWrY8eOb7/9tmsxNjbWNbidv84LAAINM08AQHihaXr+/PlFRUU9e/Yc\nNmyYKIrvv//+b7/9VlZW5nogO2DAgDlz5hQXF991112VlZULFy7s3bu3a6w1tVr90ksvPfjg\ng3/+85/vvPPOCxcuLFu2rG/fvg3Ge2tEWlraoEGDRo0alZiYuHLlyv379z///PMpKSmNH5cQ\notPpCCGvvvrqrbfeKtkk7pqMGTOGZdlXX32VEPLGG2906tRp/Pjxa9asabBabGzsgAEDXn/9\ndYZhCgsLve3t9ddfd89UZjKZvv766x9//HH58uWxsbGrV692d1shhFx33XVt2rSZMWPGvn37\nunTpcvTo0dWrV7dp06Zfv37NPCMACA4kdgAQdgYNGrR169Znn33WVXXUo0ePTz755E9/+pPr\n3RkzZpjN5o8//njLli0FBQUrVqw4fvz4zp07Xe+OGjUqJibm5Zdf/uc//5mfn79y5coNGzb4\n/sy0pKQkOzt74cKFx44d69SpU1lZWUlJiS/HdY2x/NprrxkMhmYmdsuXL//iiy+WL1/u6hec\nnp4+Z86cyZMnf/LJJ3fffXeDlYcMGbJu3bqBAwc2Ms3r66+/7n7tapn39ttvFxQUWK3WzZs3\n/9///V/9d9etW/fss89+/fXXH374YUpKyp133vnMM8+40lYACH+UZJtcAIBIxPN8TU2NWq2u\n30Pi/vvvP3nypKujQOMoipoxY8bzzz/v98Dy8vJycnJWrVrl9z0HWVFR0alTpxq0RASA8IE2\ndgAQPerq6lJTU+uPyvvbb7+tXr26kceUAADRBI9iASB6qNXqBx54YPHixU6n8y9/+Ut1dfW8\nefNYlh09enSoQyO//vrrmjVr2rRp4xoKOOLs27fv1KlT58+fD3UgANAY1NgBQFR54403nn/+\n+S1btpSWls6dOzcvL2/Pnj2JiYmhjots3769uLj4nXfeCXUgTbRo0aLi4uJdu3aFOhAAaAza\n2AEAAABECdTYAQAAAEQJJHYAAAAAUQKJHQAAAECUQGIHAAAAECWQ2AEAAABECSR2AAAAAFEC\niR0AAABAlEBiBwAAABAlkNgBAAAARIn/B4grsMZ/ot/xAAAAAElFTkSuQmCC", + "text/plain": [ + "plot without title" + ] + }, + "metadata": { + "image/png": { + "height": 420, + "width": 420 + } + }, + "output_type": "display_data" + } + ], + "source": [ + "ggplot(interpResults, aes(x=`Throughput [TxMB/s]`, y=`Revenue / expense ratio [%]`, color=`Cloud hosting`)) +\n", + " geom_ribbon(\n", + " data=dcast(interpResults, `Throughput [TxMB/s]` ~ `Cloud hosting`, value.var=\"Revenue / expense ratio [%]\"),\n", + " aes(x=`Throughput [TxMB/s]`, ymin=`Premium`, ymax=`Value`),\n", + " color=NA, y=NA, fill=\"lightgray\"\n", + " ) +\n", + " annotate(\"text\", label=\"Profitability depends strongly\\nupon hosting environment\", x=0.750, y=280) +\n", + " geom_line(linewidth=2) +\n", + " geom_hline(yintercept=100, color=\"blue\") +\n", + " annotate(\"text\", label=\"Break-even\", x=0.800, y=100, color=\"blue\", hjust=1, vjust=-1) +\n", + " scale_x_sqrt(breaks=c(0.050,0.100,0.150,0.250,0.500,0.750,1.000)) +\n", + "# ggtitle(\n", + "# \"SPO profitability under Leios, without rewards from the Reserve\",\n", + "# subtitle=\"Notional approximate forecast mostly based on \\\"business as usual\\\" assumptions\"\n", + "# ) +\n", + " theme(legend.position=c(0.2,0.8))" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "7c190ce7-74e9-46ca-9abc-d5bf6af72022", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ggsave(\"leios-forecast-sqrt-fill-cip-mb.png\", units=\"in\", dpi=150, width=8, height=6)" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "8d185442-4bd6-4fad-8ef0-a28c3ccf13da", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ggsave(\"leios-forecast-sqrt-fill-cip-mb.svg\", units=\"in\", dpi=150, width=8, height=6)" + ] } ], "metadata": { diff --git a/docs/cddl/diffs/common/endorser-blocks.md b/docs/cddl/diffs/common/endorser-blocks.md new file mode 100644 index 000000000..db8e8c264 --- /dev/null +++ b/docs/cddl/diffs/common/endorser-blocks.md @@ -0,0 +1,87 @@ +# Endorser Blocks - Leios CDDL + +Endorser Blocks (EBs) are new block types in Leios that aggregate multiple Input Blocks from the current pipeline. + +## Endorser Block Sortition + +**Single EB Limit**: Each producer can generate **at most one Endorser Block per pipeline**, following the crypto-benchmarks implementation approach rather than the full Poisson sortition used in simulations. + +**VRF Lottery**: Eligibility uses the simplified probability model: + +$$P = 1 - e^{-f_{EB} \cdot \sigma}$$ + +Where $f_{EB}$ is the per-pipeline EB generation rate and $\sigma$ is the producer's stake fraction. + +> [!Important] +> **Precision Requirements**: This computation MUST be performed using machine precision-independent arithmetic to ensure deterministic results across all implementations. The exponential function SHALL be computed using rational arithmetic (e.g., `num_rational::Ratio`) with a Taylor series expansion to a predefined precision (minimum 34 decimal places as implemented in crypto-benchmarks). This prevents floating-point precision variations between different hardware architectures and ensures consensus consistency. + +Sources: [Crypto-benchmarks Sortition](https://github.com/input-output-hk/ouroboros-leios/blob/main/crypto-benchmarks.rs/Specification.md#L63-L65), [Rust Simulation EB Generation](https://github.com/input-output-hk/ouroboros-leios/blob/main/sim-rs/sim-core/src/sim/node.rs#L606-L641), [Rational Arithmetic Implementation](https://github.com/input-output-hk/ouroboros-leios/blob/main/crypto-benchmarks.rs/src/sortition.rs#L1-L25), [Technical Report - Deterministic Computation](https://github.com/input-output-hk/ouroboros-leios/blob/main/docs/technical-report-1.md?plain=1#L510-L513) + +## Block Structure + +```diff ++ endorser_block = ++ [ eb_header : eb_header ++ , eb_body : eb_body ++ ] +``` + +## Header Structure + +```diff ++ eb_header = ++ [ eb_header_body : eb_header_body ++ , body_signature : kes_signature ++ ] ++ ++ eb_header_body = ++ [ slot : slot_no ; Slot when EB was created ++ , producer : pool_id ; Block producer identifier ++ , ? vrf_proof : vrf_cert ; VRF proof of eligibility to produce EB ++ ] +``` +Sources: [Haskell Simulation EndorserBlock](https://github.com/input-output-hk/ouroboros-leios/blob/main/simulation/src/LeiosProtocol/Common.hs#L160-L171), [Rust Simulation EndorserBlock](https://github.com/input-output-hk/ouroboros-leios/blob/main/sim-rs/sim-core/src/model.rs#L167-L176), [Formal Spec EndorserBlockOSig](https://github.com/input-output-hk/ouroboros-leios-formal-spec/blob/main/formal-spec/Leios/Blocks.agda#L97-L106) + +## Body Structure + +**Design Rationale**: The block references are separated into the body to align with the network protocol design. At high TPS, the combined size of IB and EB references could exceed TCP MTU, making separate header/body transmission essential for efficient network diffusion. + +```diff ++ eb_body = ++ [ input_blocks : [* ib_reference] ; References to input blocks ++ , ? endorser_blocks : [* eb_reference] ; References to earlier endorser blocks (Full Leios) ++ ] +``` +Sources: [Network Specification - Relay Protocol](https://github.com/input-output-hk/ouroboros-leios/blob/main/docs/technical-report-2.md#relay-mini-protocol), [Network Specification - Fetch Protocol](https://github.com/input-output-hk/ouroboros-leios/blob/main/docs/technical-report-2.md#fetch-mini-protocol) + +## Input Block Reference Structure + +```diff ++ ; References to input blocks within endorser blocks ++ ib_reference = hash32 ; Hash identifier of the input block +``` + +**Design Rationale**: IB references contain only the hash identifier, following the principle that references should include only what's needed for unique identification. Producer and slot information can be obtained by fetching the block header when needed. This aligns with the formal specification's `IBRef = Hash` approach. + +Sources: [Haskell Simulation - InputBlockId](https://github.com/input-output-hk/ouroboros-leios/blob/main/simulation/src/LeiosProtocol/Common.hs#L100-L105), [Rust Simulation - InputBlockId](https://github.com/input-output-hk/ouroboros-leios/blob/main/sim-rs/sim-core/src/model.rs#L98-L105), [Formal Spec - IBRef](https://github.com/input-output-hk/ouroboros-leios-formal-spec/blob/main/formal-spec/Leios/Blocks.agda#L33), [Formal Spec - ibRefs](https://github.com/input-output-hk/ouroboros-leios-formal-spec/blob/main/formal-spec/Leios/Blocks.agda#L101) + +## Endorser Block Reference Structure + +```diff ++ ; References to earlier endorser blocks (for Full Leios) ++ eb_reference = hash32 ; Hash identifier of the endorser block +``` +Sources: [Haskell Simulation](https://github.com/input-output-hk/ouroboros-leios/blob/main/simulation/src/LeiosProtocol/Common.hs#L161-L163), [Rust Simulation](https://github.com/input-output-hk/ouroboros-leios/blob/main/sim-rs/sim-core/src/model.rs#L148-L152), [Formal Spec](https://github.com/input-output-hk/ouroboros-leios-formal-spec/blob/main/formal-spec/Leios/Blocks.agda#L34) + +## Supporting Types + +```diff ++ pool_id = bytes .size 28 ; Stake pool identifier (28 bytes) ++ slot_no = uint64 ; Slot number ++ hash32 = bytes .size 32 ; 32-byte hash ++ vrf_cert = bytes ; VRF certificate/proof ++ kes_signature = bytes ; KES signature +``` + +## Next +**→ [Input Block - CDDL](input-blocks.md)** \ No newline at end of file diff --git a/docs/cddl/diffs/common/input-blocks.md b/docs/cddl/diffs/common/input-blocks.md new file mode 100644 index 000000000..826c07814 --- /dev/null +++ b/docs/cddl/diffs/common/input-blocks.md @@ -0,0 +1,55 @@ +# Input Blocks - Leios CDDL + +**Single IB Limit**: Each producer can generate **at most one Input Block per slot**, following the crypto-benchmarks implementation approach rather than the full Poisson sortition used in simulations. + +**VRF Lottery**: Eligibility uses the simplified probability model: + +$$P = 1 - e^{-f_{IB} \cdot \sigma}$$ + +Where $f_{IB}$ is the per-slot IB generation rate and $\sigma$ is the producer's stake fraction. + +Sources: [Crypto-benchmarks Sortition](https://github.com/input-output-hk/ouroboros-leios/blob/main/crypto-benchmarks.rs/Specification.md?plain=1#L64), [Rust Simulation IB Generation](https://github.com/input-output-hk/ouroboros-leios/blob/main/sim-rs/sim-core/src/sim/node.rs#L561-L597) + +## Block Structure + +```diff ++ input_block = ++ [ ib_header : ib_header ++ , transaction_bodies : [* transaction_body] ++ , transaction_witness_sets : [* transaction_witness_set] ++ , auxiliary_data_set : {* transaction_index => auxiliary_data} ++ , invalid_transactions : [* transaction_index] ++ ] +``` +Sources: [Formal Spec](https://github.com/input-output-hk/ouroboros-leios-formal-spec/blob/main/formal-spec/Leios/Blocks.agda#L40-L57), [Haskell Simulation](https://github.com/input-output-hk/ouroboros-leios/blob/main/simulation/src/LeiosProtocol/Common.hs#L138-L142), [Rust Simulation](https://github.com/input-output-hk/ouroboros-leios/blob/main/sim-rs/sim-core/src/model.rs#L136-L141) + +## Header Structure + +```diff ++ ib_header = ++ [ ib_header_body : ib_header_body ++ , body_signature : kes_signature ++ ] ++ ++ ib_header_body = ++ [ slot : slot_no ; Slot when IB was created ++ , producer_id : pool_id ; Block producer identifier ++ , vrf_proof : vrf_cert ; VRF proof of eligibility to produce IB ++ , ranking_block_ref : hash32 ; Reference to ranking block for ledger state ++ ] +``` +Sources: [Formal Spec](https://github.com/input-output-hk/ouroboros-leios-formal-spec/blob/main/formal-spec/Leios/Blocks.agda#L40-L45), [Haskell Simulation](https://github.com/input-output-hk/ouroboros-leios/blob/main/simulation/src/LeiosProtocol/Common.hs#L114-L124), [Rust Simulation](https://github.com/input-output-hk/ouroboros-leios/blob/main/sim-rs/sim-core/src/model.rs#L127-L133) + +## Supporting Types + +```diff ++ ; Block identifiers ++ ib_id = hash32 ; Input block identifier (hash) ++ ++ ; Basic types ++ pool_id = bytes ; Pool/producer identifier ++ slot_no = uint64 ; Slot number ++ hash32 = bytes .size 32 ; 32-byte hash ++ vrf_cert = bytes ; VRF certificate/proof ++ kes_signature = bytes ; KES signature +``` \ No newline at end of file diff --git a/docs/cddl/diffs/common/ranking-blocks.md b/docs/cddl/diffs/common/ranking-blocks.md new file mode 100644 index 000000000..37088f9ed --- /dev/null +++ b/docs/cddl/diffs/common/ranking-blocks.md @@ -0,0 +1,20 @@ +# Ranking Blocks - Leios CDDL + +Ranking Blocks (RBs) are extended Praos blocks that include optional Leios certificates. + +## Block Structure - (Conway) Extension + +```diff + ranking_block = + [ header : block_header + , transaction_bodies : [* transaction_body] + , transaction_witness_sets : [* transaction_witness_set] + , auxiliary_data_set : {* transaction_index => auxiliary_data} + , invalid_transactions : [* transaction_index] ++ , ? leios_cert : leios_certificate + ] +``` +Sources: [Conway Base](https://github.com/IntersectMBO/cardano-ledger/blob/master/eras/conway/impl/cddl-files/conway.cddl#L8-L14), [Leios Base](https://github.com/input-output-hk/ouroboros-leios-formal-spec/blob/main/formal-spec/Leios/Base.agda#L21-L22) + +## Next +**→ [Votes and Certificates - CDDL](votes-certificates.md)** diff --git a/docs/cddl/diffs/common/votes-certificates.md b/docs/cddl/diffs/common/votes-certificates.md new file mode 100644 index 000000000..4e5de2d72 --- /dev/null +++ b/docs/cddl/diffs/common/votes-certificates.md @@ -0,0 +1,106 @@ +# Votes and Certificates - Leios CDDL + +Leios introduces a new BLS-based voting system with certificates for endorser block validation. + +## Certificate Structure + +Leios certificates are embedded in Ranking Blocks as described in [Ranking Block - CDDL](ranking-blocks.md). These certificates attest to the validity of Endorser Blocks as described in [Endorser Block - CDDL](endorser-blocks.md). Here is the complete certificate structure: + +```cddl +; Complete Leios certificate structure (from crypto-benchmarks implementation) +leios_certificate = + [ election_id : election_id ; 8-byte election identifier (EID) + , endorser_block_hash : hash32 ; Hash of the endorsed block (EB) + , persistent_voters : [* persistent_voter_id] ; Set of persistent voter IDs + , nonpersistent_voters : {* pool_id => bls_signature} ; Non-persistent voters with eligibility proofs + , ? aggregate_elig_sig : bls_signature ; Aggregate eligibility signature (present when non-persistent voters exist) + , aggregate_vote_sig : bls_signature ; Aggregate BLS signature on (election_id || endorser_block_hash) + ] +``` +Sources: [Certificate Reference Implementation](https://github.com/input-output-hk/ouroboros-leios/blob/main/crypto-benchmarks.rs/src/cert.rs#L13-L21), [Certificate Abstract Interface](https://github.com/input-output-hk/ouroboros-leios-formal-spec/blob/main/formal-spec/Leios/Base.agda#L24-L28) + +## Vote Structure + +The Leios voting system supports two types of voters: persistent voters (selected per epoch) and non-persistent voters (selected per election via local sortition). + +> [!Note] +> Individual votes are ephemeral data structures used during the voting process. They are aggregated into certificates and do not appear on the ledger or persistent storage. Only the resulting certificates are stored permanently. + +```cddl +; Vote bundle containing votes for multiple endorser blocks from same voter +leios_vote_bundle = persistent_vote_bundle / non_persistent_vote_bundle + +persistent_vote_bundle = + [ 0 ; Vote type identifier for persistent voter + , election_id ; 8-byte election identifier + , persistent_voter_id ; 2-byte epoch-specific pool identifier + , vote_entries ; Map of endorser blocks to signatures + ] + +non_persistent_vote_bundle = + [ 1 ; Vote type identifier for non-persistent voter + , election_id ; 8-byte election identifier + , pool_id ; 28-byte pool identifier + , eligibility_signature ; 48-byte BLS signature proving eligibility + , vote_entries ; Map of endorser blocks to signatures + ] + +vote_entries = {* endorser_block_hash => vote_signature} +``` +Sources: [Vote Reference Implementation](https://github.com/input-output-hk/ouroboros-leios/blob/main/crypto-benchmarks.rs/src/vote.rs#L13-L27), [Formal Specification - Vote Abstract Interface](https://github.com/input-output-hk/ouroboros-leios-formal-spec/blob/main/formal-spec/Leios/Abstract.agda#L24-L27), [Haskell Bundle Usage](https://github.com/input-output-hk/ouroboros-leios/blob/main/simulation/src/LeiosProtocol/Short.hs#L231-L234), [Rust Vote Bundle](https://github.com/input-output-hk/ouroboros-leios/blob/main/sim-rs/sim-core/src/model.rs#L208-L212) + +## BLS Key Registration + +For pools to participate in Leios voting, they must register BLS keys in their operational certificates: + +```diff + operational_cert = + [ hot_vkey : kes_vkey + , sequence_number : uint .size 8 + , kes_period : uint + , sigma : signature ++ , ? bls_key_reg : bls_key_registration + ] +``` +Sources: [Conway Base](https://github.com/IntersectMBO/cardano-ledger/blob/master/eras/conway/impl/cddl-files/conway.cddl#L114-L119) + +```cddl +; BLS key registration for voting (included in operational certificates) +bls_key_registration = + [ pool_id : pool_id ; Pool identifier (28 bytes) + , bls_public_key : bls_vkey ; BLS12-381 G2 public key (96 bytes) + , proof_of_possession : bls_proof_of_possession ; Proof of secret key possession (96 bytes) + , kes_signature : kes_signature ; KES signature over the registration (448 bytes) + ] + +; Total size: 28 + 96 + 96 + 448 = 668 bytes +``` +Sources: [Registration Struct](https://github.com/input-output-hk/ouroboros-leios/blob/main/crypto-benchmarks.rs/src/key.rs#L156-L162), [Proof Generation](https://github.com/input-output-hk/ouroboros-leios/blob/main/crypto-benchmarks.rs/src/bls_vote.rs#L19-L23) + +## Cryptographic Types + +```cddl +; Core BLS cryptographic primitives +bls_signature = bytes .size 48 ; BLS12-381 G1 signature (compressed) +bls_vkey = bytes .size 96 ; BLS12-381 G2 public key (compressed) +bls_proof_of_possession = + [ mu1 : bls_signature ; Signature on public key + , mu2 : bls_signature ; Signature on empty message + ] + +; Leios-specific identifiers +election_id = bytes .size 8 ; Slot-based election identifier +persistent_voter_id = uint .size 2 ; Epoch-specific voter identifier (0-65535) +pool_id = bytes .size 28 ; Stake pool identifier +endorser_block_hash = bytes .size 32 ; Hash of endorser block + +; Additional Cardano types used +kes_signature = bytes .size 448 ; KES signature +hash32 = bytes .size 32 ; 32-byte hash (used for endorser_block_hash) +``` +Sources: [Sig](https://github.com/input-output-hk/ouroboros-leios/blob/main/crypto-benchmarks.rs/src/key.rs#L100), [PubKey](https://github.com/input-output-hk/ouroboros-leios/blob/main/crypto-benchmarks.rs/src/key.rs#L62), [PoP](https://github.com/input-output-hk/ouroboros-leios/blob/main/crypto-benchmarks.rs/src/key.rs#L139-L143), [Eid](https://github.com/input-output-hk/ouroboros-leios/blob/main/crypto-benchmarks.rs/src/primitive.rs#L76), [PersistentId](https://github.com/input-output-hk/ouroboros-leios/blob/main/crypto-benchmarks.rs/src/registry.rs#L14), [PoolKeyhash](https://github.com/input-output-hk/ouroboros-leios/blob/main/crypto-benchmarks.rs/src/primitive.rs#L14), [EbHash](https://github.com/input-output-hk/ouroboros-leios/blob/main/crypto-benchmarks.rs/src/primitive.rs#L117), [KesSig](https://github.com/input-output-hk/ouroboros-leios/blob/main/crypto-benchmarks.rs/src/primitive.rs#L170) + + + +## Next +**→ [Endorser Block - CDDL](endorser-blocks.md)** \ No newline at end of file diff --git a/docs/cddl/diffs/eb-only/endorser-blocks.md b/docs/cddl/diffs/eb-only/endorser-blocks.md new file mode 100644 index 000000000..d3c0f6082 --- /dev/null +++ b/docs/cddl/diffs/eb-only/endorser-blocks.md @@ -0,0 +1,22 @@ +# Endorser Blocks - Eb-Only Leios + +This file specifies the CDDL modifications for Endorser Blocks in Stracciatella Leios, which contain transaction references directly instead of introducing input blocks (IBs). + +## EB Extensions + +Stracciatella Leios extends the common endorser block structure from [Common Endorser Blocks](../common/endorser-blocks.md): + +```diff + eb_body = + [ +- input_blocks : [* ib_reference] ; References to input blocks + , ? endorser_blocks : [* eb_reference] ; References to earlier endorser blocks (Full Leios) ++ , transaction_references: [* tx_reference] ; Transaction references instead of full transactions + ] +``` + +## Transaction Reference Structure + +```cddl +tx_reference = bytes .size 32, ; Transaction ID (hash) +``` diff --git a/docs/cddl/diffs/full-sharding/README.md b/docs/cddl/diffs/full-sharding/README.md new file mode 100644 index 000000000..72e907746 --- /dev/null +++ b/docs/cddl/diffs/full-sharding/README.md @@ -0,0 +1,41 @@ +# Full Sharding - Leios + +This directory contains CDDL specifications for the **full sharding** approach to Leios ledger design. + +## Sharding Approaches + +The full sharding design provides two complementary mechanisms that **prevent transaction conflicts and duplicates** by ensuring potentially conflicting transactions are processed sequentially within the same shard rather than concurrently across different shards: + +### 1. UTxO Sharding ([Spec](./utxo.md)) + +- **Mechanism**: Explicit `shard_label` field in transaction outputs matches implicit IB `shard` derived by its VRF proof +- **Shard Assignment**: IB shard derived from VRF proof: + + $$\text{shardId} = \text{vrf\_value} \bmod \text{totalShards}$$ +- **Network Overhead**: +2 bytes per labeled output + +### 2. Reward Account Sharding ([Spec](./reward-account.md)) + +- **Mechanism**: Implicit shard assignment where transactions using reward accounts for collateral/withdrawals must match the IB's shard +- **Shard Assignment**: Reward account shard derived from hash function: + + $$\text{shardId} = \text{hash}(\text{rewardAccount}) \bmod \text{totalShards}$$ +- **Network Overhead**: 0 bytes (computed on-demand) + +## Sharding Benefits + +Both mechanisms contribute to the broader sharding strategy that: +- **Prevents conflicts** by processing potentially conflicting transactions sequentially within the same shard +- **Reduces duplicates** through per-shard mempool segmentation + +## Comparison + +| Aspect | UTxO Sharding | Reward Account Sharding | +|--------|---------------|------------------------| +| **Explicitness** | Explicit `shard_label` field | Implicit hash-based | +| **Network Overhead** | +2 bytes per output | 0 bytes | +| **Flexibility** | Can choose shard | Deterministic shard | +| **Bootstrapping** | Requires labeled UTxOs | Immediate availability | + +> [!Note] +> **Design Rationale**: These approaches serve different purposes and can be used together or independently. Reward account sharding enables immediate onboarding while UTxO sharding provides operational control. diff --git a/docs/cddl/diffs/full-sharding/input-blocks.md b/docs/cddl/diffs/full-sharding/input-blocks.md new file mode 100644 index 000000000..051ba4b57 --- /dev/null +++ b/docs/cddl/diffs/full-sharding/input-blocks.md @@ -0,0 +1,35 @@ +# Input Blocks - Full Sharding CDDL + +The common [`input_block`](../common/input-blocks.md#block-structure) structure is used with shard assignment in the IB header. + +## Sharded IB Header + +Stays the same as [common input block](../common/input-blocks.md). + + +> [!Important] +> It was specifically no `shard` id added to the `ib_header_body` as it can be derived from the VRF. This keeps the CDDL the same for both ledger designs (sharded & collateralized). + +## Shard Assignment + +```cddl +; Shard identifier (16-bit allows up to 65,536 shards) +; Current simulation configs use 1-900 shards +shard_id = uint .size 2 + +; Shard assignment based on VRF value +; Implementation: shard = vrf_value mod total_shards +``` +Sources: Ledger v0.2: "each IB has a shard id (determined through its VRF value)", [Rust Shard Assignment](https://github.com/input-output-hk/ouroboros-leios/blob/main/sim-rs/sim-core/src/sim/node.rs#L599-L604) + +## Supporting Types + +```cddl +; Basic types +shard_id = uint .size 2 ; 16-bit shard identifier (current range: 1-900) +slot_no = uint64 ; Slot number +``` + +## Next + +**→ [Sharded UTxO - CDDL](utxo.md)** \ No newline at end of file diff --git a/docs/cddl/diffs/full-sharding/reward-account.md b/docs/cddl/diffs/full-sharding/reward-account.md new file mode 100644 index 000000000..73319ee6f --- /dev/null +++ b/docs/cddl/diffs/full-sharding/reward-account.md @@ -0,0 +1,81 @@ +# Reward Account Sharding Analysis + +The reward account sharding scheme leverages Conway's existing structure without modifications for network transfer, using **implicit hash-based shard assignment**. + +## Supporting CDDL Definitions + +```cddl +; Conway structure remains unchanged +reward_account = bytes +withdrawals = {+ reward_account => coin} +``` +Sources: [Conway Reward Account](https://github.com/IntersectMBO/cardano-ledger/blob/master/eras/conway/impl/cddl-files/conway.cddl#L382), [Conway Withdrawals](https://github.com/IntersectMBO/cardano-ledger/blob/master/eras/conway/impl/cddl-files/conway.cddl#L421) + +## Transaction Body Extensions + +```diff +; Conway transaction body extended with Leios collateral field + transaction_body = + { 0 : set ; inputs + , 1 : [* transaction_output] ; outputs + , 2 : coin ; fee + , ? 3 : slot_no ; ttl + , ? 4 : certificates ; certificates + , ? 5 : withdrawals ; withdrawals + , ? 7 : auxiliary_data_hash ; auxiliary_data_hash + , ? 8 : slot_no ; validity_interval_start + , ? 9 : mint ; mint + , ? 11 : script_data_hash ; script_data_hash + , ? 13 : nonempty_set ; collateral_inputs (Conway - for script failures) + , ? 14 : required_signers ; required_signers + , ? 15 : network_id ; network_id + , ? 16 : transaction_output ; collateral_return (Conway - for script failures) + , ? 17 : coin ; total_collateral (Conway - for script failures) + , ? 18 : nonempty_set ; reference_inputs + , ? 19 : voting_procedures ; voting_procedures + , ? 20 : proposal_procedures ; proposal_procedures + , ? 21 : coin ; current_treasury_value + , ? 22 : positive_coin ; donation ++ , ? 25 : leios_collateral ; Leios collateral from reward accounts + } +``` + +## Leios Collateral Structure + +```diff ++; Leios collateral using reward accounts (same type as withdrawals) ++leios_collateral = {+ reward_account => coin} +``` +Sources: [Conway Transaction Body](https://github.com/IntersectMBO/cardano-ledger/blob/master/eras/conway/impl/cddl-files/conway.cddl#L130-L151), [Conway Withdrawals](https://github.com/IntersectMBO/cardano-ledger/blob/master/eras/conway/impl/cddl-files/conway.cddl#L421) + +**Field Selection Rationale**: Field 25 is allocated for Leios collateral specification using the same type as Conway withdrawals. Fields 23-24 are reserved for future Conway extensions, making 25 the next available field for Leios reward account sharding extensions. + +> [!Note] +> **Design Rationale**: The explicit reward account field allows transactions to specify which reward account should be used for collateral posting, enabling deterministic shard assignment for fee payment validation. + +## Shard Assignment Algorithm + +The shard assignment for reward accounts is computed implicitly: + +$$\text{shardId} = \text{hash}(\text{rewardAccount}) \bmod \text{totalShards}$$ + +**Where**: +- `hash()` uses the same hash function as Cardano address derivation +- `total_shards` is a protocol parameter +- Ensures deterministic shard assignment across all nodes + +## Shard Assignment Validation + +For all VKey reward accounts in both `withdrawals` and `leios_collateral` fields, transactions must ensure: + +$$ +\text{hash}(\text{rewardAccount}) \bmod \text{totalShards} = \text{ibShardId} +$$ + +**Where this validation applies to**: +- All VKey reward accounts in the `withdrawals` field +- All VKey reward accounts in the `leios_collateral` field +- Script reward accounts are exempt from this restriction + +> [!Important] +> **Implications**: This creates significant constraints where VKey reward accounts can only withdraw staking rewards or post collateral in transactions belonging to their assigned shard, preventing cross-shard conflicts and ensuring collateral integrity. Script reward accounts remain unrestricted. \ No newline at end of file diff --git a/docs/cddl/diffs/full-sharding/utxo.md b/docs/cddl/diffs/full-sharding/utxo.md new file mode 100644 index 000000000..efc498a6b --- /dev/null +++ b/docs/cddl/diffs/full-sharding/utxo.md @@ -0,0 +1,46 @@ +# Sharded Transactions - CDDL + +The fully-sharded transactions approach extends Conway transactions with shard assignment and fee payment mechanisms to ensure compatibility with the sharded ledger design. + +## Core Sharding Principles + +The transaction extensions implement the following design principles from Ledger v0.2: +- **Shard Assignment**: Transactions are assigned to shards based on their fee-paying UTxOs +- **Fee Payment**: Any transaction submitted to Leios must pay its fees through labelled UTxOs +- **UTxO Labeling**: UTxOs can be explicitly labelled with a shard id + +## UTxO Shard Labeling + +```diff +; Conway transaction output from conway.cddl + transaction_output = + [ address + , amount : value + , ? datum_option : datum_option + , ? script_ref : script_ref ++ , ? shard_label : shard_id ; Optional explicit shard labeling + ] +``` +Sources: [Conway CDDL](https://github.com/IntersectMBO/cardano-ledger/blob/master/eras/conway/impl/cddl-files/conway.cddl#162), Ledger v0.2: "UTxOs can be explicitly labelled with a shard id" + + +## Supporting Types + +```cddl +; Base Cardano types (referenced from Conway) +transaction_input = [transaction_id, uint32] ; Conway transaction input +transaction_output = shelley_transaction_output / babbage_transaction_output ; Conway transaction output +transaction_id = hash32 ; Conway transaction ID +reward_account = bytes ; Conway reward account +coin = uint64 ; Coin amount +certificates = nonempty_set ; Conway certificates +withdrawals = {+ reward_account => coin} ; Conway withdrawals + +; Sharding-specific types +shard_id = uint .size 2 ; 16-bit shard identifier (0-65535) +slot_no = uint64 ; Slot number +hash32 = bytes .size 32 ; 32-byte hash +hash28 = bytes .size 28 ; 28-byte hash +uint64 = uint .size 8 ; 64-bit unsigned integer +``` +Sources: [Conway CDDL](https://github.com/IntersectMBO/cardano-ledger/blob/master/eras/conway/impl/cddl-files/conway.cddl#L156) \ No newline at end of file diff --git a/docs/cddl/diffs/linear/endorser-blocks.md b/docs/cddl/diffs/linear/endorser-blocks.md new file mode 100644 index 000000000..8b79abba1 --- /dev/null +++ b/docs/cddl/diffs/linear/endorser-blocks.md @@ -0,0 +1,50 @@ +# Endorser Blocks - Linear Leios + +This file specifies the CDDL modifications for Endorser Blocks in Linear Leios, which contain transaction references and conflicting transaction information. EBs have no header/body separation and are announced through RB headers. + +## Overview + +In Linear Leios, Endorser Blocks (EBs) are announced by Ranking Blocks through the `announced_eb` field in the RB header. EBs contain transaction references rather than full transactions and include information about conflicting transactions from previous RBs. + +## Linear EB Structure + +Linear Leios completely replaces the common endorser block structure: + +```diff +- endorser_block = +- [ eb_header : eb_header +- , eb_body : eb_body +- ] +- +- eb_header = +- [ eb_header_body : eb_header_body +- , body_signature : kes_signature +- ] +- +- eb_header_body = +- [ slot : slot_no +- , producer : pool_id +- , ? vrf_proof : vrf_cert +- ] +- +- eb_body = +- [ +- input_blocks : [* ib_reference] ; References to input blocks +- , ? endorser_blocks : [* eb_reference] ; References to earlier endorser blocks (Full Leios) +- ] + ++ endorser_block = ++ [ conflicting_txs : [* transaction_index] ; Indices of conflicting txs in previous RBs ++ , transaction_references : [* tx_reference] ; Transaction references ++ ] +``` + +## Reference Structures + +```cddl +; Transaction reference structure +tx_reference = hash32 ; Transaction ID (hash) + +; Transaction index in a block +transaction_index = uint +``` diff --git a/docs/cddl/diffs/linear/ranking-blocks.md b/docs/cddl/diffs/linear/ranking-blocks.md new file mode 100644 index 000000000..ee9368610 --- /dev/null +++ b/docs/cddl/diffs/linear/ranking-blocks.md @@ -0,0 +1,54 @@ +# Ranking Blocks - Linear Leios + +In Linear Leios, Ranking Blocks (RBs) serve as the anchor point for EBs. RBs can announce a new EB and certify a previously announced EB through their header and body respectively, creating a tight coupling between the Praos chain and EB processing. + +## Linear Leios RB Extensions + +Linear Leios extends the common ranking block structure from [Common Ranking Blocks](../common/ranking-blocks.md): + +### Block Structure + +```diff + ranking_block = + [ header : block_header + , transaction_bodies : [* transaction_body] + , transaction_witness_sets : [* transaction_witness_set] + , auxiliary_data_set : {* transaction_index => auxiliary_data} + , invalid_transactions : [* transaction_index] ++ , ? eb_certificate : leios_certificate ; Certificate for previously announced EB + ] +``` + +### Header Extensions + +```diff +block_header = + [ + header_body : block_header_body + , body_signature : kes_signature + ] + + block_header_body = + [ block_number : uint + , slot : slot_no + , prev_hash : hash32 + , issuer_vkey : vkey + , vrf_vkey : vrf_vkey + , vrf_result : vrf_cert + , block_body_size : uint + , block_body_hash : hash32 ++ , ? announced_eb : hash32 ; EB announcement (hash of announced EB) ++ , ? certified_eb : hash32 ; Reference to EB being certified + ] +``` + +## Reference Structures + +```cddl +; Hash identifier of the endorser block +eb_reference = hash32 + +; Transaction reference structure +tx_reference = hash32 +``` + diff --git a/docs/cddl/diffs/over-collateralization/transactions.md b/docs/cddl/diffs/over-collateralization/transactions.md new file mode 100644 index 000000000..f0e4bec09 --- /dev/null +++ b/docs/cddl/diffs/over-collateralization/transactions.md @@ -0,0 +1,67 @@ +# Transactions - Over-Collateralization CDDL + +The over-collateralization approach extends Conway transactions with Leios-specific collateral mechanisms for conflict resolution in concurrent Input Blocks. + +> [!Note] +> **Design Rationale**: Leios requires a separate collateral system for conflict resolution in concurrent Input Blocks, distinct from Conway's existing collateral mechanism which handles Plutus script execution failures. +> +> **TODO:** Check if both collateral system could be merged. + +## Transaction Body Extensions + +```diff +; Conway transaction body extended with Leios collateral fields + transaction_body = + { 0 : set ; inputs + , 1 : [* transaction_output] ; outputs + , 2 : coin ; fee + , ? 3 : slot_no ; ttl + , ? 4 : certificates ; certificates + , ? 5 : withdrawals ; withdrawals + , ? 7 : auxiliary_data_hash ; auxiliary_data_hash + , ? 8 : slot_no ; validity_interval_start + , ? 9 : mint ; mint + , ? 11 : script_data_hash ; script_data_hash + , ? 13 : nonempty_set ; collateral_inputs (Conway - for script failures) + , ? 14 : required_signers ; required_signers + , ? 15 : network_id ; network_id + , ? 16 : transaction_output ; collateral_return (Conway - for script failures) + , ? 17 : coin ; total_collateral (Conway - for script failures) + , ? 18 : nonempty_set ; reference_inputs + , ? 19 : voting_procedures ; voting_procedures + , ? 20 : proposal_procedures ; proposal_procedures + , ? 21 : coin ; current_treasury_value + , ? 22 : positive_coin ; donation ++ , ? 25 : leios_collateral_inputs ; Leios-specific collateral for conflict resolution ++ , ? 26 : leios_collateral_return ; Return output for unused Leios collateral + } +``` +Sources: [Conway Transaction Body](https://github.com/IntersectMBO/cardano-ledger/blob/master/eras/conway/impl/cddl-files/conway.cddl#L130-L151), [Formal Spec - Abstract Tx](https://github.com/input-output-hk/ouroboros-leios-formal-spec/blob/main/formal-spec/Leios/Abstract.agda#L16) + +**Field Selection Rationale**: Fields 23-24 are reserved for future Conway extensions. Fields 25-26 are allocated for Leios collateral to avoid conflicts with Conway's roadmap. + +## Leios Collateral Structure + +```diff ++; Leios collateral inputs for conflict resolution in concurrent IBs ++leios_collateral_inputs = nonempty_set ++ ++; Return output for unused Leios collateral ++leios_collateral_return = transaction_output +``` +Sources: [Conway Collateral Pattern](https://github.com/IntersectMBO/cardano-ledger/blob/master/eras/conway/impl/cddl-files/conway.cddl#L108-L120), [Conway Transaction Types](https://github.com/IntersectMBO/cardano-ledger/blob/master/eras/conway/impl/cddl-files/conway.cddl#L137-L145) + +> [!Note] +> **Design Rationale**: Users post collateral proportional to the concurrency level of the protocol to cover wasted resources when conflicts occur. + +## Supporting Types + +```diff +; Reused Conway types +transaction_input = [transaction_id : transaction_id, index : uint .size 2] +transaction_output = shelley_transaction_output / babbage_transaction_output +nonempty_set = #6.258([+ a0]) / [+ a0] +transaction_id = hash32 +hash32 = bytes .size 32 +``` +Sources: [Conway Transaction Input](https://github.com/IntersectMBO/cardano-ledger/blob/master/eras/conway/impl/cddl-files/conway.cddl#L156), [Conway Transaction Output](https://github.com/IntersectMBO/cardano-ledger/blob/master/eras/conway/impl/cddl-files/conway.cddl#L162) \ No newline at end of file diff --git a/docs/cip/README.md b/docs/cip/README.md index 52d140c16..1982504c5 100644 --- a/docs/cip/README.md +++ b/docs/cip/README.md @@ -4,518 +4,1143 @@ Title: Ouroboros Leios - Greater transaction throughput Status: Active Category: Consensus Authors: - - William Wolff - - Brian W Bush - - PLEASE ADD YOUR NAME IF YOU CONTRIBUTE TEXT TO THIS DOCUMENT + - William Wolff + - Brian W Bush + - Sebastian Nagel + - Nicolas Frisby + - Giorgos Panagiotakos + - Andre Knipsel + - Simon Gellis + - Yves Hauser + - Yuriy Syrovetskiy + - PLEASE ADD YOUR NAME IF YOU CONTRIBUTE TEXT TO THIS DOCUMENT Implementors: - - Intersect + - Intersect Discussions: - - https://github.com/input-output-hk/ouroboros-leios/discussions + - https://github.com/input-output-hk/ouroboros-leios/discussions Solution-To: - - CPS-0018 + - CPS-0018 Created: 2025-03-07 License: Apache-2.0 --- ## Abstract -> [!NOTE] -> -> A short (~200 word) description of the proposed solution and the technical issue being addressed. +The anticipated growth of the Cardano ecosystem necessitates a fundamental +enhancement of network throughput to accommodate increasing transaction volumes +and support complex decentralized applications. -The anticipated growth of the Cardano ecosystem necessitates a fundamental enhancement of network throughput to accommodate increasing transaction volumes and support complex decentralized applications. +We propose Ouroboros Leios, a consensus protocol designed for high-throughput +operation while preserving Ouroboros Praos security properties. Block producers +simultaneously create both a standard Praos block and a larger secondary block +containing additional transactions. Secondary blocks undergo committee +validation before ledger inclusion, enabling significantly higher throughput. -To address this challenge, we propose a transition to Ouroboros Leios — a novel consensus protocol within the Ouroboros family. Leios is specifically designed for high-throughput operation while preserving the rigorous security properties established by Ouroboros Praos. +This specification presents the first version of the Ouroboros Leios protocol +family, designed to deliver substantial throughput improvements with +economic sustainability and reduced complexity through fewer new protocol elements. -Leios achieves its scalability through a decoupled block production and aggregation mechanism. This allows for a higher rate of input-block generation, followed by efficient endorsement and anchoring onto the main chain. This document formally specifies the Leios protocol using Agda and provides a detailed rationale and supporting evidence demonstrating its efficacy in overcoming the throughput limitations inherent in the current Ouroboros Praos protocol. +> [!NOTE] +> +> For comprehensive research documentation, development history, and additional +> technical resources, visit the +> Leios Innovation R&D site at [leios.cardano-scaling.org][leios-website].

Table of contents

Create a table of contents with internal hyperlinks when the organization of the document is stable.
-## Motivation: why is this CIP necessary? +
+

Table of figures and tables

+ +### Figures + +- [Figure 1: Forecast of rewards on Cardano mainnet](#figure-1) +- [Figure 2: SPO profitability under Praos, as a function of transaction volume](#figure-2) +- [Figure 3: Ouroboros Leios Rolling Window Mechanism](#figure-3) +- [Figure 4: Leios Protocol Flow](#figure-4) +- [Figure 5: Detailed protocol flow showing rolling windows and correction mechanisms](#figure-5) +- [Figure 6: Up- and downstream interactions of a node (simplified)](#figure-6) +- [Figure 7: Time for transaction to reach the ledger](#figure-7) +- [Figure 8: Transactions reaching the ledger](#figure-8) +- [Figure 9: Number of TX references](#figure-9) +- [Figure 10: Disposition of transactions in blocks](#figure-10) +- [Figure 11: Size of transactions referenced by EBs](#figure-11) +- [Figure 12: Arrival delays for transactions, ranking blocks, votes, and endorser blocks](#figure-12) +- [Figure 13: Mean nodal ingress (left) and Mean CPU load among all nodes (right)](#figure-13) +- [Figure 14: Mean CPU load among all nodes](#figure-14) +- [Figure 15: Fate of Plutus-heavy transactions in Leios](#figure-15) +- [Figure 16: CPU usage in Plutus-heavy workloads for Leios](#figure-16) + +### Tables + +- [Table 1: Network Characteristics](#table-1) +- [Table 2: Protocol Design Constants](#table-2) +- [Table 3: Leios Protocol Parameters](#table-3) +- [Table 4: Performance Metrics](#table-4) +- [Table 5: Leios effficiency at different throughputs](#table-5) +- [Table 6: Feasible Protocol Parameters](#table-6) +- [Table 7: Operating Costs by IB Production Rate](#table-7) +- [Table 8: Required TPS for Infrastructure Cost Coverage](#table-8) +- [Table 9: Required TPS for Current Reward Maintenance](#table-9) +- [Table 10: Leios Mini-Protocols](#table-10) + +
+ +## Motivation + +Cardano's current throughput generally satisfies the immediate needs of its users. However, the Ouroboros Praos consensus protocol imposes inherent scalability limitations. To ensure timely and reliable global propagation of new blocks, the protocol requires that blocks be distributed across the network within a short time frame. This requirement forces a careful balance, restricting both the maximum size of individual blocks and the computational resources available for validating transactions and Plutus scripts. As a result, there is a fixed ceiling on the network's transaction throughput that cannot be raised by adjusting protocol parameters alone. + +However, the dynamic growth of the Cardano ecosystem is increasingly revealing +the practical consequences of these inherent limitations. The Cardano mainnet +periodically experiences periods of significant congestion, where the volume of +transactions awaiting processing surpasses the network's ability to include them +in a timely manner. This congestion can lead to a tangible degradation in the +user experience, manifesting as delays in transaction confirmation. Moreover, it +poses substantial obstacles for specific use cases that rely on the efficient +processing of large volumes of transactions, such as the distribution of tokens +via airdrops, or the rapid and consistent updating of data by decentralized +oracles or partner chains. + +The semi-sequential nature of block propagation in Ouroboros Praos, where blocks +are relayed from one block producer to the next across potentially +geographically distant nodes, is a key factor contributing to these limitations. +The necessity of completing this global dissemination within the few-second +period places a fundamental constraint on the rate at which new blocks, and +consequently the transactions they contain, can be added to the blockchain. This +architectural characteristic stands in contrast to the largely untapped +potential of the network's underlying infrastructure, where the computational +and bandwidth resources of individual nodes often remain significantly +underutilized. + +To transcend these inherent scaling barriers and unlock the latent capacity of +the Cardano network, a measured evolution of the core consensus algorithm is +required. This specification presents the first version of the Ouroboros Leios +protocol family - a stepping stone toward higher throughput while preserving the +proven security and stability characteristics of Praos. This initial protocol +version extends Praos with optional secondary blocks and committee validation +to achieve significant increases in throughput while +maintaining familiar transaction semantics. + +The Cardano Problem Statement [CPS-18 Greater Transaction Throughput][cps-18] +further motivates the need for higher transaction throughput and marshals +quantitative evidence of existing mainnet bottlenecks. Realizing higher +transaction rates is also necessary for long-term Cardano techno-economic +viability as rewards contributions from the Reserve pot diminish: fees from more +transactions will be needed to make up that deficit and keep sound the finances +of stakepool operations. + +A major protocol upgrade like Leios will take significant time to implement, test, and audit. It is therefore critical to have begun implementation well before transaction demand on mainnet exceeds the capabilities of Ouroboros Praos. The plot below shows the historically +diminishing rewards and a forecast of their continued reduction: the forecast is +mildly uncertain because the future pattern of staking behavior, transaction +fees, and node efficiency might vary considerably. + +
+ +

+ Forecast of rewards on Cardano mainnet +

+ +_Figure 1: Forecast of rewards on Cardano mainnet_ + +
+ +Ouroboros Praos cannot support the high transaction volume needed to generate +the fees that will eventually be needed to offset the diminishing rewards. +However, as sustained throughput of transactions grows beyond 50 transactions +per second, there is more opportunity for simultaneously reducing fees, +augmenting the Treasury, and increasing SPO and delegator rewards. + +
+ +

+ SPO profitability under Praos, as a function of transaction volume +

+ +_Figure 2: SPO profitability under Praos, as a function of transaction volume_ + +
+ +The Leios protocol specified in this document represents a balance +between immediate scalability needs and long-term protocol evolution. The +approach prioritizes practical deployment and ecosystem compatibility while +establishing the foundation for subsequent protocol versions with higher +throughput capacity. + +## Specification + +Leios extends Ouroboros Praos by introducing [**Endorser Blocks (EBs)**](#endorser-blocks-ebs) - secondary blocks containing additional transactions that undergo committee validation before inclusion in the permanent ledger. + +
+ +

+ Rolling Window Operation +

+ + Figure 3: Ouroboros Leios rolling window mechanism +
+ +The protocol's behavior is governed by a **rolling window mechanism** that tracks certificate inclusion timing. When a committee successfully certifies an EB, this triggers a rolling window of $L_\text{recover}$ slots during which the network can process additional transactions at higher throughput. The protocol continuously evaluates this timing to determine validation requirements: + +- **Beyond the window** (no certificate within past $L_\text{recover}$ slots): Standard Praos validation applies - every transaction must be fully validated before block inclusion +- **Within the window** (certificate included within past $L_\text{recover}$ slots): Enhanced throughput enabled through relaxed validation requirements, with correction mechanisms ensuring ledger integrity + +This design preserves Ouroboros Praos security properties while automatically delivering higher throughput when network conditions support successful EB certification. + +### Protocol Flow + +
+ +

+ Leios Protocol Flow +

+ + Figure 4: Leios Protocol Flow +
+ +The protocol operates through a five-step process that introduces new block types and validation mechanisms to achieve enhanced throughput. + +#### Step 1: Block Production + +When a stake pool wins block leadership, it **simultaneously** may create two +components: + +1. **[Ranking Block (RB)](#ranking-blocks-rbs)** +A standard Praos block with extended header fields to optionally certify one previously announced EB and optionally announce one EB for the next subsequent RB to certify. +1. **[Endorser Block (EB)](#endorser-blocks-ebs)** +A larger block containing additional transaction references. There are no other ways to create EBs. + +The RB chain continues to be distributed exactly as in Praos, while Leios introduces a separate header distribution mechanism for rapid EB discovery and equivocation detection. + +Due to the voting overhead per EB, nodes should generally avoid announcing EBs with insufficient transaction content to justify the voting costs, as detailed in the [adaptive EB production](#adaptive-eb-production) incentive mechanism. However, EBs may also be announced when RB resource constraints (size or Plutus limits) are reached, even at lower transaction volumes. + +#### Step 2: EB Distribution + +Nodes receiving the RB header discover the announced EB and fetch its content. The EB contains references to transactions. If a node does not already possess a transaction referenced in the EB, it explicitly requests that transaction from peers. + +#### Step 3: Committee Validation + +A voting committee of stake pools validates the EB. As depicted in Figure 4, votes are collected during the $L_\text{vote}$ period following the EB announcement, with voting beginning $3\Delta_\text{hdr}$ slots after the EB creation to ensure sufficient time for [equivocation detection](#rbheaderrelay-mini-protocol). Committee members are [selected via sortition](#committee-structure) (lottery based on stake). A committee member votes for an EB only if: + + 1. It has received the EB within $L_\text{vote}$ slots from its creation, + 2. It has **not** received an equivocated RB header for this EB within $L_\text{vote}$ slots, + 3. The EB is the one announced by the latest RB in the voter's current chain, + 4. The EB's transactions form a **valid** extension of the RB that announced it. + +where $L_\text{vote}$ is a protocol parameter represented by a number of slots. + +#### Step 4: Certification + +If enough committee votes are collected such that the total active stake exceeds a +**threshold** parameter ($\tau$), for example 60%, the EB becomes **certified**: + +$$ +\sum_{v \in \text{votes}} \text{stake}(v) \geq \tau \times \text{stake}_{\text{total-active}} +$$ + +This creates a compact **certificate** proving the EB's validity. + +#### Step 5: Chain Inclusion + +The certificate for an EB shall be included in the body of a new ranking block `RB'` only if all of the following conditions hold: + 1. `RB'` directly extends the RB which announced this EB (as illustrated in Figure 4 where `RB'` contains the certificate for the EB announced by the preceding RB). + 2. The certificate is valid as defined in [Certificate Validation](#certificate-validation). + 3. If the EB contains a `tx_execution_bitmap`, this bitmap must be applied to determine which transactions from previous RBs back to the last RB that included a certificate were successfully executed (correction mechanisms are detailed in the following [Transaction Validation](#transaction-validation) section). + +This **conditional inclusion** ensures transaction availability to honest nodes with high probability while achieving higher throughput. When included: + +- The certified EB's transactions become part of the permanent ledger +- Throughput increases significantly for that segment of the chain +- If timing is insufficient, only the standard RB is included (maintaining Praos baseline) + +#### Rolling Window Rules + +The rolling window mechanism operates through two key behaviors that automatically manage throughput based on certificate inclusion timing: + +**Window Reset**: Each certificate inclusion immediately resets the $L_\text{recover}$ countdown, extending the enhanced throughput period. As shown in Figure 5 below, when RB3 includes a certificate, it starts a new window ($L_\text{recover-RB3}$). Later, RB5 resets this timer again, creating overlapping windows that maintain continuous high throughput. + +**Window Expiration**: Only when $L_\text{recover}$ consecutive slots pass without any certificate does the protocol revert to standard validation. This recovery period ensures all nodes synchronize any delayed EBs before validation resumes. In Figure 5, this occurs after the $L_\text{recover-RB5}$ window expires. + +
+ +

+ Rolling Window Timeline +

+ +Figure 5: Detailed protocol flow showing rolling $L_\text{recover}$ windows and transaction execution tracking + +
+ +**Transaction Validation** + +The rolling window mechanism enables different validation approaches that balance throughput with safety: + +**Standard Validation** (beyond window): Block producers have complete ledger state and must validate all transactions before inclusion, maintaining current Ouroboros Praos guarantees. + +**Enhanced Throughput** (within window): Block producers are permitted to create RBs before receiving all previously certified EBs due to network delays. Since they cannot determine complete ledger state, Leios allows temporary inclusion of **unvalidated transactions** - transactions whose validity cannot be immediately confirmed. + +This resolves the timing dilemma that would otherwise force block producers to either violate Praos constraints (by waiting) or include potentially invalid transactions without tracking. As shown in Figure 5, RBs produced during certificate-active periods (RB3 through RB7, marked with red dashed borders) are permitted to contain such transactions. + +**Correction Mechanisms**: To maintain ledger integrity when unvalidated transactions are included, the protocol implements transaction execution tracking through `tx_execution_bitmap` fields. These corrections follow two simple rules: + +**1. During enhanced throughput**: When EBs are certified within the rolling window, each certified EB includes corrections for RB transactions that occurred since the previous certificate. Since validators can only certify EBs when they have sufficient ledger state, they correct transactions from the known baseline forward (see EB2 in Figure 5). + +**2. When returning to standard validation**: The first RB after window expiration includes corrections for all remaining unvalidated transactions from the certificate-active period (see RB8 in Figure 5, which corrects transactions from RB5 through RB7). + +Figure 5 also shows the timing constraints that enable these mechanisms: +- **$L_\text{vote}$ periods** (timing brackets under each EB): Define the voting window for committee members +- **$L_\text{recover}$ windows** (thin green bars): The rolling countdown periods that determine validation requirements + +Parameter constraints are detailed in the [Protocol Parameters](#protocol-parameters) section. > [!NOTE] +> **Edge Case: Delayed EB Synchronization** > -> A clear explanation that introduces a proposal's purpose, use cases, and stakeholders. If the CIP changes an established design, it must outline design issues that motivate a rework. For complex proposals, authors must write a [Cardano Problem Statement (CPS) as defined in CIP-9999][CPS] and link to it as the `Motivation`. +> When a node reaches the end of a certificate-active window (i.e., $L_\text{recover}$ slots have passed since the last certificate) but has not yet received all certified EBs, it **must** wait to synchronize before producing new blocks or adopting longer chains. Without the complete ledger state from all certified EBs, the node cannot identify which transactions from the certificate-active period were invalid and thus cannot create the necessary corrections in its next block. The protocol parameter $L_\text{recover}$ is designed to prevent this scenario. -While Cardano's current transaction processing capabilities often meet the immediate demands of its user base, the underlying Ouroboros Praos consensus protocol inherently imposes limitations on scalability. The critical requirement for timely and reliable global propagation of newly generated blocks within a short time interval necessitates a careful balancing act. This constraint directly restricts the maximum size of individual blocks and the computational resources available for the validation of transactions and Plutus scripts, effectively establishing a ceiling on the network's transaction throughput that cannot be overcome through simple parameter adjustments alone. +### Protocol Component Details -However, the dynamic growth of the Cardano ecosystem is increasingly revealing the practical consequences of these inherent limitations. The Cardano mainnet periodically experiences periods of significant congestion, where the volume of transactions awaiting processing surpasses the network's ability to include them in a timely manner. This congestion can lead to a tangible degradation in the user experience, manifesting as delays in transaction confirmation. Moreover, it poses substantial obstacles for specific use cases that rely on the efficient processing of large volumes of transactions, such as the distribution of tokens via airdrops, or the rapid and consistent updating of data by decentralized oracles or partner chains. +The protocol extends Praos with three main elements: -The semi-sequential nature of block propagation in Ouroboros Praos, where blocks are relayed from one block producer to the next across potentially geographically distant nodes, is a key factor contributing to these limitations. The necessity of completing this global dissemination within the few-second period places a fundamental constraint on the rate at which new blocks, and consequently the transactions they contain, can be added to the blockchain. This architectural characteristic stands in contrast to the largely untapped potential of the network's underlying infrastructure, where the computational and bandwidth resources of individual nodes often remain significantly underutilized. +#### Ranking Blocks (RBs) -To transcend these inherent scaling barriers and unlock the latent capacity of the Cardano network, a fundamental evolution of the core consensus algorithm is imperative. Ouroboros Leios represents a departure from the sequential processing model of Praos, aiming to introduce mechanisms for parallel transaction processing and more efficient aggregation of transaction data. By reorganizing how transactions are proposed, validated, and ultimately recorded on the blockchain, this protocol upgrade seeks to achieve a substantial increase in the network's overall throughput, enabling it to handle a significantly greater volume of transactions within a given timeframe. +RBs are Praos blocks extended to support Leios by optionally announcing EBs in their headers and embedding EB certificates in their bodies. -The Cardano Problem Statement [CPS-18 Greater Transaction Throughput](https://github.com/cardano-foundation/CIPs/blob/master/CPS-0018/README.md) further motivates the need for higher transaction throughput and marshals quantitative evidence of existing mainnet bottlenecks. Realizing higher transaction rates is also necessary for long-term Cardano techo-economic viability as rewards contributions from the Reserve pot diminish: fees from more transactions will be needed to make up that deficit and keep sound the finances of stakepool operations. (Currently, the Reserve contributes more than 85% of the reward of a typical epoch, with less than 15% of the reward coming from the collection of transaction fees. In five years, however, the Reserve contribution will be much diminished.) Because a major protocol upgrade like Leios will take significant time to implement, test, and audit, it is important to began implementation well before transaction demand on mainnet exceeds the capabilities of Ouroboros Praos. The plot below shows the historically diminishing rewards and a forecast of their continued reduction: the forecast is mildly uncertain because the future pattern of staking behavior, transaction fees, and node efficiency might vary considerably. +1. **Header additions**: + - `announced_eb` (optional): Hash of the EB created by this block producer + - `certified_eb` (optional): Hash of the EB being certified by this RB -![Forecast of rewards on Cardano mainnet](images/reward-forecast-bau.svg) +2. **Body additions**: + - `eb_certificate` (optional): certificate proving EB availability & validity + - `tx_execution_bitmap` (optional): bitmap tracking transaction execution status -Ouroboros Praos cannot support the high transaction volume needed to generate the fees that will eventually be needed to offset the diminishing rewards. However, as sustained throughput of transactions grows beyond 50 transactions per second, there is more opportunity for simultaneously reducing fees, augmenting the Treasury, and increasing SPO and delegator rewards. +**Inclusion Rules**: When an RB header includes a `certified_eb` field, the corresponding body must include a matching `eb_certificate`. Conversely, an `eb_certificate` shall only be included when a `certified_eb` field references the EB being certified. -![SPO profitability under Praos, as a function of transaction volume](images/spo-profitability.svg) +**RB Corrections**: Following **Rule 2**, when the first RB is generated more than $L$recover slots after the latest EB certificate, the `tx_execution_bitmap` field must indicate the execution status of transactions in RBs between this RB and that EB certificate. This ensures the ledger state is fully determined before standard validation resumes. -## Specification +**Bitmap Size Constraint**: The transaction execution bitmap size $S_\text{bitmap}$ (see [Protocol Parameters](#protocol-parameters)) must fit within $S_\text{RB}$ alongside other required data. This is ensured by bounding $L_\text{recover}$ implicitly via $S_\text{bitmap} < S_\text{RB}$ (see [Bitmap Size Relationships](#bitmap-size-relationships)). + +**Cost Proportionality**: The first block, after the certificate-active window expires pays a cost proportional to the **uncorrected** transactions - i.e., RB transactions since the last EB certificate. EB corrections already included during the certificate-active period reduce this cost; only the remaining transactions require an RB-side bitmap. + +> [!WARNING] +> **TODO:** Add transaction confirmation levels and their implications for applications + +Transactions from certified EBs are included in the ledger alongside direct RB transactions. + +#### Endorser Blocks (EBs) + +EBs are produced by the same stake pool that created the corresponding announcing RB and reference additional transactions to increase throughput beyond what is permitted to be included directly in the RB. + +**EB Structure**: EBs have a simplified structure without header/body separation: +- `transaction_references`: List of transaction references (transaction ids) +- `tx_execution_bitmap`: Bitmap tracking execution status of transactions from previous RBs + +**EB Corrections**: Following **Rule 1**, when validators create an EB certificate within $L_\text{recover}$ slots of the latest certificate, they determine the execution status of transactions in RBs that occurred since the previous certificate. The `tx_execution_bitmap` field tracks this information, ensuring ledger state consistency during certificate-active periods while reducing the correction burden for the RB that will include all remaining corrections following $L_\text{recover}$ expiration. + +> [!NOTE] +> **Light Node Optimization**: As a future optimization, transaction execution bitmaps could also be included in EB certificates to allow light nodes to determine transaction execution status without downloading full EBs. + +When an EB is announced in an RB header via the `announced_eb` field, a voting period begins as described in [Votes and Certificates](#votes-and-certificates). Only RBs that directly extend the announcing RB are eligible to certify the announced EB by including a certificate. + +The hash referenced in RB headers (`announced_eb` and `certified_eb` fields) is computed from the complete EB structure and serves as the unique identifier for the EB. + +#### Votes and Certificates + +Leios employs a voting and certificate scheme where committee members cast votes that reference specific EBs, which are then aggregated into compact certificates for inclusion in RBs. This specification uses BLS signatures as the implementation example, though the protocol is designed to accommodate any efficient aggregate signature scheme that Cardano may adopt. + +The implementation meets the requirements for votes and certificates specified in Appendix A. Alternative schemes satisfying these requirements could be substituted, enabling unified voting infrastructure across Ouroboros Leios, Ouroboros Peras, and other protocols. + +To participate in the Leios protocol as voting member/ block producing node, stake pool operators must register one additional cryptographic key for the voting scheme alongside their existing VRF and KES keys. In the BLS implementation described here, this would be a BLS12-381 key. + +**Committee Structure**: Two types of voters validate EBs, balancing security, decentralization, and efficiency: +- **Persistent Voters**: Selected once per epoch using [Fait Accompli sortition][fait-accompli-sortition], vote in every election, identified by compact identifiers +- **Non-persistent Voters**: Selected per EB via local sortition with Poisson-distributed stake-weighted probability + +This dual approach prevents linear certificate size growth by leveraging non-uniform stake distribution, enabling faster certificate diffusion while maintaining broad participation. With efficient aggregate signature schemes like BLS, certificate sizes remain compact (under 10 kB) even with large committees, as shown in the [BLS certificates specification][bls-spec]. + +**Vote Structure**: All votes include the `endorser_block_hash` field that uniquely identifies the target EB: +- **Persistent votes**: + - `election_id`: Identifier for the voting round + - `persistent_voter_id`: Epoch-specific pool identifier + - `endorser_block_hash`: Hash of the target EB + - `vote_signature`: Cryptographic signature (BLS in this implementation) +- **Non-persistent votes**: + - `election_id`: Identifier for the voting round + - `pool_id`: Pool identifier + - `eligibility_signature`: Cryptographic proof of sortition eligibility (BLS in this implementation) + - `endorser_block_hash`: Hash of the target EB + - `vote_signature`: Cryptographic signature (BLS in this implementation) + +**Certificate Validation**: When an RB includes an EB certificate, nodes must validate the following before accepting the block: + +1. **CDDL Format Compliance**: Certificate structure matches the specification format defined in Appendix B: Votes and Certificates CDDL +2. **Cryptographic Signatures**: All cryptographic signatures are valid (BLS signatures in this implementation) + +3. **Voter Eligibility**: + - Persistent voters must have been selected as such by the [Fait Accompli scheme][fait-accompli-sortition] for the current epoch + - Non-persistent voters must provide valid sortition proofs +4. **Stake Verification**: Total voting stake meets the required quorum threshold +5. **EB Consistency**: Certificate references the correct EB hash announced in the preceding RB + +Detailed specifications, performance, and benchmarks are available in the [BLS certificates specification][bls-spec]. > [!NOTE] +> **Vote Bundling** > -> The technical specification should describe the proposed improvement in sufficient technical detail. In particular, it should provide enough information that an implementation can be performed solely based on the design outlined in the CIP. A complete and unambiguous design is necessary to facilitate multiple interoperable implementations. +> The linked BLS specification mentions vote bundling as an optimization. However, this only applies when EB production is decoupled from RBs, which is not the case in this specification where each EB is announced by an RB. + +### Network Characteristics and Protocol Parameters + +The following sections distinguish between observed **network characteristics** (which depend on topology and node capabilities), **protocol characteristics** (determined by architectural design decisions), and tunable **protocol parameters** (which can be adjusted via governance). + +**Network Characteristics** + +These are observed properties of the network topology and node capabilities: + +
+ + +| Characteristic | Symbol | Units | Description | Typical Range | Notes | +| ------------------------- | :-----------------: | :---: | ----------------------------------------------------------- | :-----------------------------: | -------------------------------------------------- | +| RB diffusion time | $\Delta_\text{RB}$ | slot | Observed upper bound for RB diffusion and adoption to all nodes | 2-6 slots | Depends on network topology and conditions | +| RB header diffusion time | $\Delta_\text{hdr}$ | slot | Observed time for RB headers to reach all nodes | $\leq \Delta_\text{RB}$ | Usually faster than full block diffusion | +| EB diffusion time | $\Delta_\text{EB}$ | slot | Observed upper bound for EB diffusion, transaction retrieval, and ledger state building at all nodes when no competing or fresher blocks exist | $\geq \Delta_\text{RB}$ | Slower than RBs due to larger size and additional processing requirements | + +_Table 1: Network Characteristics_ + +
+ +**Protocol Characteristics** + +These characteristics are determined by fundamental protocol design decisions and cannot be changed through governance: + +
+ + +| Characteristic | Symbol | Units | Description | Value | Notes | +| ------------------------- | :-----------: | :------: | ---------------------------------------------------------------------- | :---------------------------------------: | --------------------------------------------------------- | +| Minimum transaction size | $T_\text{min}$ | bytes | Lower bound on transaction size | $\geq 55$ bytes | Anchored to observed 55-byte transaction [^mainnet-min-tx] | + +_Table 2: Protocol Characteristics_ + +
+ +**Protocol Parameters** + +These parameters are configurable and subject to governance decisions, +constrained by the network characteristics and protocol characteristics above: + +
+ + +| Parameter | Symbol | Units | Description | Constraints | Rationale | +| ----------------------------- | :-----------: | :------: | ---------------------------------------------------------------------- | :---------------------------------------------: | ------------------------------------------------------------- | +| Voting period length | $L_\text{vote}$ | slot | Duration during which committee members can vote on endorser blocks | $L_\text{vote} > 3\Delta_\text{hdr}$ | Must allow EB diffusion and equivocation detection before voting; the constraint ensures sufficient time for header propagation and equivocation detection before voting begins.

**Liveness**: To ensure that honest EBs are certified most of the time, $L_\text{vote}$ must be set so that there is sufficient time for an honestly produced EB to be diffused and processed by a large fraction of the network, assuming no other "fresher" RB is produced in the same period | +| Recovery period length | $L_\text{recover}$ | slot | Duration of rolling window that tracks time since last certificate | $L_\text{recover} > \Delta_\text{EB}$ | Must ensure all nodes receive certified EBs before window expires. Implicitly constrained by bitmap size requirement (see $S_\text{bitmap}$ row) | +| Ranking block max size | $S_\text{RB}$ | bytes | Maximum size of a ranking block | $S_\text{RB} > 0$ | Limits RB size to ensure timely diffusion | +| Endorser-block referenceable transaction size | $S_\text{EB-tx}$ | bytes | Maximum total size of transactions that can be referenced by an endorser block | $S_\text{EB-tx} > 0$ | Limits total transaction payload to ensure timely diffusion within stage length | +| Endorser block max size | $S_\text{EB}$ | bytes | Maximum size of an endorser block itself | $S_\text{EB} > 0$ | Limits EB size to ensure timely diffusion; prevents issues with many small transactions | +| Praos active slot coefficient | $f_\text{RB}$ | 1/slot | Probability that a party will be the slot leader for a particular slot | $0 < f_\text{RB} \leq \Delta_\text{RB}^{-1}$ | Blocks must not be produced faster than network delay | +| Mean committee size | $n$ | parties | Average number of stake pools selected for voting | $n > 0$ | Ensures sufficient decentralization and security | +| Quorum size | $\tau$ | fraction | Minimum fraction of committee votes required for certification | $\tau > 0.5$ | Prevents adversarial control while ensuring liveness | +| Maximum correction bitmap size | $S_\text{bitmap}$ | bytes | Maximum size of transaction execution bitmap for corrections | $S_\text{bitmap} = \lceil L_\text{recover} \times S_\text{RB} / (8 \times T_\text{min}) \rceil$ | Calculated based on worst-case scenario with one RB per slot containing minimum-sized transactions during recovery period. Protocol must ensure all corrections are included before standard validation resumes to maintain ledger integrity | + +_Table 3: Leios Protocol Parameters_ + +
+ +> [!NOTE] +> **EB Size Constraints** > -> This section must address the [Versioning](#versioning) requirement unless this is addressed in an optional Versioning section. +> Two separate parameters control EB sizes: +> - $S_\text{EB}$ limits the size of the EB data structure itself, preventing issues when many small transactions create large numbers of transaction references (32 bytes each) +> - $S_\text{EB-tx}$ limits the total size of transactions that can be referenced, controlling the actual transaction payload > -> If a proposal defines structure of on-chain data it must include a CDDL schema. +> For example, an EB referencing 10,000 transactions of 100 bytes each would have $S_\text{EB-tx} = 1$ MB but the EB itself would be at least 320 KB for the transaction hashes alone. -### Non-normative overview of Leios + -> [!IMPORTANT] +> [!NOTE] +> **Bitmap Size Relationships** +> +> The maximum correction bitmap size parameter $S_\text{bitmap}$ creates a fundamental relationship between recovery period length and transaction throughput: +> - Longer recovery periods ($L_\text{recover}$) require larger bitmaps to track more potential transactions +> - The worst-case scenario assumes one ranking block per slot during the recovery period (i.e. $f_\text{RB} = 1$) +> - Smaller minimum transaction sizes ($T_\text{min}$) allow more transactions per block, requiring more correction bits +> +> **Implicit Constraint on $L_\text{recover}$**: > -> - [ ] Write this section after the details of the recommended variant of Full Leios have been settled. +> The requirement that $S_\text{bitmap} < S_\text{RB}$ creates an upper bound on the recovery period: +> +> $$L_\text{recover} < 8 \times T_\text{min}$$ +> +> For example, with $T_\text{min} = 55$ bytes[^mainnet-min-tx], this gives $L_\text{recover} < 440$ slots. This constraint ensures the bitmap can fit within a ranking block even in the worst-case scenario of continuous block production. +> +> The critical requirement is that all transaction corrections **must** be included before the certificate-active window expires to ensure ledger integrity. In extreme cases, the first block after window expiration may need to dedicate most of its space to corrections, temporarily sacrificing transaction throughput for safety. -### Normative Leios specification in Agda +[^mainnet-min-tx]: Observed 55-byte transaction on mainnet: https://cardanoscan.io/transaction/d2a2098fabb73ace002e2cf7bf7131a56723cd0745b1ef1a4f9e29fd27c0eb68?tab=summary -> [!IMPORTANT] -> -> Work in progress: https://github.com/input-output-hk/ouroboros-leios-formal-spec/tree/main/formal-spec/Leios. +### Node Behavior + +The Leios protocol introduces new node responsibilities and message flows beyond those in Praos, reflecting the additional steps of EB creation and announcement, committee voting, and certificate aggregation. The following sections detail the specific behaviors that nodes must implement. + +
+ +

+ Node Behavior Sequence +

+ +_Figure 6: Up- and downstream interactions of a node (simplified)_ + +
+ +The diagram above illustrates the Leios protocol in a simplified sequential order. In practice, these operations occur concurrently and the actual execution order depends on network conditions, timing, and node state. While many steps introduce new behaviors, several core Praos mechanisms remain unchanged. + +#### Transaction Diffusion + +**Transaction Propagation**: Uses the TxSubmission mini-protocol exactly as implemented in Praos. Transactions flow from downstream to upstream nodes through diffusion, where they are validated against the current ledger state before being added to local mempools. The protocol maintains the same FIFO ordering and duplicate detection mechanisms. + +**Mempool Design**: The mempool follows the same design as current Praos deployment with increased capacity to support both RB and EB production. Mempool capacity should accommodate expanded transaction volume: + +
+ +$\text{Mempool} \geq 2 \times (S_\text{RB} + S_\text{EB-tx})$ + +
+ +#### RB Block Production and Diffusion + +When a stake pool wins block leadership (step 1), they create a Ranking Block (RB) and **optionally** an Endorser Block (EB) based on the [adaptive EB production](#adaptive-eb-production) criteria. The RB is a standard Praos block with extended header fields to reference one EB and announce another EB when created. The optional EB is a larger block containing references to additional transactions. The RB chain continues to be distributed exactly as in Praos, while Leios introduces a separate mechanism to distribute the same headers for rapid EB discovery and equivocation detection. + +**RB Header Diffusion**: RB headers diffuse via a new [RbHeaderRelay mini-protocol](#rbheaderrelay-mini-protocol) independently of standard ChainSync (steps 2a and 2b). This separate mechanism enables rapid EB discovery within the strict timing bound $\Delta_\text{hdr}$. Headers are diffused freshest-first to facilitate timely EB delivery, with nodes propagating at most two headers per (slot, issuer) pair to detect equivocation - where an attacker creates multiple EBs for the same block generation opportunity - while limiting network overhead. The header contains the EB hash when the block producer created an EB, allowing peers to discover the corresponding EB. + +**RB Body Diffusion**: After receiving headers, nodes fetch RB bodies via standard BlockFetch protocol (step 3). This employs ChainSync and BlockFetch protocols without modification for fetching complete ranking blocks after headers are received. The pipelining and batching optimizations for block body transfer remain unchanged from Praos. + +**Validation and Adoption**: Nodes validate the RB and any included EB certificate before adopting the block (step 4). This includes cryptographic verification of certificates and ensuring they correspond to properly announced EBs. The complete validation procedure is detailed in [certificate validation](#certificate-validation). The node serves RBs to downstream peers using standard Praos block distribution mechanisms (step 5), which are permitted to include diffusion pipelining with delayed validation. + +#### EB Diffusion + +Whenever an EB is announced through an RB header, nodes must fetch the EB content promptly (step 6), such that they receive it within $L_\text{vote}$ and consequently enables them to vote. Only the EB body corresponding to the first EB announcement/RB header received for a given RB creation opportunity shall be downloaded. The EB contains references to transactions. + +**EB Propagation for Chain Selection**: To support efficient chain selection, nodes must receive **all EBs from competing forks**, not only those in their current preferred chain. This ensures that when a node switches to a different fork due to the longest-chain rule, it can immediately validate the new chain without additional EB propagation delays. EBs are forwarded before complete validity checks, with only lightweight verification (hash consistency, basic structure validation) performed initially to prevent DoS attacks. + +> [!Warning] > -> - [ ] Do we plan to embed the Agda in this document? -> - [ ] If so, will all of the Agda be embedded, instead of just the core subset? +> **TODO** +> Clarify if this is optimistic enough, or whether nodes should announce EBs before having all transactions available or make use of optimization by offering "chunks" of the transaction reference list. + +**Transaction Retrieval**: Nodes check transaction availability for the EB and fetch any missing transactions from peers (steps 6a and 7a). After receiving the EB body, nodes perform fast validation (step 6b) with only lightweight verification (hash consistency, basic structure validation) to prevent DoS attacks before proceeding with transaction retrieval. Once all transactions are available, nodes can serve EBs to downstream peers (step 7). This guarantees that when a node announces an EB its downstream peers can trust it has all EB transactions available. + +**Transaction Validation**: With all transactions available, nodes validate the endorsed transaction sequence against the appropriate ledger state (step 8), ensuring the transactions form a valid extension of the announcing RB and meet size constraints. + +> [!WARNING] +> - Stop serving an EB if we determined the endorsed sequence of transactions as invalid? (Could be done without radical mini-protocol changes, but needs further analysis) -### Constraints on Leios protocol parameters +#### Voting & Certification +**Voting Process**: Committee members [selected through a lottery process](#votes-and-certificates) vote on EBs as soon as vote requirements are met according to protocol (step 9). An honest node casts only one vote for the EB extending its current longest chain. + +**Vote Propagation**: Votes propagate through the network during the vote diffusion period ($L_\text{diff}$ slots) (steps 10 and 10a). While nodes forward votes on EBs across all candidate chains, they only forward at most one vote per committee member per slot. + > [!WARNING] -> -> This is an incomplete work in progress. -> -> - [ ] Revise after protocol definition is complete. -> - [ ] Add paragraphs explain the rationale in more detail. +> - How long should votes be propagated? (Likely not critical - "30 seconds" would be sufficient) +> - Nodes should receive and relay votes for EBs even before acquiring/validating the EB, but only if they have seen an RB header announcing that EB -| Parameter | Symbol | Units | Description | Constraints | Rationale | -| ------------------------------------------ | ---------------- | -------- | --------------------------------------------------------------------------- | -------------------------- | ------------------------------------------------------------ | -| Stage length | $L$ | slot | | $L \geq \Delta$ | | -| Input-block production rate | $f_\text{IB}$ | 1/slot | | $0 \lt f_\text{IB}$ | | -| Endorser-block production rate | $f_\text{EB}$ | 1/stage | | $0 < f_\text{EB}$ | | -| Expiration of unreferenced input blocks | $r_\text{IB}$ | slot | | | | -| Expiration of unreferenced endorser blocks | $r_\text{EB}$ | slot | | | | -| Number of shards | $k_\text{shard}$ | unitless | | | | -| Mean committee size | $n$ | parties | | | | -| Quorum size | $\tau$ | parties | | $\tau > n / 2$ | | -| . . . | | | | | | -| Network diffusion time | $\Delta$ | slot | Upper limit on the time needed to diffuse a message to all nodes. | $\Delta > 0$ | Messages have a finite delay. | -| Praos active slot coefficient | $f_\text{RB}$ | 1/slot | The probability that a party will be the slot leader for a particular slot. | $0 \lt f \leq \Delta^{-1}$ | Blocks should not be produced faster than the network delay. | +**Certificate Construction**: All nodes receive votes from upstream peers, maintaining a running tally for each EB to track progress toward the quorum threshold (step 11). However, only RB producers need to create certificates. Stakepool nodes know the leadership schedule, so they know when they are eligible to create a certificate for an upcoming RB they will produce. When enough votes are collected during the vote diffusion period, the RB producer aggregates them into a compact certificate. This creates a cryptographic proof that the EB has received sufficient committee approval, and therefore must have already been validated by some honest stake. + +#### Next Block Production -### Specification for votes and certificates +**Certificate Inclusion**: Block producers creating new RBs include certificates for EBs where the full stage duration ($L_\text{vote}$ slots) has elapsed since the EB's creation (step 12). The producer is permitted to also announce a new EB extending their RB. Including a certificate resets the $L_\text{recover}$ rolling window, either extending an existing enhanced throughput period or starting a new one (as detailed in [Rolling Window Rules](#rolling-window-rules)). -The next section outlines the requirements for Leios sortition, voting, and certificates. Although these are stringent, several proposed schemes meet the criteria. Ideally, a common Cardano voting infrastructure would be used across Leios, Peras, Mithril, and partner chains. For concreteness, however, this section also documents a BLS approach that is feasible for Leios. -#### Requirements +#### Ledger Management -Leios is flexible regarding the details of votes, certificates, and sortition. The key requirements in this regard follow. +**Ledger Formation**: The ledger follows the same design as Praos with the addition of certificate handling and EB attachment references. The ledger state is updated according to the same validation rules used in Praos, with phase-1 and phase-2 validation applying equally to both RB and EB transactions. -1. *Succinct registration of keys:* The registration of voting keys should not involve excessive data transfer or coordination between parties. Ideally, such registration would occur as part of the already existing operational certificates and not unduly increase their size. -2. *Key rotation:* The cryptographic keys used to sign Leios votes and certificates *do not* need to be rotated periodically because the constraints on Leios voting rounds and the key rotation already present in Praos secure the protocol against attacks such as replay and key compromise. -3. *Deterministic signatures:* Deterministic signatures can guard against attacks that weakening key security. -4. *Local sortition:* Selection of the voting committee should not be so deterministic and public as to open attack avenues such as denial-of-service or subversion. -5. *Liveness:* Adversaries with significant stake (e.g., more than 35%) should not be able to thwart a honest majority from reaching a quorum of votes for an EB. -6. *Soundness:* Adversaries with near majority stake (e.g., 49%) should not be able to form an adversarial quorum that certifies the EB of their choice. -7. *Small votes:* Because vote traffic is large and frequent in Leios, the votes themselves should be small. Note that the large size of Praos KES signatures precludes their use for signing Leios votes. -8. *Small certificates:* Because Leios certificates are frequent and must fit inside Praos blocks, they should be small enough so there is plenty of room for other transactions in the Praos blocks. Note once again that certificates based on Praos KES signatures are too large for consideration in Leios. -9. *Fast cryptography:* The computational burden of creating and verifying voting eligibility, the votes themselves, and the resulting certificate must be small enough to fit within the CPU budget for Leios stages. +**State Transitions**: EBs add transactions to the ledger only when properly certified and included via RB references. RBs can include both certificates and their own transactions. The ledger state for validating RB transactions is constructed based on either the predecessor RB (when no EB certificate is included) or the certified EB (when a valid certificate is present). Note that EB transactions are validated against the ledger state from the RB that announced the EB (i.e., the predecessor RB of the certifying RB), ensuring the predecessor RB's transactions are relevant in both validation scenarios. -#### BLS certificate scheme +**Chain Selection**: Chain selection follows the densest chain rule as in Ouroboros Genesis. EBs are treated as auxiliary data that do not affect chain validity or selection decisions. Fork choice depends solely on RB chain density, with EB certificates serving only as inclusion proofs for transaction content. The [EB propagation for chain selection](#eb-chain-selection) requirement ensures that nodes already possess all necessary EBs from alternative forks, eliminating additional propagation delays during fork switches. -Consider the following voting and certificate scheme for Leios: +**Mempool Capacity Requirements**: The mempool must accommodate both RB and EB transaction production. The capacity requirements are significantly increased compared to Praos to handle the additional transaction volume expected from EB production. -1. As part of their operational certificate, stake pools register BLS keys for use in voting and prove possession of those keys. -2. Nodes verify the proofs of possession of the keys they receive. -3. For each epoch, the Fait Accompli[^1] scheme wFALS is applied to the stake distribution in order to determine the *persistent voters* for the epoch. - 1. Persistent voters should vote in every election during the epoch. - 2. A different supplement of *non-persistent voters* are selected at random for each election during the epoch using the *local sortition* algorithm. -5. The certificate records the set of voters, proof of their eligibility, and the quorum achieved. +#### Epoch Boundary -[^1]: Peter Gaži, Aggelos Kiayias, and Alexander Russell, "Fait Accompli Committee Selection: Improving the Size-Security Tradeoff of Stake-Based Committees," Cryptology ePrint Archive, Paper 2023/1273 (2023), [https://eprint.iacr.org/2023/1273](https://eprint.iacr.org/2023/1273). +**Persistent Voter Computation**: Nodes must compute the set of persistent voters for each epoch using the [Fait Accompli scheme][fait-accompli-sortition]. This computation uses the stake distribution that becomes available at the epoch boundary and represents a minimal computational overhead based on current [BLS certificates benchmarks](https://github.com/input-output-hk/ouroboros-leios/blob/main/crypto-benchmarks.rs/Specification.md#benchmarks-in-rust). Nodes should complete this computation well before voting begins in the new epoch to ensure seamless participation. -##### Key registration +### Network -The key registration records the public key and the proof of its possession. +As outlined above, Leios splits transactions between RBs and EBs, with EB inclusion dependent on committee voting and certification. Unlike Ouroboros Praos where the RB chain contains all necessary data, Leios nodes require additional message types to: -1. The Pool ID (or similar unique identifier) identifies the pool holding the key and comprises 28 bytes. -2. The public key $\mathit{mvk}$ belongs to $\mathbb{G}_2$ , so it occupies 96 bytes if BLS12-381 with compression is used. -3. The proof of possession for the secret key is the pair $\left(H_{\mathbb{G}_1}(\text{``PoP''} \parallel \mathit{mvk})^\mathit{sk}, g_1^\mathit{sk}\right)$, where $\mathit{sk}$ is the secret key and $H$ hashes to points in $\mathbb{G}_1$. This pair will occupy 96 bytes with compression. -4. The KES signature for the above will add another 448 bytes. +- **Reconstruct ledger state**: EBs containing certified transactions +- **Participate in consensus**: Vote on EBs and construct certificates +- **Detect equivocation**: RB headers from competing forks -Altogether, a key registration occupies $28 + 96 + 2 \times 48 + 448 = 668$ bytes. This registration needs to be recorded on chain so that certificates can be later verified independently. Ideally, the BLS keys would be registered as part of the SPO's *operational certificate*, which is renewed every ninety days. +#### Praos Mini-Protocols -##### Sortition +As described in [Node Behavior](#node-behavior), existing Praos mini-protocols continue to operate with only minor modifications to support Leios. ChainSync exchanges RB headers that now include optional fields for EB announcements (`announced_eb`) and certifications (`certified_eb`). BlockFetch retrieves RB bodies that may contain BLS aggregate certificates (`eb_certificate`) alongside standard transactions. TxSubmission remains unchanged except for expanded mempool capacity to support both RB and EB transaction pools. -Figure 7 of the Fait Accompli paper[^1] provides the algorithm for determining which pools are persistent voters. The inequality for this determination can be computed exactly using rational arithmetic, so there is no danger of round-off errors. The input to the formula is the size of the committee and the distribution of stake among the pools. +#### Leios Mini-Protocols -The non-persistent pools are subject to local sortition (LS) for each vote, based on an updated stake distribution where the persistent voters have been removed and where the distribution is normalized to unit probability. The VRF value for that sortition is the bytes of the SHA-256 hash of the BLS signature on the election identifier $eid$. The probability that a pool with fraction $\sigma$ of the stake is awarded $k$ votes of the committee of $n$ votes is +Leios introduces **five new mini-protocols** to handle the additional message types required for EB distribution, voting, and certificate construction. -$$ -\mathcal{P}(k) := \frac{(n \cdot \sigma)^k \cdot e^{- n \cdot \sigma}}{k!} -$$ +
+ -This VRF value is used to look up the correct number of votes from the cumulative distribution for $\mathcal{P}(k)$. The same Taylor-series expansion technique used in Praos can handle the irrational arithmetic in a deterministic manner. In practice it is unlikely that the non-persistent pools would ever be awarded more than one vote, so it may be feasible to simply award one vote whenever $k \ge 1$. +| **Protocol** | **Purpose** | **Timing Constraint** | +| :----------: | ----------- | --------------------- | +| **RbHeaderRelay** | Diffuse RB headers for equivocation detection | Must achieve $\Delta_\text{hdr}$ diffusion | +| **EbRelay** | Diffuse fresh EBs to enable timely validation | Must reach voters within $L_\text{vote}$ | +| **VoteRelay** | Diffuse valid votes for certificate aggregation | Must diffuse within $L_\text{diff}$ | +| **EbFetch** | Retrieve certified EBs for chain reconstruction | On-demand after certificate inclusion | +| **TxFetch** | Retrieve referenced transactions for EB validation | Before EB validation completes | -Each vote has a weight, measured as stake. A quorum is achieved if the weights of the votes in the certificate exceeds a specified quorum of stake. The weight calculation is also proved in Figure 7 of the aforementioned paper: +_Table 10: Leios Mini-Protocols_ -- The weight of a persistent voter is simply their stake. -- The each vote cast by a non-persistent voter has weight equal to the non-persistent stake divided by the *expected* number of non-persistent seats on the voting committee. +
-##### Votes +These protocols implement freshest-first delivery and cryptographic validation to meet their respective timing constraints while preventing spam and DoS attacks. -Votes cast by persistent versus non-persistent voters contain different information because persistent voters can be identified by a two-byte identifier and the do not have to provide an eligibility proof. This amounts to 90 bytes for persistent votes and 164 bytes for non-persistent votes. +##### RbHeaderRelay Mini-Protocol -- Common to all votes - - *Election ID:* 8 bytes - - *Hash of endorser block:* 32 bytes - - *Vote signature:* 48-byte BLS signature on the election ID and EB hash -- Specific to persistent voters - - *Epoch-specific identifier of the pool:* 2 bytes -- Specific to non-persistent voters - - *Pool ID:* 28 bytes - - *Eligibility signature:* a 48-byte BLS signature on the election ID +This protocol diffuses RB headers across the network within $\Delta_\text{hdr}$ slots to enable equivocation detection, distributing only headers (not full blocks) to meet this timing bound. By avoiding full block validation, it ensures that all nodes receive RB headers before voting begins, maintaining awareness of all competing chains and equivocations across the network. -##### Certification +**Mini-Protocol Overview** -Consider the committee size $n$, which contains $m$ persistent voters. The certificate must contain the following information: +RbHeaderRelay is a **pull-based relay protocol** that enables nodes to request and receive RB headers from peers. It implements the Relay mini-protocol pattern used in Ouroboros networks for transaction submission, extended with equivocation-aware rules to ensure all nodes can detect competing chains. -- Election and EB - - *Election ID:* Presumably a 8-byte identifier for the Leios election is included in the certificate, though perhaps this is not strictly necessary. This could just be the slot number. - - *Message:* the 32-byte hash of the endorser block is also included in the certificate. -- Identity of voters - - Persistent voters are encoded in a bitset of size $m$, occupying $\left\lceil m / 8 \right\rceil$ bytes. - - Non-persistent voters are encoded by their Pool ID (or equivalent), occupying 28 bytes each and hence $28 \cdot (n - m)$ bytes total. - - Alternatively, all possible voters could be assigned bits in a bitset, with size $\left\lceil N_\text{pools} / 8 \right\rceil$. -- Eligibility proof - - Persistent voters are eligible by definition (by virtue of their stake in the epoch), so no proof is needed. - - Non-persistent voters prove eligibility with a 48 byte (compressed) BLS signature on the message, occupying $48 \cdot (n - m)$ bytes total. -- Aggregate signatures - - *Signed message:* This aggregate BLS signature on the message is 48 bytes (compressed). - - *Signed election proofs:* Perhaps not strictly necessary, but another 48 byte (compressed) BLS signature can attest to the proof of the eligibility, see **BLS.BSig** in the Leios paper[^2]. - -Thus the total certificate size is +**Key Properties**: +- **Pull-based design**: Nodes request headers from peers, preventing DoS attacks +- **Freshest-first delivery**: Prioritizes recent headers over historical ones +- **Equivocation handling**: Serves at most two headers per (slot, issuer) pair +- **Cryptographic validation**: Signature and VRF verification before serving +- **Universal availability**: Headers served regardless of fork preference -$$ -\text{certificate bytes} = 136 + \left\lceil \frac{m}{8} \right\rceil + 76 \times (n - m) -$$ +##### EbRelay Mini-Protocol -but not including any minor overhead arising from CBOR serialization. As noted previously, only a quorum of votes actually needs to be recorded, but the full set might need to be recorded in order for any voting rewards to be computed. +> [!Warning] +> **TODO**: Protocol specification -[^2]: Sandro Coretti-Drayton et al., "High-Throughput Blockchain Consensus under Realistic Network Assumptions" (preprint, April 2024), https://iohk.io/en/research/library/papers/high-throughput-blockchain-consensus-under-realistic-network-assumptions/. +##### VoteRelay Mini-Protocol -### CDDL schema for the ledger +> [!Warning] +> **TODO**: Protocol specification -#### IB schema +##### EbFetch Mini-Protocol -> [!IMPORTANT] -> -> - [ ] Translate the Agda type for input blocks into CDDL. +> [!Warning] +> **TODO**: Protocol specification -#### EB schema +##### TxFetch Mini-Protocol -> [!IMPORTANT] -> -> - [ ] Translate the Agda type for endorser blocks into CDDL. +> [!Warning] +> **TODO**: Protocol specification -#### Certificate schema -> [!IMPORTANT] -> -> - [ ] Translate the Agda type for certificates into CDDL. +### Incentives -#### RB schema +The Leios incentive structure builds upon the existing Ouroboros Praos reward mechanism while introducing new considerations for EB production, voting participation, and dual-block production scenarios. The design aims to maintain economic security while optimizing for throughput efficiency. -> [!IMPORTANT] -> -> - [ ] Provide the diff for the CDDL for Praos blocks, so that Leios certificates are included. +**Reward Function Evolution** -## Rationale: how does this CIP achieve its goals? +The current Praos reward function tracks the number of RBs created by each SPO compared to their expected production, using this performance metric (β) to determine rewards proportional to stake. This mechanism detects offline behavior and incentivizes consistent participation without directly measuring transaction inclusion - empty blocks count equally toward the performance factor. -> [!NOTE] -> -> The rationale fleshes out the specification by describing what motivated the design and what led to particular design decisions. It should describe alternate designs considered and related work. The rationale should provide evidence of consensus within the community and discuss significant objections or concerns raised during the discussion. -> -> It must also explain how the proposal affects the backward compatibility of existing solutions when applicable. If the proposal responds to a [CPS][], the 'Rationale' section should explain how it addresses the CPS and answer any questions that the CPS poses for potential solutions. +**Performance-Based Rewards**: Leios extends this approach by refining the performance calculation to account for block validity in enhanced throughput scenarios. When operating within the rolling window (certificate-active periods), RBs containing invalid transactions due to incomplete ledger state knowledge should not negatively impact the producer's performance factor. The proposed enhancement excludes RBs with invalid transactions from performance calculations, ensuring honest parties maintaining connectivity can always produce valid empty blocks even when lacking complete EB synchronization. -### How Leios increases throughput +**Voting Participation Rewards**: A second extension incorporates committee votes in certified EBs into reward calculations. Since votes occur more frequently than RB production, this significantly reduces reward variance for participating SPOs. This mechanism follows similar anti-gaming principles as RB production - while malicious parties might ignore certain votes to favor preferred chains, such behavior risks delaying their own block publication and reducing main chain inclusion probability. -The throughput of a Nakamoto consensus like Ouroboros Praos is intrinsically limited by the strict requirement for rapid global propagation of each block approximately before the next leader produces a block. Leios escapes that limitation by producing input blocks at a higher rate and then voting on aggregations of them (i.e., voting on endorser blocks) by a dynamically selected representative committee of stake pools, ensuring broad participation in the aggregation process. The voting process on these aggregations occurs in a more relaxed and extended manner over a multi-slot stage, allowing for greater network latency tolerance. When a quorum is reached, that quorum is recorded in a Praos block. The majority voting by this committee ensures consensus on the endorser block while inheriting and maintaining Praos's robust resistance to adversarial activity, as the final commitment is anchored in the secure Praos chain. +**Fee Structure Considerations** -As a result of this decoupled approach, Leios can utilize nearly the full bandwidth available to the network of nodes without requiring unrealistically fast propagation of blocks: Leios employs a structured, multi-stage process where input blocks are produced rapidly and then aggregated and voted upon in subsequent stages before being referenced by a Praos block. Think of Praos as a single-lane highway where every car (block) needs to travel the entire length before the next can start. Leios, in contrast, is like having many local roads (input blocks) feeding into a larger, slower-moving but higher-capacity highway (endorser block aggregation and Praos anchoring). +**Single vs. Dual Pricing**: The protocol maintains a unified fee structure for transactions regardless of inclusion method (RB versus EB). While separate pricing could theoretically reduce off-chain bribing incentives (since RB inclusion offers superior service guarantees), the implementation complexity and ecosystem disruption costs outweigh the benefits. The existing single-price model already experiences potential bribing pressures for mempool queue jumping, and Leios does not fundamentally alter this dynamic. -In analogy, imagine Praos as a single courier diligently collecting and delivering individual letters one by one, limiting the delivery speed to their individual capacity. Ouroboros Leios, however, operates like a mail sorting office where numerous local branches rapidly collect and bundle letters (input blocks) before a central team efficiently processes and dispatches these aggregated bundles (endorser blocks), achieving a significantly higher delivery volume. +**Service Quality Differentiation**: The inherent service difference between RB and EB inclusion (immediate vs. certificate-dependent confirmation) creates natural economic incentives without requiring protocol-level price differentiation. Applications requiring immediate confirmation can adjust their fee strategies accordingly within the existing framework. -### Metrics +**Operational Cost Optimization** -> [!NOTE] -> -> This is a preliminary set of metrics that will be finalized when the Leios protocol variants are finalized and the simulation studies are complete. +**Adaptive EB Production**: To address concerns about operational costs during low-traffic periods, the protocol implements adaptive EB announcement based on transaction availability and resource constraints. SPOs should announce EBs when **either** condition is met: + +1. **Capacity utilization**: EB contains sufficient transactions (for example, 10% capacity utilization) to justify voting overhead costs +2. **Resource constraints**: RB is considered "full" due to **either** size or computational limits being reached: + - **Size constraint**: RB approaches $S_\text{RB}$ byte limit + - **Plutus constraint**: Remaining RB Plutus budget cannot accommodate transactions in mempool that would fit in EB Plutus budget + +This ensures transactions requiring higher Plutus execution limits can be included in EBs without waiting for byte-based RB saturation. When traffic levels can be adequately served by RBs alone within both size and computational constraints, no EBs are announced, reducing operational costs to Praos levels. + +This adaptive mechanism ensures the protocol's cost structure scales with actual throughput demand rather than imposing fixed overhead regardless of network utilization. + +**Hardware Upgrade Incentives**: The increased computational and bandwidth requirements for Leios operation are offset by higher potential rewards from increased transaction throughput. As demonstrated in the [operating costs analysis](#operating-costs), SPO profitability improves significantly once sustained throughput exceeds 30-50 TPS, providing clear economic incentives for infrastructure upgrades. + +**Reserve Contribution Adjustments** + +During low-traffic periods when EB production is minimal, the protocol maintains current Reserve contribution patterns without artificial inflation. The adaptive production mechanism ensures that enhanced infrastructure costs are only incurred when corresponding revenue opportunities exist through increased transaction processing. + +## Rationale + +Ouroboros Leios introduces a committee-based voting layer over Nakamoto-style consensus to handle transaction surplus beyond current Praos block limits, enabling substantial throughput increases while preserving existing security properties. + +### How Leios addresses CPS-18 and increases throughput + +The [Leios research paper][leios-paper] describes a highly concurrent protocol with three block types - Input Blocks (IBs), Endorser Blocks (EBs), and Ranking Blocks (RBs)-produced independently across decoupled, pipelined stages. This specification simplifies that design by eliminating IBs and coupling EB production with RB production, reducing complexity while preserving substantial throughput gains. + +This simplification avoids the complexity and ecosystem disruption of implementing massive throughput increases immediately, while still delivering substantial gains to address [CPS-18 Greater Transaction Throughput][cps-18] challenges. Four strategic design priorities guided this approach: + +1. [Economic sustainability](#economic-sustainability) +2. [Reasonable time to market](#time-to-market) +3. [Minimal downstream impact](#downstream-impact) +4. [Competitive positioning](#competitiveness) + +**1. Economic sustainability: Capacity without utilization risk** + +On one hand, this approach avoids over-engineering massive throughput capacity without proven demand. Creating fundamental system changes to support multiple orders of magnitude more throughput adds to the cost of running a more expensive, more capable system that does not pay for itself until utilization increases. + +On the other hand, the minimum economic requirement establishes the lower bound. As the Cardano Reserve diminishes, transaction fees must replace rewards to maintain network security and SPO profitability. Currently, the Reserve contributes more than 85% of epoch rewards, with less than 15% coming from transaction fees. By 2029, to compensate for Reserve depletion, the network requires approximately 36-50 TPS with average-sized transactions - roughly 10 times current mainnet throughput. This conservative lower bound represents the breakeven point for running the protocol sustainably. + +However, TPS is not an appropriate metric for defining these bounds. To properly assess economic breakeven points, we measure throughput in Transaction Bytes per second (TxB/s) rather than Transactions per second (TPS). TPS does not account for transaction size or computational complexity, making systems with smaller transactions appear "faster" while providing less utility. Current Cardano mainnet provides 4,500 TxB/s, while this specification targets 140,000-300,000 TxB/s (equivalent to roughly 100-200 TPS) - a 30-65x increase sufficient for economic sustainability. + +Achieving this capacity increase requires trade-offs, as detailed below. + +**2. Reasonable time to market: Complexity trade-offs** + +The linearization approach eliminates complex distributed systems problems around transaction sharding, conflict resolution, and sophisticated mempool coordination that could delay deployment by years. It also maintains familiar transaction semantics, deterministic ordering, and predictable finality patterns that existing dApps and infrastructure depend on today. + +**3. Minimal downstream impact: Ecosystem preservation** + +Beyond preserving transaction behavior, the design minimizes infrastructure and operational disruption for the existing ecosystem. The proposed protocol still functions as an overlay extending Praos - like the research paper version, allowing SPOs to upgrade progressively without coordinated migrations. + +The most obvious approach to increasing throughput while minimizing disruption would be increasing Praos block sizes. However, this naive alternative would create proportionally longer propagation times that violate Praos timing assumptions and lack sufficient scalability for long-term viability. Additionally, Praos blocks larger than approximately 3 MB would pose security risks by increasing the frequency of short forks that adversaries could exploit to compromise the common prefix property and enable attacks such as double-spending. + +**4. Competitive positioning** + +The coupled block production design can be extended towards higher concurrency models, as demonstrated in simulation results. It maintains compatibility with more aggressive scaling approaches including full Leios variants, EB and IB (input block) decoupling, and sharding extensions, ensuring current throughput gains do not preclude 100x+ improvements when chain growth solutions mature. + +**Conclusion** + +This linearization proposal balances all four priorities. A delivered 30-65x improvement provides substantially more value than the research paper's higher-concurrency variants, which would impose costs on existing dApps, wallets, and infrastructure while taking significantly longer to build. + +The following evidence section shall provide quantitative support for these trade-offs and validate the protocol's performance under realistic network conditions. + +### Evidence + +This section provides protocol simulation results, feasible protocol parameters with justifications, node-level simulation results, and operating cost analysis that support the design decisions outlined in the rationale. + +**Performance metrics** + +The performance of a protocol like Leios can be characterized in terms of its +efficient use of resources, its total use of resources, the probabilities of +negative outcomes due to the protocol's design, and the resilience to adverse +conditions. Metrics measuring such performance depend upon the selection of +protocol parameters, the network topology, and the submission of transactions. +The table below summarizes key metrics for evaluating Leios as a protocol and +individual scenarios (parameters, network, and load). Estimates for many of these +appear in the following section on Simulation Results. Additionally, future +implementations of Leios can be assessed in these terms. -The performance of a protocol like Leios can be characterized in terms of its efficient use of resources, its total use of resources, the probabilities of negative outcomes due to the protocol's design, and the resilience to adverse conditions. Metrics measuring such performance depend upon the selection of protocol parameters, the network topology, and the submission of transactions. The table below summarizes key metrics for evaluating Leios as a protocol and individual scenarios (parameters, network, and load). +
+ | Category | Metric | Measurement | | ---------- | --------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | -| Efficiency | Spatial efficiency, $`\epsilon_\text{spatial}`$ | Ratio of total transactions size to persistent storage | -| | Temporal efficiency, $`\epsilon_\text{temporal}(s)`$ | Time to include transaction on ledger | -| | Network efficiency, $`\epsilon_\text{network}`$ | Ratio of total transaction size to node-averaged network usage | -| Protocol | TX collision, $`p_\text{collision}`$ | Probability of a transaction being included in two IBs | -| | TX inclusion, $`\tau_\text{inclusion}`$ | Mean number of slots for a transaction being included in any IB | -| | Voting failure, $`p_\text{noquorum}`$ | Probability of sortition failure to elect sufficient voters for a quorum | -| Resource | Network egress, $`q_\text{egress}`$ | Rate of bytes transmitted by a node | -| | Disk usage, $`q_\text{disk}`$ | Rate of persistent bytes stored by a node | -| | I/O operations, $`\bar{q}_\text{iops}(b)`$ | Mean number of I/O operations per second, where each operation writes a filesystem block of $`b`$ bytes | -| | Mean CPU usage, $`\bar{q}_\text{vcpu}`$ | Mean virtual CPU cores used by a node | -| | Peak CPU usage, $`\hat{q}_\text{vcpu}`$ | Maximum virtual CPU cores used by a node over a one-slot window | -| Resilience | Bandwidth, $`\eta_\text{bandwidth}(b)`$ | Fractional loss in throughput at finite bandwidth $`b`$ | -| | Adversarial stake, $`\eta_\text{adversary}(s)`$ | Fractional loss in throughput due to adversial stake of $`s`$ | -| Fees | Collateral paid for success, $`\kappa_\text{success}(c)`$ | Average collateral paid for a successful transaction when it conflicts with a fraction $`c`$ of the memory pool | -| | Collateral paid for failure, $`\kappa_\text{failure}(c)`$ | Average collateral paid for a failed transaction when it conflicts with a fraction $`c`$ of the memory pool | - -***Spatial efficiency:*** Leios necessarily imposes some disk overhead beyond the raw bytes needed to store transactions themselves. This overhead includes the IBs, EBs, and RBs associated with storing transactions. The concurrency inherent in Leios also opens the possibility that duplicate or conflicting transactions are stored in IBs, with the consequence that some space is the IBs is wasted. The spatial efficiency metric is defined as the ratio of the total bytes of transactions included in the ledger to the total persistent storage required by the protocol. - -$$` -\epsilon_\text{spatial} = \frac{\text{total bytes of transactions included in the ledger}}{\text{total bytes of IBs, EBs, and RBs}} -`$$ - -***Temporal efficiency:*** As is true for Praos, there is a delay between submitting a transaction and its being included in the ledger and there is a finite chance that it never is included in the ledger. Before a transaction is eligible to be included in a new IB, it must be validated and placed in the memory pool. It is cleanest to measure the time from the transaction reaching the local memory pool of the node where it was submitted to the time when it is included in the ledger, via a Praos block. The same metric applies both to Praos and to Leios. In aggregate, we measure the temporal efficiency as the fraction of transactions that reach the ledger, as function of the number of slots elapsed. The quantity $`\epsilon_\text{temporal}(\infty)`$ is the fraction of submitted transactions that ever reach the ledger. - -$$` +| Efficiency | Spatial efficiency, $\epsilon_\text{spatial}$ | Ratio of total transactions size to persistent storage | +| | Temporal efficiency, $\epsilon_\text{temporal}(s)$ | Time to include transaction on ledger | +| | Network efficiency, $\epsilon_\text{network}$ | Ratio of total transaction size to node-averaged network usage | +| Protocol | TX inclusion, $\tau_\text{inclusion}$ | Mean number of slots for a transaction being included in any EB | +| | Voting failure, $p_\text{noquorum}$ | Probability of sortition failure to elect sufficient voters for a quorum | +| Resource | Network egress, $q_\text{egress}$ | Rate of bytes transmitted by a node | +| | Disk usage, $q_\text{disk}$ | Rate of persistent bytes stored by a node | +| | I/O operations, $\bar{q}_\text{iops}(b)$ | Mean number of I/O operations per second, where each operation writes a filesystem block of $b$ bytes | +| | Mean CPU usage, $\bar{q}_\text{vcpu}$ | Mean virtual CPU cores used by a node | +| | Peak CPU usage, $\hat{q}_\text{vcpu}$ | Maximum virtual CPU cores used by a node over a one-slot window | +| Resilience | Adversarial stake, $\eta_\text{adversary}(s)$ | Fractional loss in throughput due to adversial stake of $s$ | + +_Table 4: Performance Metrics_ + +
+ +**_Spatial efficiency:_** Leios necessarily imposes some disk overhead beyond +the raw bytes needed to store transactions themselves. This overhead includes +the EBs and RBs associated with storing transactions. The spatial efficiency +metric is defined as the ratio of the total bytes of transactions included in +the ledger to the total persistent storage required by the protocol. + +$$ +\epsilon_\text{spatial} = \frac{\text{total bytes of transactions included in the ledger}}{\text{total bytes of EBs and RBs}} +$$ + +**_Temporal efficiency:_** As is true for Praos, there is a delay between +submitting a transaction and its being included in the ledger and there is a +finite chance that it never is included in the ledger. Before a transaction is +eligible to be included in a new IB, it must be validated and placed in the +memory pool. It is cleanest to measure the time from the transaction reaching +the local memory pool of the node where it was submitted to the time when it is +included in the ledger, via a Praos block. The same metric applies both to Praos +and to Leios. In aggregate, we measure the temporal efficiency as the fraction +of transactions that reach the ledger, as function of the number of slots +elapsed. The quantity $\epsilon_\text{temporal}(\infty)$ is the fraction of +submitted transactions that ever reach the ledger. + +$$ \epsilon_\text{temporal}(s) = \text{fraction of transactions included in the ledger within } s \text{ slots of their inclusion in a local memory pool} -`$$ +$$ -***Network efficiency:*** Effective utilization of the network can be characterized by the ratio of bytes of transactions reaching the ledger to the average network traffic per node. (This could also be computed individually for each node and used as a local metric.) +**_Network efficiency:_** Effective utilization of the network can be +characterized by the ratio of bytes of transactions reaching the ledger to the +average network traffic per node. (This could also be computed individually for +each node and used as a local metric.) -$$` +$$ \epsilon_\text{network} = \frac{(\text{bytes of valid transactions reaching the ledger}) \cdot (\text{number of nodes in the network})}{\text{total bytes of network traffic}} -`$$ +$$ -***TX duplicate:*** Because Leios uses local sortition for electing which nodes produce IBs, there is a finite chance that a transaction will be included in more than one IB during the concurrency period when nodes are not aware of which transactions other nodes are including in their new IBs. The transaction collision probability is simply the fraction of transactions that appear multiple times in IBs. +**_TX inclusion:_** In Leios, it is possible that a transaction might have to +wait for multiple EB production opportunities before being included in an EB. +The characteristic time for such inclusion in an EB depends on the EB production +rate and mempool management. This is correlated with how long the transaction +waits in the memory pool before being selected for inclusion. + +$$ +\tau_\text{inclusion} = \text{mean number of slots for a transaction to be included in any EB} +$$ -$$` -p_\text{duplicate} = \text{fraction of transactions that appear multiple times in IBs} -`$$ +**_Voting failure:_** An unlucky set of VRF evaluations might result in +insufficient voters being selected in a given pipeline, thus making it +impossible to certify an EB in that pipeline. -***TX inclusion:*** Similarly to the case of a transaction being included multiple times in IBs, it is possible that a transaction might have to wait for many pipelines to progress before being included in an IB. The characteristic time for such inclusion in an IB is inversely proportional to the probability of it being included in a pipeline. This is strongly correlated with how long the transaction waits in the memory pool: some of the proposed Leios variants draw txs randomly from the memory pool or wait for the correct shard. +$$ +p_\text{noquorum} = \text{probability of sufficient voters to achieve a quorum in a given pipeline} +$$ -$$` -\tau_\text{inclusion} = \text{mean number of slots for a transaction to be included in any IB} -`$$ +**_Network egress:_** Cloud service providers typically charge for network +egress rather than for network ingress. The quantity $q_\text{egress}$ is +the number of bytes sent from a node per unit time. -***Voting failure:*** An unlucky set of VRF evaluations might result in insufficient voters being selected in a given pipeline, thus making it impossible to certify an EB in that pipeline. +**_Disk usage:_** Leios requires that EBs and RBs be stored permanently; votes +need not be stored permanently, however. The quantity $q_\text{disk}$ is the +total number of EB and RB bytes generated per unit time. -$$` -p_\text{noquorum} = \text{probability of sufficient voters to achieve a quorum in a given pipeline} -`$$ +**_I/O operations:_** Some cloud service providers limit or bill input/output +operations on a per-second capacity basis. The number of I/O operations depends +upon the filesystem's block size $b$, not on the logical number of writes to +disk by the protocol: e.g., writing an EB of 32,768 bytes might consist of 64 +I/O operations on a filesystem having a 512-byte block size. We assume that disk +caching and delayed writes smooth out the unevenness in I/O operations, so that +the mean $\bar{q}_\text{iops}$ is the best metric here. -***Network egress:*** Cloud service providers typically charge for network egress rather than for network ingress. The quantity $`q_\text{egress}`$ is simply the number of bytes sent from a node per unit time. +**_Mean CPU usage:_** Computation resources consumed by the number are +quantified as $\bar{q}_\text{vcpu}$, which is the mean number of virtual CPU +cores utilized by the protocol. -***Disk usage:*** Leios requires that IBs, EBs, and RBs be stored permanently; votes need not be stored permanently, however. The quantity $`q_\text{disk}`$ is the total number of IB, EB, and RB bytes generated per unit time. +**_Peak CPU usage:_** Because CPU usage varies depending upon the node's +activity, the maximum number of virtual CPU cores utilized by the protocol +during any slot, $\hat{q}_\text{vcpu}$, provides a useful indication of +computational burstiness and of how a virtual machine should be sized for Leios. -***I/O operations:*** Some cloud service providers limit or bill input/output operations on a per-second capacity basis. The number of I/O operations depends upon the filesystem's block size $`b`$, not on the logical number of writes to disk by the protocol: e.g., writing an IB of 32,768 bytes might consist of 64 I/O operations on a filesystem having a 512-byte block size. We assume that disk caching and delayed writes smooth out the unevenness in I/O operations, so that the mean $`\bar{q}_\text{iops}`$ is the best metric here. +**_Adversarial stake:_** Similarly, when adversarial stake is appreciable and +active, the throughput of Leios might be drop. -***Mean CPU usage:*** Computation resources consumed by the number are quantified as $`\bar{q}_\text{vcpu}`$, which is the mean number of virtual CPU cores utilized by the protocol. +$$ +\eta_\text{adversary}(s) = \frac{\text{bytes of transactions reaching the ledger without adversarial activity}}{\text{bytes of transactions reaching the ledger with adversarial activity given fraction } s \text{ of the total stake}} +$$ -***Peak CPU usage:*** Because CPU usage varies depending upon the node's activity, the maximum number of virtual CPU cores utilized by the protocol during any slot, $`\hat{q}_\text{vcpu}`$, provides a useful indication of computational burstiness and of how a virtual machine should be sized for Leios. +**Simulation results** -***Bandwidth:*** If the bandwidth for inter-node communication drops below a given value, then the throughput of Leios (at a given level of demand) will be drop, as network congesting occurs. +The [Leios paper][leios-paper] provides a rigorous theoretical analysis of the safety and +throughput of the protocol. That has been reinforced and demonstrated by +prototype simulations written in Haskell and Rust. -$$` -\eta_\text{bandwidth}(b) = \frac{\text{bytes of transactions reaching the ledger if links have bandwidth } b}{\text{bytes of transactions reaching the ledger if bandwidth were infinite}} -`$$ +> [!IMPORTANT] +> +> TODO: **@bwbush** +> - [ ] Regenerate the plots below each time the version of `sim-cli` is bumped. +> - [ ] Discuss only displaying three or four cases, instead of the five. +> - [ ] In next set of re-runs . . . +> - [ ] In the CPU plot, expand the abbrevations into phrases. +> - [ ] In the EB-size plot, remove empty EBs (created at the start or end of the simulation). +> - [ ] Review and possibly elaborate the figure and table captions. +> - [ ] In the final version . . . +> - [ ] Remove title and subtitle. -***Adversarial stake:*** Similarly, when adversarial stake is appreciable and active, the throughput of Leios might be drop. +The simulation results use a mainnet-like topology[^mnrm] that accurately +reflects the characteristics of the Cardano mainnet. This includes a realistic +distribution of stake and a representative number of stake pools. The network +is designed with a total of 10,000 nodes (`pseudo-mainnet`)[^pseudo] or 750 +nodes (`mini-mainnet`)[^mini], where each block producer is connected +exclusively to two dedicated relays. Furthermore, the topology incorporates +realistic latencies based on the RIPE Atlas[^ripe] ping dataset +and bandwidth that aligns with the lower end of what is typically found in +cloud data centers. The node connectivity and geographic distribution (across +various countries and autonomous systems) are also consistent with +measurements provided by the Cardano +Foundation.[^cf] A simulation study [^mncp] has +demonstrated that analysis conclusions deriving from the `mini-mainnet` +topology are also valid for the `pseudo-mainnet` topology; the advantage of +using the former is that simulations run much more quickly. Simulated RB +diffusion is consistent with the Praos performance model.[^praosp] -$$` -\eta_\text{adversary}(s) = \frac{\text{bytes of transactions reaching the ledger without adversarial activity}}{\text{bytes of transactions reaching the ledger with adversarial activity given fraction } s \text{ of the total stake}} -`$$ +[^mnrm]: [Mainnet-like topologies for Leios](https://github.com/input-output-hk/ouroboros-leios/blob/6d8619c53cc619a25b52eac184e7f1ff3c31b597/data/simulation/pseudo-mainnet/ReadMe.md) -***Fees:*** Two fee metrics relate to consumption of collateral. Some Leios variants may consume collateral for successful transactions when conflicts are present in IBs and EBs; others may consume collateral for failed transactions. +[^pseudo]: [Leios pseudo-mainnet topology](https://github.com/input-output-hk/ouroboros-leios/blob/6d8619c53cc619a25b52eac184e7f1ff3c31b597/data/simulation/pseudo-mainnet/topology-v1.md) -$$` -\kappa_\text{success}(c) = \text{average collateral paid for a successful transaction when it conflicts with a fraction } c \text{ of the memory pool} -`$$ +[^mini]: [Leios mini-mainnet topology](https://github.com/input-output-hk/ouroboros-leios/blob/6d8619c53cc619a25b52eac184e7f1ff3c31b597/data/simulation/pseudo-mainnet/topology-v2.md) -$$` -\kappa_\text{failure}(c) = \text{average collateral paid for a failed transaction when it conflicts with a fraction } c \text{ of the memory pool} -`$$ +[^ripe]: [RIPE Atlas](https://atlas.ripe.net/) -### Evidence that Leios provides high throughput +[^cf]: [Cardano Foundation](https://cardanofoundation.org/) -The Leios paper[^2] provides a rigorous theoretical analysis of the safety and throughput of the protocol. That has been reinforced and demonstrated by prototype simulations written in Haskell and Rust. +[^mncp]: https://github.com/input-output-hk/ouroboros-leios/blob/6d8619c53cc619a25b52eac184e7f1ff3c31b597/analysis/sims/2025w30b/analysis.ipynb -> [!CAUTION] -> -> The plots below are placeholders. All of the simulations in this section need to be re-run: -> -> - [ ] Final version of the Leios protocol -> - [ ] Realistic mainnet topology -> - [ ] Protocol parameters close to the recommended value -> - [ ] CPU -> - [ ] Unlimited? -> - [ ] Six cores? -> - [ ] Decide which plots best illustrate throughput -> - [ ] Strip the major titles from the diagrams -> - [ ] Use SVG format +[^praosp]: https://github.com/IntersectMBO/cardano-formal-specifications/blob/6d4e5cfc224a24972162e39a6017c273cea45321/src/performance/README.md -The simulations demonstrate that bandwidth is partitioned between IBs, EBs, votes, and RBs so that congestion in one message type does not spill over into congestion for other message types. Because IBs are the largest messages, these are the ones first subject to congestion. The plot below shows the appearance of congestion effects in the Haskell simulation at 8 IB/s for 98 kB IBs. (Note that the Haskell simulation represents TCP more faithfully than the Rust one.) Even at this high throughput, IBs arrive at all nodes in the network with 100% success and mostly within five seconds. This implies that the stage length could be as short a five seconds per stage. +The simulation results in the remainder of this section use the Rust simulator with a set of protocol parameters suitable for running Linear Leios at 200 kB/s of transactions, which corresponds to approximately 150 tx/s of transactions of sizes typical on the Cardano mainnet. The maximum size of transactions referenced by an EB is 12 MB and the stage length is $L_\text{diff} = L_\text{vote} = 7 \text{ slots}$. In order to illustrate the minimal infrastructure resources used by Leios at these throughputs, we have limited nodes to 4 virtual CPUs each and limited inter-node bandwidth to 10 Mb/s. We vary the throughput to illustrate the protocol's behavior in light vs congested transaction loads, and inject transaction from the 60th through 960th slots of the simulation; the simulation continues until the 1500th slot, so that the effects of clearing the memory pool are apparent. The table below summarizes the results of the simulation experiment. We see that a transaction at the front of the memory pool can become referenced by an EB in as few as 20 seconds when the system is lightly or moderately loaded and that it can reach certification on the ledger in about one minute. These times can double under congested conditions. In all cases there is little overhead, relative to the total bytes of transactions, in data that must be stored permanently as the ledger history. -![Simulated time in flight for IBs](images/elapsed-IB.png) +
+ -In terms of the transaction lifecycle, transaction typically reach IBs rapidly for high-throughput settings of Leios parameters, but it takes tens of seconds for the to become referenced by an EB. Referencing by an RB takes longer, often close to 100 seconds. +| Throughput [TxMB/s] | TPS at 1500 B/tx | Conditions | Mempool to EB [s] | Mempool to ledger [s] | Space efficiency [%] | +|--------------------:|-----------------:|-----------------|------------------:|----------------------:|---------------------:| +| 0.100 | 66.7 | light load | 19.3 | 60.8 | 92.22 | +| 0.150 | 100.0 | moderate load | 20.8 | 63.8 | 94.08 | +| 0.200 | 142.9 | heavy load | 28.9 | 71.7 | 94.79 | +| 0.250 | 166.7 | some congestion | 42.1 | 84.3 | 94.92 | +| 0.300 | 200.0 | much congestion | 83.5 | 125.8 | 95.09 | -![Simulation of transaction lifecycle](images/lifecycle-histogram.png) +_Table 5. Leios effficiency at different throughputs._ -### Why Leios is practical to implement +
-A Leios implementation would build upon the well-proven design of the existing Cardano node by adding several new mini-protocols for the diffusion of IBs, EBs, and votes. The additional cryptography used by Leios is also quite similar to that already in production in various parts of the Cardano and blockchain ecosystems. Leios adds complexity to the process of updating the ledger because conflicting or duplicate transactions in IBs need reconciliation when the UTXO set is recomputed. The sharding of transactions in Leios will complicate the management of the memory pool and the structure of UTXOs themselves. Adjustments to the rewards model will also be required. +The first plot below demonstrates that most transactions reach the ledger in under two minutes in these simulations when the system is not congested. This transaction lifecycle time lengthens as congestion increases. The plot colors transactions by the minute when they were submitted so that one can see that the distribution of delays is independent of the submission time in the uncongested cases, but that there are "lucky" or "unlucky" periods in the congested cases. The variability arises from the randomness of the RB production scheduled. First, a transaction may has to wait for an RB to be forged; second, a transaction referenced by an EB has to wait for the following RB to be forged. The EB is discarded, however, if the second RB is produced in fewer that $L_\text{diff} + L_\text{vote}$ after the first RB. Thus, both the time to the next RB and the RB following that introduce unpredictability in a transaction reaching the ledger under even lightly loaded conditions. When the sortition happens to produce RBs too close together, transactions will accumulate in the memory pool, awaiting favorable sortition conditions. If too many accumulate, there is not room for all of them to be included in the next EB. The second plot below illustrates that all transactions eventually do arrive on the ledger, but that they may have to wait long during congestion. During light load a transaction takes one or two minutes to reach the ledger, but in heavier load it might take three minutes or even longer. The capacity parameter $S_\text{EB-tx}$ (12 MB/EB in these simulations) fundamentally limits the amortized maximum throughput of Linear Leios: furthermore, it affects how long it takes transactions to reach the ledger as the throughput approaches the capacity. -The performance of the cryptographic operations required for Leios is demonstrated by a prototype implementation[^3] and the benchmarks in the Appendix [Cryptographic benchmarks](#cryptographic-benchmarks). The small size (less than 9 kB) of Leios certificates is documented in the Appendix [Certificate size for realistic stake distributions](#certificate-size-for-realistic-stake-distributions). The [Resource requirements](#resource-requirements), discussed below, modestly increase the requirements for running a Cardano node but not beyond commonly available commodity hardware. +> [!IMPORTANT] +> +> TODO: **@bwbush** +> +> Would it be appropriate to include these equations and/or figures at this point? +> +> - [ ] Throughput as a function of the capacity parameter and the active slot coefficient. +> - [ ] Time-to-ledger as a function of the capacity parameter and the active slot coefficient. -### Use cases +
+ -Leios immediately enables use cases for high transaction volume and for more computationally intensive Plutus scripts, but future minor modifications of the protocol can open additional novel and custom transaction workflows. +![Time for transaction to reach the ledger](images/reach-rb-tx.svg) -#### High transaction volume +_Figure 7. Time for transaction to reach the ledger._ -Prototype simulations of the Leios protocol indicate that it can achieve at least 20 times the maximum throughput of the current Cardano mainnet. This amounts to approximately 2 MB/s or 1500 tx/s, assuming the current mean transaction size of 1400 bytes. The availability of Leios, however, would likely affect the characteristics of the mix of transactions, so the the maximum transaction rate could be higher or lower than this estimate. Whatever the specifics, Leios will enable transaction volumes that are orders of magnitude greater than Praos. +
-Aside from the general benefit of high capacity, several specific use cases could benefit. +
+ -- *Enterprise or national-state adoption:* Enterprises and nation states require sustained and guaranteed scalability for their blockchain transactions, and large entities may become heavy users of Cardano. -- *Finance:* High volume and high frequency trading may become more practical given the higher throughput supported by Leios. -- *Airdrops:* The high throughput of Leios could streamline the user experience of claiming tokens for large (or extremely large) airdrops. -- *Partner chains, bridges, and oracles:* Multiple simultaneous operation of partner chains, bridges, and oracles on Cardano will require high transaction rates and minimal delays from the time a transaction reaches the memory pool to when it is recorded in the ledger. -- *Games:* High throughput and lower transaction cost may enable cost-effective coupling of games (e.g., markets for in-game items). -- *Improved user experience:* From the onset of the Alonzo era, the usability of particular dapps has occasionally been constrained by the transaction throughput available on Praos. This is especially important and severe when a popular new dapps launches and experiences high activity. Congestion that sometimes occurs during spikes in transaction activity would be alleviated. -- *More complex governance actions:* Expansion of Cardano and DAO governance would required high volumes of transactions if large portions of the community participate. This is particularly important if the number of dreps increases and Cardano moves towards a "direct democracy" style of voting. +![Transactions reaching the ledger](images/temporal-efficiency-bar.svg) -#### Improved cost structure +_Figure 8. Transactions reaching the ledger._ -Techno-economic analyses indicate that at a sustained transaction volume of 50 tx/s or greater the profitability profile of Cardano will improve in several ways. If the current transaction fee structure remains the same as now, Leios would have three economic effects at 50+ tx/s: +
-1. The intake of transaction fees would be large enough to lessen or eliminate the need for supplementing rewards from the Reserve pot. In particular, the `monetaryExpansion` protocol parameters to be lowered and/or the `treasuryCut` parameter could be increased. -2. Stake rewards would increase. -3. Stake pools would become more profitable. In particular, at 50+ tx/s the costlier Leios hardware would be overcome by higher rewards. -4. Transaction fees could be somewhat lowered. That could further drive adoption and make smaller transactions more cost effective, perhaps even opening the possibilities for micropayments or IoT applications. +The effect of EBs being discarded when RBs are too close together is evidenced in the following plot. A transaction referenced only once by an EB is one that reaches the ledger on the first attempt. If a transaction is referenced more than one EB, it means that several attempts were made to before a relevant EB's certificate was included in an RB. The subsequent plot shows Leios's irregular rhythm of forging, sometimes discarding, and certifying EB. (Note that RBs are so small relative to most EBs that they are difficult to see in the histogram.) The diagram also provides a sense of the intermittency of successful certification and the presence of periods of unfavorable sortition where RBs are not produced or are produced too close together. The same phenomenon occurs in Praos, but Linear Leios amplifies the intermittency. -The following plot shows a forecast for SPO profitability under Leios, assuming a "business as usual" scenario where the fee, treasury, and monetary expansion protocol parameter stay the same as presently. The precise profitability of individual SPOs depends strongly upon how they host their nodes, but there is a clear trend towards profitability (without any contributions from the Cardano Reserve) once 30-50 transactions per second are sustained. Note that profitability slows at very high throughput because of the substantial expense of network egress and storage of the ledger. +
+ -![SPO profitability under Leios.](images/leios-forecast-sqrt-fill.svg) +![Number of TX references](images/references-tx.svg) -#### Intensive Plutus execution +_Figure 9. Number of TX references._ -Because there typically is a time window of several seconds from the time a Leios input block can be created to when it needs to start diffusing to other nodes, there is also an opportunity to do more computation validating an Leios input block than for a Praos ranking block. This opens the possibility of increasing the Plutus execution budget for input blocks so that it is significantly larger than the budget for Praos blocks. At the very least a script could be allowed to use the whole Plutus execution budget for an input block, instead of just one quarter of it as is the case for Praos. +
-Numerous emerging use cases on Cardano would benefit from larger Plutus execution budgets. Complex dapps currently have to split a single logical operation into a sequence of several transactions, increasing the development effort, the complexity, and the attack surface of the scripts involved. +
+ -- *ZK proofs:* It may be possible to increase the Plutus execution budget enough that a complete ZK proof could verified in a single transaction. -- *Large number of parties:* Scripts managing potential interactions with a large number of parties (e.g., airdrops, lotteries, and local accounts) are intrinsically limited by Plutus execution limits. -- *On-chain interpreters:* Dapps like Marlowe run interpreters for their DSL in a Plutus script. Execution limits currently restrict the complexity of the DSL expressions that can be evaluated in a single transaction. +![Disposition of transactions in blocks](images/disposition-size-timeseries.svg) -#### Novel use cases +_Figure 10. Disposition of transactions in blocks._ -Although the version of Leios proposed in this document does not support the particular use cases listed below, a minor variant or future version of Leios could. +
-- *Priority pipelines:* Different Leios pipelines might have different stage lengths, throughput, fees, and/or Plutus execution limits, enabling applications to select their level of service. -- *Externally batched input blocks:* Third parties could construction input blocks and provide them directly to the block producers, allowing a dapp or an exchange detailed control over sequencing of interdependent transactions within a block or even between blocks. -- *Nuanced roles for SPOs:* Leios opens the possibility of separating the protocol functions into separate processes that could be run independently but in coordination. For example, some SPOs (or parts of an SPO) might only create input blocks while others might only produce ranking blocks. In addition to enabling flexible configuration of Cardano worker services, this could encourage new operational models for SPO consortia. +When demand is not high relative to capacity, the total size of transactions referenced by an EB varies randomly and rarely reaches the maximum size of 12 MB/EB: see the following figure. One can see that at higher demands, fully utilized blocks predominate. The presence of those full blocks means that other transactions are waiting in the memory pool for referencing by a subsequent EB. Thus the capacity parameter provides a natural form of backpressure that limits the potential EB-related work a node must do when demand is high. -### Feasible values for Leios protocol parameters +
+ -The table below documents a set of Leios protocol parameters that provided high throughput and reasonably fast settlement in the prototype Haskell and Rust simulations of Leios. The exact choice of parameters that would be adopted on the Cardano mainnet must be subject to discussion and consideration of tradeoffs. +![Size of transactions referenced by EBs](images/contents-ebs-size.svg) -> [!WARNING] -> -> This is an incomplete work in progress. -> -> - [ ] Revise after the protocol definition is complete. -> - [ ] Each row should have a paragraph of justification. - -| Parameter | Symbol | Units | Description | Feasible value | Justification | -| ------------------------------------------ | ---------------- | -------- | --------------------------------------------------------------------------- | -------------: | ------------------------------------------------------------------------------------------------------------------------- | -| Stage length | $L$ | slot | | 10 | Short stages increase settlement speed, but the stage length must be generously larger than the propagation time for IBs. | -| Input-block production rate | $f_\text{IB}$ | 1/slot | | | | -| Endorser-block production rate | $f_\text{EB}$ | 1/stage | | | | -| Expiration of unreferenced input blocks | $r_\text{IB}$ | slot | | | | -| Expiration of unreferenced endorser blocks | $r_\text{EB}$ | slot | | | | -| Number of shards | $k_\text{shard}$ | unitless | | | | -| Mean committee size | $n$ | parties | | 500 | Probabilistic analyses of adversarial stake scenarios. | -| Quorum size | $\tau$ | fraction | | 60% | Probabilistic analyses of adversarial stake scenarios. | -| . . . | | | | | | -| Praos active slot coefficient | $f_\text{RB}$ | 1/slot | The probability that a party will be the slot leader for a particular slot. | 0.05 | This is the current value on mainnet, but it may become feasible to reduce it if Praos blocks are made smaller. | - -The analysis [Committee size and quorum requirement](https://github.com/input-output-hk/ouroboros-leios/blob/main/docs/technical-report-1.md#committee-size-and-quorum-requirement) in the first Leios Technical Report indicates that the Leios committee size should be no smaller than 500 votes and the quorum should be at least 60% of those votes. However, the proposed Fait Accompli[^1] scheme wFALS achieves compact certificates that do not become larger as the number of voters increases, so larger committee sizes might be permitted for broader SPO participation and higher security. The committee size should be large enough that fluctuations in committee membership do not create an appreciable probability of an adversarial quorum when the adversarial stake is just under 50%. The quorum size should be kept large enough above 50% so that those same fluctuations do not prevent an honest quorum. Larger committees require more network traffic, of course. - -### Attack and mitigation +_Figure 11. Size of transactions referenced by EBs._ -The Leios protocol may have to mitigate the following categories of threats. +
-- Grinding the VRF to obtain an advantage in Leios sortition -- Equivocating IBs, EBs, or RBs -- Declining to create IBs, EBs, or votes -- Manipulating the content of IBs or EBs -- Sending invalid txs, IBs, EBs, or certificates -- Abusing the sync protocol -- Delaying diffusion of IBs, EBs, or votes -- Submitting invalid, conflicting, or duplicate transactions +Because of the aforementioned backpressure, diffusion occurs in Leios in an orderly manner even when demand is high. The following set of plots show histograms of diffusion time (i.e., the time from a transaction's, RB's, EB's, or vote's creation to its reaching the nodes in the network). Transactions and votes typically diffuse rapidly throughout the whole network in fractions of a second, due to their small sizes, often small enough to fit in a single TCP transmission unit. RBs diffuse in less one second, with the empty RBs at the start and end of the simulation diffusing fastest. Similarly, EBs diffuse fast when empty or when demand is low, but once full EBs are diffusing, it can take up to two seconds for them to diffuse. All of the distribution have long tails where messages arrive much later for nodes with unfavorably topological locations. The Leios protocol possesses the important property that traffic in transactions, RBs, votes, and EBs do not interfere with one another: for example, delays in EBs and high throughput do not also delay RBs in those cases. -Nearly all of these *hypothetical* threats are already mitigated by the protocol design, the incentive structure, or the cost of the resources needed to execute the threat. The [Threat model](https://github.com/input-output-hk/ouroboros-leios/blob/main/docs/technical-report-1.md#threat-model) section of the first Leios Technical report contains a detailed taxonomy that we summarize here. The general impact of such attacks varies: +
+ -- Resource burden on nodes -- Lowered throughput -- Increased latency -- Manipulation of dapps or oracles +| | | +| ----------------------------------------------- | ----------------------------------------------- | +| ![Arrival delay for TXs](images/elapsed-TX.svg) | ![Arrival delay for RBs](images/elapsed-RB.svg) | +| ![Arrival delay for VTs](images/elapsed-VT.svg) | ![Arrival delay for EBs](images/elapsed-EB.svg) | -*Grinding and other threats to Praos:* Threats to the ranking blocks used by Leios are already mitigated by Ouroboros Praos and Genesis. Nevertheless, the possibility of _grinding attacks_, as discussed in [CPS-0017](https://github.com/cardano-scaling/CIPs/blob/settlement-cps/CPS-0017/README.md), will always exist, albeit at low probability of success. Such an attack, which requires some stake, involves using CPU resources to try to manipulate the epoch nonce to a value which will result in higher probability of being select as an RB, IB, or EB producer or as a voter in a subsequent epoch. This presumes that the Praos VRF will be used for the sortition in Leios. Currently, large and expensive amounts of CPU power would be required to successfully conduct a grind attack on Praos. Nevertheless, additional research and development are underway to further harden Praos. +_Figure 12. Arrival delays for transactions, ranking blocks, votes, and endorser blocks._ -*Equivocation:* In Leios, an IB producer, EB producers, or voter is only allowed one production for each winning of the sortition lottery. (Note that they may win more than once in the same slot because a lottery takes place for each lovelace staked.) A malicious producer or voter might create two conflicting IBs, EBs, or votes and diffuse them to different downstream peers in an attempt to disrupt the Leios protocol. The [Leios paper](https://iohk.io/en/research/library/papers/high-throughput-blockchain-consensus-under-realistic-network-assumptions/) mitigates this situation explicitly by identifying nodes that misbehave in this manner and notifying downstream peers in a controlled manner. +
-*Inaction and nuisance:* Producer nodes might also attempt to disrupt the protocol by failing to play their assigned role or by attempting to diffuse invalid information. Failing to produce a block (RB, IB, or EB) or to vote when entitled will result in the attacker receiving fewer rewards for their Leios work. Similarly for creating invalid blocks or votes. Very little advantage would be gained by such attacks because they really only reduce throughput or create a minor annoyance to their first downstream nodes by burdening them with useless verification work. Presumably, the loss of rewards would not compensate for the small disruption they create. The cryptographic aspects of Leios quickly catch invalid blocks or votes, of course. +**Resource requirements** -*Omission and manipulation:* In Praos, omitting transactions from a block being forged does not directly affect the producer's rewards, but it may reduce the overall size of the rewards pot for the whole epoch. However, a malicious producer has little leverage by such omissions because of the very high probability that the omitted transactions reside elsewhere in the memory pool and will soon be included in subsequent honest blocks. Reordering IBs when an EB is created is not an option for an attacker because the Leios paper specifies a fixed ordering. +The resource requirements for operating Leios nodes have been estimated from +benchmarking and simulation studies. The assumed values for various Leios +operations come either from measurements of the cryptography prototype[^leioscrypto], +from the IOG benchmarking cluster for the Cardano node, or analysis of the Cardano mainnet ledger using the `db-analyser` tool. These were input to the +Haskell and Rust simulators for Leios to make holistic estimates of resource +usage of operating nodes. -*Network interference:* Malicious network activity such as violating the sync protocol or delaying diffusion of block or votes creates a minor annoyance that the node's sync protocol will quickly avoid by preferring efficient and honest nodes. Large numbers of malicious relays would be needed to impinge on efficiency even in a small degree. +In terms of resource usage, the throughputs in these simulations do no stress the four virtual CPUs of each node or saturate the 10 Mb/s available bandwidth between nodes. The figures below show that bandwidth usage does not exceed 4 Mb/s and that most of that is consumed by diffusion of transactions among the nodes. Furthermore, vCPU usage stays below 200% (i.e., the equivalent of two vCPUs operating fully), though it is very bursty because of the uneven workload of cryptographic and ledger operations. The last figure quantifies how transaction and EB body validation dominate CPU usage. Averaged over time, CPU usage is low: there may be opportunities in the implementation of the Leios node for lazy computations, caching, etc. that will spread out the occasional spikes in CPU usage over time. -*Denial of service:* Transaction-based denial of service attacks on Leios would involve submitting numerous invalid, duplicate, or conflicting transactions to different nodes so that they would all make their way into the memory pool and then to IBs, only to be invalidated when transaction reconciliation occurs after those IBs are indirectly referenced by a certificate on a Praos ranking block. Such a denial of service would result in extra computation by the nodes and wasted permanent storage in the IBs. (Plutus transactions may be especially burdensome in this respect.) Ongoing research will mitigate such denial of service via sharding techniques and Leios's fee structure. Sharding will prevent duplicate transactions from reaching IBs and the fee structure will enforce payment for intentionally conflicted transactions, even though only one of the transactions would make it onto the ledger. +
+ -### Resource requirements +| | | +| ------------------------------------------------------ | ---------------------------------------------------------------- | +| ![Mean nodal ingress](images/ingress-average-area.svg) | ![Mean CPU load among all nodes](images/cpu-mean-timeseries.svg) | -The resource requirements for operating Leios nodes have been estimated from benchmarking and simulation studies. The benchmark values for various Leios operations come either from measurements of the cryptography prototype[^3] or from the IOG benchmarking cluster for the Cardano node. These were input to the Haskell and Rust simulators for Leios to make holistic estimates of resource usage of operating nodes. +_Figure 13. Mean nodal ingress (left) and Mean CPU load among all nodes (right)._ -> [!CAUTION] -> -> The plots below are placeholders. All of the simulations in this section need to be re-run: -> -> - [ ] Final version of the Leios protocol -> - [ ] Realistic mainnet topology -> - [ ] Protocol parameters close to the recommended value -> - [ ] CPU -> - [ ] Unlimited? -> - [ ] Six cores? -> - [ ] Strip the major titles from the diagrams -> - [ ] Use SVG format +
+ +
+ -At high throughput, network egress can become a significant cost for nodes hosted on some cloud-computing providers. The violin plots below indicate that at the higher throughput that Leios can support, network egress can reach nearly 2 MB/s. +![Mean CPU load among all nodes](images/cpu-mean-histogram.svg) -![Simulation of Leios network egress](images/network.png) +_Figure 14. Mean CPU load among all nodes._ -Disk usage is correlated with network usage, as most of the blocks moving over the network also need to be persisted permanently; only the votes do not require disk storage. The plots below demonstrate that disk usage scales directly as the product of the IB rate and the IB size. +
-![Simulation of Leios disk usage](images/disk.png) +Note that the transaction workload in the simulations above was modeled upon the *average* amount of Plutus computation typical of the Cardano mainnet. The low time-averaged CPU usage in the simulations (i.e., less than 15% of a vCPU) suggests that the per-transaction and/or per-block Plutus budget could be significantly increased under Leios: either every transaction could have a modestly higher budget, or some transactions could use an order of magnitude more Plutus execution units. Statistical analysis of CPU usage in ledger operations[^timings] using the `db-analyser` tool[^dbanalyser] on Cardano mainnet from epoch 350 through 573 yields the following simple models of the CPU cost of validating signatures and executing Plutus in the transactions of a block. Because of the noisiness in the raw mainnet data, these estimates are uncertain. -Both the average CPU usage and the peak CPU usage are relevant for deciding how to provision hardware for Leios nodes. The following plots indicate that two CPUs are sufficient for sustained and for peak Leios operation at high throughput. Real deployments should over-provision CPU, of course, in order to handle rare extraordinary peak conditions and to speed syncing from genesis. +[^timings]: [Analysis of mainnet transaction validation times](https://github.com/input-output-hk/ouroboros-leios/blob/main/analysis/timings/ReadMe.ipynb) -![Simulation of average CPU usage for Leios](images/cpu-mean.png) +[^dbanalyser]: [Cardano instantiation of the Consensus Layer: db-analyser](https://github.com/IntersectMBO/ouroboros-consensus/blob/main/ouroboros-consensus-cardano/README.md#db-analyser) -![Simulation of peak CPU usage for Leios](images/cpu-peak.png) +- CPU per transaction in a block: `428.4 μs/tx`. +- CPU per byte of a block: `211.5 μs/kB`. +- Linear models for signature verification and Plutus execution: + - `(148.1 μs/tx) * (number of transactions) + (114.1 μs/kB) * (number of bytes)`. + - `(137.5 μs/tx) * (number of transactions) + (60.2 μs/kB) * (number of bytes) + (585.2 μs/Gstep) * (billions of Plutus execution steps)`, with a Lapace-distributed error having scale `1250 μs`. -Overall the most significant Leios hardware requirement changes compared to Praos are the higher levels of network egress and the rapidly growing disk space to store the Leios blocks. CPU requirements are quite similar to existing Praos deployments. +The Leios simulators use the value `0.4284 ms` as the validation time for each transaction. A more nuanced model of CPU usage in the simulators would account for Plutus execution. In order to estimate the effect of Plutus-heavy workloads, one can vary that per-transaction time to higher values. Very approximately, validation times of `1 ms/tx`, `10 ms/tx`, or `100 ms/tx` correspond to 2, 20, or 200 billion Plutus steps per transaction, respectively. The following plot of simulation results limit each node to 6 vCPU cores and suggest that the `100 ms/tx` workload is untenable. The subsequent plot shows the 6 vCPUs becoming saturated with Plutus execution, so much so that EBs fail to be created. These results indicate that Leios's *block-level* Plutus budget can safely be 2000 billion steps, or 100 times the Plutus budget of Praos. -### Operating costs +> [!IMPORTANT] +> +> TODO: **@bwbush** +> +> - [ ] Regenerate the plots below each time the version of `sim-cli` is bumped. +> - [ ] In next set of re-runs . . . +> - [ ] Use SVG format. +> - [ ] Align with the base case of the previous section. +> - [ ] In the transaction plot, switch to the minute-based ledged. +> - [ ] In the CPU plot, expand the abbrevations into phrases. +> - [ ] Review and possibly elaborate the figure and table captions. +> - [ ] In the final version . . . +> - [ ] Remove title and subtitle. + +
+ + +![Fate of Plutus-heavy transactions in Leios](images/plutus-temporal-efficiency-bar.png) + +_Figure 15. Fate of Plutus-heavy transactions in Leios._ + +
+ +
+ + +![CPU usage in Plutus-heavy workloads for Leios](images/plutus-cpu-mean-histogram.png) + +_Figure 16. CPU usage in Plutus-heavy workloads for Leios._ + +
+ +In summary, Leios will require a modest increase of the recommended hardware requirements[^spohw]: a four-core machine will be required, but a network upgrade will not be needed, as 10 Mb/s is well below the bandwidth of standard network connections. At throughput much higher than 200 kB/s, network egress can become a significant cost for nodes hosted on some cloud-computing providers. The Leios simulations do not model memory or disk. With the advent of UTxO-HD[^utxohd], 16 GB of memory will remain be sufficient for Leios if the `OnDisk` option is used for the UTxO set. Disk requirements depend upon the growth of the ledger, but a sustained 0.150 MB/s throughput amounts to ledger size increasing by 4.7 TB each year: see the section below on Operating Costs for further discussion. + +[^spohw]: [Minimum hardware requirements to run a stake pool](https://developers.cardano.org/docs/operate-a-stake-pool/hardware-requirements/) + +[^utxohd]: [Cardano Node 10.5.1 release notes](https://github.com/IntersectMBO/cardano-node/releases/tag/10.5.1) + +**Feasible protocol parameters** + +The table below documents a set of Leios protocol parameters that provided high +throughput and reasonably fast settlement in the prototype Haskell and Rust +simulations of Leios. The exact choice of parameters that would be adopted on +the Cardano mainnet must be subject to discussion and consideration of +tradeoffs. + +
+ + +| Parameter | Symbol | Feasible value | Justification +| --------------------------------------------- | :----------------: | :----------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Voting period length | $L_\text{vote}$ | 7 slots | Short stages increase settlement speed, but the stage length must be generously larger than the propagation time for EBs. | +| Recovery period length | $L_\text{recover}$ | ?? slots | ??? | +| Endorser-block referenceable transaction size | $S_\text{EB-tx}$ | 12 MB | Simulations indicate that 200 kB/s throughput is feasible at this block size. | +| Endorser block max size | $S_\text{EB}$ | 512 kB | Endorser blocks must not be so large that the transaction-execution bitmap is not too large to fit in a Praos block. | +| Maximum Plutus steps per endorser block | - | 2000G step units | Simulations at high transaction-validation CPU usage. | +| Maximum Plutus memory per endorser block | - | 7000M memory units | Simulations at high transaction-validation CPU usage. | +| Maximum Plutus steps per transaction | - | 100G step units | Raise per-transaction limit by a factor of twenty relative to Praos. | +| Maximum Plutus memory per transaction | - | 350M memory units | Raise per-transaction limit by a factor of twenty relative to Praos. | +| Ranking block max size | $S_\text{RB}$ | 90,112 bytes | This is the current value on the Cardano mainnet. | +| Praos active slot coefficient | $f_\text{RB}$ | 0.05 /slot | This is the current value on the Cardano mainnet. | +| Mean committee size | $n$ | 600 stakepools | Modeling of the proposed certificate scheme indicates that certificates reach their minimum size of ~8 kB at this committee size, given a realistic distribution of stake among pools. | +| Quorum size | $\tau$ | 60% | Quorum should be enough greater than 50% that sortition fluctuations do not give a 50% adversary a temporary majority, but low enough that weak adversaries cannot thwart an honest quorum. | + +_Table 6: Feasible Protocol Parameters_ + +
+ +> [!IMPORTANT] +> +> TODO: **@bwbush** +> +> - [ ] Determine how long the recovery period should be, entering it into the table. +> - [ ] Add a paragraph about the recovery period. +> - [ ] Are the per-transaction Plutus limits appropriate? -A detailed cost analysis of Leios deployment is documented in [Leios node operating costs](https://github.com/input-output-hk/ouroboros-leios/blob/main/docs/cost-estimate/README.md) in the github repository for the Leios R&D effort. The major conclusion of that report is the following table that relates IB production rate, assuming IBs are the maximum size of existing Praos blocks, to the cost per node and the total cost of all nodes. +Simulations on mainnet-like topologies indicate that seven slots is more than sufficient to diffuse the transactions, blocks, and votes required by Leios. Most nodes receive these in one second or less and even the tardiest nodes receive them in under two seconds. Similarly, the cryptography involved can be easily executed within the CPU budget. Seven-second voting periods provide a long safety margin for the transport and computation. A longer voting period would increase the probability that a ranking block is forged during the voting period: in such a situation, the endorser block would have to be discarded. Thus there is a tradeoff between allowing enough time for diffusion and computing but not so much time that endorser blocks are too frequently discarded. Higher-fidelity simulators, better empirical data on mainnet performance, and Leios testnet operations will test the appropriateness of this parameter and refine its value for a final recommendation. + +The aforementioned simulations also demonstrate that Leios operates up to 0.2 TxMB/s without experiencing congestion, provided endorser blocks reference no more than 12 MB of transactions. Even under adversarial conditions, where malicious nodes release transactions from their private memory pool at the same time that they forge a ranking block and an endorser block, simulations demonstrate that 12 MB of transactions diffuse rapidly enough for the protocol to operate smoothly, achieving a quorum of votes before the voting period ends. It is important to limit the number of transactions referenced by an endorser block because the transaction-execution bitmap in a subsequent ranking block may have to record information about conflicted transactions. A limit of 512 kB on the size of the endorser block itself ensures fast diffusion and limits its contents to 16,000 transactions, since each transaction hash is 32 bytes. That limit keeps the size of the bitmap in the few-kilobyte range, ensuring that it easily fits in the ranking block. The combination of 12 MB of transaction data and 16,000 transactions implies an average transaction size of 2000 bytes when both limits are reached: this is higher than the recent average transaction size on Cardano mainnet. + +Estimating the feasible limits for Plutus execution requires a more solid grounding, than currently exists, of the Plutus cost model in terms of actual CPU resources required to execute Plutus steps and memory. The empirical analysis and simulations presented above suggest the the per-block Plutus budget could be substantially increased. Results indicate that 2000 billion Plutus steps would consume less than two CPU-seconds of computation on typical node hardware. On a four-core machine there would be sufficient resources to evaluate the Plutus rapidly enough so as not to interfere with voting for endorser blocks. As in Praos, that block-level budget could be allocated to transactions in such a manner that several Plutus-heavy transaction fit in a single endorser block. Limiting a transaction to 100 billion steps, for instance, would allow 20 such transactions in each endorser block. For reference, this is ten times the recent Praos limit on transaction execution steps. The per-transaction limit can be adjusted to suit the needs of the community: i.e., it could be tuned to favor many light Plutus transactions vs a few heavy Plutus transactions. + +Although the Praos maximum block size could be modestly raised in Leios and the active-slot coefficient adjusted slightly, there is no compelling reason to alter these. They could, however, be re-evaluated in the context of the Leios testnet. + +The analysis +[Committee size and quorum requirement][committee-size-analysis] +in the first Leios Technical Report indicates that the Leios committee size +should be no smaller than 500 votes and the quorum should be at least 60% of +those votes. However, the proposed [Fait Accompli][fait-accompli-sortition][^fasort] scheme wFALS +achieves compact certificates that do not become larger as the number of voters +increases, so larger committee sizes might be permitted for broader SPO +participation and higher security. The committee size should be large enough +that fluctuations in committee membership do not create an appreciable +probability of an adversarial quorum when the adversarial stake is just under +50%. The quorum size should be kept large enough above 50% so that those same +fluctuations do not prevent an honest quorum. Larger committees require more +network traffic, of course. + +**Operating costs** + +> [!IMPORTANT] +> +> TODO: **@bwbush** +> +> - [ ] Revise this section and the computations to align with Linear Leios + +A detailed cost analysis of Leios deployment is documented in +[Leios node operating costs][cost-estimate] +in the github repository for the Leios R&D effort. The major conclusion of that +report is the following table that relates IB production rate, assuming IBs are +the maximum size of existing Praos blocks, to the cost per node and the total +cost of all nodes. + +
+ | IB/s Rate | Cost per Node (Avg) | Network Cost (10,000 nodes) | | --------: | ------------------: | --------------------------: | @@ -526,7 +1151,16 @@ A detailed cost analysis of Leios deployment is documented in [Leios node operat | 20 | $2,500 USD/month | $25,000,000 USD/month | | 30 | $3,600 USD/month | $36,000,000 USD/month | -*Required TPS for Infrastructure Cost Coverage:* Using average transaction sizes and fees, we can calculate the required TPS to generate enough fees to cover infrastructure costs. +_Table 7: Operating Costs by IB Production Rate_ + +
+ +_Required TPS for Infrastructure Cost Coverage:_ Using average transaction sizes +and fees, we can calculate the required TPS to generate enough fees to cover +infrastructure costs. + +
+ | Infrastructure Cost (USD/month) | Required ADA (at $0.45/ADA) | TPS (Avg Tx) | TPS (Min Tx) | Equivalent IB/s | | ------------------------------: | --------------------------: | -----------: | -----------: | --------------: | @@ -537,7 +1171,15 @@ A detailed cost analysis of Leios deployment is documented in [Leios node operat | $25,000,000 | 55,555,556 | 9.71 | 12.47 | 0.139 | | $36,000,000 | 80,000,000 | 13.99 | 17.96 | 0.200 | -*Required TPS for Current Reward Maintenance:* To maintain current reward levels (~48 million ADA monthly) through transaction fees as the Reserve depletes. +_Table 8: Required TPS for Infrastructure Cost Coverage_ + +
+ +_Required TPS for Current Reward Maintenance:_ To maintain current reward levels +(~48 million ADA monthly) through transaction fees as the Reserve depletes. + +
+ | Year | Reserve Depletion | Rewards from Fees (ADA) | Required TPS (Avg Tx) | Required IB/s | | ---: | ----------------: | ----------------------: | --------------------: | ------------: | @@ -548,160 +1190,564 @@ A detailed cost analysis of Leios deployment is documented in [Leios node operat | 2029 | ~43% | 20,640,000 | 36.1 | 0.52 | | 2030 | ~50% | 24,000,000 | 41.9 | 0.60 | -Note that by 2029, to compensate for Reserve depletion, the network would need to process approximately 36 TPS with average-sized transactions, requiring an Input Block rate of around 0.52 IB/s, roughly 10 times the current mainnet throughput. Leios's design would comfortably support this increased throughput while maintaining decentralization. +_Table 9: Required TPS for Current Reward Maintenance_ + +
+ +Note that by 2029, to compensate for Reserve depletion, the network would need +to process approximately 36 TPS with average-sized transactions, requiring an +Input Block rate of around 0.52 IB/s, roughly 10 times the current mainnet +throughput. Leios's design would comfortably support this increased throughput +while maintaining decentralization. + +While the empirical evidence demonstrates Leios's performance capabilities, any protocol modification introduces new attack vectors and operational constraints that must be carefully assessed. The following section examines potential security risks and practical constraints that inform deployment considerations. + +### Trade-offs & Limitations + +This section examines the key threats, limitations, and trade-offs inherent in the Leios design, along with their mitigations and consequences for practical deployment. + +**Solution space analysis** + +> [!WARNING] +> TODO: +> - A short overview of the threat model +> - Highlight key 2-3 threats and mitigations +> - Link the [dedicated threat model](https://github.com/input-output-hk/ouroboros-leios/pull/452) once merged? +> - Link [threat model in report #1][threat-model], [comments in report #2][threat-model-report2]? + +The Leios protocol may have to mitigate the following categories of threats. + +- Grinding the VRF to obtain an advantage in Leios sortition +- Equivocating IBs, EBs, or RBs +- Declining to create IBs, EBs, or votes +- Manipulating the content of IBs or EBs +- Sending invalid txs, IBs, EBs, or certificates +- Abusing the sync protocol +- Delaying diffusion of IBs, EBs, or votes +- Submitting invalid, conflicting, or duplicate transactions + +Nearly all of these _hypothetical_ threats are already mitigated by the protocol +design, the incentive structure, or the cost of the resources needed to execute +the threat. The +[Threat model][threat-model] +section of the first Leios Technical report contains a detailed taxonomy that we +summarize here. The general impact of such attacks varies: + +- Resource burden on nodes +- Lowered throughput +- Increased transaction delay +- Manipulation of dapps or oracles + +_Grinding and other threats to Praos:_ Threats to the ranking blocks used by +Leios are already mitigated by Ouroboros Praos and Genesis. Nevertheless, the +possibility of _grinding attacks_, as discussed in +[CPS-0017][cps-17], +will always exist, albeit at low probability of success. Such an attack, which +requires some stake, involves using CPU resources to try to manipulate the epoch +nonce to a value which will result in higher probability of being select as an +RB, IB, or EB producer or as a voter in a subsequent epoch. This presumes that +the Praos VRF will be used for the sortition in Leios. Currently, large and +expensive amounts of CPU power would be required to successfully conduct a grind +attack on Praos. Nevertheless, additional research and development are underway +to further harden Praos. + +_Equivocation:_ In Leios, an IB producer, EB producers, or voter is only allowed +one production for each winning of the sortition lottery. (Note that they may +win more than once in the same slot because a lottery takes place for each +lovelace staked.) A malicious producer or voter might create two conflicting +IBs, EBs, or votes and diffuse them to different downstream peers in an attempt +to disrupt the Leios protocol. The [Leios paper][leios-paper] mitigates this +situation explicitly by identifying nodes that misbehave in this manner and +notifying downstream peers in a controlled manner. + +_Inaction and nuisance:_ Producer nodes might also attempt to disrupt the +protocol by failing to play their assigned role or by attempting to diffuse +invalid information. Failing to produce a block (RB, IB, or EB) or to vote when +entitled will result in the attacker receiving fewer rewards for their Leios +work. Similarly for creating invalid blocks or votes. Very little advantage +would be gained by such attacks because they really only reduce throughput or +create a minor annoyance to their first downstream nodes by burdening them with +useless verification work. Presumably, the loss of rewards would not compensate +for the small disruption they create. The cryptographic aspects of Leios quickly +catch invalid blocks or votes, of course. + +_Omission and manipulation:_ In Praos, omitting transactions from a block being +forged does not directly affect the producer's rewards, but it may reduce the +overall size of the rewards pot for the whole epoch. However, a malicious +producer has little leverage by such omissions because of the very high +probability that the omitted transactions reside elsewhere in the memory pool +and will soon be included in subsequent honest blocks. Reordering IBs when an EB +is created is not an option for an attacker because the Leios paper specifies a +fixed ordering. + +_Network interference:_ Malicious network activity such as violating the sync +protocol or delaying diffusion of block or votes creates a minor annoyance that +the node's sync protocol will quickly avoid by preferring efficient and honest +nodes. Large numbers of malicious relays would be needed to impinge on +efficiency even in a small degree. + +_Denial of service:_ Transaction-based denial of service attacks on Leios would +involve submitting numerous invalid, duplicate, or conflicting transactions to +different nodes so that they would all make their way into the memory pool and +then to IBs, only to be invalidated when transaction reconciliation occurs after +those IBs are indirectly referenced by a certificate on a Praos ranking block. +Such a denial of service would result in extra computation by the nodes and +wasted permanent storage in the IBs. (Plutus transactions may be especially +burdensome in this respect.) Ongoing research will mitigate such denial of +service via sharding techniques and Leios's fee structure. Sharding will prevent +duplicate transactions from reaching IBs and the fee structure will enforce +payment for intentionally conflicted transactions, even though only one of the +transactions would make it onto the ledger. + +**Key limitations** + +**EB Availability Limitations** + +The current specification requires nodes to receive EBs within $L_\text{vote}$ to participate in voting. When network conditions prevent nodes from obtaining all transactions referenced by an EB, this creates a binary outcome: either sufficient nodes can vote (enabling certification) or they cannot (causing the EB to be discarded). + +One potential approach to address this limitation involves [partial EB certification mechanisms](https://gist.githubusercontent.com/will-break-it/aa959601a13e2a9899a96de150fcafdd/raw/70b91ef564c484472ee81b2138ae4e92c5ed1088/leios-progressive-eb-certification.md) using merkle tree structures that would allow nodes to vote on partial transaction subsets when they cannot obtain all referenced transactions. This concept trades increased EB size for improved resilience under adverse network conditions, transforming the binary success/failure dynamic into graduated progress. + +This approach remains exploratory and would require careful analysis of the bandwidth vs. resilience trade-offs and validation through simulation to determine whether nodes actually receive transactions in the contiguous patterns the mechanism assumes. + +> [!WARNING] +> TODO: +> - ΔEB timing constraints and consequences +> - High-throughput liveness analysis +> - Praos safety argument impacts +> - Increased inclusion delay trade-offs + +**Impact onto ecosystem** + +> [!WARNING] +> TODO: +> - Refer back to [CPS-18][cps-18] use cases and explain how proposed protocol improves them +> - Review and only mention use cases we have evidence for + +Leios immediately enables use cases for high transaction volume and for more +computationally intensive Plutus scripts, but future minor modifications of the +protocol can open additional novel and custom transaction workflows. + +**High transaction volume** + +Prototype simulations of the Leios protocol indicate that it can achieve at +least 20 times the maximum throughput of the current Cardano mainnet. This +amounts to approximately 2 MB/s or 1500 tx/s, assuming the current mean +transaction size of 1400 bytes. The availability of Leios, however, would likely +affect the characteristics of the mix of transactions, so the maximum +transaction rate could be higher or lower than this estimate. Whatever the +specifics, Leios will enable transaction volumes that are orders of magnitude +greater than Praos. + +Aside from the general benefit of high capacity, several specific use cases +could benefit. + +- _Enterprise or national-state adoption:_ Enterprises and nation states require + sustained and guaranteed scalability for their blockchain transactions, and + large entities may become heavy users of Cardano. +- _Finance:_ High volume and high frequency trading may become more practical + given the higher throughput supported by Leios. +- _Airdrops:_ The high throughput of Leios could streamline the user experience + of claiming tokens for large (or extremely large) airdrops. +- _Partner chains, bridges, and oracles:_ Multiple simultaneous operation of + partner chains, bridges, and oracles on Cardano will require high transaction + rates and minimal delays from the time a transaction reaches the memory pool + to when it is recorded in the ledger. +- _Games:_ High throughput and lower transaction cost may enable cost-effective + coupling of games (e.g., markets for in-game items). +- _Improved user experience:_ From the onset of the Alonzo era, the usability of + particular dapps has occasionally been constrained by the transaction + throughput available on Praos. This is especially important and severe when a + popular new dapps launches and experiences high activity. Congestion that + sometimes occurs during spikes in transaction activity would be alleviated. +- _More complex governance actions:_ Expansion of Cardano and DAO governance + would required high volumes of transactions if large portions of the community + participate. This is particularly important if the number of dreps increases + and Cardano moves towards a "direct democracy" style of voting. + +**Improved cost structure** + +Techno-economic analyses indicate that at a sustained transaction volume of 50 +tx/s or greater the profitability profile of Cardano will improve in several +ways. If the current transaction fee structure remains the same as now, Leios +would have three economic effects at 50+ tx/s: + +1. The intake of transaction fees would be large enough to lessen or eliminate + the need for supplementing rewards from the Reserve pot. In particular, the + `monetaryExpansion` protocol parameters to be lowered and/or the + `treasuryCut` parameter could be increased. +2. Stake rewards would increase. +3. Stake pools would become more profitable. In particular, at 50+ tx/s the + costlier Leios hardware would be overcome by higher rewards. +4. Transaction fees could be somewhat lowered. That could further drive adoption + and make smaller transactions more cost effective, perhaps even opening the + possibilities for micropayments or IoT applications. + +The following plot shows a forecast for SPO profitability under Leios, assuming +a "business as usual" scenario where the fee, treasury, and monetary expansion +protocol parameter stay the same as presently. The precise profitability of +individual SPOs depends strongly upon how they host their nodes, but there is a +clear trend towards profitability (without any contributions from the Cardano +Reserve) once 30-50 transactions per second are sustained. Note that +profitability slows at very high throughput because of the substantial expense +of network egress and storage of the ledger. + +![SPO profitability under Leios.](images/leios-forecast-sqrt-fill.svg) + +**Intensive Plutus execution** + +Because there typically is a time window of several seconds from the time a +Leios endorser block can be created to when voting must complete, there is also +an opportunity to do more computation validating transactions within an endorser +block than for a Praos ranking block. This opens the possibility of increasing +the Plutus execution budget for endorser blocks so that it is significantly +larger than the budget for Praos blocks. At the very least a script could be +allowed to use the whole Plutus execution budget for an endorser block, instead +of just one quarter of it as is the case for Praos. + +Numerous emerging use cases on Cardano would benefit from larger Plutus +execution budgets. Complex dapps currently have to split a single logical +operation into a sequence of several transactions, increasing the development +effort, the complexity, and the attack surface of the scripts involved. + +- _ZK proofs:_ It may be possible to increase the Plutus execution budget enough + that a complete ZK proof could verified in a single transaction. +- _Large number of parties:_ Scripts managing potential interactions with a + large number of parties (e.g., airdrops, lotteries, and local accounts) are + intrinsically limited by Plutus execution limits. +- _On-chain interpreters:_ Dapps like Marlowe run interpreters for their DSL in + a Plutus script. Execution limits currently restrict the complexity of the DSL + expressions that can be evaluated in a single transaction. + +**Novel use cases** + +Although the version of Leios proposed in this document does not support the +particular use cases listed below, a minor variant or future version of Leios +could. + +- _Priority pipelines:_ Different Leios pipelines might have different stage + lengths, throughput, fees, and/or Plutus execution limits, enabling + applications to select their level of service. +- _Externally batched endorser blocks:_ Third parties could construct endorser + blocks and provide them directly to the block producers, allowing a dapp or an + exchange detailed control over sequencing of interdependent transactions + within the endorser block. +- _Nuanced roles for SPOs:_ Leios opens the possibility of separating the + protocol functions into separate processes that could be run independently but + in coordination. For example, some SPOs (or parts of an SPO) might focus on + voting and validation while others might specialize in ranking block + production. In addition to enabling flexible configuration of Cardano worker + services, this could encourage new operational models for SPO consortia. + +The current specification delivers immediate throughput benefits while preserving pathways to these enhanced capabilities. The following section outlines how this foundation can evolve toward even higher performance and expanded functionality as the ecosystem matures. + +### Roadmap & Next Steps + +This section outlines alternative approaches, future work, and extensions that build upon the specified Leios protocol to achieve even higher performance and expanded functionality. + +**Alternative approaches** + +> [!WARNING] +> TODO: +> - alternatives analysis (e.g., Praos big blocks) +> - solution space positioning + +**Next steps** + +> [!WARNING] +> TODO: +> - immediate next steps for development +> - future work and extensions of proposed design + +**Long-term roadmap** + +> [!WARNING] +> TODO: +> - pathway to higher throughput variants +> - integration with other scaling solutions ## Path to active > [!NOTE] -> +> > Organised in two sub-sections: -- [ ] Clear evidence of stakeholder use cases that require the high transaction throughput that Leios provides. +- [ ] Clear evidence of stakeholder use cases that require the high transaction + throughput that Leios provides. ### Acceptance criteria > [!NOTE] -> -> Describes what are the acceptance criteria whereby a proposal becomes _'Active'_. -> -> This sub-section must define a list of criteria by which the proposal can become active. Criteria must relate to observable metrics or deliverables and be reviewed by editors and project maintainers when applicable. For example: "The changes to the ledger rules are implemented and deployed on Cardano mainnet by a majority of the network", or "The following key projects have implemented support for this standard". - -- [ ] The revised `cardano-node` implementations pass the node-level conformance test suites. -- [ ] Audit. -- [ ] Successful operation in testnet environments. -- [ ] Community agreement on the settings for the Leios protocol parameters. +> +> Describes what are the acceptance criteria whereby a proposal becomes +> _'Active'_. +> +> This sub-section must define a list of criteria by which the proposal can +> become active. Criteria must relate to observable metrics or deliverables and +> be reviewed by editors and project maintainers when applicable. For example: +> "The changes to the ledger rules are implemented and deployed on Cardano +> mainnet by a majority of the network", or "The following key projects have +> implemented support for this standard". + +- [ ] The revised `cardano-node` implementations pass the node-level conformance + test suites. +- [ ] Audit. +- [ ] Successful operation in testnet environments. +- [ ] Community agreement on the settings for the Leios protocol parameters. ### Implementation plan -> [!NOTE] -> Either a plan to meet those criteria or `N/A` if not applicable. -> -> This sub-section should define the plan by which a proposal will meet its acceptance criteria, when applicable. More, proposals that require implementation work in a specific project may indicate one or more implementors. Implementors must sign off on the plan and be referenced in the document's preamble. -> -> In particular, an implementation that requires a hard-fork should explicitly mention it in its _'Implementation Plan'_. +> [!NOTE] Either a plan to meet those criteria or `N/A` if not applicable. +> +> This sub-section should define the plan by which a proposal will meet its +> acceptance criteria, when applicable. More, proposals that require +> implementation work in a specific project may indicate one or more +> implementors. Implementors must sign off on the plan and be referenced in the +> document's preamble. +> +> In particular, an implementation that requires a hard-fork should explicitly +> mention it in its _'Implementation Plan'_. -- [ ] Detailed node-level (as opposed to this protocol-level) specification. -- [ ] Develop node-level conformance test suite. -- Consider developing a "quick and dirty" implementation for large scale experiments. +- [ ] Detailed node-level (as opposed to this protocol-level) specification. +- [ ] Develop node-level conformance test suite. +- Consider developing a "quick and dirty" implementation for large scale + experiments. - Coordinate with related activities on other protocol enhancements. - - Compatibility between Peras, Leios, and Genesis. - - Common design and implementation for certificates, voting, and related key registration: Mithril, Peras, Leios, and partner chains. -- Triage by intersect Core Infrastructure, Consensus, Ledger, and Network functions. + - Compatibility between Peras, Leios, and Genesis. + - Common design and implementation for certificates, voting, and related key + registration: Mithril, Peras, Leios, and partner chains. + - https://github.com/berewt/CIPs/blob/master/CIP-xxxx/CIP-xxxx.md is relevant +- Triage by intersect Core Infrastructure, Consensus, Ledger, and Network + functions. ## Versioning > [!NOTE] -> +> > if Versioning is not addressed in Specification -> -> CIPs must indicate how the defined Specification is versioned. **Note** this does not apply to the CIP text, for which annotated change logs are automatically generated and [available through the GitHub UI](https://docs.github.com/en/pull-requests/committing-changes-to-your-project/viewing-and-comparing-commits/differences-between-commit-views) as a history of CIP files and directories. -> -> Authors are free to describe any approach to versioning that allows versioned alterations to be added without author oversight. Stipulating that the proposal must be superseded by another is also considered to be valid versioning. -> -> A single Versioning scheme can be placed either as a subsection of the Specification section or in an optional Versioning top-level section near the end. If the Specification contains multiple specification subsections, each of these can have a Versioning subsection within it. +> +> CIPs must indicate how the defined Specification is versioned. **Note** this +> does not apply to the CIP text, for which annotated change logs are +> automatically generated and +> [available through the GitHub UI](https://docs.github.com/en/pull-requests/committing-changes-to-your-project/viewing-and-comparing-commits/differences-between-commit-views) +> as a history of CIP files and directories. +> +> Authors are free to describe any approach to versioning that allows versioned +> alterations to be added without author oversight. Stipulating that the +> proposal must be superseded by another is also considered to be valid +> versioning. +> +> A single Versioning scheme can be placed either as a subsection of the +> Specification section or in an optional Versioning top-level section near the +> end. If the Specification contains multiple specification subsections, each of +> these can have a Versioning subsection within it. -Leios will be versioned via the major and minor version numbers of the Cardano protocol. +Leios will be versioned via the major and minor version numbers of the Cardano +protocol. ## References -> [!NOTE] -> -> Optional +### Primary Documents -- [CPS-18: Greater transaction throughput](https://github.com/cardano-foundation/CIPs/blob/master/CPS-0018/README.md) -- [Leios R&D web site](https://leios.cardano-scaling.org/) -- [Leios channel on IOG Discord](https://discord.com/channels/826816523368005654/1247688618621927505) -- [Github repository for Leios R&D](https://github.com/input-output-hk/ouroboros-leios) -- [Github repository for Leios formal specification](https://github.com/input-output-hk/ouroboros-leios-formal-spec) +- **CPS-18: Greater transaction throughput** - [CPS-0018][cps-18] +- **Ouroboros Leios: Design Goals and Concepts** - [Research Paper][leios-paper] -## Appendices +### Leios Resources -> [!NOTE] -> -> Optional +- **Leios R&D website** - [leios.cardano-scaling.org][leios-website] +- **Leios Discord channel** - [IOG Discord][leios-discord] +- **Leios R&D repository** - [GitHub][leios-github] +- **Leios formal specification** - [GitHub][leios-formal-spec] -### Cryptographic benchmarks +### Technical Specifications -The following benchmarks for Leios cryptographic operations were computed with Rust code[^3] that uses a reference implementation for BLS operations. A variety of optimizations are possible, so the measurements below should be considered worst-case bounds. +- **BLS certificates specification** - [Specification][bls-spec] +- **BLS certificates benchmarks** - [Benchmarks][bls-benchmarks] +- **Fait Accompli sortition** - [Specification][fait-accompli-sortition] -**Sortition Benchmarks** +### Technical Reports -| Operation | Timing | -|--------------------------|---------------| -| Input blocks | 230 µs | -| Endorser blocks | 230 µs | -| Persistent voters | 5.5 ms | -| Non-persistent voters | 230 µs | +- **Committee size and quorum requirement** - [Analysis][committee-size-analysis] +- **Threat model** - [Report #1][threat-model] +- **Leios attack surface** - [Report #2][threat-model-report2] +- **Node operating costs** - [Cost estimate][cost-estimate] -> [!NOTE] -> -> Persistent voters are computed once per epoch, non-persistent voters once per pipeline. +### Related -**Vote Benchmarks** +- **CPS-0017** - [Settlement layer CPS][cps-17] +- **Praos performance model** - [Specification][praos-performance] -| Operation | Timing | -|-----------------------------------------|---------------| -| Verify proof of key possession | 1.5 ms/key | -| Generate vote (persistent) | 135 µs/vote | -| Generate vote (non-persistent) | 280 µs/vote | -| Verify vote (persistent) | 670 µs/vote | -| Verify vote (non-persistent) | 1.4 ms/vote | +### Simulation Resources -**Certificate Benchmarks** +*See footnotes in the Simulation Results section for detailed topology documentation* -> [!NOTE] -> -> For realistic number of pools, stake distribution, and committee size +### External + +- **RIPE Atlas** - [Network measurements][ripe-atlas] +- **Cardano Foundation** - [Official site][cardano-foundation] + + + + + +[cps-18]: https://github.com/cardano-foundation/CIPs/blob/master/CPS-0018/README.md "CPS-18: Greater transaction throughput" +[leios-paper]: https://eprint.iacr.org/2025/1115.pdf "Ouroboros Leios: Design Goals and Concepts" +[fait-accompli-sortition]: https://github.com/input-output-hk/ouroboros-leios/blob/main/crypto-benchmarks.rs/Specification.md#sortition "Fait Accompli sortition specification" + + +[leios-website]: https://leios.cardano-scaling.org/ "Leios R&D web site" +[leios-discord]: https://discord.com/channels/826816523368005654/1247688618621927505 "Leios channel on IOG Discord" +[leios-github]: https://github.com/input-output-hk/ouroboros-leios "Github repository for Leios R&D" +[leios-formal-spec]: https://github.com/input-output-hk/ouroboros-leios-formal-spec "Github repository for Leios formal specification" + + +[bls-spec]: https://github.com/input-output-hk/ouroboros-leios/blob/main/crypto-benchmarks.rs/Specification.md "BLS certificates specification" +[bls-benchmarks]: https://github.com/input-output-hk/ouroboros-leios/blob/main/crypto-benchmarks.rs/Specification.md#benchmarks-in-rust "BLS certificates benchmarks" + + +[committee-size-analysis]: https://github.com/input-output-hk/ouroboros-leios/blob/main/docs/technical-report-1.md#committee-size-and-quorum-requirement "Committee size and quorum requirement" +[threat-model]: https://github.com/input-output-hk/ouroboros-leios/blob/main/docs/technical-report-1.md#threat-model "Threat model" +[threat-model-report2]: https://github.com/input-output-hk/ouroboros-leios/blob/main/docs/technical-report-2.md#notes-on-the-leios-attack-surface "Comments on Leios attack surface" +[cost-estimate]: https://github.com/input-output-hk/ouroboros-leios/blob/main/docs/cost-estimate/README.md "Leios node operating costs" + + +[cps-17]: https://github.com/cardano-scaling/CIPs/blob/settlement-cps/CPS-0017/README.md "CPS-0017" +[praos-performance]: https://github.com/IntersectMBO/cardano-formal-specifications/blob/6d4e5cfc224a24972162e39a6017c273cea45321/src/performance/README.md "Praos performance model" + + +[mainnet-topology]: https://github.com/input-output-hk/ouroboros-leios/blob/6d8619c53cc619a25b52eac184e7f1ff3c31b597/data/simulation/pseudo-mainnet/ReadMe.md "Mainnet-like topology documentation" +[pseudo-mainnet]: https://github.com/input-output-hk/ouroboros-leios/blob/6d8619c53cc619a25b52eac184e7f1ff3c31b597/data/simulation/pseudo-mainnet/topology-v1.md "Pseudo-mainnet topology" +[mini-mainnet]: https://github.com/input-output-hk/ouroboros-leios/blob/6d8619c53cc619a25b52eac184e7f1ff3c31b597/data/simulation/pseudo-mainnet/topology-v2.md "Mini-mainnet topology" +[topology-comparison]: https://github.com/input-output-hk/ouroboros-leios/blob/6d8619c53cc619a25b52eac184e7f1ff3c31b597/analysis/sims/2025w30b/analysis.ipynb "Topology comparison study" + + +[ripe-atlas]: https://atlas.ripe.net/ "RIPE Atlas" +[cardano-foundation]: https://cardanofoundation.org/ "Cardano Foundation" -| Operation | Timing | -|-----------------------------------------|---------------| -| Generate certificate | 90 ms/cert | -| Verify certificate | 130 ms/cert | -| Determine weight in certificate | 5.9 ms/cert | + +[apache-2.0]: http://www.apache.org/licenses/LICENSE-2.0 "Apache License 2.0" -**Serialization Benchmarks** + +[^fasort]: The Fait Accompli sortition scheme +[^2]: Leios: Dynamic Availability for Blockchain Sharding (2025) +[^leioscrypto]: Leios cryptography prototype implementation -| Operation | Timing | -|-----------------------------------------|---------------| -| Key registration | 1.1 µs | -| Vote | 630 ns | -| Certificate | 65 µs | +## Appendix -**Deserialization Benchmarks** +

Appendix A: Requirements for votes and certificates

-| Operation | Timing | -|-----------------------------------------|---------------| -| Key registration | 52 µs | -| Vote | 19 µs | -| Certificate | 2.7 ms | +The voting and certificate scheme for Leios must satisfy the following requirements to ensure security, efficiency, and practical deployability: -As a general rule of thumb, assume that 80% of votes are persistent and 20% are non-persistent. Here are details for how certificate operations vary with committee size, given a realistic stake distribution similar to that on Cardano mainnet. +1. **Succinct registration of keys:** The registration of voting keys should not involve excessive data transfer or coordination between parties. Ideally, such registration would occur as part of the already existing operational certificates and not unduly increase their size. -| Number of pools | Number of committee seats | Generate certificate | Verify certificate | Weigh certificate | -|----------------:|--------------------------:|---------------------:|-------------------:|------------------:| -| 2500 | 500 | 63.4 ms | 104.8 ms | 10.6 ms | -| 2500 | 600 | 71.1 ms | 116.9 ms | 12.0 ms | -| 2500 | 700 | 77.4 ms | 125.5 ms | 12.3 ms | -| 2500 | 800 | 83.5 ms | 134.4 ms | 12.8 ms | -| 2500 | 900 | 88.2 ms | 141.1 ms | 12.4 ms | -| 2500 | 1000 | 92.5 ms | 144.9 ms | 12.3 ms | +2. **Key rotation:** The cryptographic keys used to sign Leios votes and certificates *do not* need to be rotated periodically because the constraints on Leios voting rounds and the key rotation already present in Praos secure the protocol against attacks such as replay and key compromise. -[^3]: "Benchmarks and CLI for BLS cryptography used by Leios", https://github.com/input-output-hk/ouroboros-leios/blob/main/crypto-benchmarks.rs/ReadMe.md +3. **Deterministic signatures:** Deterministic signatures can guard against attacks that weaken key security. -### Certificate size for realistic stake distributions +4. **Local sortition:** Selection of the voting committee should not be so deterministic and public as to open attack avenues such as denial-of-service or subversion. -The following plots show number of persistent votes and votes, along with certificate size, for the `mainnet` stake distribution of Epoch 535. The dashed line in the first plot has slope one, so the gap between it and the solid line indicates the number of non-persistent voters. The certificate-size plot does not take into account a potential reduction in certificate size from omitting votes in excess of a quorum. +5. **Liveness:** Adversaries with significant stake (e.g., more than 35%) should not be able to thwart an honest majority from reaching a quorum of votes for an EB. -| Persistent voters | Certificate size | -| -------------------------------------------------------- | ---------------------------------------------------------------- | -| ![Fait-accompli voters](images/fait-accompli-voters.svg) | ![Fait-accompli certificate size](images/fait-accompli-cert.svg) | +6. **Soundness:** Adversaries with near majority stake (e.g., 49%) should not be able to form an adversarial quorum that certifies the EB of their choice. + +7. **Small votes:** Because vote traffic is large and frequent in Leios, the votes themselves should be small. Note that the large size of Praos KES signatures precludes their use for signing Leios votes. + +8. **Small certificates:** Because Leios certificates are frequent and must fit inside Praos blocks, they should be small enough so there is plenty of room for other transactions in the Praos blocks. Note once again that certificates based on Praos KES signatures are too large for consideration in Leios. + +9. **Fast cryptography:** The computational burden of creating and verifying voting eligibility, the votes themselves, and the resulting certificate must be small enough to fit within the CPU budget for Leios stages. + +The aggregate signature scheme implementation specified in this document (using BLS as an example) satisfies all these requirements, as evidenced by the performance characteristics and certificate sizes documented in the [Specification for votes and certificates](#specification-for-votes-and-certificates) section. + + +

Appendix B: Wire Format Specifications (CDDL)

+ +This appendix contains the complete CDDL specifications for all Leios protocol messages and data structures. These definitions specify the exact wire format for network communication. + +

Ranking Block

+ +```diff + ranking_block = + [ header : block_header + , transaction_bodies : [* transaction_body] + , transaction_witness_sets : [* transaction_witness_set] + , auxiliary_data_set : {* transaction_index => auxiliary_data} ++ , ? tx_execution_bitmap : bytes ++ , ? eb_certificate : leios_certificate + ] + +block_header = + [ header_body : block_header_body + , body_signature : kes_signature + ] + + block_header_body = + [ block_number : uint + , slot : slot_no + , prev_hash : hash32 + , issuer_vkey : vkey + , vrf_vkey : vrf_vkey + , vrf_result : vrf_cert + , block_body_size : uint + , block_body_hash : hash32 ++ , ? announced_eb : hash32 ++ , ? certified_eb : hash32 + ] +``` + +

Endorser Block

+ +```cddl +endorser_block = + [ tx_execution_bitmap : bytes + , transaction_references : [* tx_reference] + ] + +; Reference structures +tx_reference = hash32 +``` + +

Votes and Certificates

+ +```cddl +leios_certificate = + [ election_id : election_id + , endorser_block_hash : hash32 + , persistent_voters : [* persistent_voter_id] + , nonpersistent_voters : {* pool_id => bls_signature} + , ? aggregate_elig_sig : bls_signature + , aggregate_vote_sig : bls_signature + ] + +leios_vote = persistent_vote / non_persistent_vote + +persistent_vote = + [ 0 + , election_id + , persistent_voter_id + , endorser_block_hash + , vote_signature + ] + +non_persistent_vote = + [ 1 + , election_id + , pool_id + , eligibility_signature + , endorser_block_hash + , vote_signature + ] +``` ## Copyright > [!NOTE] -> -> The CIP must be explicitly licensed under acceptable copyright terms (see below). -> -> CIPs are licensed in the public domain. More so, they must be licensed under one of the following licenses. Each new CIP must identify at least one acceptable license in its preamble. In addition, each license must be referenced by its respective abbreviation below in the _"Copyright"_ section. +> +> The CIP must be explicitly licensed under acceptable copyright terms (see +> below). +> +> CIPs are licensed in the public domain. More so, they must be licensed under +> one of the following licenses. Each new CIP must identify at least one +> acceptable license in its preamble. In addition, each license must be +> referenced by its respective abbreviation below in the _"Copyright"_ section. -This CIP is licensed under [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0). +This CIP is licensed under +[Apache-2.0][apache-2.0]. diff --git a/docs/cip/images/contents-ebs-size.svg b/docs/cip/images/contents-ebs-size.svg new file mode 100644 index 000000000..bc12de9b5 --- /dev/null +++ b/docs/cip/images/contents-ebs-size.svg @@ -0,0 +1,318 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0.100 TxMB/s + + + + + + + + + + +0.150 TxMB/s + + + + + + + + + + +0.200 TxMB/s + + + + + + + + + + +0.250 TxMB/s + + + + + + + + + + +0.300 TxMB/s + + + + + + + +0 +3 +6 +9 +12 +0 +10 +20 +30 + + + + +0 +10 +20 + + + +0 +10 +20 + + + +0 +10 +20 + + + +0 +10 +20 +30 + + + + +EB size [MB] +Number of EBs +Rust, linear-with-tx-references, topology-v2, 4 vCPU/node, 10 Mb/s, 7 slot/stage, 12 MB/EB, 1500 B/Tx +Size of transactions in EBs + + diff --git a/docs/cip/images/cpu-mean-histogram.svg b/docs/cip/images/cpu-mean-histogram.svg new file mode 100644 index 000000000..5934aa312 --- /dev/null +++ b/docs/cip/images/cpu-mean-histogram.svg @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0.100 TxMB/s + + + + + + + + + + +0.150 TxMB/s + + + + + + + + + + +0.200 TxMB/s + + + + + + + + + + +0.250 TxMB/s + + + + + + + + + + +0.300 TxMB/s + + + + + + + +0 +5 +10 +15 + + + + +Mean CPU load [%] + +Task + + + + + + + + + + + + + + + + +GenRB +GenVote +ValEB +ValEH +ValRB +ValRH +ValTX +ValVote +Rust, linear-with-tx-references, topology-v2, 4 vCPU/node, 10 Mb/s, 7 slot/stage, 12 MB/EB, 1500 B/Tx +Mean CPU load among all nodes + + diff --git a/docs/cip/images/cpu-mean-timeseries.svg b/docs/cip/images/cpu-mean-timeseries.svg new file mode 100644 index 000000000..cb10c2cef --- /dev/null +++ b/docs/cip/images/cpu-mean-timeseries.svg @@ -0,0 +1,283 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0.100 TxMB/s + + + + + + + + + + +0.150 TxMB/s + + + + + + + + + + +0.200 TxMB/s + + + + + + + + + + +0.250 TxMB/s + + + + + + + + + + +0.300 TxMB/s + + + + + + +0 +500 +1000 +1500 +0 +50 +100 +150 +200 + + + + + +0 +50 +100 +150 +200 + + + + + +0 +50 +100 +150 +200 + + + + + +0 +50 +100 +150 +200 + + + + + +0 +50 +100 +150 +200 + + + + + +Slot +Mean CPU load [%] +Rust, linear-with-tx-references, topology-v2, 4 vCPU/node, 10 Mb/s, 7 slot/stage, 12 MB/EB, 1500 B/Tx +Mean CPU load among all nodes + + diff --git a/docs/cip/images/cpu-mean.png b/docs/cip/images/cpu-mean.png deleted file mode 100644 index 76bc91078..000000000 Binary files a/docs/cip/images/cpu-mean.png and /dev/null differ diff --git a/docs/cip/images/cpu-peak.png b/docs/cip/images/cpu-peak.png deleted file mode 100644 index f91f8a3ee..000000000 Binary files a/docs/cip/images/cpu-peak.png and /dev/null differ diff --git a/docs/cip/images/disk.png b/docs/cip/images/disk.png deleted file mode 100644 index 7d03f5832..000000000 Binary files a/docs/cip/images/disk.png and /dev/null differ diff --git a/docs/cip/images/disposition-size-timeseries.svg b/docs/cip/images/disposition-size-timeseries.svg new file mode 100644 index 000000000..01918d425 --- /dev/null +++ b/docs/cip/images/disposition-size-timeseries.svg @@ -0,0 +1,782 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0.100 TxMB/s + + + + + + + + + + +0.150 TxMB/s + + + + + + + + + + +0.200 TxMB/s + + + + + + + + + + +0.250 TxMB/s + + + + + + + + + + +0.300 TxMB/s + + + + + + + + +0 +5 +10 +15 +20 +25 +0 +2 +4 +6 + + + + +0 +3 +6 +9 + + + + +0 +5 +10 +15 + + + + +0 +5 +10 +15 +20 + + + + + +0 +5 +10 +15 +20 + + + + + +Minute of block generation +Total size of transactions [MB] + +Block + + + + + + + + +RB +EB later not certified +EB later certified +EB now certified +Rust, linear-with-tx-references, topology-v2, 4 vCPU/node, 10 Mb/s, 7 slot/stage, 12 MB/EB, 1500 B/Tx +Disposition of transactions in blocks + + diff --git a/docs/cip/images/elapsed-EB.svg b/docs/cip/images/elapsed-EB.svg new file mode 100644 index 000000000..23f92420b --- /dev/null +++ b/docs/cip/images/elapsed-EB.svg @@ -0,0 +1,4026 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0.100 TxMB/s + + + + + + + + + + +0.150 TxMB/s + + + + + + + + + + +0.200 TxMB/s + + + + + + + + + + +0.250 TxMB/s + + + + + + + + + + +0.300 TxMB/s + + + + + + +0 +1 +2 +3 +Time from generation to receipt at node [s] +Number received + +Minute created + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +Rust, linear-with-tx-references, topology-v2, 4 vCPU/node, 10 Mb/s, 7 slot/stage, 12 MB/EB, 1500 B/Tx +Arrival delay for EB + + diff --git a/docs/cip/images/elapsed-IB.png b/docs/cip/images/elapsed-IB.png deleted file mode 100644 index e35ae7b5b..000000000 Binary files a/docs/cip/images/elapsed-IB.png and /dev/null differ diff --git a/docs/cip/images/elapsed-RB.svg b/docs/cip/images/elapsed-RB.svg new file mode 100644 index 000000000..9a6606a9f --- /dev/null +++ b/docs/cip/images/elapsed-RB.svg @@ -0,0 +1,3763 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0.100 TxMB/s + + + + + + + + + + +0.150 TxMB/s + + + + + + + + + + +0.200 TxMB/s + + + + + + + + + + +0.250 TxMB/s + + + + + + + + + + +0.300 TxMB/s + + + + + +0 +1 +2 +Time from generation to receipt at node [s] +Number received + +Minute created + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +Rust, linear-with-tx-references, topology-v2, 4 vCPU/node, 10 Mb/s, 7 slot/stage, 12 MB/EB, 1500 B/Tx +Arrival delay for RB + + diff --git a/docs/cip/images/elapsed-TX.svg b/docs/cip/images/elapsed-TX.svg new file mode 100644 index 000000000..99ded8b82 --- /dev/null +++ b/docs/cip/images/elapsed-TX.svg @@ -0,0 +1,1938 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0.100 TxMB/s + + + + + + + + + + +0.150 TxMB/s + + + + + + + + + + +0.200 TxMB/s + + + + + + + + + + +0.250 TxMB/s + + + + + + + + + + +0.300 TxMB/s + + + + + + + +0.0 +0.5 +1.0 +1.5 +2.0 +Time from generation to receipt at node [s] +Number received + +Minute created + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +Rust, linear-with-tx-references, topology-v2, 4 vCPU/node, 10 Mb/s, 7 slot/stage, 12 MB/EB, 1500 B/Tx +Arrival delay for TX + + diff --git a/docs/cip/images/elapsed-VT.svg b/docs/cip/images/elapsed-VT.svg new file mode 100644 index 000000000..385d97762 --- /dev/null +++ b/docs/cip/images/elapsed-VT.svg @@ -0,0 +1,2858 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0.100 TxMB/s + + + + + + + + + + +0.150 TxMB/s + + + + + + + + + + +0.200 TxMB/s + + + + + + + + + + +0.250 TxMB/s + + + + + + + + + + +0.300 TxMB/s + + + + + + + +0.0 +0.5 +1.0 +1.5 +2.0 +Time from generation to receipt at node [s] +Number received + +Minute created + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +Rust, linear-with-tx-references, topology-v2, 4 vCPU/node, 10 Mb/s, 7 slot/stage, 12 MB/EB, 1500 B/Tx +Arrival delay for VT + + diff --git a/docs/cip/images/ingress-average-area.svg b/docs/cip/images/ingress-average-area.svg new file mode 100644 index 000000000..4cf19f9ca --- /dev/null +++ b/docs/cip/images/ingress-average-area.svg @@ -0,0 +1,306 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0.100 TxMB/s + + + + + + + + + + +0.150 TxMB/s + + + + + + + + + + +0.200 TxMB/s + + + + + + + + + + +0.250 TxMB/s + + + + + + + + + + +0.300 TxMB/s + + + + + + +0 +500 +1000 +1500 +0 +1 +2 + + + +0 +1 +2 +3 + + + + +0 +1 +2 +3 + + + + +0 +1 +2 +3 +4 + + + + + +0 +2 +4 + + + +Slot [s] +Mean network ingress among nodes [Mb/s] + +Message + + + + + + + + +EB +RB +TX +VT +Rust, linear-with-tx-references, topology-v2, 4 vCPU/node, 10 Mb/s, 7 slot/stage, 12 MB/EB, 1500 B/Tx +Mean nodal ingress + + diff --git a/docs/cip/images/leios-forecast-sqrt-fill.svg b/docs/cip/images/leios-forecast-sqrt-fill.svg index e5203cd12..3a2580423 100644 --- a/docs/cip/images/leios-forecast-sqrt-fill.svg +++ b/docs/cip/images/leios-forecast-sqrt-fill.svg @@ -24,95 +24,94 @@ - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Profitability depends strongly -upon hosting environment - - - -Break-even + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Profitability depends strongly +upon hosting environment + + + +Break-even -0 -100 -200 -300 -400 - - - - - - - - - - - - - - - -25 -50 -75 -100 -150 -200 -250 -500 -750 -1000 -Transaction rate [tx/s] -Revenue / expense ratio [%] - -Cloud hosting - - - - -Value -Premium -Notional approximate forecast mostly based on "business as usual" assumptions -SPO profitability under Leios, without rewards from the Reserve +0 +100 +200 +300 +400 + + + + + + + + + + + + + + + +25 +50 +75 +100 +150 +200 +250 +500 +750 +1000 +Throughput [TxkB/s] +Revenue / expense ratio [%] + +Cloud hosting + + + + +Value +Premium diff --git a/docs/cip/images/lifecycle-histogram.png b/docs/cip/images/lifecycle-histogram.png deleted file mode 100644 index 2d29e6a1f..000000000 Binary files a/docs/cip/images/lifecycle-histogram.png and /dev/null differ diff --git a/docs/cip/images/network.png b/docs/cip/images/network.png deleted file mode 100644 index 778c88fd5..000000000 Binary files a/docs/cip/images/network.png and /dev/null differ diff --git a/docs/cip/images/node-behavior-sequence.svg b/docs/cip/images/node-behavior-sequence.svg new file mode 100644 index 000000000..d681b4f59 --- /dev/null +++ b/docs/cip/images/node-behavior-sequence.svg @@ -0,0 +1,299 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Upstream + previous block (RB) producer + + + + Block Producer + current node + + + + Downstream + subsequent node(s) + + + + + + + + + + + + + + + + + + + + + + + + + Lrecover + + + + + + + + + + Transaction Propagation + + + + + + + Block Production + + + + + + + EB Diffusion + + + + + + + Voting & Certification + + + + + + + + + Diffuse Transaction + + + + + + Add to Mempool + + + + + + Diffuse Transaction + + + + + + Add to Mempool + + + + + + + + + 1. Create RB + & announce EB + + + + + + 2a. Sync chain + relay headers + + + + + + 2b. Sync chain + relay headers + + + + + + 3. Fetch RB Body + + + + + + 4. Validate and adopt RB + + + + + + 5. Serve RB + + + + + + + + + 6. Fetch EB + + + + + + 6a. Fetch missing transactions + + + + + + 6b. Validate EB body (fast) + + + + + + 7. Serve EB + + + + + + 7a. Fetch missing transactions + + + + + + 8. Validate endorsed + transactions (slow) + + + + + + + + + 9. Vote on EB + (if eligible) + + + + + + 10. Relay votes + + + + + + 10a. Relay votes (+ own vote) + + + + + + + + + 11. Aggregate certificate + from votes + + + + + + 12. Create next RB + certifying EB & + announcing next EB + + + + + Time in slots + \ No newline at end of file diff --git a/docs/cip/images/plutus-cpu-mean-histogram.png b/docs/cip/images/plutus-cpu-mean-histogram.png new file mode 100644 index 000000000..727e9ed2b Binary files /dev/null and b/docs/cip/images/plutus-cpu-mean-histogram.png differ diff --git a/docs/cip/images/plutus-temporal-efficiency-bar.png b/docs/cip/images/plutus-temporal-efficiency-bar.png new file mode 100644 index 000000000..4209d7c11 Binary files /dev/null and b/docs/cip/images/plutus-temporal-efficiency-bar.png differ diff --git a/docs/cip/images/protocol-flow-detail.svg b/docs/cip/images/protocol-flow-detail.svg new file mode 100644 index 000000000..d4d14e3d0 --- /dev/null +++ b/docs/cip/images/protocol-flow-detail.svg @@ -0,0 +1,349 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Standard Validation + + + + Certificate-Active + + + + Standard Validation + + + + + + + + + + Lrecover-RB3 + + + + + + + + Lrecover-RB5 + + + + + + + Certificate starts + Lrecover window + + + Resets + Lrecover-RB3 + + + Windows expired, + validation required + + + + + + + + RB₁ + [Txs] + + + + + + RB₂ + [Txs] + + + + + announces + + + + + EB₁ + [TxRefs] + + + + + + RB₃ + [Txs] + + + + + + + CEB1 + + + + + + + + + + RB₄ + [Txs] + + + + + + + + + + announces + + + + + EB₂ + [TxRefs] + + + + + + <TxBitMap>RB3 + + + + + + RB₅ + [Txs] + + + + + + + CEB2 + + + + + + + + + + + + + RB₆ + [Txs] + + + + + + + + RB₇ + [Txs] + + + + + + + + RB₈ + [Txs] + + + + + + <TxBitMap>RB5-7 + + + + + + ... + + + + + + + + + + Lvote + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lvote + + + + + + + + + + + + + + + + + + + + + + + + + + Legend + + + + + + + + + + Ranking Block (RB) + + + + + + Endorser Block (EB) + + + + + + Certificate + + + + + + + Vote + + + + + + + Lrecover window + + + + + Transaction execution bitmap + + \ No newline at end of file diff --git a/docs/cip/images/protocol-flow-overview.svg b/docs/cip/images/protocol-flow-overview.svg new file mode 100644 index 000000000..42fbb6c50 --- /dev/null +++ b/docs/cip/images/protocol-flow-overview.svg @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Time in slots + + + + + + + + + + + Lrecover-RB' + + + + + + + + + + ... + + + + + RB + [Txs] + + + + + announces + + + + + EB + [TxRefs] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lvote + + + + + + + RB' + [Txs] + + + + + + + + CEB + + + + + + + + + + + + ... + + + + + Legend + + + + + + + + + Ranking Block (RB) + + + + + + Endorser Block (EB) + + + + + + Certificate + + + + + + Vote + + + + + + + Lrecover window + + + \ No newline at end of file diff --git a/docs/cip/images/reach-rb-tx.svg b/docs/cip/images/reach-rb-tx.svg new file mode 100644 index 000000000..9cecf9f46 --- /dev/null +++ b/docs/cip/images/reach-rb-tx.svg @@ -0,0 +1,4018 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0.100 TxMB/s + + + + + + + + + + +0.150 TxMB/s + + + + + + + + + + +0.200 TxMB/s + + + + + + + + + + +0.250 TxMB/s + + + + + + + + + + +0.300 TxMB/s + + + + + + +50 +100 +150 +200 +Time for transaction to reach ledger [s] +Number of items + +Minute created + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +Rust, linear-with-tx-references, topology-v2, 4 vCPU/node, 10 Mb/s, 7 slot/stage, 12 MB/EB, 1500 B/Tx +Time for transaction to reach the ledger + + diff --git a/docs/cip/images/references-tx.svg b/docs/cip/images/references-tx.svg new file mode 100644 index 000000000..2d2acbbd6 --- /dev/null +++ b/docs/cip/images/references-tx.svg @@ -0,0 +1,291 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0.100 TxMB/s + + + + + + + + + + +0.150 TxMB/s + + + + + + + + + + +0.200 TxMB/s + + + + + + + + + + +0.250 TxMB/s + + + + + + + + + + +0.300 TxMB/s + + + + + + +1 +2 +3 +4 +0 +10000 +20000 + + + +0 +10000 +20000 +30000 +40000 + + + + + +0 +20000 +40000 +60000 + + + + +0 +20000 +40000 +60000 +80000 + + + + + +0 +25000 +50000 +75000 + + + + +References +Number of TX +Rust, linear-with-tx-references, topology-v2, 4 vCPU/node, 10 Mb/s, 7 slot/stage, 12 MB/EB, 1500 B/Tx +Number of TX references (0 = not used, 2+ = duplicated) + + diff --git a/docs/cip/images/reward-forecast-bau.svg b/docs/cip/images/reward-forecast-bau.svg index a7a203966..253741c2c 100644 --- a/docs/cip/images/reward-forecast-bau.svg +++ b/docs/cip/images/reward-forecast-bau.svg @@ -57,18 +57,18 @@ -2022.5 -2025.0 -2027.5 -2030.0 +2022.5 +2025.0 +2027.5 +2030.0 -0 -5 -10 -15 +0 +5 +10 +15 @@ -78,16 +78,16 @@ -200 -400 -600 -800 -1000 -Year -Epoch -Reward [millon ADA / epoch] +200 +400 +600 +800 +1000 +Year +Epoch +Reward [millon ADA / epoch] -Source +Source @@ -96,11 +96,10 @@ -Fees -Reserve -Fees (forecast) -Reserve (forecast) -Conservative approximate forecast mostly based on "business as usual" assumptions -Rewards on Cardano mainnet +Fees +Reserve +Fees (forecast) +Reserve (forecast) + diff --git a/docs/cip/images/rolling-window-simplified.svg b/docs/cip/images/rolling-window-simplified.svg new file mode 100644 index 000000000..2dc9cd707 --- /dev/null +++ b/docs/cip/images/rolling-window-simplified.svg @@ -0,0 +1,255 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Standard Validation + + + + + Certificate Active + + + + + Standard Validation + + + + + Certificate Active + + + + + Std. Val. + + + ... + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Legend + + + + + + + + + Ranking Block (RB) + + + + + + Endorser Block (EB) + + + + + + Certificate + + + + + + + Lrecover window + + + \ No newline at end of file diff --git a/docs/cip/images/spo-profitability.svg b/docs/cip/images/spo-profitability.svg index 4f07e4624..cb4e862ee 100644 --- a/docs/cip/images/spo-profitability.svg +++ b/docs/cip/images/spo-profitability.svg @@ -52,21 +52,21 @@ -Surplus for reducing fees, -augmenting treasury, -and increasing rewards -Unprofitable Profitable +Surplus for reducing fees, +augmenting treasury, +and increasing rewards +Unprofitable Profitable -Break-even +Break-even -Maximum Praos throughput +Maximum Praos throughput -0 -50 -100 -150 -200 +0 +50 +100 +150 +200 @@ -77,14 +77,13 @@ -0 -25 -50 -75 -100 -Throughput [tx/s] -Revenue / expense ratio [%] -Notional approximate forecast mostly based on "business as usual" assumptions -SPO profitability under Praos, without rewards from the Reserve +0 +25 +50 +75 +100 +Throughput [tx/s] +Revenue / expense ratio [%] + diff --git a/docs/cip/images/temporal-efficiency-bar.svg b/docs/cip/images/temporal-efficiency-bar.svg new file mode 100644 index 000000000..fd84742e0 --- /dev/null +++ b/docs/cip/images/temporal-efficiency-bar.svg @@ -0,0 +1,727 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0.100 TxMB/s + + + + + + + + + + +0.150 TxMB/s + + + + + + + + + + +0.200 TxMB/s + + + + + + + + + + +0.250 TxMB/s + + + + + + + + + + +0.300 TxMB/s + + + + + + + + + + + + + + + + + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +0 +25 +50 +75 +100 + + + + + +0 +25 +50 +75 +100 + + + + + +0 +25 +50 +75 +100 + + + + + +0 +25 +50 +75 +100 + + + + + +0 +25 +50 +75 +100 + + + + + +Submitted [minute] +Fraction [%] + +Outcome + + + + + + + + + + +Ledger in 1st min +Ledger in 2nd min +Ledger in 3rd min +Ledger later +Lost +Rust, linear-with-tx-references, topology-v2, 4 vCPU/node, 10 Mb/s, 7 slot/stage, 12 MB/EB, 1500 B/Tx +Transactions reaching the ledger + + diff --git a/docs/cip/partial-eb-certification-proposal.md b/docs/cip/partial-eb-certification-proposal.md new file mode 100644 index 000000000..47fa4283e --- /dev/null +++ b/docs/cip/partial-eb-certification-proposal.md @@ -0,0 +1,160 @@ +# Partial Endorsement Block Certification via Merkle Trees + +## Abstract + +This proposal introduces a merkle tree-based approach to Endorsement Block (EB) certification in Leios, allowing Ranking Block (RB) producers to make progress with partially available transaction sets rather than requiring complete EB availability. This addresses the critical edge case where network conditions prevent full EB propagation within the required time bounds. + +## Motivation + +The current Linear Leios design faces a challenging edge case: when an RB producer receives an EB certificate but lacks the certified EB's contents, they cannot build the required ledger state. This creates a dilemma: + +1. **Wait for the EB**: Violates the Δ_RB timing assumption, potentially compromising Praos security +2. **Build on different chain**: Leads to short forks and reduced chain growth +3. **Include invalid transactions**: Compromises the consensus guarantees + +These solutions either weaken security assumptions or degrade user experience. We need a mechanism that allows forward progress while maintaining cryptographic soundness. + +## Key Idea + +Transform EBs from monolithic transaction lists into merkle trees, where: +- EB producers announce a merkle root of their transaction set +- Voters can vote on partial views (merkle paths) they've observed +- RB producers can include transaction subsets with merkle proofs +- Certificates attest to the merkle root, not complete contents + +This enables **progressive consensus**: nodes agree on increasingly specific subsets as data propagates. + +## Design Details + +### 1. EB Structure + +Replace the current EB structure: +``` +Current: EB = [tx_id_1, tx_id_2, ..., tx_id_n] +Proposed: EB = MerkleRoot(OrderedTxTree) +``` + +Using an order-preserving structure like: +- **Indexed Merkle Tree**: Each leaf = `hash(index || tx_id)` +- **Merkle Mountain Range**: Natural append-order preservation +- **Vector Commitment**: Proves both membership and position + +### 2. Hierarchical Voting + +Voters cast votes on the deepest merkle path they can verify: + +``` +Vote = { + eb_id: Hash, + merkle_path: Path, + path_depth: Integer, + stake: Amount +} +``` + +Example voting tree: +``` +Root (90% stake voted) +├── PathA (75% stake) +│ ├── PathA1 (60% stake) +│ └── PathA2 (45% stake) +└── PathB (70% stake) + └── PathB1 (65% stake) +``` + +### 3. Certificate Creation + +An EB certificate includes: +``` +Certificate = { + merkle_root: Hash, + total_tx_count: Integer, + min_inclusion_threshold: Percentage, + votes: [Vote] +} +``` + +### 4. RB Production Algorithm + +When producing an RB with an EB certificate: + +```python +def select_transactions(certificate, local_mempool): + # Start from root + current_path = certificate.merkle_root + selected_txs = [] + + # Traverse tree following highest-voted paths + while can_go_deeper(current_path): + children = get_children_paths(current_path) + # Filter by: (1) sufficient votes, (2) local availability + valid_children = filter( + lambda p: has_quorum(p) and available_locally(p), + children + ) + if not valid_children: + break + current_path = max_votes(valid_children) + selected_txs.extend(get_txs_at_path(current_path)) + + return selected_txs, generate_merkle_proof(selected_txs) +``` + +### 5. Reward Mechanism + +Proportional rewards based on inclusion: +``` +reward = base_reward × (included_tx_count / total_tx_count) +``` + +This incentivizes maximum inclusion while allowing degraded operation. + +## Security Considerations + +### Advantages + +1. **Graceful Degradation**: Network congestion causes reduced throughput, not complete stalls +2. **Maintained Consensus**: All nodes still agree on the certified merkle root +3. **Verifiable Partial Sets**: Merkle proofs ensure included transactions are legitimate +4. **Economic Alignment**: Rewards incentivize maximum feasible inclusion + +### Potential Concerns + +1. **Vote Dilution**: Stake might be spread across multiple paths rather than concentrated +2. **Complexity**: Increased computational and storage requirements for vote tracking +3. **Weaker Attestation**: Votes attest "I've seen at least X" rather than "I've seen exactly Y" + +### Mitigations + +- **Minimum Thresholds**: Require voters see >X% of transactions before voting +- **Depth Limits**: Bound merkle tree depth to limit complexity +- **Time Windows**: Longer L_vote periods to allow fuller propagation + +## Comparison with Existing Proposals + +| Approach | Pros | Cons | +|----------|------|------| +| **ThereIsNoProblem** | Simple, secure | Requires very fast EB propagation | +| **Shavasana** | Guaranteed time for propagation | Reduces throughput with empty RBs | +| **NonRecursiveRbValidity** | Always make progress | Invalid txs on chain, complex corrections | +| **Partial Certification** | Adaptive to network conditions | Increased protocol complexity | + +## Implementation Considerations + +1. **Merkle Structure Choice**: Need benchmarks for different order-preserving structures +2. **Vote Aggregation**: Efficient algorithms for tracking votes across tree paths +3. **Network Protocol**: Extensions to gossip votes on partial paths +4. **Mempool Coordination**: Ensuring transaction availability alignment + +## Open Questions + +1. What minimum inclusion threshold provides adequate security? +2. How deep should merkle trees be for optimal performance/security trade-off? +3. Can vote aggregation be made efficient enough for mainnet scale? +4. How does this interact with adversarial EB producers who might create unbalanced trees? + +## Conclusion + +Merkle tree-based partial EB certification offers a promising middle ground between the rigid "all-or-nothing" current design and proposals that compromise on consensus guarantees. By enabling progressive consensus on transaction subsets, we can maintain forward progress during adverse network conditions while preserving cryptographic soundness and economic incentives. + +This approach warrants further investigation through formal security analysis and simulation to validate its practical feasibility. \ No newline at end of file