mirror of
https://github.com/logos-blockchain/logos-blockchain-pocs.git
synced 2026-01-05 22:53:10 +00:00
1120 lines
463 KiB
Plaintext
1120 lines
463 KiB
Plaintext
|
|
{
|
||
|
|
"cells": [
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 1,
|
||
|
|
"id": "ad657d5a-bd36-4329-b134-6745daff7ae9",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"import numpy as np\n",
|
||
|
|
"import matplotlib.pyplot as plt\n",
|
||
|
|
"from dataclasses import dataclass\n",
|
||
|
|
"from pyvis.network import Network\n",
|
||
|
|
"from pyvis.options import Layout\n",
|
||
|
|
"from collections import defaultdict"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 2,
|
||
|
|
"id": "a9e0b910-c633-4dbe-827c-4ddb804f7a9a",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"def phi(f, alpha):\n",
|
||
|
|
" return 1 - (1-f)**alpha"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 3,
|
||
|
|
"id": "aa0aadce-a0be-4873-ba23-293be74db313",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"@dataclass\n",
|
||
|
|
"class Block:\n",
|
||
|
|
" id: int\n",
|
||
|
|
" slot: int\n",
|
||
|
|
" height: int\n",
|
||
|
|
" parent: int\n",
|
||
|
|
" leader: int"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 4,
|
||
|
|
"id": "a538cf45-d551-4603-b484-dbbc3f3d0a73",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"@dataclass\n",
|
||
|
|
"class NetworkParams:\n",
|
||
|
|
" mixnet_delay_mean: int # seconds\n",
|
||
|
|
" mixnet_delay_var: int\n",
|
||
|
|
" broadcast_delay_mean: int # second\n",
|
||
|
|
" pol_proof_time: int # seconds\n",
|
||
|
|
" no_network_delay: bool = False\n",
|
||
|
|
"\n",
|
||
|
|
" def sample_mixnet_delay(self):\n",
|
||
|
|
" scale = self.mixnet_delay_var / self.mixnet_delay_mean\n",
|
||
|
|
" shape = self.mixnet_delay_mean / scale\n",
|
||
|
|
" return np.random.gamma(shape=shape, scale=scale)\n",
|
||
|
|
" \n",
|
||
|
|
" def sample_broadcast_delay(self, blocks):\n",
|
||
|
|
" return np.random.exponential(self.broadcast_delay_mean, size=blocks.shape)\n",
|
||
|
|
"\n",
|
||
|
|
" def block_arrival_slot(self, block_slot):\n",
|
||
|
|
" if self.no_network_delay:\n",
|
||
|
|
" return block_slot\n",
|
||
|
|
" return self.pol_proof_time + self.sample_mixnet_delay() + self.sample_broadcast_delay(block_slot) + block_slot"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 5,
|
||
|
|
"id": "24779de7-284f-4200-9e4a-d2aa6e1b823b",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"@dataclass\n",
|
||
|
|
"class Params:\n",
|
||
|
|
" SLOTS: int\n",
|
||
|
|
" f: float\n",
|
||
|
|
" honest_stake: np.array\n",
|
||
|
|
" adversary_control: float\n",
|
||
|
|
"\n",
|
||
|
|
" @property\n",
|
||
|
|
" def N(self):\n",
|
||
|
|
" return len(self.honest_stake) + 1\n",
|
||
|
|
"\n",
|
||
|
|
" @property\n",
|
||
|
|
" def stake(self):\n",
|
||
|
|
" return np.append(self.honest_stake, self.honest_stake.sum() / (1/self.adversary_control - 1))\n",
|
||
|
|
" \n",
|
||
|
|
" @property\n",
|
||
|
|
" def relative_stake(self):\n",
|
||
|
|
" return self.stake / self.stake.sum()\n",
|
||
|
|
"\n",
|
||
|
|
" def slot_prob(self):\n",
|
||
|
|
" return phi(self.f, self.relative_stake)"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 203,
|
||
|
|
"id": "a90495a8-fcda-4e47-92b4-cc5ceaa9ff9c",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"class Sim:\n",
|
||
|
|
" def __init__(self, params: Params, network: NetworkParams):\n",
|
||
|
|
" self.params = params\n",
|
||
|
|
" self.network = network\n",
|
||
|
|
" self.leaders = np.zeros((params.N, params.SLOTS), dtype=np.int64)\n",
|
||
|
|
" self.blocks = []\n",
|
||
|
|
" self.block_slots = np.array([], dtype=np.int64)\n",
|
||
|
|
" self.block_heights = np.array([], dtype=np.int64)\n",
|
||
|
|
" self.block_arrivals = np.zeros(shape=(params.N, 0), dtype=np.int64) # arrival time to each leader for each block\n",
|
||
|
|
"\n",
|
||
|
|
" # emit the genesis block\n",
|
||
|
|
" self.emit_block(\n",
|
||
|
|
" leader=0,\n",
|
||
|
|
" slot=0,\n",
|
||
|
|
" height=1,\n",
|
||
|
|
" parent=-1,\n",
|
||
|
|
" )\n",
|
||
|
|
" self.block_arrivals[:,:] = 0 # all nodes see the genesis block\n",
|
||
|
|
"\n",
|
||
|
|
" def emit_block(self, leader, slot, height, parent):\n",
|
||
|
|
" assert type(leader) in [int, np.int64]\n",
|
||
|
|
" assert type(slot) in [int, np.int64]\n",
|
||
|
|
" assert type(height) in [int, np.int64]\n",
|
||
|
|
" assert type(parent) in [int, np.int64]\n",
|
||
|
|
"\n",
|
||
|
|
" block = Block(\n",
|
||
|
|
" id=len(self.blocks),\n",
|
||
|
|
" slot=slot,\n",
|
||
|
|
" height=height,\n",
|
||
|
|
" parent=parent,\n",
|
||
|
|
" leader=leader,\n",
|
||
|
|
" )\n",
|
||
|
|
" self.blocks.append(block)\n",
|
||
|
|
" self.block_slots = np.append(self.block_slots, block.slot)\n",
|
||
|
|
" self.block_heights = np.append(self.block_heights, block.height)\n",
|
||
|
|
" \n",
|
||
|
|
" # decide when this block will arrive at each node\n",
|
||
|
|
" new_block_arrival_by_node = self.network.block_arrival_slot(np.repeat(block.slot, self.params.N))\n",
|
||
|
|
"\n",
|
||
|
|
" if parent != -1:\n",
|
||
|
|
" # the new block cannot arrive before it's parent\n",
|
||
|
|
" parent_arrival_by_node = self.block_arrivals[:,parent]\n",
|
||
|
|
" new_block_arrival_by_node = np.maximum(new_block_arrival_by_node, parent_arrival_by_node)\n",
|
||
|
|
" \n",
|
||
|
|
" self.block_arrivals = np.append(self.block_arrivals, new_block_arrival_by_node.reshape((self.params.N, 1)), axis=1)\n",
|
||
|
|
" return block.id\n",
|
||
|
|
"\n",
|
||
|
|
" def emit_leader_block(self, leader, slot):\n",
|
||
|
|
" assert type(leader) in [int, np.int64], type(leader)\n",
|
||
|
|
" assert isinstance(slot, int)\n",
|
||
|
|
"\n",
|
||
|
|
" parent = self.fork_choice(leader, slot)\n",
|
||
|
|
"\n",
|
||
|
|
" return self.emit_block(\n",
|
||
|
|
" leader,\n",
|
||
|
|
" slot,\n",
|
||
|
|
" height=self.blocks[parent].height + 1,\n",
|
||
|
|
" parent=parent,\n",
|
||
|
|
" )\n",
|
||
|
|
"\n",
|
||
|
|
" def fork_choice(self, node, slot):\n",
|
||
|
|
" return self.honest_chain(node, slot)[-1]\n",
|
||
|
|
"\n",
|
||
|
|
" def honest_chain(self, node, slot):\n",
|
||
|
|
" seen_blocks = self.block_arrivals[node,:] <= slot\n",
|
||
|
|
" block_ids = np.nonzero(seen_blocks)[0]\n",
|
||
|
|
"\n",
|
||
|
|
" children = defaultdict(list)\n",
|
||
|
|
" for block in block_ids:\n",
|
||
|
|
" children[self.blocks[block].parent].append(block)\n",
|
||
|
|
"\n",
|
||
|
|
" block_weight = self.block_weight(node, slot)\n",
|
||
|
|
"\n",
|
||
|
|
" chain = [self.blocks[0].id]\n",
|
||
|
|
"\n",
|
||
|
|
" while len(children[chain[-1]]) > 0:\n",
|
||
|
|
" next_block = max(children[chain[-1]], key=lambda c: block_weight[c])\n",
|
||
|
|
" chain.append(next_block)\n",
|
||
|
|
"\n",
|
||
|
|
" return chain\n",
|
||
|
|
"\n",
|
||
|
|
" def block_weight(self, node, slot, dbg=False):\n",
|
||
|
|
" seen_blocks = self.block_arrivals[node,:] <= slot\n",
|
||
|
|
" block_ids = np.nonzero(seen_blocks)[0]\n",
|
||
|
|
" \n",
|
||
|
|
" block_weight = {}\n",
|
||
|
|
"\n",
|
||
|
|
" children = defaultdict(list)\n",
|
||
|
|
" if dbg:\n",
|
||
|
|
" print(\"seen\", seen_blocks)\n",
|
||
|
|
" print(\"block_ids\", block_ids)\n",
|
||
|
|
" \n",
|
||
|
|
" for b in sorted(block_ids, reverse=True):\n",
|
||
|
|
" if dbg:\n",
|
||
|
|
" print(f\"block={b} weights={block_weight} children={children}\")\n",
|
||
|
|
" weight = 1\n",
|
||
|
|
" for child in children[b]:\n",
|
||
|
|
" weight += block_weight[child]\n",
|
||
|
|
"\n",
|
||
|
|
" block_weight[b] = weight\n",
|
||
|
|
" children[self.blocks[b].parent].append(b)\n",
|
||
|
|
" assert self.blocks[b].parent not in block_weight\n",
|
||
|
|
" # curr = b\n",
|
||
|
|
" # while self.blocks[curr].parent >= 0:\n",
|
||
|
|
" # block_weight[self.blocks[curr].parent] += 1\n",
|
||
|
|
" # curr = self.blocks[curr].parent\n",
|
||
|
|
"\n",
|
||
|
|
" return block_weight\n",
|
||
|
|
" \n",
|
||
|
|
"\n",
|
||
|
|
" def plot_spacetime_diagram(self, MAX_SLOT=1000):\n",
|
||
|
|
" alpha_index = sorted(range(self.params.N), key=lambda n: self.params.relative_stake[n])\n",
|
||
|
|
" nodes = [f\"$N_{n}$($\\\\alpha$={self.params.relative_stake[n]:.2f})\" for n in alpha_index]\n",
|
||
|
|
" messages = [(nodes[alpha_index.index(self.blocks[b].leader)], nodes[alpha_index.index(node)], self.blocks[b].slot, arrival_slot, f\"$B_{{{b}}}$\", b) for b, arrival_slots in enumerate(self.block_arrivals.T) for node, arrival_slot in enumerate(arrival_slots) if arrival_slot < MAX_SLOT]\n",
|
||
|
|
" \n",
|
||
|
|
" fig, ax = plt.subplots(figsize=(8,4))\n",
|
||
|
|
" \n",
|
||
|
|
" # Plot vertical lines for each node\n",
|
||
|
|
" max_slot = max(s for _,_,start_t, end_t,_,_ in messages for s in [start_t, end_t])\n",
|
||
|
|
" for i, node in enumerate(nodes):\n",
|
||
|
|
" ax.plot([i, i], [0, max_slot], 'k-', linewidth=0.1)\n",
|
||
|
|
" ax.text(i, max_slot + 30 * (0 if i % 2 == 0 else 1), node, ha='center', va='bottom')\n",
|
||
|
|
" \n",
|
||
|
|
" # Plot messages\n",
|
||
|
|
" colors = plt.cm.rainbow(np.linspace(0, 1, len(messages)))\n",
|
||
|
|
" for (start, end, start_time, end_time, label, b), color in zip(messages, colors):\n",
|
||
|
|
" start_idx = nodes.index(start)\n",
|
||
|
|
" end_idx = nodes.index(end)\n",
|
||
|
|
" ax.annotate('', xy=(end_idx, end_time), xytext=(start_idx, start_time),\n",
|
||
|
|
" arrowprops=dict(arrowstyle='->', color=\"grey\", lw=0.1))\n",
|
||
|
|
" placement = 0\n",
|
||
|
|
" mid_x = start_idx * (1 - placement) + end_idx * placement\n",
|
||
|
|
" mid_y = start_time * (1 - placement) + end_time * placement\n",
|
||
|
|
" ax.text(mid_x, mid_y, label, ha='center', va='center', \n",
|
||
|
|
" bbox=dict(facecolor='white', edgecolor='none', alpha=0.7))\n",
|
||
|
|
"\n",
|
||
|
|
" # # draw parent pointers\n",
|
||
|
|
"\n",
|
||
|
|
" # block = self.blocks[b]\n",
|
||
|
|
" # parent = self.blocks[block.parent]\n",
|
||
|
|
" # parent_t = parent.slot\n",
|
||
|
|
" # parent_idx = alpha_index.index(parent.leader)\n",
|
||
|
|
" \n",
|
||
|
|
" # ax.annotate('', xy=(parent_idx, parent_t), xytext=(end_idx, end_time),\n",
|
||
|
|
" # arrowprops=dict(arrowstyle='->', color=\"black\", lw=2))\n",
|
||
|
|
"\n",
|
||
|
|
" for block in self.blocks:\n",
|
||
|
|
" if block.parent == -1:\n",
|
||
|
|
" continue\n",
|
||
|
|
"\n",
|
||
|
|
" parent = self.blocks[block.parent]\n",
|
||
|
|
" parent_t = parent.slot\n",
|
||
|
|
" parent_idx = alpha_index.index(parent.leader)\n",
|
||
|
|
"\n",
|
||
|
|
" child_t = block.slot\n",
|
||
|
|
" child_idx = alpha_index.index(block.leader)\n",
|
||
|
|
" \n",
|
||
|
|
" ax.annotate('', xy=(parent_idx, parent_t), xytext=(child_idx, child_t),\n",
|
||
|
|
" arrowprops=dict(arrowstyle='-', color=\"black\", lw=2))\n",
|
||
|
|
" \n",
|
||
|
|
" \n",
|
||
|
|
" ax.set_xlim(-1, len(nodes))\n",
|
||
|
|
" ax.set_ylim(0, max_slot + 70)\n",
|
||
|
|
" ax.set_xticks(range(len(nodes)))\n",
|
||
|
|
" ax.set_xticklabels([])\n",
|
||
|
|
" # ax.set_yticks([])\n",
|
||
|
|
" ax.set_title('Space-Time Diagram')\n",
|
||
|
|
" ax.set_ylabel('Slot')\n",
|
||
|
|
" \n",
|
||
|
|
" plt.tight_layout()\n",
|
||
|
|
" plt.show()\n",
|
||
|
|
"\n",
|
||
|
|
" def visualize_chain(self):\n",
|
||
|
|
" honest_chain = self.honest_chain(0, self.block_arrivals.max())\n",
|
||
|
|
" print(\"Honest chain length\", len(honest_chain))\n",
|
||
|
|
" honest_chain_set = set(honest_chain)\n",
|
||
|
|
" \n",
|
||
|
|
" layout = Layout()\n",
|
||
|
|
" layout.hierachical = True\n",
|
||
|
|
" \n",
|
||
|
|
" G = Network(width=1600, height=800, notebook=True, directed=True, layout=layout, cdn_resources='in_line')\n",
|
||
|
|
"\n",
|
||
|
|
" for block in self.blocks:\n",
|
||
|
|
" # level = slot\n",
|
||
|
|
" level = block.height\n",
|
||
|
|
" color = \"lightgrey\"\n",
|
||
|
|
" if block.id in honest_chain_set:\n",
|
||
|
|
" color = \"orange\"\n",
|
||
|
|
"\n",
|
||
|
|
" G.add_node(int(block.id), level=level, color=color, label=f\"{block.id}:s={block.slot},h={block.height}\")\n",
|
||
|
|
" if block.parent >= 0:\n",
|
||
|
|
" G.add_edge(int(block.id), int(block.parent), width=1, color=color)\n",
|
||
|
|
"\n",
|
||
|
|
" \n",
|
||
|
|
" return G.show(\"chain.html\")\n",
|
||
|
|
"\n",
|
||
|
|
" def run(self, seed=None):\n",
|
||
|
|
" if seed is not None:\n",
|
||
|
|
" np.random.seed(seed)\n",
|
||
|
|
" \n",
|
||
|
|
" for s in range(1, self.params.SLOTS):\n",
|
||
|
|
" if s > 0 and s % 100000 == 0:\n",
|
||
|
|
" print(f\"SIM={s}/{self.params.SLOTS}, blocks={len(self.blocks)}\")\n",
|
||
|
|
" \n",
|
||
|
|
" # the adversary will not participate in the simulation\n",
|
||
|
|
" # (implemented by never delivering blocks to the adversary)\n",
|
||
|
|
" self.block_arrivals[-1,:] = self.params.SLOTS\n",
|
||
|
|
"\n",
|
||
|
|
" self.leaders[:,s] = np.random.random(size=self.params.N) < self.params.slot_prob()\n",
|
||
|
|
" for leader in np.nonzero(self.leaders[:,s])[0]:\n",
|
||
|
|
" if self.params.adversary_control is not None and leader == self.params.N - 1:\n",
|
||
|
|
" continue\n",
|
||
|
|
" self.emit_leader_block(\n",
|
||
|
|
" leader,\n",
|
||
|
|
" s,\n",
|
||
|
|
" )\n",
|
||
|
|
" \n",
|
||
|
|
" def adverserial_analysis(self, should_plot=True, seed=0):\n",
|
||
|
|
" np.random.seed(seed)\n",
|
||
|
|
"\n",
|
||
|
|
" adversary = self.params.N-1 # adversary is always the last node in our simulations\n",
|
||
|
|
"\n",
|
||
|
|
" self.block_arrivals[adversary,:] = self.block_slots # we will say the adversary receives the blocks immidiately\n",
|
||
|
|
"\n",
|
||
|
|
" honest_chain = self.honest_chain(adversary, slot=self.params.SLOTS)\n",
|
||
|
|
" honest_weight_by_slot = np.zeros(self.params.SLOTS, dtype=np.int64)\n",
|
||
|
|
" honest_height_by_slot = np.zeros(self.params.SLOTS, dtype=np.int64)\n",
|
||
|
|
" for b in honest_chain:\n",
|
||
|
|
" temp_weight = np.zeros(self.params.SLOTS, dtype=np.int64) + self.block_weight(adversary, self.blocks[b].slot)[0]\n",
|
||
|
|
" temp_weight[:self.blocks[b].slot] = 0\n",
|
||
|
|
" honest_weight_by_slot = np.maximum(temp_weight, honest_weight_by_slot)\n",
|
||
|
|
"\n",
|
||
|
|
" temp_height = np.zeros(self.params.SLOTS, dtype=np.int64) + self.blocks[b].height\n",
|
||
|
|
" temp_height[:self.blocks[b].slot] = 0\n",
|
||
|
|
" honest_height_by_slot = np.maximum(temp_height, honest_height_by_slot)\n",
|
||
|
|
"\n",
|
||
|
|
" reorg_hist = np.zeros(self.params.SLOTS, dtype=np.int64)\n",
|
||
|
|
" reorg_depths = np.array([], dtype=np.int64)\n",
|
||
|
|
"\n",
|
||
|
|
" if should_plot:\n",
|
||
|
|
" plt.figure(figsize=(20, 6))\n",
|
||
|
|
" ax = plt.subplot(121)\n",
|
||
|
|
" \n",
|
||
|
|
" adversary_active_slots = np.random.random(size=self.params.SLOTS) < phi(self.params.f, self.params.relative_stake[adversary])\n",
|
||
|
|
" all_active_slots = (self.leaders.sum(axis=0) + adversary_active_slots) > 0\n",
|
||
|
|
" \n",
|
||
|
|
" for block in self.blocks:\n",
|
||
|
|
" if block.id > 0 and block.id % 1000 == 0:\n",
|
||
|
|
" print(\"Processing block\", block)\n",
|
||
|
|
"\n",
|
||
|
|
" # honest_chain = self.honest_chain(adversary, slot=block.slot)\n",
|
||
|
|
"\n",
|
||
|
|
" nearest_honest_block = block\n",
|
||
|
|
" while nearest_honest_block.height > len(honest_chain) or honest_chain[nearest_honest_block.height-1] != nearest_honest_block.id:\n",
|
||
|
|
" assert nearest_honest_block.parent != -1\n",
|
||
|
|
" nearest_honest_block = self.blocks[nearest_honest_block.parent]\n",
|
||
|
|
"\n",
|
||
|
|
" adv_init_fork_weight = self.block_weight(adversary, block.slot)[0]\n",
|
||
|
|
"\n",
|
||
|
|
" cumulative_rel_height = adversary_active_slots[block.slot+1:].cumsum()\n",
|
||
|
|
" adverserial_weight_by_slot = adv_init_fork_weight + cumulative_rel_height\n",
|
||
|
|
" \n",
|
||
|
|
" adverserial_wins = adverserial_weight_by_slot > honest_weight_by_slot[block.slot + 1:]\n",
|
||
|
|
" \n",
|
||
|
|
" reorg_events = adverserial_wins & all_active_slots[block.slot+1:]\n",
|
||
|
|
" \n",
|
||
|
|
" reorg_depths = np.append(reorg_depths, honest_height_by_slot[block.slot+1:][reorg_events] - nearest_honest_block.height)\n",
|
||
|
|
" reorg_hist += np.append(np.zeros(block.slot, dtype=np.int64), adverserial_wins).sum(axis=0)\n",
|
||
|
|
"\n",
|
||
|
|
" if should_plot:\n",
|
||
|
|
" if reorg_events.sum() > 0:\n",
|
||
|
|
" first_slot = block.slot+1\n",
|
||
|
|
" last_slot = first_slot + np.nonzero(reorg_events)[0].max() + 1\n",
|
||
|
|
"\n",
|
||
|
|
" ax.plot(np.arange(first_slot, last_slot), adverserial_weight_by_slot[:last_slot-first_slot]-honest_weight_by_slot[first_slot:last_slot], lw=\"1\")\n",
|
||
|
|
" for event in np.nonzero(reorg_events)[0]:\n",
|
||
|
|
" plt.axvline(x = event + block.slot + 1, ymin = 0, ymax = 1, color ='red', lw=0.01)\n",
|
||
|
|
"\n",
|
||
|
|
" if should_plot:\n",
|
||
|
|
" ax.plot(np.zeros(self.params.SLOTS), color=\"k\", label=f\"honest chain\")\n",
|
||
|
|
" _ = ax.set_title(f\"max chain weight with adversery controlling {self.params.relative_stake[adversary] * 100:.0f}% of stake\")\n",
|
||
|
|
" _ = ax.set_ylabel(\"weight advantage\")\n",
|
||
|
|
" _ = ax.set_xlabel(\"slot\")\n",
|
||
|
|
" _ = ax.legend()\n",
|
||
|
|
"\n",
|
||
|
|
" ax = plt.subplot(122)\n",
|
||
|
|
" _ = ax.grid(True)\n",
|
||
|
|
" bins = (reorg_depths.max() if reorg_depths.sum() > 0 else 0) + 1\n",
|
||
|
|
" _ = ax.hist(reorg_depths, density=False, bins=100)\n",
|
||
|
|
" _ = ax.set_title(f\"re-org depth with {self.params.relative_stake[adversary] * 100:.0f}% adversary\")\n",
|
||
|
|
" _ = ax.set_xlabel(\"re-org depth\")\n",
|
||
|
|
" _ = ax.set_ylabel(\"frequency\")\n",
|
||
|
|
"\n",
|
||
|
|
" return reorg_depths"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 231,
|
||
|
|
"id": "6625ba1b-0039-4dcc-a1ec-eea47ce7e476",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"avg blocks per slot 0.04709\n",
|
||
|
|
"Number of blocks 4709\n",
|
||
|
|
"longest chain 2346\n",
|
||
|
|
"CPU times: user 16.5 s, sys: 7.51 s, total: 24 s\n",
|
||
|
|
"Wall time: 24.7 s\n"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"%%time\n",
|
||
|
|
"np.random.seed(0)\n",
|
||
|
|
"sim = Sim(\n",
|
||
|
|
" params=Params(\n",
|
||
|
|
" SLOTS=100000,\n",
|
||
|
|
" f=0.05,\n",
|
||
|
|
" adversary_control = 0.1,\n",
|
||
|
|
" honest_stake = np.random.pareto(10, 1000)\n",
|
||
|
|
" ),\n",
|
||
|
|
" network=NetworkParams(\n",
|
||
|
|
" mixnet_delay_mean=10, # seconds\n",
|
||
|
|
" mixnet_delay_var=4,\n",
|
||
|
|
" broadcast_delay_mean=2, # second\n",
|
||
|
|
" pol_proof_time=10, # seconds\n",
|
||
|
|
" no_network_delay=False\n",
|
||
|
|
" )\n",
|
||
|
|
")\n",
|
||
|
|
"sim.run(seed=5)\n",
|
||
|
|
"\n",
|
||
|
|
"n_blocks_per_slot = len(sim.blocks) / sim.params.SLOTS\n",
|
||
|
|
"print(\"avg blocks per slot\", n_blocks_per_slot)\n",
|
||
|
|
"print(\"Number of blocks\", len(sim.blocks))\n",
|
||
|
|
"print(\"longest chain\", max(b.height for b in sim.blocks))"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 232,
|
||
|
|
"id": "aabccc4e-8f47-403e-b7f9-7508e93ec18b",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"# sim.visualize_chain()"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 233,
|
||
|
|
"id": "51c90b03-336f-4108-8560-27bd4465a5bb",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"Processing block Block(id=1000, slot=21253, height=495, parent=998, leader=935)\n",
|
||
|
|
"Processing block Block(id=2000, slot=42906, height=991, parent=1999, leader=589)\n",
|
||
|
|
"Processing block Block(id=3000, slot=64559, height=1499, parent=2998, leader=781)\n",
|
||
|
|
"Processing block Block(id=4000, slot=85787, height=1996, parent=3998, leader=421)\n"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"image/png": "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Klu2rAIDA5Wamqro6Gj1799fVapUkd1uV9myZdWqVSstXrzYo43FixerXbt2Cg0NVWBgoFq1apUtRmsdWr9+vXr06KHw8HBdccUVmjZtmmw2W45XPr366qvy9fX1WE9y8s8//+j+++9XuXLlZLfbVbVqVT344IMel7Vv3rxZt99+u8LDw+Xv769rr71WU6dO9WinoNthmzZt9NNPP2n//v0e64yUecn/W2+9pddff101atSQ3W7XL7/8Ikn6/vvv1aJFCwUGBiokJEQdOnQ466u+zuVzxBijN954Q9WqVZO/v7+aNm2qRYsWqU2bNmrTpk2+fVs//PIzd+5cGWOynf320EMPKTk5WfPnz5fk2lbsdrt8fX0lScHBwe5ySXrnnXeUlpamoUOHFqjfrD777DM1bNhQ/v7+ioiIUPfu3bVt2zb38DZt2uiBBx6QJDVv3jzf2yzkt13ktX5I0ogRI9S8eXNFREQoNDRUjRs31qRJkwp067KPPvpIPj4+GjZsmLusINsfAAA4O7ntw0qu/amPPvpI1157rQICAhQeHq4ePXpoz549BW6/MPuo06ZN0+DBg1WpUiXZ7Xbt2rVLkuskl9q1a8tut+vqq6/WF198keMtYnPicDj07LPPun/T3XDDDVq9enWOdaOiovTYY4+pcuXK8vPzU40aNTRixAilp6e762TdFx45cqSqVq3q3tfMun8yfPhw94k2NWrUcO8vZb0VsyTNnz9fjRs3VkBAgOrWrVug21M1a9ZMt956q0dZ/fr1ZbPZtGbNGnfZnDlzZLPZtGnTJknZb/OV3z6d5b333lONGjUUHBysFi1aaNWqVfnGKBV8f/rbb7/VzTff7E6kSK4TBO+880798MMP7vmfkpKioKAgd53g4GD3vrR1YtLzzz+vOnXqFKhfS0H3XQuyLm3cuFE2my3H4y0///yzbDabvv/+e3fZzp071bNnT0VGRsput+uqq65y/3a35LV9JCUlaciQIapRo4b7t0DTpk315Zdfusdfu3at7rvvPlWvXl0BAQGqXr267r//fu3fv9+jn9x+N//+++/u32Bn+vzzz7OtdwDOMwNcJIYNG2YkmTp16pjXXnvNLFq0yDz77LNGknnqqadM3bp1zYcffmgWLVpkHnroISPJfPPNN+7xY2JiTN++fc20adPM0qVLzfz5882QIUOMl5eXmTp1qkdfjz/+uPHz8zNr1qwxxhizZMkS4+XlZV566aV843z55ZeNJHPnnXea2bNnm4ULF5r33nvPvPzyy+46rVu3NqVLlza1atUy48ePN4sWLTIDBgwwkjxiKUzM1apVM3369HG//+WXX4wkU716ddOrVy/z008/mS+//NJUrVrV1KpVy6Snp+c5HRUqVDD9+/d3vx89erQJCAgwkszhw4eNMcY4HA4TGhpqnn32WXe9kSNHGpvNZh5++GHz448/mjlz5pgWLVqYoKAgs2XLFnc9a3lmdf/99xsvLy/z/PPPm4ULF5oxY8aYKlWqmLCwMI9pmzx5spFkatasaf7zn/+YBQsWmE8//dSEh4ebtm3buuutX7/e1KxZ0zRq1MisXLnSrFy50qxfvz7XaR4/fryRZI4cOeKevpCQEBMQEGD69evnrvfmm28aHx8fExcX5zGvf/nlF2OMMbt27TI9evQwktz9rly
|
||
|
|
"text/plain": [
|
||
|
|
"<Figure size 2000x600 with 2 Axes>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"reorgs = sim.adverserial_analysis()"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 234,
|
||
|
|
"id": "67b6b368-9203-4af6-bab3-dfbc2ef4fb1c",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"2.71% of slots were reorged with depth >= 0\n",
|
||
|
|
"2.04% of slots were reorged with depth >= 1\n",
|
||
|
|
"0.22% of slots were reorged with depth >= 2\n",
|
||
|
|
"0.04% of slots were reorged with depth >= 3\n",
|
||
|
|
"0.01% of slots were reorged with depth >= 4\n",
|
||
|
|
"0.00% of slots were reorged with depth >= 5\n",
|
||
|
|
"0.00% of slots were reorged with depth >= 6\n",
|
||
|
|
"0.00% of slots were reorged with depth >= 7\n",
|
||
|
|
"0.00% of slots were reorged with depth >= 8\n",
|
||
|
|
"0.00% of slots were reorged with depth >= 9\n",
|
||
|
|
"0.00% of slots were reorged with depth >= 10\n",
|
||
|
|
"0.00% of slots were reorged with depth >= 11\n",
|
||
|
|
"0.00% of slots were reorged with depth >= 12\n",
|
||
|
|
"0.00% of slots were reorged with depth >= 13\n",
|
||
|
|
"0.00% of slots were reorged with depth >= 14\n",
|
||
|
|
"0.00% of slots were reorged with depth >= 15\n",
|
||
|
|
"0.00% of slots were reorged with depth >= 16\n",
|
||
|
|
"0.00% of slots were reorged with depth >= 17\n",
|
||
|
|
"0.00% of slots were reorged with depth >= 18\n",
|
||
|
|
"0.00% of slots were reorged with depth >= 19\n"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"for DEPTH in range(20):\n",
|
||
|
|
" print(f\"{len(reorgs[reorgs >= DEPTH]) / sim.params.SLOTS*100:.2f}% of slots were reorged with depth >= {DEPTH}\")"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 235,
|
||
|
|
"id": "e29f1bfb-042d-4ffa-9981-b6a5dfc88557",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"simulating 1/10\n",
|
||
|
|
"simulating 2/10\n",
|
||
|
|
"simulating 3/10\n",
|
||
|
|
"simulating 4/10\n",
|
||
|
|
"simulating 5/10\n",
|
||
|
|
"simulating 6/10\n",
|
||
|
|
"simulating 7/10\n",
|
||
|
|
"simulating 8/10\n",
|
||
|
|
"simulating 9/10\n",
|
||
|
|
"simulating 10/10\n",
|
||
|
|
"finished simulation, starting analysis\n"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"np.random.seed(0)\n",
|
||
|
|
"stake = np.random.pareto(10, 100)\n",
|
||
|
|
"\n",
|
||
|
|
"sims = [Sim(\n",
|
||
|
|
" params=Params(\n",
|
||
|
|
" SLOTS=10000,\n",
|
||
|
|
" f=0.05,\n",
|
||
|
|
" adversary_control = i,\n",
|
||
|
|
" honest_stake = stake\n",
|
||
|
|
" ),\n",
|
||
|
|
" network=NetworkParams(\n",
|
||
|
|
" mixnet_delay_mean=10, # seconds\n",
|
||
|
|
" mixnet_delay_var=4,\n",
|
||
|
|
" broadcast_delay_mean=2, # second\n",
|
||
|
|
" pol_proof_time=10, # seconds\n",
|
||
|
|
" no_network_delay=False\n",
|
||
|
|
" )\n",
|
||
|
|
") for i in np.linspace(1e-3, 0.3, 10)]\n",
|
||
|
|
"\n",
|
||
|
|
"for i, sim in enumerate(sims):\n",
|
||
|
|
" print(f\"simulating {i+1}/{len(sims)}\")\n",
|
||
|
|
" sim.run(seed=0)\n",
|
||
|
|
"\n",
|
||
|
|
"print(\"finished simulation, starting analysis\")\n",
|
||
|
|
"advs = [sim.adverserial_analysis(should_plot=False) for sim in sims]"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 236,
|
||
|
|
"id": "dd417361-b315-4769-9c24-221e231c2458",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"image/png": "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
|
||
|
|
"text/plain": [
|
||
|
|
"<Figure size 4000x4000 with 2 Axes>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"max_reorg_depth = max(a.max() if len(a) > 0 else 0 for a in advs)\n",
|
||
|
|
"\n",
|
||
|
|
"\n",
|
||
|
|
"heatmap = np.zeros((len(advs), max_reorg_depth), dtype=np.int64)\n",
|
||
|
|
"\n",
|
||
|
|
"for i, adv in enumerate(advs):\n",
|
||
|
|
" for depth in range(max_reorg_depth):\n",
|
||
|
|
" heatmap[i][depth] = (adv == depth).sum()\n",
|
||
|
|
"\n",
|
||
|
|
"plt.figure(figsize=(40,40))\n",
|
||
|
|
"ax = plt.subplot(121)\n",
|
||
|
|
"im = ax.imshow(heatmap)\n",
|
||
|
|
"\n",
|
||
|
|
"_ = ax.set_yticks(np.arange(len(sims)), labels=[f\"{s.params.adversary_control:.2f}\" if i % 2 == (len(sims) - 1) % 2 else None for i, s in enumerate(sims)])\n",
|
||
|
|
"_ = ax.set_xticks(np.arange(max_reorg_depth), labels=[r if r % (max_reorg_depth // 10) == 0 else None for r in range(max_reorg_depth)])\n",
|
||
|
|
"_ = ax.set_xlabel(\"reorg depth\")\n",
|
||
|
|
"_ = ax.set_ylabel(\"adversary stake\")\n",
|
||
|
|
"\n",
|
||
|
|
"ax = plt.subplot(1,10,6)\n",
|
||
|
|
"scale = heatmap.max()\n",
|
||
|
|
"ax.imshow(np.arange(scale+1).reshape((1, scale+1)).T, extent=(1,0,1,0))\n",
|
||
|
|
"_ = ax.set_yticks(np.arange(scale+1) / scale, labels = [r if r % (scale // 10) == 0 else None for r in range(scale+1)])\n",
|
||
|
|
"_ = ax.set_xticks([], minor=False)\n",
|
||
|
|
"_ = ax.set_ylabel(\"frequency\")"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 357,
|
||
|
|
"id": "6a232e82-2b79-4924-b6fe-b56564c797ea",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"simulating 1/5\n",
|
||
|
|
"SIM=100000/200000, blocks=4637\n",
|
||
|
|
"simulating 2/5\n",
|
||
|
|
"SIM=100000/200000, blocks=4637\n",
|
||
|
|
"simulating 3/5\n",
|
||
|
|
"SIM=100000/200000, blocks=4637\n",
|
||
|
|
"simulating 4/5\n",
|
||
|
|
"SIM=100000/200000, blocks=4637\n",
|
||
|
|
"simulating 5/5\n",
|
||
|
|
"SIM=100000/200000, blocks=4637\n",
|
||
|
|
"finished simulation, starting analysis\n",
|
||
|
|
"Processing block Block(id=1000, slot=21112, height=947, parent=999, leader=70)\n",
|
||
|
|
"Processing block Block(id=2000, slot=43487, height=1905, parent=1999, leader=27)\n",
|
||
|
|
"Processing block Block(id=3000, slot=64768, height=2860, parent=2998, leader=74)\n",
|
||
|
|
"Processing block Block(id=4000, slot=86152, height=3827, parent=3999, leader=4)\n",
|
||
|
|
"Processing block Block(id=5000, slot=107463, height=4788, parent=4999, leader=53)\n",
|
||
|
|
"Processing block Block(id=6000, slot=129674, height=5754, parent=5999, leader=8)\n",
|
||
|
|
"Processing block Block(id=7000, slot=150939, height=6696, parent=6999, leader=57)\n",
|
||
|
|
"Processing block Block(id=8000, slot=172707, height=7644, parent=7999, leader=27)\n",
|
||
|
|
"Processing block Block(id=9000, slot=194724, height=8608, parent=8999, leader=66)\n",
|
||
|
|
"Processing block Block(id=1000, slot=21112, height=719, parent=999, leader=70)\n",
|
||
|
|
"Processing block Block(id=2000, slot=43487, height=1446, parent=1998, leader=27)\n",
|
||
|
|
"Processing block Block(id=3000, slot=64768, height=2144, parent=2998, leader=74)\n",
|
||
|
|
"Processing block Block(id=4000, slot=86152, height=2881, parent=3999, leader=4)\n",
|
||
|
|
"Processing block Block(id=5000, slot=107463, height=3606, parent=4996, leader=53)\n",
|
||
|
|
"Processing block Block(id=6000, slot=129674, height=4340, parent=5999, leader=8)\n",
|
||
|
|
"Processing block Block(id=7000, slot=150939, height=5062, parent=6999, leader=57)\n",
|
||
|
|
"Processing block Block(id=8000, slot=172707, height=5772, parent=7999, leader=27)\n",
|
||
|
|
"Processing block Block(id=9000, slot=194724, height=6502, parent=8999, leader=66)\n",
|
||
|
|
"Processing block Block(id=1000, slot=21112, height=579, parent=999, leader=70)\n",
|
||
|
|
"Processing block Block(id=2000, slot=43487, height=1152, parent=1999, leader=27)\n",
|
||
|
|
"Processing block Block(id=3000, slot=64768, height=1727, parent=2997, leader=74)\n",
|
||
|
|
"Processing block Block(id=4000, slot=86152, height=2323, parent=3998, leader=4)\n",
|
||
|
|
"Processing block Block(id=5000, slot=107463, height=2906, parent=4996, leader=53)\n",
|
||
|
|
"Processing block Block(id=6000, slot=129674, height=3505, parent=5999, leader=8)\n",
|
||
|
|
"Processing block Block(id=7000, slot=150939, height=4097, parent=6999, leader=57)\n",
|
||
|
|
"Processing block Block(id=8000, slot=172707, height=4679, parent=7997, leader=27)\n",
|
||
|
|
"Processing block Block(id=9000, slot=194724, height=5259, parent=8998, leader=66)\n",
|
||
|
|
"Processing block Block(id=1000, slot=21112, height=471, parent=999, leader=70)\n",
|
||
|
|
"Processing block Block(id=2000, slot=43487, height=947, parent=1995, leader=27)\n",
|
||
|
|
"Processing block Block(id=3000, slot=64768, height=1423, parent=2997, leader=74)\n",
|
||
|
|
"Processing block Block(id=4000, slot=86152, height=1931, parent=3998, leader=4)\n",
|
||
|
|
"Processing block Block(id=5000, slot=107463, height=2423, parent=4996, leader=53)\n",
|
||
|
|
"Processing block Block(id=6000, slot=129674, height=2922, parent=5997, leader=8)\n",
|
||
|
|
"Processing block Block(id=7000, slot=150939, height=3412, parent=6994, leader=57)\n",
|
||
|
|
"Processing block Block(id=8000, slot=172707, height=3898, parent=7997, leader=27)\n",
|
||
|
|
"Processing block Block(id=9000, slot=194724, height=4399, parent=8998, leader=66)\n",
|
||
|
|
"Processing block Block(id=1000, slot=21112, height=418, parent=999, leader=70)\n",
|
||
|
|
"Processing block Block(id=2000, slot=43487, height=834, parent=1996, leader=27)\n",
|
||
|
|
"Processing block Block(id=3000, slot=64768, height=1249, parent=2997, leader=74)\n",
|
||
|
|
"Processing block Block(id=4000, slot=86152, height=1671, parent=3995, leader=4)\n",
|
||
|
|
"Processing block Block(id=5000, slot=107463, height=2093, parent=4997, leader=53)\n",
|
||
|
|
"Processing block Block(id=6000, slot=129674, height=2532, parent=5997, leader=8)\n",
|
||
|
|
"Processing block Block(id=7000, slot=150939, height=2944, parent=6995, leader=57)\n",
|
||
|
|
"Processing block Block(id=8000, slot=172707, height=3372, parent=7997, leader=27)\n",
|
||
|
|
"Processing block Block(id=9000, slot=194724, height=3804, parent=8998, leader=66)\n"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"np.random.seed(0)\n",
|
||
|
|
"stake = np.random.pareto(10, 100)\n",
|
||
|
|
"\n",
|
||
|
|
"sims = [Sim(\n",
|
||
|
|
" params=Params(\n",
|
||
|
|
" SLOTS=200000,\n",
|
||
|
|
" f=0.05,\n",
|
||
|
|
" adversary_control = 0.1,\n",
|
||
|
|
" honest_stake = stake\n",
|
||
|
|
" ),\n",
|
||
|
|
" network=NetworkParams(\n",
|
||
|
|
" mixnet_delay_mean=i, # seconds\n",
|
||
|
|
" mixnet_delay_var=(i / 5)**2,\n",
|
||
|
|
" broadcast_delay_mean=1e-6, # second\n",
|
||
|
|
" pol_proof_time=0, # seconds\n",
|
||
|
|
" no_network_delay=False\n",
|
||
|
|
" )\n",
|
||
|
|
") for i in np.linspace(1, 30, 5)]\n",
|
||
|
|
"\n",
|
||
|
|
"\n",
|
||
|
|
"for i, sim in enumerate(sims):\n",
|
||
|
|
" print(f\"simulating {i+1}/{len(sims)}\")\n",
|
||
|
|
" sim.run(seed=0)\n",
|
||
|
|
"\n",
|
||
|
|
"print(\"finished simulation, starting analysis\")\n",
|
||
|
|
"advs = [sim.adverserial_analysis(should_plot=False) for sim in sims]"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 358,
|
||
|
|
"id": "b49ce221-5754-4982-a2c1-9fc61e23d0ee",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"image/png": "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MbpmTT4nbyYJluqY/kXv5eWlXn/9dbV582a1Zs0apZRSzz77rDI3N1evvPKK2rhxo1q+fLlq3bq1cnNzU8nJyYY65s6dqwA1cuRI9b///U99++23qkWLFsrBwUGdOnXKUO6pp54y/CF+//331R9//KF+++03VVxcrO6//35lZWWl5s2bpzZt2qTefvtt1apVq2oFS8nJycrV1VU1bdpURUREqPXr16vRo0crT0/PMn+Uv/vuO6XRaNQjjzyiVq9erdauXasGDx6sTE1Njf4wl/65/L//9//Ub7/9pj7++GNla2urAgICVEFBgVJKqf3796sWLVqogIAAtXPnTrVz507DHxb9G9Hb21uNHj1a/e9//1MrVqxQnp6eqlWrVqqoqKjS++rfv79ycXFRX375pYqMjFRr1qxRs2fPVt9///0N34+fn5+aPXu22rx5s/r444+VpaWlUSC0Y8cOpdFo1JNPPqnWr1+v/vzzTxUREaHGjBljKHN9EHPu3Dk1ZcoUBajVq1cbfg4ZGRlKKeNgSSmlXnrpJWVtbW34vt7nn3+uAMOHTE2uc+jQIQWo//73v0Z1/vPPPwpQCxcurPDn/M8//6iePXsqd3d3Q507d+5USimVm5urOnTooGxtbdVHH32kNm3apGbNmqXMzMxUSEhIpb8//b07OzsbgpTffvtNDR48WAHq7bffVu3bt1crVqxQ69evV/fdd5+ytLRUiYmJhvPLCw6+//57BahPP/1UKaULdNzc3FTv3r2NXlNeXl6qWbNmyt/fX3377bfqt99+U0888YQC1NatWw3lkpKSVPPmzZWXl5davHix+v3339U777yjLC0t1bhx45RSSuXl5amNGzcqQI0fP97wMzpz5kyF914f78vyfh6LFi1S77//vvr111/V1q1b1TfffKM6duyo/Pz8DO9TpZQKCAhQPXv2LNPOrl27qq5du1byW9QJDg5Ww4YNUyUlJeV+v6SkxPDznzVrlurQoUOFZSuTnp6uHBwc1KOPPmo4duLEiQpfx6+++qrSaDQqNzdXKaXU+++/r0xNTdVbb72l/vjjD7Vx40a1YMECNWfOnEqvq/971bx5czV06FC1du1atXTpUtWyZUtlb29v9OFfXrD03HPPKUC98MILauPGjeqLL75QLi4uqnnz5kaB61dffaU0Go3q06ePWr58ufr999/V559/riZNmmQoc32wtHLlSmVpaakmTpxY6d/NM2fOqMcff1wBRu9l/X9sKgqWvLy81Lhx4wzt1mq1KigoSPXr10+9+uqratOmTSosLEyZmpqqKVOmGF2zup+TN5sES3VM/6KfPXu20fGdO3cqQM2fP9/o+Llz55S1tbV67bXXlFK63gBra+syHxzx8fHK0tJSjRo1ynBMH/Xr/1et97///U8BatGiRUbH33///WoFS6+//rrSaDTq4MGDRsf79etn9Ec5OztbNWrUSA0ZMsSoXHFxserYsaPq1q1bmZ+LvpdDb9myZQpQS5cuNRxr27atUTCgp38jXv+z+eGHHwxv5spotVr14osvVvj9G7mfDz74wKjspEmTlJWVleGP+kcffaSAMr1NpV0fxCil1IcffljmQ0zv+mDp8OHDClBffvmlUblu3bqpLl261Oo6nTp1Mjo2ceJEZW9vX+Z/g9cbNGiQoUewtC+
|
||
|
|
"text/plain": [
|
||
|
|
"<Figure size 640x480 with 1 Axes>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"for s in range(len(sims)):\n",
|
||
|
|
" max_depth = advs[s].max()\n",
|
||
|
|
" count_by_depth = np.zeros(max_depth)\n",
|
||
|
|
" for d in range(max_depth):\n",
|
||
|
|
" count_by_depth[d] = (advs[s] == d).sum() / (sims[s].params.SLOTS * sims[s].params.f)\n",
|
||
|
|
" plt.plot(np.arange(max_depth), count_by_depth, label=f\"E[mixnet_delay]={sims[s].network.mixnet_delay_mean:.1f}s\")\n",
|
||
|
|
"\n",
|
||
|
|
"_ = plt.title(f\"reorg depth sensitivity to mixnet delay @ {1/sims[s].params.f:.0f}s block time\")\n",
|
||
|
|
"_ = plt.xlabel(\"reorg depth\")\n",
|
||
|
|
"_ = plt.ylabel(\"frequency\")\n",
|
||
|
|
"_ = plt.legend()\n",
|
||
|
|
"_ = plt.yscale(\"log\")\n",
|
||
|
|
"_ = plt.xlim(0, 25)\n",
|
||
|
|
"_ = plt.ylim(10**-3,10**0)\n",
|
||
|
|
"# _ = plt."
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 244,
|
||
|
|
"id": "518f75ce-58e1-466c-87b5-57bb59c6dd99",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"simulating 1/5\n",
|
||
|
|
"SIM=100000/600000, blocks=122\n",
|
||
|
|
"SIM=200000/600000, blocks=225\n",
|
||
|
|
"SIM=300000/600000, blocks=326\n",
|
||
|
|
"SIM=400000/600000, blocks=442\n",
|
||
|
|
"SIM=500000/600000, blocks=559\n",
|
||
|
|
"simulating 2/5\n",
|
||
|
|
"simulating 3/5\n",
|
||
|
|
"simulating 4/5\n",
|
||
|
|
"simulating 5/5\n",
|
||
|
|
"finished simulation, starting analysis\n"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"np.random.seed(0)\n",
|
||
|
|
"stake = np.random.pareto(10, 100)\n",
|
||
|
|
"\n",
|
||
|
|
"sims = [Sim(\n",
|
||
|
|
" params=Params(\n",
|
||
|
|
" SLOTS=int(1000 / i),\n",
|
||
|
|
" f=i,\n",
|
||
|
|
" adversary_control = 0.3,\n",
|
||
|
|
" honest_stake = stake\n",
|
||
|
|
" ),\n",
|
||
|
|
" network=NetworkParams(\n",
|
||
|
|
" mixnet_delay_mean=10, # seconds\n",
|
||
|
|
" mixnet_delay_var=4,\n",
|
||
|
|
" broadcast_delay_mean=2, # second\n",
|
||
|
|
" pol_proof_time=2, # seconds\n",
|
||
|
|
" no_network_delay=False\n",
|
||
|
|
" )\n",
|
||
|
|
") for i in np.linspace(1 / 600, 0.05, 5)]\n",
|
||
|
|
"\n",
|
||
|
|
"\n",
|
||
|
|
"for i, sim in enumerate(sims):\n",
|
||
|
|
" print(f\"simulating {i+1}/{len(sims)}\")\n",
|
||
|
|
" sim.run(seed=0)\n",
|
||
|
|
"\n",
|
||
|
|
"print(\"finished simulation, starting analysis\")\n",
|
||
|
|
"advs = [sim.adverserial_analysis(should_plot=False) for sim in sims]"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 250,
|
||
|
|
"id": "070d2a09-a06e-4998-bd67-df3d80c2d482",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"image/png": "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
|
||
|
|
"text/plain": [
|
||
|
|
"<Figure size 640x480 with 1 Axes>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"for s in range(len(sims)):\n",
|
||
|
|
" max_depth = advs[s].max()\n",
|
||
|
|
" count_by_depth = np.zeros(max_depth)\n",
|
||
|
|
" for d in range(max_depth):\n",
|
||
|
|
" count_by_depth[d] = (advs[s] == d).sum() / (sims[s].params.SLOTS * sims[s].params.f)\n",
|
||
|
|
" plt.plot(np.arange(max_depth), count_by_depth, label=f\"E[block_time]={1 / sims[s].params.f:.0f}s\")\n",
|
||
|
|
"\n",
|
||
|
|
"_ = plt.title(\"reorg depth sensitivity to block time\")\n",
|
||
|
|
"_ = plt.xlabel(\"reorg depth\")\n",
|
||
|
|
"_ = plt.ylabel(\"frequency (per block)\")\n",
|
||
|
|
"_ = plt.legend()\n",
|
||
|
|
"_ = plt.yscale(\"log\")"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 335,
|
||
|
|
"id": "e32a48f7-17c8-47f9-8177-e8ce2117e630",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"simulating 1/4\n",
|
||
|
|
"SIM=100000/150000, blocks=15539\n",
|
||
|
|
"simulating 2/4\n",
|
||
|
|
"SIM=100000/300000, blocks=7454\n",
|
||
|
|
"SIM=200000/300000, blocks=14913\n",
|
||
|
|
"simulating 3/4\n",
|
||
|
|
"SIM=100000/600000, blocks=3648\n",
|
||
|
|
"SIM=200000/600000, blocks=7251\n",
|
||
|
|
"SIM=300000/600000, blocks=10815\n",
|
||
|
|
"SIM=400000/600000, blocks=14462\n",
|
||
|
|
"SIM=500000/600000, blocks=18038\n",
|
||
|
|
"simulating 4/4\n",
|
||
|
|
"SIM=100000/900000, blocks=2368\n",
|
||
|
|
"SIM=200000/900000, blocks=4745\n",
|
||
|
|
"SIM=300000/900000, blocks=7051\n",
|
||
|
|
"SIM=400000/900000, blocks=9482\n",
|
||
|
|
"SIM=500000/900000, blocks=11815\n",
|
||
|
|
"SIM=600000/900000, blocks=14139\n",
|
||
|
|
"SIM=700000/900000, blocks=16637\n",
|
||
|
|
"SIM=800000/900000, blocks=19004\n",
|
||
|
|
"finished simulation, starting analysis\n",
|
||
|
|
"Processing block Block(id=1000, slot=6647, height=331, parent=993, leader=23)\n",
|
||
|
|
"Processing block Block(id=2000, slot=12979, height=654, parent=1996, leader=72)\n",
|
||
|
|
"Processing block Block(id=3000, slot=19147, height=970, parent=2996, leader=70)\n",
|
||
|
|
"Processing block Block(id=4000, slot=25849, height=1301, parent=3994, leader=7)\n",
|
||
|
|
"Processing block Block(id=5000, slot=32235, height=1620, parent=4995, leader=57)\n",
|
||
|
|
"Processing block Block(id=6000, slot=38680, height=1938, parent=5996, leader=23)\n",
|
||
|
|
"Processing block Block(id=7000, slot=45085, height=2265, parent=6997, leader=20)\n",
|
||
|
|
"Processing block Block(id=8000, slot=51497, height=2591, parent=7999, leader=62)\n",
|
||
|
|
"Processing block Block(id=9000, slot=57923, height=2912, parent=8997, leader=13)\n",
|
||
|
|
"Processing block Block(id=10000, slot=64359, height=3240, parent=9995, leader=8)\n",
|
||
|
|
"Processing block Block(id=11000, slot=70846, height=3554, parent=10996, leader=0)\n",
|
||
|
|
"Processing block Block(id=12000, slot=77247, height=3868, parent=11997, leader=74)\n",
|
||
|
|
"Processing block Block(id=13000, slot=83581, height=4187, parent=12996, leader=49)\n",
|
||
|
|
"Processing block Block(id=14000, slot=90342, height=4523, parent=13997, leader=23)\n",
|
||
|
|
"Processing block Block(id=15000, slot=96605, height=4847, parent=14995, leader=68)\n",
|
||
|
|
"Processing block Block(id=16000, slot=103137, height=5175, parent=15994, leader=35)\n",
|
||
|
|
"Processing block Block(id=17000, slot=109408, height=5485, parent=16996, leader=21)\n",
|
||
|
|
"Processing block Block(id=18000, slot=116148, height=5814, parent=17994, leader=1)\n",
|
||
|
|
"Processing block Block(id=19000, slot=122629, height=6133, parent=18996, leader=44)\n",
|
||
|
|
"Processing block Block(id=20000, slot=128649, height=6436, parent=19992, leader=72)\n",
|
||
|
|
"Processing block Block(id=21000, slot=134981, height=6766, parent=20992, leader=91)\n",
|
||
|
|
"Processing block Block(id=22000, slot=141443, height=7084, parent=21993, leader=72)\n",
|
||
|
|
"Processing block Block(id=23000, slot=147541, height=7391, parent=22996, leader=70)\n",
|
||
|
|
"Processing block Block(id=1000, slot=13696, height=504, parent=998, leader=19)\n",
|
||
|
|
"Processing block Block(id=2000, slot=27252, height=994, parent=1996, leader=40)\n",
|
||
|
|
"Processing block Block(id=3000, slot=40875, height=1486, parent=2995, leader=17)\n",
|
||
|
|
"Processing block Block(id=4000, slot=53942, height=1974, parent=3997, leader=52)\n",
|
||
|
|
"Processing block Block(id=5000, slot=66966, height=2468, parent=4997, leader=52)\n",
|
||
|
|
"Processing block Block(id=6000, slot=80689, height=2983, parent=5998, leader=52)\n",
|
||
|
|
"Processing block Block(id=7000, slot=94116, height=3481, parent=6998, leader=2)\n",
|
||
|
|
"Processing block Block(id=8000, slot=107469, height=3988, parent=7999, leader=54)\n",
|
||
|
|
"Processing block Block(id=9000, slot=120483, height=4498, parent=8997, leader=10)\n",
|
||
|
|
"Processing block Block(id=10000, slot=134285, height=5011, parent=9998, leader=13)\n",
|
||
|
|
"Processing block Block(id=11000, slot=147596, height=5514, parent=10998, leader=28)\n",
|
||
|
|
"Processing block Block(id=12000, slot=160875, height=6009, parent=11997, leader=45)\n",
|
||
|
|
"Processing block Block(id=13000, slot=174501, height=6513, parent=12998, leader=38)\n",
|
||
|
|
"Processing block Block(id=14000, slot=187371, height=6986, parent=13996, leader=37)\n",
|
||
|
|
"Processing block Block(id=15000, slot=201237, height=7499, parent=14997, leader=38)\n",
|
||
|
|
"Processing block Block(id=16000, slot=214376, height=7992, parent=15995, leader=19)\n",
|
||
|
|
"Processing block Block(id=17000, slot=227251, height=8483, parent=16996, leader=83)\n",
|
||
|
|
"Processing block Block(id=18000, slot=240344, height=8983, parent=17995, leader=28)\n",
|
||
|
|
"Processing block Block(id=19000, slot=254516, height=9501, parent=18999, leader=65)\n",
|
||
|
|
"Processing block Block(id=20000, slot=268027, height=10003, parent=19998, leader=72)\n",
|
||
|
|
"Processing block Block(id=21000, slot=281073, height=10489, parent=20998, leader=62)\n",
|
||
|
|
"Processing block Block(id=22000, slot=294487, height=10990, parent=21998, leader=89)\n",
|
||
|
|
"Processing block Block(id=1000, slot=28018, height=678, parent=999, leader=13)\n",
|
||
|
|
"Processing block Block(id=2000, slot=54681, height=1338, parent=1998, leader=37)\n",
|
||
|
|
"Processing block Block(id=3000, slot=81956, height=2003, parent=2998, leader=2)\n",
|
||
|
|
"Processing block Block(id=4000, slot=108982, height=2667, parent=3994, leader=68)\n",
|
||
|
|
"Processing block Block(id=5000, slot=136909, height=3341, parent=4999, leader=18)\n",
|
||
|
|
"Processing block Block(id=6000, slot=163753, height=4012, parent=5997, leader=13)\n",
|
||
|
|
"Processing block Block(id=7000, slot=192695, height=4696, parent=6999, leader=5)\n",
|
||
|
|
"Processing block Block(id=8000, slot=221475, height=5366, parent=7998, leader=6)\n",
|
||
|
|
"Processing block Block(id=9000, slot=248974, height=6027, parent=8998, leader=17)\n",
|
||
|
|
"Processing block Block(id=10000, slot=277968, height=6712, parent=9998, leader=42)\n",
|
||
|
|
"Processing block Block(id=11000, slot=305410, height=7370, parent=10999, leader=18)\n",
|
||
|
|
"Processing block Block(id=12000, slot=332514, height=8047, parent=11996, leader=13)\n",
|
||
|
|
"Processing block Block(id=13000, slot=359107, height=8703, parent=12997, leader=93)\n",
|
||
|
|
"Processing block Block(id=14000, slot=387380, height=9362, parent=13997, leader=28)\n",
|
||
|
|
"Processing block Block(id=15000, slot=414889, height=10019, parent=14997, leader=5)\n",
|
||
|
|
"Processing block Block(id=16000, slot=442318, height=10689, parent=15999, leader=31)\n",
|
||
|
|
"Processing block Block(id=17000, slot=470263, height=11361, parent=16999, leader=0)\n",
|
||
|
|
"Processing block Block(id=18000, slot=499107, height=12050, parent=17997, leader=56)\n",
|
||
|
|
"Processing block Block(id=19000, slot=526745, height=12716, parent=18999, leader=44)\n",
|
||
|
|
"Processing block Block(id=20000, slot=555994, height=13405, parent=19998, leader=60)\n",
|
||
|
|
"Processing block Block(id=21000, slot=583060, height=14052, parent=20999, leader=48)\n",
|
||
|
|
"Processing block Block(id=1000, slot=43147, height=756, parent=999, leader=52)\n",
|
||
|
|
"Processing block Block(id=2000, slot=84935, height=1523, parent=1998, leader=58)\n",
|
||
|
|
"Processing block Block(id=3000, slot=127256, height=2278, parent=2998, leader=13)\n",
|
||
|
|
"Processing block Block(id=4000, slot=168543, height=3021, parent=3998, leader=17)\n",
|
||
|
|
"Processing block Block(id=5000, slot=211612, height=3780, parent=4998, leader=40)\n",
|
||
|
|
"Processing block Block(id=6000, slot=254555, height=4514, parent=5999, leader=37)\n",
|
||
|
|
"Processing block Block(id=7000, slot=297433, height=5284, parent=6999, leader=36)\n",
|
||
|
|
"Processing block Block(id=8000, slot=337608, height=6021, parent=7999, leader=66)\n",
|
||
|
|
"Processing block Block(id=9000, slot=380081, height=6780, parent=8999, leader=37)\n",
|
||
|
|
"Processing block Block(id=10000, slot=421828, height=7524, parent=9998, leader=10)\n",
|
||
|
|
"Processing block Block(id=11000, slot=463502, height=8278, parent=10998, leader=52)\n",
|
||
|
|
"Processing block Block(id=12000, slot=508372, height=9044, parent=11999, leader=36)\n",
|
||
|
|
"Processing block Block(id=13000, slot=551404, height=9811, parent=12998, leader=41)\n",
|
||
|
|
"Processing block Block(id=14000, slot=593238, height=10574, parent=13998, leader=83)\n",
|
||
|
|
"Processing block Block(id=15000, slot=633488, height=11327, parent=14999, leader=27)\n",
|
||
|
|
"Processing block Block(id=16000, slot=674922, height=12060, parent=15997, leader=51)\n",
|
||
|
|
"Processing block Block(id=17000, slot=714860, height=12815, parent=16999, leader=89)\n",
|
||
|
|
"Processing block Block(id=18000, slot=758063, height=13567, parent=17999, leader=70)\n",
|
||
|
|
"Processing block Block(id=19000, slot=799852, height=14311, parent=18999, leader=59)\n",
|
||
|
|
"Processing block Block(id=20000, slot=841279, height=15062, parent=19999, leader=20)\n",
|
||
|
|
"Processing block Block(id=21000, slot=881497, height=15807, parent=20999, leader=7)\n"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"np.random.seed(0)\n",
|
||
|
|
"stake = np.random.pareto(10, 100)\n",
|
||
|
|
"\n",
|
||
|
|
"mixnet_delay_mean = 10\n",
|
||
|
|
"\n",
|
||
|
|
"sims = [Sim(\n",
|
||
|
|
" params=Params(\n",
|
||
|
|
" SLOTS=int(30000 * 1 / (1/mixnet_delay_mean / i)),\n",
|
||
|
|
" f=1/mixnet_delay_mean / i,\n",
|
||
|
|
" adversary_control = 0.3,\n",
|
||
|
|
" honest_stake = stake\n",
|
||
|
|
" ),\n",
|
||
|
|
" network=NetworkParams(\n",
|
||
|
|
" mixnet_delay_mean=mixnet_delay_mean, # seconds\n",
|
||
|
|
" mixnet_delay_var=4,\n",
|
||
|
|
" broadcast_delay_mean=2, # second\n",
|
||
|
|
" pol_proof_time=2, # seconds\n",
|
||
|
|
" no_network_delay=False\n",
|
||
|
|
" )\n",
|
||
|
|
") for i in [1/2, 1, 2, 3]]\n",
|
||
|
|
"\n",
|
||
|
|
"\n",
|
||
|
|
"for i, sim in enumerate(sims):\n",
|
||
|
|
" print(f\"simulating {i+1}/{len(sims)}\")\n",
|
||
|
|
" sim.run(seed=0)\n",
|
||
|
|
"\n",
|
||
|
|
"print(\"finished simulation, starting analysis\")\n",
|
||
|
|
"advs = [sim.adverserial_analysis(should_plot=False) for sim in sims]"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 344,
|
||
|
|
"id": "8c716377-7a62-4b2c-9001-910fc07cbb1c",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"image/png": "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
|
||
|
|
"text/plain": [
|
||
|
|
"<Figure size 640x480 with 1 Axes>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"MAX=30\n",
|
||
|
|
"\n",
|
||
|
|
"for s in range(len(sims)):\n",
|
||
|
|
" \n",
|
||
|
|
" max_depth = advs[s].max() if advs[s].sum() > 0 else 0\n",
|
||
|
|
" max_depth = min(MAX, max_depth)\n",
|
||
|
|
" count_by_depth = np.zeros(max_depth)\n",
|
||
|
|
" for d in range(max_depth):\n",
|
||
|
|
" count_by_depth[d] = (advs[s] == d).sum() \n",
|
||
|
|
" block_time = 1 / sims[s].params.f\n",
|
||
|
|
" expected_blocks = sims[s].params.SLOTS / block_time\n",
|
||
|
|
" plt.plot(np.arange(max_depth), count_by_depth / expected_blocks, label=f\"{block_time:.0f}s ~ {block_time / sims[s].network.mixnet_delay_mean:.1f}x mix delay\")\n",
|
||
|
|
"\n",
|
||
|
|
"_ = plt.title(f\"reorg depth sensitivity to block time @ {mixnet_delay_mean}s mixnet delay\")\n",
|
||
|
|
"_ = plt.xlabel(\"reorg depth\")\n",
|
||
|
|
"_ = plt.ylabel(\"frequency\")\n",
|
||
|
|
"_ = plt.legend()\n",
|
||
|
|
"_ = plt.yscale(\"log\")\n",
|
||
|
|
"_ = plt.xlim(0, MAX)\n",
|
||
|
|
"_ = plt.ylim(10**-4, 4)\n",
|
||
|
|
"# _ = plt.ylim(0,None)"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 340,
|
||
|
|
"id": "3ba22221-45d6-4e4c-9cee-9e5cb4855dbe",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAkkAAAHFCAYAAADmGm0KAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAB33klEQVR4nO3dd1xV5R8H8M8FLly2CMhQZLs3KMMQFcWRq9x7UmY5W9pyVJppOVFzayZaZmZFKQ7IgRtcoKKAOEAEZYkyLs/vD+L+unGZApfxeb9evOo+9znnfM/D4dyPZ12JEEKAiIiIiJRoqLsAIiIiouqIIYmIiIhIBYYkIiIiIhUYkoiIiIhUYEgiIiIiUoEhiYiIiEgFhiQiIiIiFRiSiIiIiFRgSCIiIiJSgSGpFti+fTskEgkuXLhQYfNcsGABJBJJhc2vJoiIiMCCBQsQGxtb6L2uXbuiVatWVV/US7Czs0O/fv1K7BcbGwuJRILt27dXSh3BwcGQSCTYt29fmad9+PAhFixYgPDw8ELv1cVttEDBmAYHByvaAgMDsWDBApX97ezsMGHChHItS53jHBYWBm9vbxgbG0MikWDlypVVtuzi9gfqUvC3unz58gqfZ3n+/lVth7UNQxKpNGXKFISGhqq7jCoVERGBhQsXVqudYl338OFDLFy4UGVIqovbaHECAwOxcOFCle/98ssv+PTTT6u4opc3adIkxMfHY8+ePQgNDcWIESOqbNncHxAAaKm7AKqeGjVqhEaNGqm7DIXMzEzo6empuwyqRqrbNlqdtW/fXt0llMu1a9fg5+eHPn36qLsUtRJC4MWLF+ouo07ikaQa4MaNGxg5ciQsLCygo6ODxo0bY9y4ccjKylLql56ejrfeegtmZmYwNTXF66+/jocPHyr12bt3L3x9fWFlZQVdXV00b94cc+fOxbNnz5T6qTrEXnD65q+//kKHDh2gq6uLZs2aYevWraVaj/v372PIkCEwNDREvXr1MHr0aJw/f77Qod4JEybAwMAAV69eha+vLwwNDeHj4wMAePLkCaZNm4aGDRtCW1sbDg4O+Pjjj5XGYujQoWjZsqXSsvv37w+JRIKffvpJ0Xbp0iVIJBL89ttv2L59O4YOHQoA6NatGyQSicpD0OfPn4eXlxf09PTg4OCAr776Cnl5ecWud/v27eHl5VWoXS6Xo2HDhnj99dcVbevXr0fbtm1hYGAAQ0NDNGvWDB999FHxA1uCX375BW3atIFMJoODgwNWr15dqulOnjwJHx8fGBoaQk9PD56envjjjz8K9Xvw4AHeeOMN2NjYQFtbG9bW1hgyZAgePXpU5LzT0tLQq1cvWFhY4Ny5cyr7BAcHo2PHjgCAiRMnKn4nBaeUittGf//9d7Rv316xjf/+++8A8k9NN2/eHPr6+ujUqZPKU9QXLlzAgAEDUL9+fchkMrRv3x4//vhjieNVcNpi2bJlWLp0Kezs7KCrq4uuXbvi1q1byMnJwdy5c2FtbQ1jY2O89tprSExMVJrHv9fvv+tV3OmyCRMmwN/fXzGPgp+CoyD/nb7gNMmuXbswZ84cWFpaQldXF97e3ggLCytxXYH8fYmHhwf09fVhYGCAXr16lXraa9euYeDAgTAxMYFMJkO7du2wY8cOxfsFlxDk5uZi/fr1ivUpyr9PQ3377bewt7eHgYEBPDw8cObMmUL9S/odF7c/8Pf3h4aGhtLv7ptvvoFEIsHbb7+taMvLy4OJiQneffddRVtp9l9A/u/wnXfewYYNG9C8eXPo6Ogojc+/5eTkYPz48TAwMFBs50V5+PAhhg0bBkNDQxgbG2P48OFISEhQ2be8fwcXLlzAiBEjFNu/nZ0dRo4cibt37yr6xMbGQktLC0uWLCk0/d9//11oX61Wgqq18PBwYWBgIOzs7MSGDRvE0aNHxa5du8SwYcNEWlqaEEKIbdu2CQDCwcFBTJ8+XRw6dEhs3rxZmJiYiG7duinN7/PPPxcrVqwQf/zxhwgODhYbNmwQ9vb2hfrNnz9f/HfzsLW1FY0aNRItWrQQO3fuFIcOHRJDhw4VAERISEix65GRkSGcnJxE/fr1hb+/vzh06JCYPXu2sLe3FwDEtm3bFH3Hjx8vpFKpsLOzE0uWLBFHjx4Vhw4dEs+fPxdt2rQR+vr6Yvny5eLw4cPi008/FVpaWqJv376K6Tds2CAAiIcPHwohhMjJyRGGhoZCV1dX+Pn5KfotXbpUaGlpibS0NJGYmCgWL14sAAh/f38RGhoqQkNDRWJiohBCCG9vb2FqaiqcnZ3Fhg0bRFBQkJg2bZoAIHbs2FHsuq9atUoAELdu3VJqDwwMFADEwYMHhRBCBAQECABi+vTp4vDhw+LIkSNiw4YNYsaMGcXOvyi2traiYcOGonHjxmLr1q0iMDBQjB49WgAQy5YtU/SLiYkp9DsIDg4WUqlUuLi4iL1794oDBw4IX19fIZFIxJ49exT97t+/L6ysrISZmZn49ttvxZEjR8TevXvFpEmTRGRkpBBCiOPHjwsA4qeffhJCCHHv3j3RunVr0bRpU3Hnzp0i609NTVVs25988onid3Lv3j0hRPHbaKtWrURAQIAIDAwUbm5uQiqVis8++0x07txZ7N+/X/zyyy+iSZMmwsLCQmRmZiqmP3bsmNDW1hZeXl5i79694q+//hITJkwoND6qFIyjra2t6N+/v/j999/Frl27hIWFhWjSpIkYO3asmDRpkvjzzz/Fhg0bhIGBgejfv7/SPACI+fPnq/xdjh8/XvG6YEyPHz8uhBDi9u3bYsiQIQKAYpxCQ0PFixcvip3exsZGDBw4UPz2229i165dwsnJSRgZGSn9XlSN85dffikkEomYNGmS+P3338X+/fuFh4eH0NfXF9evXy92nG7cuCEMDQ2Fo6Oj2Llzp/jjjz/EyJEjBQCxdOlSIYQQiYmJIjQ0VAAQQ4YMUaxPSWNvZ2cnevfuLQ4cOCAOHDggWrduLUxMTERKSoqib2l+x8XtD27cuCEAiN27dyvm2bt3b6GrqyucnZ0VbWfPnhUARGBgoBBClHr/JUT+dtCwYUPRpk0bsXv3bnHs2DFx7do1xXoW/P0+ffpUdOvWTVhaWooLFy4UO+6ZmZmiefPmwtjYWKxZs0YcOnRIzJgxQzRu3LjQ9l3av4P/bodCCPHTTz+Jzz77TPzyyy8iJCRE7NmzR3h7ewtzc3Px+PFjRb/XXntNNG7cWOTm5irVOXToUGFtbS1ycnKKXZ+qwpBUzXXv3l3Uq1dP8WGtSsEHybRp05Tav/76awFAxMfHq5wuLy9P5OTkiJCQEAFAXL58WfFeUR9AMplM3L17V9H2/PlzUb9+ffHmm28Wux7+/v4CgPjzzz+V2t98802VIQmA2Lp1q1LfgvDz448/KrUvXbpUABCHDx8WQuR/YAAQO3fuFEIIcfLkSQFAfPDBB8Le3l4xXc+ePYWnp6fi9U8//VToD76At7e3ACDOnj2r1N6iRQvRq1evYtc9KSlJaGtri48++kipfdiwYcLCwkKxM3jnnXdEvXr1ip1XWdja2gqJRCLCw8OV2nv27CmMjIzEs2fPhBCqQ5K7u7to0KCBSE9PV7Tl5uaKVq1aiUaNGom8vDwhhBCTJk0SUqlUREREFFnHv0NSWFiYsLa2Fl5eXiI5ObnEdTh//nyRAaWobVRXV1fcv39f0RYeHi4ACCsrK8U6CyHEgQMHlEKqEEI0a9ZMtG/fvtAOul+/fsLKykrI5fIiay0Yx7Zt2yr1W7lypQAgBgwYoNR/1qxZAoBITU1VtJU3JAkhxNtvv11oPEqavkOHDorfpRBCxMbGCqlUKqZMmaJo++84x8XFCS0tLTF9+nSlZaSnpwtLS0sxbNgwlTUUGDFihNDR0RFxcXFK7X369BF6enpKgQaAePvtt4udnxD/H/vWrVsrfeieO3dOABABAQGKttL+jovbHzRq1EhMmjRJCCFEVlaW0NfXFx9++KEAoNg/fvnll0IqlYqMjAwhROn3XwXrbWxsLJ48eaJyPZctWyZiYmJEixYtRIsWLURsbGyJY7R+/XoBQPz
|
||
|
|
"text/plain": [
|
||
|
|
"<Figure size 640x480 with 1 Axes>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"# _ = plt.plot([(1 / s.params.f) / s.network.mixnet_delay_mean for s in sims], [len(s.honest_chain()) / s.params.SLOTS for s in sims])\n",
|
||
|
|
"_ = plt.plot([s.params.f for s in sims], [len(s.honest_chain(-1, s.params.SLOTS)) / s.params.SLOTS for s in sims])\n",
|
||
|
|
"\n",
|
||
|
|
"_ = plt.title(\"chain growth vs. block time multiple of network delay\")\n",
|
||
|
|
"_ = plt.ylabel(\"blocks/slot\")\n",
|
||
|
|
"_ = plt.xlabel(\"block time multiple of network delay\")"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 341,
|
||
|
|
"id": "8bf09039-2bff-40a7-96b4-df55a514c060",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"image/png": "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
|
||
|
|
"text/plain": [
|
||
|
|
"<Figure size 640x480 with 1 Axes>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"# _ = plt.plot([(1 / s.params.f) / s.network.mixnet_delay_mean for s in sims], [len(s.honest_chain()) / s.params.SLOTS for s in sims])\n",
|
||
|
|
"_ = plt.plot([s.params.f for s in sims], [len(s.honest_chain(-1, s.params.SLOTS)) / len(s.blocks) for s in sims])\n",
|
||
|
|
"\n",
|
||
|
|
"_ = plt.title(\"block efficiency\")\n",
|
||
|
|
"_ = plt.ylabel(\"% of blocks member of honest chain\")\n",
|
||
|
|
"_ = plt.xlabel(\"f\")"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": null,
|
||
|
|
"id": "5b360b74-c8f6-4694-b511-7ee4e50275cc",
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": []
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"metadata": {
|
||
|
|
"kernelspec": {
|
||
|
|
"display_name": "Python 3 (ipykernel)",
|
||
|
|
"language": "python",
|
||
|
|
"name": "python3"
|
||
|
|
},
|
||
|
|
"language_info": {
|
||
|
|
"codemirror_mode": {
|
||
|
|
"name": "ipython",
|
||
|
|
"version": 3
|
||
|
|
},
|
||
|
|
"file_extension": ".py",
|
||
|
|
"mimetype": "text/x-python",
|
||
|
|
"name": "python",
|
||
|
|
"nbconvert_exporter": "python",
|
||
|
|
"pygments_lexer": "ipython3",
|
||
|
|
"version": "3.11.9"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"nbformat": 4,
|
||
|
|
"nbformat_minor": 5
|
||
|
|
}
|