mirror of
https://github.com/logos-storage/logos-storage-research.git
synced 2026-01-03 22:13:08 +00:00
370 lines
76 KiB
Plaintext
370 lines
76 KiB
Plaintext
{
|
|
"nbformat": 4,
|
|
"nbformat_minor": 0,
|
|
"metadata": {
|
|
"colab": {
|
|
"name": "PoR Analysis",
|
|
"provenance": []
|
|
},
|
|
"kernelspec": {
|
|
"name": "python3",
|
|
"display_name": "Python 3"
|
|
},
|
|
"language_info": {
|
|
"name": "python"
|
|
}
|
|
},
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"# Verification frequency calculation\n",
|
|
"\n",
|
|
"This code shows how we can compute the minimum horizontal and vertical verification frequency in order to achieve a certain level of guarantee computed in number of nines (e.g., 99.9999999%)\n"
|
|
],
|
|
"metadata": {
|
|
"id": "IAw0wWuN-1Yh"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [
|
|
"import numpy as np\n",
|
|
"import random as random\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"\n",
|
|
"#@markdown Durability guarantee (three 9s (99.9%) to nine 9s (99.9999999%))\n",
|
|
"Durability = 9 #@param {type:\"slider\", min:3, max:9, step:3}\n",
|
|
"#@markdown Erasure Coding parameter K\n",
|
|
"ECK = 60 #@param {type:\"slider\", min:1, max:100, step:1}\n",
|
|
"#@markdown Percentage of data a malicious node discards or refuses/avoids to store\n",
|
|
"CheatRatio = 5 #@param {type:\"slider\", min:5, max:95, step:5}\n",
|
|
"#@markdown Number of PoR blocks inside an EC block (See model below)\n",
|
|
"NbPoRinEC = 500 #@param {type:\"slider\", min:100, max:10000, step:100}\n",
|
|
"\n",
|
|
"GuaranteeDurability = {3:99.90, 6: 99.99990, 9: 99.99999990}\n",
|
|
"ExpectedGuarantee = GuaranteeDurability[Durability]\n",
|
|
"\n",
|
|
"hx = []\n",
|
|
"HorizontalProb = []\n",
|
|
"for NbOfHVerif in range(ECK):\n",
|
|
" prob = (1-(((ECK-1)/100)**NbOfHVerif))*100\n",
|
|
" hx.append(NbOfHVerif)\n",
|
|
" HorizontalProb.append(prob)\n",
|
|
" if prob > ExpectedGuarantee:\n",
|
|
" print(\"Probability of detecting catastrophic failures with %d horizontal verifications is %12.12f%% (Over nine 9s)\" % (NbOfHVerif, prob))\n",
|
|
" break\n",
|
|
"\n",
|
|
"vx = [0]\n",
|
|
"VerticalProb = [0]\n",
|
|
"for NbOfVVerif in range(1, NbPoRinEC):\n",
|
|
" prob = (1-((1-(CheatRatio/100))**NbOfVVerif))*100\n",
|
|
" vx.append(NbOfVVerif)\n",
|
|
" VerticalProb.append(prob)\n",
|
|
" if prob > ExpectedGuarantee:\n",
|
|
" print(\"Probability of detecting catastrophic failures with %d vertical verifications %12.12f%% (Over nine 9s)\" % (NbOfVVerif, prob))\n",
|
|
" print(\"That is %2.1f%% of the PoR blocks need to be verified\" % (NbOfVVerif*100/NbPoRinEC))\n",
|
|
" break\n",
|
|
"\n",
|
|
"\n",
|
|
"fig, ax = plt.subplots()\n",
|
|
"plt.grid(axis='x', color='0.9')\n",
|
|
"plt.grid(axis='y', color='0.9')\n",
|
|
"plt.title(\"Number of horizontal verifications to reach %9.9f guarantee on durability\" % ExpectedGuarantee)\n",
|
|
"plt.xlabel(\"Nodes verified from K=%d in the EC\" % ECK)\n",
|
|
"plt.ylabel(\"Guarantee of not having catastrophic failures (%)\")\n",
|
|
"ax.plot(hx, HorizontalProb)\n",
|
|
"#plt.yscale('log')\n",
|
|
"plt.show()\n",
|
|
"plt.clf()\n",
|
|
"\n",
|
|
"\n",
|
|
"fig, ax = plt.subplots()\n",
|
|
"plt.grid(axis='x', color='0.9')\n",
|
|
"plt.grid(axis='y', color='0.9')\n",
|
|
"plt.title(\"Number of vertical verifications to reach %9.9f guarantee on durability\" % ExpectedGuarantee)\n",
|
|
"plt.xlabel(\"Number of PoR blocks verified out of %d\" % NbPoRinEC)\n",
|
|
"plt.ylabel(\"Guarantee of not having catastrophic failures (%)\")\n",
|
|
"ax.plot(vx, VerticalProb)\n",
|
|
"#plt.yscale('log')\n",
|
|
"plt.show()\n",
|
|
"\n"
|
|
],
|
|
"metadata": {
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 1000
|
|
},
|
|
"id": "Y_CIsSJz_Nek",
|
|
"outputId": "1b4b7efb-2990-44b2-dd22-67c257d4ff70"
|
|
},
|
|
"execution_count": 48,
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"name": "stdout",
|
|
"text": [
|
|
"Probability of detecting catastrophic failures with 40 horizontal verifications is 99.999999931753% (Over nine 9s)\n",
|
|
"Probability of detecting catastrophic failures with 405 vertical verifications 99.999999904926% (Over nine 9s)\n",
|
|
"That is 81.0% of the PoR blocks need to be verified\n"
|
|
]
|
|
},
|
|
{
|
|
"output_type": "display_data",
|
|
"data": {
|
|
"text/plain": [
|
|
"<Figure size 1080x576 with 1 Axes>"
|
|
],
|
|
"image/png": "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\n"
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
}
|
|
},
|
|
{
|
|
"output_type": "display_data",
|
|
"data": {
|
|
"text/plain": [
|
|
"<Figure size 1080x576 with 0 Axes>"
|
|
]
|
|
},
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"output_type": "display_data",
|
|
"data": {
|
|
"text/plain": [
|
|
"<Figure size 1080x576 with 1 Axes>"
|
|
],
|
|
"image/png": "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\n"
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"# PoR Analysis\n",
|
|
"\n",
|
|
"## Friendly toy scenario\n",
|
|
"\n",
|
|
"Feel free to play with these variables as much as you want in order to simulate any extreme scenario you find interesting to explore."
|
|
],
|
|
"metadata": {
|
|
"id": "Bw-GGBdX6tMm"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 49,
|
|
"metadata": {
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/"
|
|
},
|
|
"id": "n-GB9Vsmp4M1",
|
|
"outputId": "a4ab7563-bc61-4169-89e8-7f7432f542a2"
|
|
},
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"name": "stdout",
|
|
"text": [
|
|
"\n",
|
|
" *** Network Parameters *** \n",
|
|
"\n",
|
|
"The network has 15400 nodes\n",
|
|
"The average node capacity is 1200 GBs\n",
|
|
"The network has 1206000 files\n",
|
|
"The average file size in the network is 9765 MBs\n",
|
|
"The estimated mean time between failures of the network is 12 hours\n",
|
|
"Malicious nodes cheat the system by NOT storing 5% of the data they should store\n",
|
|
"\n",
|
|
" *** Codex Parameters *** \n",
|
|
"\n",
|
|
"The erasure coding parameter K is 60\n",
|
|
"The erasure coding parameter M is 40\n",
|
|
"The lazy repair parameter L is 20\n",
|
|
"The Proof of Retrievability number of sectors per block is 10\n",
|
|
"The PoR agregation cost is 1 ms per PoR block\n",
|
|
"Durability in number of nines: 9\n",
|
|
"\n",
|
|
" *** Dataset and block structures *** \n",
|
|
"\n",
|
|
"There are 1206000 files of size 10000000 KB (9765.6 MB)\n",
|
|
"The total storage used in the network is 11231.8 TB and there is 6815.1 TB of available storage for a total of 18046.9 TB\n",
|
|
"There will be 100 EC blocks of size 162.8 MBs per file\n",
|
|
"There is a total of 120600000 EC blocks in the network\n",
|
|
"There is an average of 7831.2 EC blocks per node (assuming an homogeneous distribution)\n",
|
|
"Each EC block has 550537.6 PoR blocks of size 0.3 KB\n",
|
|
"\n",
|
|
" *** Durability guarantees and verification frequency *** \n",
|
|
"\n",
|
|
"Guarantee of data durability is 99.999999900\n",
|
|
"Probability of detecting catastrophic failures with 40 horizontal verifications is 99.999999931753% (Over 99.999999900)\n",
|
|
"Probability of detecting catastrophic failures with 405 vertical verifications 99.999999904926% (Over 99.999999900)\n",
|
|
"That is 0.1% of the PoR blocks need to be verified\n",
|
|
"The PoR horizontal verification factor is 40.0\n",
|
|
"The PoR vertical verification factor is 7.4%\n",
|
|
"\n",
|
|
" *** PoR Storage and Time Requirements *** \n",
|
|
"\n",
|
|
"The total storage required for PoR proofs is 14261.6 MB to check a total of 11231.8TB of data each round\n",
|
|
"To verify 40 EC blocks and 7.4% PoR blocks per file in the system:\n",
|
|
"Each node will spend 2114.4 minutes (35.2 hours) agregating PoR proofs\n",
|
|
"It will take the system 480 hours (20.0 days) to accidentally lose M nodes\n",
|
|
"Lazy repair should be triggered after 240 hours (10.0 days)\n",
|
|
"Assuming PoR verifications are done once per lazy repair round, PoR verification takes 14.7% of the time\n",
|
|
"There are 36.5 PoR verification rounds in a year accumulating 508.3 GB of storage\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"import numpy as np\n",
|
|
"import random as random\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"\n",
|
|
"plt.rcParams['figure.figsize'] = [15, 8]\n",
|
|
"\n",
|
|
"\n",
|
|
"#@markdown #Network parameters. \n",
|
|
"#@markdown These parameters give the characteristic of the network and we (Codex) have no control over them.\n",
|
|
"\n",
|
|
"#@markdown Number of nodes in the network\n",
|
|
"NetworkSize = 15400 #@param {type:\"slider\", min:100, max:20000, step:100}\n",
|
|
"#@markdown Average storage size per node (in GB)\n",
|
|
"NodeCapacity = 1200 #@param {type:\"slider\", min:100, max:10000, step:100}\n",
|
|
"#@markdown Number of files in the system\n",
|
|
"NumberOfFiles = 1206000 #@param {type:\"slider\", min:1000, max:10000000, step:1000}\n",
|
|
"#@markdown File size (in KB)\n",
|
|
"FileSize = 10000000 #@param {type:\"slider\", min:100, max:10000000, step:100}\n",
|
|
"#@markdown Overall network MTBF (in hours)\n",
|
|
"MTBF = 12 #@param {type:\"slider\", min:1, max:100, step:1}\n",
|
|
"#@markdown Percentage of data a malicious node discards or refuses/avoids to store\n",
|
|
"CheatRatio = 5 #@param {type:\"slider\", min:5, max:95, step:5}\n",
|
|
"#@markdown Predefined Scenario (Set to 1 to overwrite the above parameters with the values from the Storj network)\n",
|
|
"Scenario = 0 #@param {type:\"slider\", min:0, max:1, step:1}\n",
|
|
"\n",
|
|
"#@markdown ----------------------------------------------------\n",
|
|
"#@markdown ----------------------------------------------------\n",
|
|
"#@markdown ----------------------------------------------------\n",
|
|
"\n",
|
|
"\n",
|
|
"#@markdown #Codex parameters\n",
|
|
"#@markdown The Codex team can tune the following parametersto potimize the system\n",
|
|
"\n",
|
|
"#@markdown Erasure Coding parameter K\n",
|
|
"ECK = 60 #@param {type:\"slider\", min:1, max:100, step:1}\n",
|
|
"#@markdown Erasure Coding parameter M\n",
|
|
"ECM = 40 #@param {type:\"slider\", min:1, max:100, step:1}\n",
|
|
"#@markdown Lazy repair parameter L (start repair after L erasures)\n",
|
|
"ECL = 20 #@param {type:\"slider\", min:1, max:100, step:1}\n",
|
|
"#@markdown Number of PoR sectors (PoR Parameter S)\n",
|
|
"PoRS = 10 #@param {type:\"slider\", min:10, max:1000, step:10}\n",
|
|
"#@markdown PoR block agregation cost (in miliseconds)\n",
|
|
"AgregationCost = 1 #@param {type:\"slider\", min:1, max:100, step:1}\n",
|
|
"#@markdown Durability guarantee (three 9s (99.9%) to nine 9s (99.9999999%))\n",
|
|
"Durability = 9 #@param {type:\"slider\", min:3, max:9, step:3}\n",
|
|
"\n",
|
|
"\n",
|
|
"# #@markdown Number of EC blocks to verify among K+M nodes\n",
|
|
"#HorizontalVerification = 40 #@param {type:\"slider\", min:1, max:100, step:1}\n",
|
|
"##@markdown Percentage of PoR blocks to verify inside an EC block\n",
|
|
"#VerticalVerification = 0.2 #@param {type:\"slider\", min:0.1, max:1, step:0.1}\n",
|
|
"\n",
|
|
"\n",
|
|
"if Scenario == 1:\n",
|
|
" print(\"\\n***This is the Storj scenario***\\n\")\n",
|
|
" NetworkSize = 15400\n",
|
|
" NodeCapacity = 1200\n",
|
|
" NumberOfFiles = 1200000\n",
|
|
" FileSize = 10000000\n",
|
|
"\n",
|
|
"print(\"\\n *** Network Parameters *** \\n\")\n",
|
|
"print(\"The network has %d nodes\" % NetworkSize)\n",
|
|
"print(\"The average node capacity is %d GBs\" % NodeCapacity)\n",
|
|
"print(\"The network has %d files\" % NumberOfFiles)\n",
|
|
"print(\"The average file size in the network is %d MBs\" % (FileSize/1024))\n",
|
|
"print(\"The estimated mean time between failures of the network is %d hours\" % MTBF)\n",
|
|
"print(\"Malicious nodes cheat the system by NOT storing %d%% of the data they should store\" % CheatRatio)\n",
|
|
"\n",
|
|
"\n",
|
|
"print(\"\\n *** Codex Parameters *** \\n\")\n",
|
|
"print(\"The erasure coding parameter K is %d\" % ECK)\n",
|
|
"print(\"The erasure coding parameter M is %d\" % ECM)\n",
|
|
"print(\"The lazy repair parameter L is %d\" % ECL)\n",
|
|
"print(\"The Proof of Retrievability number of sectors per block is %d\" % PoRS)\n",
|
|
"print(\"The PoR agregation cost is %d ms per PoR block\" % AgregationCost)\n",
|
|
"print(\"Durability in number of nines: %d\" % Durability)\n",
|
|
"\n",
|
|
"ECblockSize = FileSize/ECK\n",
|
|
"PoRblockSize = 31*PoRS/1024\n",
|
|
"TotalECBlocks = NumberOfFiles*(ECK+ECM)\n",
|
|
"ECBlocksPerNode = TotalECBlocks/NetworkSize\n",
|
|
"NbPoRinEC = ECblockSize/PoRblockSize\n",
|
|
"\n",
|
|
"print(\"\\n *** Dataset and block structures *** \\n\")\n",
|
|
"print(\"There are %d files of size %d KB (%2.1f MB)\" % (NumberOfFiles, FileSize, FileSize/1024))\n",
|
|
"print(\"The total storage used in the network is %2.1f TB and there is %2.1f TB of available storage for a total of %2.1f TB\" % (TotalUsedCapacity, TotalNetworkCapacity-TotalUsedCapacity, TotalNetworkCapacity))\n",
|
|
"print(\"There will be %d EC blocks of size %2.1f MBs per file\" % (ECK+ECM, ECblockSize/1024))\n",
|
|
"print(\"There is a total of %d EC blocks in the network\" % TotalECBlocks)\n",
|
|
"print(\"There is an average of %2.1f EC blocks per node (assuming an homogeneous distribution)\" % ECBlocksPerNode)\n",
|
|
"print(\"Each EC block has %2.1f PoR blocks of size %2.1f KB\" % (NbPoRinEC, PoRblockSize))\n",
|
|
"\n",
|
|
"\n",
|
|
"print(\"\\n *** Durability guarantees and verification frequency *** \\n\")\n",
|
|
"GuaranteeDurability = {3:99.90, 6: 99.99990, 9: 99.99999990}\n",
|
|
"ExpectedGuarantee = GuaranteeDurability[Durability]\n",
|
|
"print(\"Guarantee of data durability is %9.9f\" % ExpectedGuarantee)\n",
|
|
"\n",
|
|
"for NbOfHVerif in range(ECK):\n",
|
|
" prob = (1-(((ECK-1)/100)**NbOfHVerif))*100\n",
|
|
" if prob > ExpectedGuarantee:\n",
|
|
" print(\"Probability of detecting catastrophic failures with %d horizontal verifications is %12.12f%% (Over %9.9f)\" % (NbOfHVerif, prob, ExpectedGuarantee))\n",
|
|
" HorizontalVerification = NbOfHVerif \n",
|
|
" break\n",
|
|
"\n",
|
|
"for NbOfVVerif in range(1, int(NbPoRinEC)):\n",
|
|
" prob = (1-((1-(CheatRatio/100))**NbOfVVerif))*100\n",
|
|
" if prob > ExpectedGuarantee:\n",
|
|
" print(\"Probability of detecting catastrophic failures with %d vertical verifications %12.12f%% (Over %9.9f)\" % (NbOfVVerif, prob, ExpectedGuarantee))\n",
|
|
" print(\"That is %2.1f%% of the PoR blocks need to be verified\" % (NbOfVVerif*100/NbPoRinEC))\n",
|
|
" VerticalVerification = NbOfVVerif*100/NbPoRinEC\n",
|
|
" break\n",
|
|
"\n",
|
|
"print(\"The PoR horizontal verification factor is %2.1f\" % HorizontalVerification)\n",
|
|
"print(\"The PoR vertical verification factor is %2.1f%%\" % (VerticalVerification*100))\n",
|
|
"\n",
|
|
"\n",
|
|
"TotalPoRStorage = NumberOfFiles*HorizontalVerification*PoRblockSize/1024\n",
|
|
"NodeAgregationTime = NbPoRinEC*VerticalVerification*ECBlocksPerNode*(HorizontalVerification/(ECK+ECM))*AgregationCost/(1000*60)\n",
|
|
"PoRPerYear = 365*24/(ECL*MTBF)\n",
|
|
"TotalUsedCapacity = int(NumberOfFiles*FileSize)/int(1024*1024*1024)\n",
|
|
"TotalNetworkCapacity = NetworkSize*NodeCapacity/1024\n",
|
|
"\n",
|
|
"\n",
|
|
"print(\"\\n *** PoR Storage and Time Requirements *** \\n\")\n",
|
|
"print(\"The total storage required for PoR proofs is %2.1f MB to check a total of %2.1fTB of data each round\" % (TotalPoRStorage, TotalUsedCapacity))\n",
|
|
"print(\"To verify %d EC blocks and %2.1f%% PoR blocks per file in the system:\" % (HorizontalVerification, VerticalVerification*100))\n",
|
|
"print(\"Each node will spend %2.1f minutes (%2.1f hours) agregating PoR proofs\" % (NodeAgregationTime, NodeAgregationTime/60))\n",
|
|
"print(\"It will take the system %d hours (%2.1f days) to accidentally lose M nodes\" % (MTBF*ECM, MTBF*ECM/24))\n",
|
|
"print(\"Lazy repair should be triggered after %d hours (%2.1f days)\" % (MTBF*ECL, MTBF*ECL/24))\n",
|
|
"print(\"Assuming PoR verifications are done once per lazy repair round, PoR verification takes %2.1f%% of the time\" % ((NodeAgregationTime*100)/(MTBF*ECL*60)))\n",
|
|
"print(\"There are %2.1f PoR verification rounds in a year accumulating %2.1f GB of storage\" % (PoRPerYear, PoRPerYear*TotalPoRStorage/1024))\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [
|
|
""
|
|
],
|
|
"metadata": {
|
|
"id": "nDubyEGMnOPE"
|
|
},
|
|
"execution_count": null,
|
|
"outputs": []
|
|
}
|
|
]
|
|
} |