Skip to content

Instantly share code, notes, and snippets.

@chriseth
Last active July 23, 2021 21:59
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chriseth/4168b56bfe638cae8da1945dd988600b to your computer and use it in GitHub Desktop.
Save chriseth/4168b56bfe638cae8da1945dd988600b to your computer and use it in GitHub Desktop.
Gas costs for pairings
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "Gas costs for pairings"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": "# Pairs of \"Number of curve point pairs in the input\" and \"runtime in milliseconds\"\npairings = [(0, 1.83052), (2, 8.86555), (3, 11.6522), (5, 18.867), (10, 33.3857), (100, 310.811), (0, 1.82699), (2, 8.16349), (3, 11.2083), (5, 17.2602), (10, 32.7265), (100, 309.454), (0, 1.7546), (2, 8.14648), (3, 11.1569), (5, 17.9096), (10, 32.6548), (100, 310.515), (0, 1.83007), (2, 8.25916), (3, 11.1989), (5, 17.7065), (10, 37.2969), (100, 308.766), (0, 1.75853), (2, 8.20165), (3, 11.1632), (5, 17.8126), (10, 32.7409), (100, 308.66), (0, 1.75275), (2, 8.1851), (3, 11.1747), (5, 17.3392), (10, 32.7988), (100, 310.884), (0, 1.83573), (2, 8.19209), (3, 11.2713), (5, 17.2319), (10, 32.7628), (100, 311.748), (0, 1.83251), (2, 8.19629), (3, 12.0662), (5, 17.8273), (10, 32.4779), (100, 309.65), (0, 1.78006), (2, 8.7051), (3, 11.7381), (5, 17.769), (10, 32.5438), (100, 308.491), (0, 2.25923), (2, 8.32628), (3, 11.2018), (5, 17.6404), (10, 33.0981), (100, 307.664), (0, 1.85546), (2, 8.1962), (3, 11.1664), (5, 17.1973), (10, 33.0851), (100, 309.512), (0, 1.83676), (2, 8.24572), (3, 11.3606), (5, 17.8353), (10, 32.4995), (100, 318.651), (0, 1.78416), (2, 8.25256), (3, 11.4517), (5, 18.2653), (10, 35.2291), (100, 308.923), (0, 1.83081), (2, 8.28694), (3, 11.7541), (5, 17.2086), (10, 32.7599), (100, 309.146), (0, 1.75393), (2, 8.17977), (3, 11.7071), (5, 17.3187), (10, 32.8494), (100, 308.214), (0, 1.75844), (2, 8.65464), (3, 11.1771), (5, 17.1821), (10, 33.1317), (100, 309.33), (0, 1.75325), (2, 8.59196), (3, 11.1686), (5, 17.1916), (10, 32.9297), (100, 308.688), (0, 1.75771), (2, 8.59938), (3, 11.1979), (5, 17.1938), (10, 32.8833), (100, 307.804), (0, 1.99908), (2, 8.17424), (3, 11.3151), (5, 17.2734), (10, 32.8323), (100, 313.187), (0, 1.83568), (2, 8.23309), (3, 11.6604), (5, 17.2291), (10, 32.2905), (100, 308.901), ]\npairings_initial = [(n, t) for (n, t) in pairings if n < 50]\ndef sizes(data): return [n for (n, t) in data]\ndef times(data): return [t for (n, t) in data]\n",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 98
},
{
"cell_type": "code",
"collapsed": false,
"input": "# Fit the pairing numbers to a quadratic curve\nimport numpy\nimport scipy.optimize as opt\nprint \"Parameters if we also take large inputs into account:\"\nparams_quadrlarge,covariant = opt.curve_fit(lambda x, a, b, c: a * x**2 + b*x + c,\n numpy.array(sizes(pairings)), numpy.array(times(pairings)))\na, b, c = params_quadrlarge\nprint \"{a}*x**2 + {b}*x + {c}\".format(**locals())\nprint \"Parameters if we focus on small inputs:\"\nparams_quadrsmall,covariant = opt.curve_fit(lambda x, a, b, c: a * x**2 + b*x + c,\n numpy.array(sizes(pairings_initial)), numpy.array(times(pairings_initial)))\na, b, c = params_quadrsmall\nprint \"{a}*x**2 + {b}*x + {c}\".format(**locals())\n\nprint \"Force quadratic parameter to zero (with large):\"\nparams_linlarge,covariant = opt.curve_fit(lambda x, b, c: b*x + c,\n numpy.array(sizes(pairings)), numpy.array(times(pairings)))\nb, c = params_linlarge\nprint \"{b}*x + {c}\".format(**locals())\nprint \"Force quadratic parameter to zero (only small):\"\nparams_linsmall,covariant = opt.curve_fit(lambda x, b, c: b*x + c,\n numpy.array(sizes(pairings_initial)), numpy.array(times(pairings_initial)))\nb, c = params_linsmall\nprint \"{b}*x + {c}\".format(**locals())\n\n",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "Parameters if we also take large inputs into account:\n-0.000475318176065*x**2 + 3.12746434532*x + 1.95640203489\nParameters if we focus on small inputs:\n-0.0053791891938*x**2 + 3.17838187981*x + 1.88801970248\nForce quadratic parameter to zero (with large):\n3.07842143634*x + 2.13413093702\nForce quadratic parameter to zero (only small):\n3.12199313726*x + 1.96510905296\n"
}
],
"prompt_number": 103
},
{
"cell_type": "code",
"collapsed": false,
"input": "def quadr(t, params):\n return params[0] * t**2 + params[1] * t + params[2]\ndef lin(t, params):\n return params[0] * t + params[1]\nfor p in (pairings, pairings_initial):\n t = np.linspace(0, max(sizes(p)))\n plt.scatter(sizes(p), times(p))\n plt.plot(t, quadr(t, params_quadrlarge), color=\"red\")\n plt.plot(t, quadr(t, params_quadrsmall), color=\"blue\")\n plt.plot(t, lin(t, params_linlarge), color=\"yellow\")\n plt.plot(t, lin(t, params_linsmall), color=\"green\")\n plt.axvline()\n plt.axhline()\n plt.show()",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAEACAYAAABfxaZOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xlc1NX+x/HXICipqEQCyqgQiziKMmqopYUpeq0kTUPR\nlBSttM30Z2ZqYYtg2c09l7QozSVTMVMil9FywwXMRMMFkz0VUZGd+f7+mHu5WVoIAzPDfJ6PxzyC\n+W4fEt9zPN/zPUelKIqCEEIIq2Bj6gKEEELUHAl9IYSwIhL6QghhRST0hRDCikjoCyGEFZHQF0II\nK1Kh0C8sLKRLly74+/uj0WiYOnUqABEREajVarRaLVqtlu3bt5cfExkZibe3N76+vsTFxVVP9UII\nIe6KqqLj9PPz86lfvz6lpaV0796dOXPmsHPnThwcHJg4ceIt+yYlJTFs2DAOHz5Meno6vXv3Jjk5\nGRsb+YeFEEKYUoVTuH79+gAUFxdTVlaGo6MjALf7zIiJiSE0NBQ7Ozvc3d3x8vIiPj7eSCULIYSo\nrAqHvl6vx9/fHxcXF3r27Enbtm0BWLBgAR06dCA8PJzc3FwAMjIyUKvV5ceq1WrS09ONXLoQQoi7\nVeHQt7GxITExkbS0NPbu3YtOp2PcuHGkpKSQmJhIs2bNmDRp0h2PV6lURilYCCFE5dne7QGNGzfm\n8ccf58iRIwQGBpa/P2bMGPr37w+Am5sbqamp5dvS0tJwc3O75TxeXl6cO3eukmULIYR18vT05OzZ\ns5U+vkIt/cuXL5d33RQUFPDDDz+g1WrJysoq32fTpk34+fkBEBwczNq1aykuLiYlJYUzZ84QEBBw\nyznPnTuHoigW+4K3TV5DVV5vvy31S/3WWb8l164oSpUbyxVq6WdmZhIWFoZer0ev1zNixAh69erF\nyJEjSUxMRKVS4eHhwdKlSwHQaDSEhISg0WiwtbVl8eLF0r0jhBBmoEKh7+fnx7Fjx/7y/hdffHHH\nY958803efPPNylcmhBDC6GTgfKUFmrqAKvnj/RhLJPWbliXXb8m1G0OFH84y+oVVKkx0aaNQqcCC\nyxdCWKiqZqe09IUQwopI6AshhBWR0BdCCCsioS+EEFZEQl8IIayIhL4QQlgRCX0hhLAiEvpCCGFF\n7nqWTSGEsEQFBQXMmfMxv/xylm7dtLz88njq1Klj6rJqnDyRW0nyRK4QlqO0tJQHHwzixAknCgv7\nUr/+Vzz2WAu+/vrO84eZq6pmp4R+JUnoC2E5Dhw4QJ8+Y8jL+xmoA+RTr56alJSTNGvWzNTl3ZWq\nZqd07wghar2ioiJUqgbAIuAc0B6Vqh7FxcUmrqzmSUu/kqSlL4TluHHjBk5OHpSU+IPqX6CsxtHx\nCpcvX8DGxrLGs8iEa0II8Q+OHTtGSck90O5peH452Gzm6tXL/P7776YurcZJ6Ashar0lK5bAk1eh\n53iIKQZ9Z6AO+/fvN3VpNU5CXwhRqyVmJbKuyTpQFaLZ9CV7X1Rjo1oLlPLZZ5+ZurwaJ6EvhKiV\nFEVh/qH5BH0ZhKJTmFnalJ8Pj0ApBVubhwAHEhMTTV1mjatQ6BcWFtKlSxf8/f3RaDRMnToVgJyc\nHIKCgvDx8aFPnz7k5uaWHxMZGYm3tze+vr7ExcVVT/VCCHEbl25eov+a/nz585ccHLadU+Ntmbog\ni5cHR/BIxI8Ul50EbjBw4EBTl1rjKjx6Jz8/n/r161NaWkr37t2ZM2cOW7Zs4b777uP1119n9uzZ\nXL16laioKJKSkhg2bBiHDx8mPT2d3r17k5ycfMtdchm9I4SoDrtTdjNi0wiG+w3n3WbtqVtvNCVZ\nTfHsf5nUa/aAL5AElFBYmEu9evVMXPHdqbHRO/Xr1weguLiYsrIyHB0d2bJlC2FhYQCEhYWxefNm\nAGJiYggNDcXOzg53d3e8vLyIj4+vdJFCCPFPSspKmL5rOsM3DmflE8uZzWnquo6AK6Ox65HKh0uj\ngTLgZ1QqOHBgt8UFvjFUOPT1ej3+/v64uLjQs2dP2rZtS3Z2Ni4uLgC4uLiQnZ0NQEZGBmq1uvxY\ntVpNenq6kUsXQgiDC7kXeOTzRziScYSE4C/oc+UZaLEbindD108AFUOGDEFRbqAo+ej11+nataup\nyzaJCoe+jY0NiYmJpKWlsXfvXnbv3n3LdpVKhUqluuPxf7dNCCEq6+uTXxOwPICn2jzFNjctLg37\nAn7gnQ3NHzF1eWbnrqdhaNy4MY8//jhHjx7FxcWFrKwsXF1dyczMxNnZGQA3NzdSU1PLj0lLS8PN\nze0v54qIiCj/OjAwkMDAwLv/CYQQVim/JJ8JsRPYlbKLbU+upvPZCdAxGa4vhG7jTF2e0eh0OnQ6\nndHOV6EbuZcvX8bW1pYmTZpQUFBA3759efvtt/n+++9xcnJiypQpREVFkZube8uN3Pj4+PIbuWfP\nnr2ltS83coUQlfVz9s8M3TCUjs06stgtkEYNX4SS5uCtgwatTF1etaqRCdcyMzMJCwtDr9ej1+sZ\nMWIEvXr1QqvVEhISwooVK3B3d2f9+vUAaDQaQkJC0Gg02NrasnjxYuneEUJUmaIoLD68mIg9EXzU\nazYjUzeC13OQ9gL4LwIkZ/6JTLhWSdLSF6JmXcm/QviWcFKvp7KmyzR8csZAy1JotBWaPmzq8mqM\nTLgmhKj19v62F+1SLZ6O97PfLRAfp6ehSXvwyLaqwDcGmU9fCGG2SvWlvLf3PZYeXcqKnnN4LOVd\n6HEObi4Ebe25WVuTJPSFEGbp4rWLPLPxGerWqcuxTtNophoFbdyg0Vlwrt03a6uTdO8IIczOplOb\neGD5Azx+fx/ibO1o5vcq3DMGNOfBXgK/KqSlL4QwGwUlBUyKm0Ts2Vhius2i6/X/gx5lYLMTfANN\nXV6tIC19IYRZOPn7SQI+DeBqwVUSmj9OV/Vz0Mof1JngGGjq8moNCX0hhEkpisLSI0sJjA5kYtvR\nfFVwlMaPLgHbBaDZDaoGpi6xVpHuHSGEyVwtuMrYb8dyNucsP2om4ltvCjzYHBySwcnD1OXVStLS\nF0KYxE8Xf8J/qT/q+q4ctGuKb5fpcF84eJ6HuhL41UWeyK0keSJXiMop05fx/o/vs/jwYpa3n0T/\nvFnQrRQabgGHnqYuz+zVyNw7QghhDGnX03hm4zPYqGw42rQ/bp5vgNIdXLeCysHU5VkF6d4RQtSI\nmNMxdFrWiT5Nu/BD0UXcgj8Hh3ngtUcCvwZJS18IUa0KSwuZHDeZrWe2srnlaLo1+jf4uYLDabD1\nNHV5Vkda+kKIanPq0ikClgeQfS2dBJtWdHv0Q2gVBi3PmyzwCwpMclmzIaEvhDA6RVH49NinPPz5\nw7zi2o91+p00GXoU7tkOLZcBdWq8posXYdw48POD0tIav7zZkNAXQhhVbmEuQzYMYcGhBext1Jcx\nmo9QdfeDpmnQIKjG60lJgeeeA60WHB3hwAGwteKObQl9IYTR7E/dj3apFmflHg6V3qDNkPXgNAda\n/QQ0rtFazp2D8HB44AFwcYHkZJg1C5o2rdEyzI4Vf94JIYylTF9G1E9RzI+fzzLnQTzptAIecgGH\nk1DHu0ZrOXsW3n8fvv0WXnoJzpwxtPCFgYS+EKJK0q+nM2LTCPSlJRzFG3XfZVAWBs2XAHY1VsfZ\ns/Dee/Ddd4awP3sWmjSpsctbjAp176SmptKzZ0/atm1Lu3btmD9/PgARERGo1Wq0Wi1arZbt27eX\nHxMZGYm3tze+vr7ExcVVT/VCCJPamryVTss6EWjrzk7VcdSjEw1r1jZfQU0F/rlz8Oyz0K0b3H+/\noWX/9tsS+HdSoWkYsrKyyMrKwt/fn7y8PDp16sTmzZtZv349Dg4OTJw48Zb9k5KSGDZsGIcPHyY9\nPZ3evXuTnJyMjc3/PmNkGgYhLFdRaRGv//A6m09vZrVNJ7r3/haadAa374B7a6SG8+cNLfstW+Dl\nl+HVV60j6GtkYXRXV1f8/f0BaNiwIW3atCE9PR3gthePiYkhNDQUOzs73N3d8fLyIj4+vtJFCiHM\nx6+Xf6Xriq6kZp0moURF97Ct0HwWuO2nJgL/wgUYOxYCAqBFC0M3jrTsK+6uR+9cuHCBhIQEunbt\nCsCCBQvo0KED4eHh5ObmApCRkYFarS4/Rq1Wl39ICCEsk6IofJ74Od0/687zqjZ847ybe8NKodFx\ncJwMqKr1+qmphnH2nTqBq6thNM7MmRL2d+uubuTm5eUxePBg5s2bR8OGDRk3bhxvvfUWADNmzGDS\npEmsWLHitseqVH/9hYiIiCj/OjAwkMDAwLspRwhRQ64XXeeFrS9wPCOB3cX30y74a1CFgstyoF61\nXjsjAyIj4auvDC38X3+F++6r1kuaFZ1Oh06nM9r5Khz6JSUlDBo0iGeeeYYBAwYA4OzsXL59zJgx\n9O/fHwA3NzdSU1PLt6WlpeHm5vaXc/4x9IUQ5ik+PZ7Qb0IJqt+Ww7bp1H8xFew3gn3/ar3u779D\nVBR8/jmMGgWnTsEfIsdq/LlBPHPmzCqdr0LdO4qiEB4ejkajYcKECeXvZ2Zmln+9adMm/Pz8AAgO\nDmbt2rUUFxeTkpLCmTNnCAgIqFKhQoiapVf0fLDvA/p/1Z8PirxZ8sB26g/0hSYp1Rr4OTkwdSq0\naQMlJXDyJHz0kXUGfnWoUEt/3759rFq1ivbt26PVagGYNWsWa9asITExEZVKhYeHB0uXLgVAo9EQ\nEhKCRqPB1taWxYsX37Z7RwhhnrLyshi5aST5N3I4XGBPy1d2gc070OgNqqvv/vp1+PhjWLAAnnoK\nEhKgZctquZRVk5WzKkmGbIraavuZ7YzeMprn6mqZod6BbY/74N5YsGlfLdfLz4eFC2HOHOjbFyIi\nwFNmXL4jWTlLCGEUxWXFTN0xlfW/rGXtjWY8MnYH1BsE960E7jH69YqKYPlyw3w4Dz4IOh1oNEa/\njPgTCX0hBGdzzjJ0w1DUJfVItLmO02u5YL/GEPpGVloKq1YZWvQaDWzdCh07Gv0y4g4k9IWwcl8e\n/5KJ308koqwN43sfQOXeHhpvBZoZ9Tp6PWzcCDNmGGa6XLUKunc36iVEBUjoC2GlbhTdYPy28Ry9\ncICdN+rR/v8Ogc10cJiBMWddVxT4/nuYNs3w/dy50KeP4b6YqHkS+kJYoSMZRxi6YSiPlrpyuFkq\nDZ5tAo0OgMq4/SwHDhiGX2ZlGebJGTRIwt7UZBEVIayIXtHz0f6PeGxVP2b9bs+ypw/ToG8wOJ43\nauD/8gs8+SQMGQIjRhi+HzxYAt8cSEtfCCuRnZdN2OYwrv1+kfiyItynnId60VB3qNGu8dtv8NZb\nEBsLU6bAunVgb2+00wsjkJa+EFYg7lwc2qVaOl24xN6As7g/7w4OyUYL/EuXYMIEwyicVq0Mc9pP\nnCiBb46kpS9ELVZcVsyMXTNYnRDNqhwbHn3jF7CdDA3fAepU+fx5efDvf8P8+RAaCklJhvVohfmS\n0BeiljqXc47Qb0JxvlpAovNV7nu+ETTaA6quVT53SYnhwap334WePSE+3rBqlTB/EvpC1EJfnfiK\nV7e9woxr9/Ly2AuoHPtB41WAQ5XOq9fDhg2G4Zf33w/btsF/puMSFkJCX4haJK84j5e2vcSB5J3E\nFRWhnZoG9ZZD3bAqn3v3bnj9dcO4+yVLoFcvIxQsapyEvhC1REJmAkM3DKH7VVuOPpRNw47e4PAd\n4F6l8544YRiJ8+uv8P77EBICNjIExGLJH50QFk5RFOYenEvf6N5EXLzGipfO07Drq+B4nKoEfmqq\nYfGS3r3hX/8yLGIydKgEvqWTlr4QFuzSzUs8u/lZrlxM4qBjHvePbwgOP4CqR6XPee2aYcWqZcvg\nhRcMa9E2bmzEooVJyWe2EBZq5/md+H/SHr9fTvLjoAzuD30UGp2rdOAXFxuGXvr4GJYqPH7c0J0j\ngV+7SEtfCAtTUlbC27q3iY5fxuf5hQRNuwb1FoLdGCqzqpWiwDffwBtvgLc37NgB/1n5VNRCEvpC\nWJCUqykM2xCKY0YWCZ1v4Ny9FTT8DvCu1PkOHIBJk6CgwDAip3dv49YrzI907whhIdafXE+XpZ15\n+tdzbH0xE+fA56HxL1Qm8M+dM4zCCQmB55+Ho0cl8K1FhUI/NTWVnj170rZtW9q1a8f8+fMByMnJ\nISgoCB8fH/r06UNubm75MZGRkXh7e+Pr60tcXFz1VC+EFbhZfJOxW8YwbfNLbL/nJhPfLsXGaRs0\nmA/UvatzXb1qmBOnSxfo0MEwDDMsTEbkWJMK/VHb2dnx8ccfc/LkSQ4ePMiiRYs4deoUUVFRBAUF\nkZycTK9evYiKigIgKSmJdevWkZSURGxsLOPHj0ev11frDyJEbXQ86zidl2gpOridY/2v02nUQ+Bw\nFlR392RUcTHMmwetWxsWIj950vBUbf361VS4MFsVCn1XV1f8/f0BaNiwIW3atCE9PZ0tW7YQFmZ4\n0i8sLIzNmzcDEBMTQ2hoKHZ2dri7u+Pl5UV8fHw1/QhC1D6KorAwfiG9Vz7CtKx0vngzB4c2c6DR\nDsDpLs4DmzZB27aG1at27zb03cukaNbrrm/kXrhwgYSEBLp06UJ2djYu//ntcXFxITs7G4CMjAy6\ndv3fpE5qtZr09HQjlSxE7XY5/zKjNz9L5pkjHGhXgFeQGhpuBdrc1XmOHTN05Vy5AosWGZYoFOKu\nQj8vL49BgwYxb948HBxunbhJpVKh+ptlcW63LSIiovzrwMBAAgMD76YcIWod3QUdI74OZcjvRWyY\nmE/dRqOgwTygXoXPkZ5u6Lr5/nuYORPCw6FO1WdRFiai0+nQ6XRGO1+FQ7+kpIRBgwYxYsQIBgwY\nABha91lZWbi6upKZmYmzszMAbm5upKamlh+blpaGm5vbX875x9AXwpqV6kuZqYvg0/0L+axeAf96\n2x4abAJVvwqfIz8fPvzQ8IDVc88ZbtI2alSNRYsa8ecG8cyZM6t0vgr16SuKQnh4OBqNhgkTJpS/\nHxwcTHR0NADR0dHlHwbBwcGsXbuW4uJiUlJSOHPmDAEBAVUqVIja6rfc33jk04c4tHMpCX2K+NcL\nAdAwucKBr9fD6tWGm7RJSYbhl5GREvji9lSKoij/tNNPP/3Eww8/TPv27cu7aSIjIwkICCAkJISL\nFy/i7u7O+vXradKkCQCzZs1i5cqV2NraMm/ePPr27XvrhVUqKnBps6VSGW6SCVEV3yR9w7jNY5h8\nvYhJb+qxsX8P6k6iok/WHjxoWKawrAzmzoWHHqreeoXpVTU7KxT61UFCX1iz/JJ8Xtv2KjsSv2aN\nZwEBT7qCw7dA+wodn5pqmDZhzx6YNQueeUbG2luLqman/JoIUcN++f0XAhb5c2P/ehJGFREwcBg4\nnKYigZ+fDxER4O9vWLnq9GkYOVICX1SczL0jRA1RFIUlRz7hrdgpzKlTzMgZdVHVXwM2AypwLKxd\na1jM5MEHDcMxW7WqgaJFrSOhL0QNyCnIYcw3YVz49Uf2BZXgo9VCw41A83889sgRePVVKCw03LDt\nUfmp8oWQ7h0hqtuPv/2I/7w2uJ/YyYGJhfh0nQEO+/mnwM/KgtGjoX9/w38PH5bAF1UnoS9ENSnV\nlzJz19uEfN6PJfdd5d8zHKnnuA/qTuPv/uoVF8OcOdCuHTg5Gfrtw8Ol314Yh3TvCFENUq+lMvyr\nQdS9eIpjo/Q0cxsMDZYBDf/2uG3b4LXXDIuZ7N9vWMVKCGOS0BfCyDad2sQL3zzLBH0BU6bbYXPP\nZ2Az5G+POXPGEPbJyYbx9o89VkPFCqsjoS+EkRSUFDDpu5eJPbaWmG6ldO3eDhpsBlre8ZgbN+C9\n92DFCsPInI0boe7dTZEvxF2R0BfCCE7+fpKhXz5J20vpJEyExk1eh7pvA7ef6UxRDCNxpkwxrFh1\n4gQ0a1azNQvrJKEvRBUoisLyI0uZtm0Ss52KGTXdEVXDGKDbHY9JTISXXjIMwdywAbrdeVchjE5C\nX4hKulpwlefWP8OZ5N38GKLg6/UENPgcaHzb/XNyYPp0QxfOu+8ahmHKlMeipskgMCEqYd/FfWg/\nbk3zc3EcnAK+fksMUyHfJvDLymDZMmjTxjDsMikJxo6VwBemIS19Ie5Cmb6MWbsiWPTjHJa319O/\nb2toGAN43nb/Q4cMXTn29hAXZ1iMXAhTktAXooLSr6fzzBdPQvoJjo63wc35Fag3C7D7y76XLhlm\nwYyNhdmzYfhww8ysQpiadO8IUQFbTm2m01xfehUdZ8ebDXFrEQv1PuTPgV9WBosXGxYib9wYTp0y\nTHssgS/MhbT0hfgbhaWFvL75RbYcX803/eChDkHQYDXg+Jd9Dx6EF18EBwfYtcswjYIQ5kZCX4g7\nOH35NENXPobXjVQSJtjh2GQu1BnLn1e1+mNXzocfQmiotOyF+ZLuHSH+RFEUVh5aQo+FWsa5pvH1\n6x44OiVAnef4Y+CXlcGSJYaunEaNDF05w4ZJ4AvzJi19If7gWuE1nl89lJPnd6ILs6Fty+fB/iPg\n1rkRjhyBceMMo3J27ID2FVvlUAiTq1BLf/To0bi4uODn51f+XkREBGq1Gq1Wi1arZfv27eXbIiMj\n8fb2xtfXl7i4OONXLUQ1OJR6EO2H9+N06QfiJzegrfe3YL+APwb+1aswfrxhjvuXXoK9eyXwhWWp\nUOiPGjWK2NjYW95TqVRMnDiRhIQEEhIS6NevHwBJSUmsW7eOpKQkYmNjGT9+PHq93viVC2EkekVP\n1PczCF7+MB91zWPRS49wT5NkUAWV76Mo8MUXoNEYvk9KgrAw6coRlqdC3Ts9evTgwoULf3n/diuy\nx8TEEBoaip2dHe7u7nh5eREfH0/Xrl2rXKwQxpZ5I5MRKx6j+MoJjoyzpYXzB2D7Mn/suz950tC6\nv3kTvv0WOnc2Xb1CVFWVbuQuWLCADh06EB4eTm5uLgAZGRmo1eryfdRqNenp6VWrUohqsC0pho4f\nedGj/i/smtyCFs2Pgu0r/Dfwb940zIIZGAhDhhierpXAF5au0jdyx40bx1tvvQXAjBkzmDRpEitW\nrLjtvqo7/Bs4IiKi/OvAwEACAwMrW44QFVZUWsTUDc+z4eRq1g2y4eHWz8I9CwD78n22bIGXXzas\nSXviBLi6mqxcYeV0Oh06nc5o56t06Ds7O5d/PWbMGPr37w+Am5sbqamp5dvS0tJwc3O77Tn+GPpC\n1ITky78ydFkQrfTpJL7agHudvgLVE+XbL16EV14xrEv72Wfw6KMmLFYI/tognjlzZpXOV+nunczM\nzPKvN23aVD6yJzg4mLVr11JcXExKSgpnzpwhICCgSkUKUVWKohC9fzEPLfBjrCaLja924d77fi0P\n/JISw4NVHTsaunCOH5fAF7VThVr6oaGh7Nmzh8uXL9OiRQtmzpyJTqcjMTERlUqFh4cHS5cuBUCj\n0RASEoJGo8HW1pbFixffsXtHiJpwveg64z4bRGL6bnaNtsVPPRPsJvPfNs+BA/D884aVqw4eBC8v\n09YrRHVSKbcbglMTF1apbjv6x1KoVIZhfMK8Hb54gNDPHqO34w3+PcKF+o5bAS1gGHP/xhuGETn/\n/rfhZq20T4S5q2p2yjQMolbSK3o++PYNHv+0B1G98lkyZij1HZMBLYoCX31lmD6hTh3DmPuhQyXw\nhXWQaRhErZOVl8XIT4LIL0ji8Av2tHKNBpvBAJw7Zxhzn5UFmzZBly4mLlaIGiYtfVGrfP/zRjp+\n6EHX5qfRvaqlVfNfwWYwxcUQGWkI+aAgw9w5EvjCGklLX9QKxWXFTFs9mrVn1/DVkDoEes+AutOA\nOuzfb7hR27KlIezd3U1drRCmI6EvLN7ZS78ydElPmttnk/CSE/c5bwUCyM2FqVMND1rNnQuDB0u/\nvRDSvSMs2irdfLotaEfYA5eJGTeQ+5zPoSgBfPON4UYtGObOefppCXwhQFr6wkLdKLrBi0v7czhn\nLztG1aNDq0/BZjipqYYlC8+ehXXroHt3U1cqhHmRlr6wOEfP76PjLDfq2v/EkZc1dPA4RZkynPnz\nQas1PFGbkCCBL8TtSEtfWAy9omfuxteJ+vljFjxehyHt/w/s3+PECVvGjoV69WDfPmjd2tSVCmG+\nJPSFRfg9L5uw+Y+Qq0rm0HNN8GgeQ2FRD96dBsuXw/vvQ3g42Mi/XYX4W/JXRJi9Hcc2oP2gJVqf\ns+wd1xcPt/Ps2duD9u3h118Nk6ONHSuBL0RFSEtfmK2SshJmfPYMq9K+5oshdvRqvYTcvHCmPK/i\nu+9g0SJ48klTVymEZZG2kTBL57NP0/1dNSfyN5Dwgge92v7Cpm/H0LatCpXKMAxTAl+IuyctfWF2\n1v7wMa/8NJlpj6h4pcuLZN+Yw+DBdTlxAtasgYcfNnWFQlguCX1hNm4W5fHywr7sKzhA7IgGaO/f\nTPQXvXj9dRgzBlatAnv7fz6PEOLOJPSFWUg88yNDv+xHV88Cjj7egys3N9L3X05cuQJxceDvb+oK\nhagdpE9fmJSiKMxfO4Gg1Y8w44liVg6Zx4rVOjp1cqJ3bzh0SAJfCGOSlr4wmUvXsxg1rzu/25/n\n4KjmUPoD3R9tg60t7N8PPj6mrlCI2kda+sIkdh1ai/ajlrRtf4E94c/y9ZqzdO3ahhEjQKeTwBei\nulQo9EePHo2Liwt+fn7l7+Xk5BAUFISPjw99+vQhNze3fFtkZCTe3t74+voSFxdn/KqFxSopK2Ha\nJ0/xzPfDWDnYlrFtYniw10r27LHn6FEYN04eshKiOlXor9eoUaOIjY295b2oqCiCgoJITk6mV69e\nREVFAZCUlMS6detISkoiNjaW8ePHo9frjV+5sDgXMk/xyDvNOMpmjozuxNGtKTzY/XEmTIBt2wyL\nnAghqleFQr9Hjx44Ojre8t6WLVsICwsDICwsjM2bNwMQExNDaGgodnZ2uLu74+XlRXx8vJHLFpbm\n620fErC0HYMCc1n8aCRBfeOJj3fh+HEIC5O57oWoKZW+kZudnY2LiwsALi4uZGdnA5CRkUHXrl3L\n91Or1aQJZFNWAAASPklEQVSnp1exTGGp8otv8urcnuwuO8zWoU35adsOHgxtz7x5EBIiYS9ETTPK\n6B2VSoXqb/723mlbRERE+deBgYEEBgYaoxxhJn4+pWPomsfo1LqI7R1DGTzkU3x963PiBDRtaurq\nhLAMOp0OnU5ntPNVOvRdXFzIysrC1dWVzMxMnJ2dAXBzcyM1NbV8v7S0NNzc3G57jj+Gvqg9FEVh\n8aqXiDj/CXMes6P45294pNcAFi6Ep54ydXVCWJY/N4hnzpxZpfNVepxEcHAw0dHRAERHRzNgwIDy\n99euXUtxcTEpKSmcOXOGgICAKhUpLMeV3EwGvuvBysufsP0pP5ZOTEG3ZwAnTkjgC2EOKtTSDw0N\nZc+ePVy+fJkWLVrwzjvv8MYbbxASEsKKFStwd3dn/fr1AGg0GkJCQtBoNNja2rJ48eK/7foRtcee\nn1bzzI4wnu4IwwsiGNBvOosW2chsmEKYEZWiKIpJLqxSYaJLG4VKBRZcvlGVlpXw7qKBLLv+HYv7\nOhL9/vc4ODzAvHlw772mrk6I2qWq2SnTMIgquZj6C8M/7UE9t2ssbz2Q14Z9wUcfNSQ42NSVCSFu\nR0JfVNrGmFmMS5zOqz1sydi8mnU/hnLokLTuhTBnEvrirhUU5jHx4x7E2Rxncc/WRE36nunTW0rf\nvRAWQPr0K8la+/RP/rKLIRseo51PKR0yJ/PLsfeYP78OTk6mrkwI61DV7JSprUSFKIrCks/GErip\nFy8E3sONr/bg4x7J6tUS+EJYEmnpV5I1tfRzctIZu7ALZ5tk8oJzXw5sW8OcOY35z/N4QogaJC19\nUa1+2hONdkErXNv/TtfTy2iibCM6WgJfCEslN3LFbZWVlfL+wsdYdHMH0wPuJ3HD97z7rifNm5u6\nMiFEVUj3TiXV5u6dtIsnGPZZd2zcbvJwzng8mn7Es8/ayYyYQpgBeThLGFXMNxGMTXqX8M4NuBkX\nS/jE3rRqZeqqhBDGIi39SqptLf3Cwjwmze3K1jqnGN+8B443NzJmzL2ydKEQZkZa+qLKTiX+wOAt\nwfh4ljHi7BwGPjABHx/pyxGiNpKWfiXVhpa+oih8uuJZ3shexUtt3XBJj+W55zXYSlNACLNV1eyU\n0K8kSw/93CvpjFrchTNNshhqM5wnHlqOv39dU5clhPgHEvomYsmhf2D3CkJ+Gk9vX1s6/76a8PAB\n2NubuiohREVI6JuIJYZ+WVkp787vy8JCHa+08ifII5Zu3WSxWiEsiYS+iVha6KenHGfwlz2xaXaD\nkLI3GDXsHRo1kpu1QlgaGb0j/tGm9dMZe2Y2w9o40r/xQYL6dDJ1SUIIE5HQr8WKCvJ44aOH+MH+\nJJPV/+LZh7/GxeUeU5clhDChKoe+u7s7jRo1ok6dOtjZ2REfH09OTg5Dhgzht99+K180vUmTJsao\nV1TQqWOxDNj2NN4tSphbfxmDBo+WaRSEEFWfZVOlUqHT6UhISCA+Ph6AqKgogoKCSE5OplevXkRF\nRVW5UFExiqIwd+FIHop9ggGezZjf/TyDn5bAF0IYVPlGroeHB0eOHMHpDytp+Pr6smfPHlxcXMjK\nyiIwMJDTp0/femG5kWt01y6n8fSiHqTem8prjs8xeuhCbG1lHgUhahOTz6evUqno3bs3nTt3Zvny\n5QBkZ2fj4uICgIuLC9nZ2VW9jPgHO79bSptl3jT1yuHLLjt47pnFEvhCiL+ocp/+vn37aNasGZcu\nXSIoKAhfX99btqtUKlR36FuIiIgo/zowMJDAwMCqlmN19GWlvDb7Mb6qs5NXW3TjtQHf06BBA1OX\nJYQwEp1Oh06nM9r5jDpOf+bMmTRs2JDly5ej0+lwdXUlMzOTnj17SvdONfjt1wQGft2Puk2vMM1t\nFv2fmGzagoQQ1c6k3Tv5+fncuHEDgJs3bxIXF4efnx/BwcFER0cDEB0dzYABA6pyGXEbKz+dRqeN\nAQS412HTE0kS+EKICqlSSz8lJYWBAwcCUFpayvDhw5k6dSo5OTmEhIRw8eLFOw7ZlJZ+5RTevMHw\nOT051DCBN5sNYlzoGlSqOjVfiBDCJGQaBhOprtBPS0tj9uyPuXLlGk8//Xj5hyrAwd1bGXFwOPc7\nlxDZfhUdH3jK+AUIIcyahL6JVEfoZ2VlodF0JDfXD0VpiL39IebMmc6LL77AWx8+y8KyLxnbTMPM\nkJ+wv6excS8uhLAIMvdOLbJixQquXtUD5wAVhYW5vPdWBF9fnUNmowt86jGJp/p/YOoyhRAWTELf\njOzcuRO4DhQANmj9XLg0PAPnpiWs7nUIt1YyUZoQomqke6eSqqN7x/A8QwNQLafX6OUkeut4Kt+D\npRG/olLJ57MQQvr0Taa6Qr/ZveG4TNpKnSY5OH7zLjt2vYOi3DTuhYQQFsvk0zAI43m4V2tKX/8c\njYM956f9xo5djwIyHFMIYTzS0q8kY7b0867dYMTCnhyqd4xHz7izellfoDXwPirVVfT6UuNcSAhh\n8WT0joXbFRvDS7+MwNVJYc/DsZw+V8TqZQMAO+6/341z5y6ZukQhRC0iLf1KqmpLX1Fg6pxnWK7/\nitH3apk9eh82deyNV6AQolaSlr6Z0+v16HQ6Ll++TLdu3WjRogXpKRcI2/AoF2wvEu0dwRNPvGXq\nMoUQVkJCvxqVlZVRt+496PUl/3lHxVvTxxHd+FP8GzbhwIATNG3WxqQ1CiGsi3TvVFJFundat25N\ncnImhpuyGh6fcJiDrqeZ5NSPqWO2ArKGoRDi7sg4fROpSOgbHrbqhrvbHJwnBlNYJ4/6Xzpx4Eh6\njdQohKh9ZJy+GSkrK8Pb25s6derQoUMHAPoNcKDg1R40L3Ii+Y3THDwqo3GEEKYjLf1K+nNLX1EU\nbGzqAfUBf+rWPU6f6Y05Yp9KwJFQtqz/FHgN+ApFuWaaooUQFk9a+mbA09MTGxsboC5wik4dxuH7\nQRGXHa7ScFEDtqz/BmgAfEV4+NOmLVYIYdWkpV9J/23pu7q6kp2dB/gApQx+wRudxyZ6XH6QTXPO\nU8fmdwoLC7ly5QouLi6mLlsIYeFknL6JZWdfB0bifO8otNP7c1h/Gk3MB2z60Q8YSJcuXbC1tZXA\nF0KYhWrr3omNjcXX1xdvb29mz55dXZcxidJSw1w4hk/bevTpk4/D9O4UFdXlxjuO7P3xXWAgUMK+\nfftMWaoQQtyiWrp3ysrKaN26NTt27MDNzY0HHniANWvW0KbN/x5EstTuHZXKBmgE5GJTpwFDpjnx\nff00up0ayHfR0cCTwD4aNLAlLy/PtMUKIWods7yRGx8fj5eXF+7u7tjZ2TF06FBiYmKq41I1qkmT\nJoA9MA+AHvNsSGiUQ/PPWvFd9BagCRDPJ5/MlcAXQpilaunTT09Pp0WLFuXfq9VqDh06VB2XqlHX\nrl0DhtAtoIQD8WCb4cnZ2ac5/vN3lJSUkJGRQb9+/UxdphBC3FG1hL7hSdTaKoujCYMA2DlrM9Aa\nFxcXnJycyh/IEkIIc1Utoe/m5kZqamr596mpqajV6r/sp1JF/OG7wP+8zJmhH634v/On4Q4Ucd99\nJipHCGEFdP95GUe13MgtLS2ldevW7Ny5k+bNmxMQEFBrbuR2796dffsOAqWAivz8fO655x5TlyWE\nsBJmOU7f1taWhQsX0rdvX8rKyggPD78l8C3ZTz/9BPz34SzL+9ASQlg3eSK3koy5Rq4QQlSUWQ7Z\nFEIIYZ4k9IUQwopI6AshhBWR0BdCCCsioS+EEFZEQl8IIayIhL4QQlgRCX0hhLAiEvpCCGFFJPSF\nEMKKSOgLIYQVkdAXQggrIqEvhBBWREJfCCGsiIS+EEJYEQl9IYSwIhL6QghhRST0hRDCikjoCyGE\nFal06EdERKBWq9FqtWi1WrZv316+LTIyEm9vb3x9fYmLizNKoUIIIaqu0qGvUqmYOHEiCQkJJCQk\n0K9fPwCSkpJYt24dSUlJxMbGMn78ePR6vdEKNh86UxdQJTqdztQlVInUb1qWXL8l124MVereud2K\n7DExMYSGhmJnZ4e7uzteXl7Ex8dX5TJmSmfqAqrE0n/xpX7TsuT6Lbl2Y6hS6C9YsIAOHToQHh5O\nbm4uABkZGajV6vJ91Go16enpVatSCCGEUfxt6AcFBeHn5/eX15YtWxg3bhwpKSkkJibSrFkzJk2a\ndMfzqFQqoxcuhBCiEhQjSElJUdq1a6coiqJERkYqkZGR5dv69u2rHDx48C/HeHp6KoC85CUvecnr\nLl6enp5VymtbKikzM5NmzZoBsGnTJvz8/AAIDg5m2LBhTJw4kfT0dM6cOUNAQMBfjj979mxlLy2E\nEKKSKh36U6ZMITExEZVKhYeHB0uXLgVAo9EQEhKCRqPB1taWxYsXS/eOEEKYCZWi3GYIjhBCiFqp\nxp/InTx5Mm3atKFDhw489dRTXLt2rXybpTzUFRsbi6+vL97e3syePdvU5fyt1NRUevbsSdu2bWnX\nrh3z588HICcnh6CgIHx8fOjTp0/56CtzVVZWhlarpX///oBl1Z+bm8vgwYNp06YNGo2GQ4cOWVT9\nkZGRtG3bFj8/P4YNG0ZRUZFZ1z969GhcXFzKu5zh739fzC13ble/UXOzSncEKiEuLk4pKytTFEVR\npkyZokyZMkVRFEU5efKk0qFDB6W4uFhJSUlRPD09y/czJ6WlpYqnp6eSkpKiFBcXKx06dFCSkpJM\nXdYdZWZmKgkJCYqiKMqNGzcUHx8fJSkpSZk8ebIye/ZsRVEUJSoqqvzPwVx99NFHyrBhw5T+/fsr\niqJYVP0jR45UVqxYoSiKopSUlCi5ubkWU39KSori4eGhFBYWKoqiKCEhIcrnn39u1vXv3btXOXbs\nWPngEkW58++LOebO7eo3Zm7WeOj/0caNG5Xhw4criqIos2bNUqKiosq39e3bVzlw4ICpSruj/fv3\nK3379i3//s+jlczdk08+qfzwww9K69atlaysLEVRDB8MrVu3NnFld5aamqr06tVL2bVrl/LEE08o\niqJYTP25ubmKh4fHX963lPqvXLmi+Pj4KDk5OUpJSYnyxBNPKHFxcWZf/x9HFCrKnf9/m2vu/Ln+\nP6pqbpp0wrWVK1fy2GOPAZbzUFd6ejotWrQo/95c67ydCxcukJCQQJcuXcjOzsbFxQUAFxcXsrOz\nTVzdnb322mt8+OGH2Nj879fVUupPSUmhadOmjBo1io4dOzJ27Fhu3rxpMfXfe++9TJo0iZYtW9K8\neXOaNGlCUFCQxdT/X3eq11Jy54+qmpvVEvp3eqjr22+/Ld/n/fffp27dugwbNuyO5zHHUT/mWFNF\n5OXlMWjQIObNm4eDg8Mt21Qqldn+XFu3bsXZ2RmtVnvbaT/AvOsvLS3l2LFjjB8/nmPHjtGgQQOi\noqJu2cec6z937hxz587lwoULZGRkkJeXx6pVq27Zx5zrv51/qtecfxZj5Galh2z+nR9++OFvt3/+\n+eds27aNnTt3lr/n5uZGampq+fdpaWm4ublVR3lV8uc6U1NTb/mkNUclJSUMGjSIESNGMGDAAMDQ\n2snKysLV1ZXMzEycnZ1NXOXt7d+/ny1btrBt2zYKCwu5fv06I0aMsJj61Wo1arWaBx54AIDBgwcT\nGRmJq6urRdR/5MgRHnzwQZycnAB46qmnOHDggMXU/193+n2xlNwB4+VmjXfvxMbG8uGHHxITE4O9\nvX35+8HBwaxdu5bi4mJSUlLu+FCXqXXu3JkzZ85w4cIFiouLWbduHcHBwaYu644URSE8PByNRsOE\nCRPK3w8ODiY6OhqA6Ojo8g8DczNr1ixSU1NJSUlh7dq1PProo3z55ZcWU7+rqystWrQgOTkZgB07\ndtC2bVv69+9vEfX7+vpy8OBBCgoKUBSFHTt2oNFoLKb+/7rT74ul5I5Rc9NI9x0qzMvLS2nZsqXi\n7++v+Pv7K+PGjSvf9v777yuenp5K69atldjY2JourcK2bdum+Pj4KJ6ensqsWbNMXc7f+vHHHxWV\nSqV06NCh/P/59u3blStXrii9evVSvL29laCgIOXq1aumLvUf6XS68tE7llR/YmKi0rlzZ6V9+/bK\nwIEDldzcXIuqf/bs2YpGo1HatWunjBw5UikuLjbr+ocOHao0a9ZMsbOzU9RqtbJy5cq/rdfccufP\n9a9YscKouSkPZwkhhBWR5RKFEMKKSOgLIYQVkdAXQggrIqEvhBBWREJfCCGsiIS+EEJYEQl9IYSw\nIhL6QghhRf4fV6Dq7jpr/tsAAAAASUVORK5CYII=\n",
"text": "<matplotlib.figure.Figure at 0x7f3bd4d0af90>"
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nWVlcvHiRYcOGsWLFCqOjFYqPjw8+Pj7cfvvtAAwYMMChyvyHH36gffv21K1bF4B+/fqxc+dOhgwZ\nYnCywjObzaSkpODl5UVycjINGjQwOpLd7O3MMvk3bFxcHK+++irr1q2jSpUqZXHKYmnbti1Hjx4l\nMTGR7OxsVq9eTZ8+fYyOVWg2m43IyEj8/f0ZN26c0XHsNnPmTJKSkjhx4gSrVq3innvucZgih2vX\nLBo1asSRI0cA2LRpEwEBAQanKryWLVuya9curly5gs1mY9OmTfj7+xsdyy59+vRh+fLlACxfvtzh\nBjRF6kxbGWjevLmtcePGtuDgYFtwcLBt1KhRZXHaYlm/fr3Nz8/P1qxZM9vMmTONjmOXbdu22Uwm\nk61Nmzb5v+YbNmwwOlaRWCwWW3h4uNEx7BYfH29r27atLSgoyHbffffZ0tPTjY5kl9mzZ9v8/f1t\nrVu3tg0bNsyWnZ1tdKQ/NWjQIJu3t7fN3d3d5uPjY1u2bJnt7Nmzti5duthatGhhCwsLs50/f97o\nmH/qf/MvXbq0SJ2pTUMiIk7A8ZYKiIjIH6jMRUScgMpcRMQJqMxFRJyAylxExAmozEVEnIDKXETE\nCajMRUScwP8DCn8guZx6tasAAAAASUVORK5CYII=\n",
"text": "<matplotlib.figure.Figure at 0x7f3bd4c11090>"
}
],
"prompt_number": 124
},
{
"cell_type": "code",
"collapsed": false,
"input": "# Here we have \"length in bytes\" and \"time in milliseconds\"\nsha3 = [(0,0.001954),(10,0.001148),(20,0.001049),(30,0.001067),(40,0.001052),(50,0.001034),(60,0.001029),(70,0.001016),(80,0.001033),(90,0.001056),(100,0.001021),(110,0.00106),(120,0.001044),(130,0.001005),(140,0.00226),(150,0.001981),(160,0.002036),(170,0.002002),(180,0.001986),(190,0.00199),(200,0.001998),(210,0.002011),(220,0.001796),(230,0.001801),(240,0.001817),(250,0.001785),(260,0.00182),(270,0.001842),(280,0.002705),(290,0.00266),(300,0.002669),(310,0.002653),(320,0.002653),(330,0.002695),(340,0.002676),(350,0.002653),(360,0.002691),(370,0.002689),(380,0.00267),(390,0.002688),(400,0.002681),(410,0.003567),(420,0.003565),(430,0.003536),(440,0.003589),(450,0.003566),(460,0.003548),(470,0.003587),(480,0.003563),(490,0.003535),(500,0.003557),(510,0.003566),(520,0.003582),(530,0.00357),(540,0.003602),(550,0.004535),(560,0.004473),(570,0.00444),(580,0.004474),(590,0.004458),(600,0.00445),(610,0.004451),(620,0.004422),(630,0.004452),(640,0.004388),(650,0.004429),(660,0.004389),(670,0.00448),(680,0.015864),(690,0.005876),(700,0.005992),(710,0.005869),(720,0.005878),(730,0.005928),(740,0.00595),(750,0.005861),(760,0.005917),(770,0.005882),(780,0.01453),(790,0.005304),(800,0.005321),(810,0.005319),(820,0.006181),(830,0.006275),(840,0.006197),(850,0.006234),(860,0.008817),(870,0.006238),(880,0.006245),(890,0.006247),(900,0.006191),(910,0.00622),(920,0.006262),(930,0.006205),(940,0.006184),(950,0.006266),(960,0.007113),(970,0.007056),(980,0.007103),(990,0.007136),(1000,0.007087),(1010,0.00716),(1020,0.007108),(1030,0.007128),(1040,0.007086),(1050,0.00707),(1060,0.007134),(1070,0.007042),(1080,0.007146),(1090,0.007963),(1100,0.007967),(1110,0.008026),(1120,0.008037),(1130,0.007998),(1140,0.007953),(1150,0.008065),(1160,0.008018),(1170,0.00797),(1180,0.007988),(1190,0.008012),(1200,0.007995),(1210,0.007997),(1220,0.007994),(1230,0.008842),(1240,0.008868),(1250,0.008809),(1260,0.008853),(1270,0.008905),(1280,0.008866),(1290,0.008896),(1300,0.008851),(1310,0.008831),(1320,0.008846),(1330,0.008929),(1340,0.008881),(1350,0.008886),(1360,0.020955),(1370,0.010799),(1380,0.010767),(1390,0.010785),(1400,0.02002),(1410,0.00971),(1420,0.009852),(1430,0.009759),(1440,0.009759),(1450,0.009781),(1460,0.009758),(1470,0.009767),(1480,0.009708),(1490,0.00977),(1500,0.010616),(1510,0.010635),(1520,0.010632),(1530,0.010662),(1540,0.010665),(1550,0.010625),(1560,0.010569),(1570,0.010718),(1580,0.010615),(1590,0.010709),(1600,0.010693),(1610,0.010665),(1620,0.010579),(1630,0.010707),(1640,0.011534),(1650,0.011468),(1660,0.011541),(1670,0.011528),(1680,0.011469),(1690,0.011532),(1700,0.011514),(1710,0.01155),(1720,0.011463),(1730,0.011496),(1740,0.011463),(1750,0.011514),(1760,0.011476),(1770,0.012424),(1780,0.012421),(1790,0.012469),(1800,0.012372),(1810,0.012371),(1820,0.012368),(1830,0.012415),(1840,0.012336),(1850,0.012357),(1860,0.01248),(1870,0.012417),(1880,0.012316),(1890,0.012342),(1900,0.012338),(1910,0.013231),(1920,0.013225),(1930,0.013267),(1940,0.013291),(1950,0.013242),(1960,0.013333),(1970,0.013249),(1980,0.013214),(1990,0.01325),]\nsha256 = [(0,0.001325),(10,0.00167),(20,0.001281),(30,0.001326),(40,0.001258),(50,0.001186),(60,0.001693),(70,0.002121),(80,0.001849),(90,0.001894),(100,0.001801),(110,0.001832),(120,0.002251),(130,0.002668),(140,0.002458),(150,0.002446),(160,0.002468),(170,0.002436),(180,0.011487),(190,0.002634),(200,0.002584),(210,0.002648),(220,0.002656),(230,0.002692),(240,0.002677),(250,0.003148),(260,0.003431),(270,0.003285),(280,0.003241),(290,0.00325),(300,0.003234),(310,0.003305),(320,0.00362),(330,0.003697),(340,0.003675),(350,0.003712),(360,0.003702),(370,0.003768),(380,0.004136),(390,0.004146),(400,0.004177),(410,0.004183),(420,0.004217),(430,0.004236),(440,0.004643),(450,0.004636),(460,0.004654),(470,0.004699),(480,0.004701),(490,0.004725),(500,0.004759),(510,0.005139),(520,0.005729),(530,0.005726),(540,0.005544),(550,0.00555),(560,0.005762),(570,0.005886),(580,0.005877),(590,0.005875),(600,0.005876),(610,0.005852),(620,0.005919),(630,0.005927),(640,0.006382),(650,0.006457),(660,0.006428),(670,0.006536),(680,0.006471),(690,0.006439),(700,0.01792),(710,0.00761),(720,0.007661),(730,0.00768),(740,0.007705),(750,0.007812),(760,0.017267),(770,0.007385),(780,0.007388),(790,0.007375),(800,0.007395),(810,0.007399),(820,0.00743),(830,0.007853),(840,0.007851),(850,0.007846),(860,0.007872),(870,0.007896),(880,0.00791),(890,0.008308),(900,0.008342),(910,0.008365),(920,0.008451),(930,0.008475),(940,0.008501),(950,0.008549),(960,0.008962),(970,0.00884),(980,0.008848),(990,0.008913),(1000,0.008906),(1010,0.009156),(1020,0.009482),(1030,0.009656),(1040,0.009628),(1050,0.009616),(1060,0.009575),(1070,0.009662),(1080,0.010084),(1090,0.010036),(1100,0.010041),(1110,0.010043),(1120,0.010047),(1130,0.010101),(1140,0.010069),(1150,0.010493),(1160,0.010495),(1170,0.010608),(1180,0.010614),(1190,0.010643),(1200,0.010688),(1210,0.011073),(1220,0.010989),(1230,0.011012),(1240,0.011043),(1250,0.011118),(1260,0.011154),(1270,0.011162),(1280,0.01153),(1290,0.011598),(1300,0.011566),(1310,0.01157),(1320,0.011571),(1330,0.01159),(1340,0.011993),(1350,0.011991),(1360,0.012062),(1370,0.012039),(1380,0.012038),(1390,0.01212),(1400,0.012489),(1410,0.012476),(1420,0.012561),(1430,0.012532),(1440,0.012618),(1450,0.012634),(1460,0.012717),(1470,0.01306),(1480,0.01307),(1490,0.013026),(1500,0.013075),(1510,0.013062),(1520,0.013091),(1530,0.013516),(1540,0.013523),(1550,0.013564),(1560,0.013574),(1570,0.013641),(1580,0.013657),(1590,0.013744),(1600,0.01409),(1610,0.014138),(1620,0.01411),(1630,0.014104),(1640,0.014107),(1650,0.014121),(1660,0.014552),(1670,0.014536),(1680,0.01459),(1690,0.014604),(1700,0.014645),(1710,0.014628),(1720,0.015033),(1730,0.015021),(1740,0.015075),(1750,0.015072),(1760,0.015116),(1770,0.015135),(1780,0.015149),(1790,0.015542),(1800,0.01554),(1810,0.015562),(1820,0.015585),(1830,0.015577),(1840,0.015665),(1850,0.016093),(1860,0.016173),(1870,0.016106),(1880,0.016208),(1890,0.016176),(1900,0.016171),(1910,0.016142),(1920,0.01651),(1930,0.016582),(1940,0.016552),(1950,0.01659),(1960,0.01661),(1970,0.016648),(1980,0.017033),(1990,0.017079),]\necrecover = [(0,0.013235),(0,0.132971),(0,0.010962),(0,0.010864),(0,0.136105),(0,0.135817),(0,0.124231),(0,0.125402),(0,0.009799),(0,0.009831),(0,0.122469),(0,0.122994),(0,0.009889),(0,0.123048),(0,0.009852),(0,0.124959),(0,0.121378),(0,0.009872),(0,0.009782),(0,0.122422),(0,0.00987),(0,0.01088),(0,0.137487),(0,0.011148),(0,0.011137),(0,0.237709),(0,0.015437),(0,0.245637),(0,0.243845),(0,0.022863),(0,0.184484),(0,0.124747),(0,0.125843),(0,0.122177),(0,0.009925),(0,0.009785),(0,0.009748),(0,0.009797),(0,0.009783),(0,0.124054),(0,0.009869),(0,0.009833),(0,0.009807),(0,0.123931),(0,0.009851),(0,0.131356),(0,0.125563),(0,0.123036),(0,0.009813),(0,0.124402),(0,0.00984),(0,0.125052),(0,0.009845),(0,0.125655),(0,0.124642),(0,0.124985),(0,0.125365),(0,0.124638),(0,0.124127),(0,0.009869),(0,0.124389),(0,0.009878),(0,0.12445),(0,0.125518),(0,0.120067),(0,0.009823),(0,0.009783),(0,0.009826),(0,0.124247),(0,0.009892),(0,0.009776),(0,0.125014),(0,0.124834),(0,0.122284),(0,0.009845),(0,0.1446),(0,0.123107),(0,0.009852),(0,0.009844),(0,0.125498),(0,0.009847),(0,0.126475),(0,0.00987),(0,0.009821),(0,0.009782),(0,0.123417),(0,0.009779),(0,0.009714),(0,0.124084),(0,0.009821),(0,0.009763),(0,0.009824),(0,0.122754),(0,0.127353),(0,0.123993),(0,0.121833),(0,0.009887),(0,0.124586),(0,0.195074),(0,0.189166),(0,0.191934),(0,0.145808),(0,0.011003),(0,0.010846),(0,0.141364),(0,0.141998),(0,0.010983),(0,0.010785),(0,0.14047),(0,0.010846),(0,0.142087),(0,0.137367),(0,0.173901),(0,0.010964),(0,0.010811),(0,0.140721),(0,0.181039),(0,0.124724),(0,0.009809),(0,0.009814),(0,0.009775),(0,0.009734),(0,0.00979),(0,0.00975),(0,0.009754),(0,0.009754),(0,0.009752),(0,0.009735),(0,0.12306),(0,0.009831),(0,0.009758),(0,0.125797),(0,0.124573),(0,0.12422),(0,0.123083),(0,0.12423),(0,0.009887),(0,0.12881),(0,0.00992),(0,0.009764),(0,0.009743),(0,0.12235),(0,0.125103),(0,0.123914),(0,0.121398),(0,0.125984),(0,0.124185),(0,0.123537),(0,0.009839),(0,0.125043),(0,0.009843),(0,0.009756),(0,0.009744),(0,0.124091),(0,0.009787),(0,0.124998),(0,0.124165),(0,0.009859),(0,0.131772),(0,0.124809),(0,0.127753),(0,0.00987),(0,0.124023),(0,0.009838),(0,0.009771),(0,0.125055),(0,0.123011),(0,0.123971),(0,0.124974),(0,0.123806),(0,0.009789),(0,0.009763),(0,0.009767),(0,0.020679),(0,0.010848),(0,0.009803),(0,0.150571),(0,0.234897),(0,0.011313),(0,0.010829),(0,0.135285),(0,0.010911),(0,0.009799),(0,0.123857),(0,0.010941),(0,0.125291),(0,0.009838),(0,0.009783),(0,0.009769),(0,0.009776),(0,0.123878),(0,0.009858),(0,0.009722),(0,0.123225),(0,0.009863),(0,0.124859),(0,0.124523),(0,0.009856),(0,0.122367)]\n# Some inputs exit early, so filter out the ones that take long\necrecover = [(n, t) for (n, t) in ecrecover if t > 0.1]\n\ndef cost_sha256(lengthInWords): return 60 + 12 * lengthInWords\ndef cost_sha3(lengthInWords): return 30 + 6 * lengthInWords\ndef bytesToWords(b): return (b + 31) // 32",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 156
},
{
"cell_type": "code",
"collapsed": false,
"input": "# Now let's plot the gas per milliseconds for those\nplt.scatter([bytesToWords(i) for (i, j) in sha3], [cost_sha3(bytesToWords(n)) / t for (n, t) in sha3], color=\"red\")\nplt.scatter([bytesToWords(i) for (i, j) in sha256], [cost_sha256(bytesToWords(n)) / t for (n, t) in sha256], color=\"green\")\nplt.scatter([0]*len(ecrecover), [3000.0 / t for (n,t) in ecrecover], color=\"blue\")\nplt.show()",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": "<matplotlib.figure.Figure at 0x7f3bd4cb6d10>"
}
],
"prompt_number": 157
},
{
"cell_type": "code",
"collapsed": false,
"input": "# This might suggest something around 40000 gas per millisecond,\n# which would result in (taking timing in ms to be 3 * pairings + 2)\n# 120000 * num_pairings + 80000\n\n# If we focus on the costs of ecrecover, it would be more around 20000 gas per millisecond, so\n# 60000 * num_pairings + 40000\n",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 120
}
],
"metadata": {}
}
]
}
@chriseth
Copy link
Author

After having switched the sha256 implementation from "crypto++" to "scrypt", sha256 is about twice as fast.

@chfast
Copy link

chfast commented Mar 11, 2017

You probably should rerun the benchmarks with the new implementation. BTW, 2x speed up mean SHA256 will go from 50000 gas/ms to 100000 gas/ms, right?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment