def test_addressing(self): C = Chain(Block.genesis()) for n in range(100): C.mine() self.assertEqual(C[-1].height, 100) self.assertEqual(C[3:13], C[3:7].union(C[7:13])) self.assertEqual(C[3:13], C[7:13].union(C[3:7])) self.assertNotEqual(C[3:13], C[7:12].union(C[3:7])) self.assertNotEqual(C[3:13], C[7:13].union(C[3:6])) self.assertEqual(C.union(C), C) self.assertEqual(C.intersect(C), C)
def test_chain(self): G = Block.genesis() C = Chain() C.append(G) b = C.mine() self.assertEqual(len(C), 2) self.assertEqual(C[0], G) self.assertEqual(C[-1], b) self.assertEqual(C[0:2], C) self.assertEqual(len(C.slice(G, b)), 1) self.assertEqual(C[0].height, 0) self.assertEqual(C[1].height, 1) self.assertTrue(C.is_chained())
def make_expected_distribution_superchain(self, length, interlink=False, gen=None): if gen is None: gen = Block.genesis() C = Chain(gen) for n in range(1, length + 1): C.mine() # expected distribution, OEIS A007814 if n % 2 == 1: lvl = 0 else: lvl = 1 + C[n // 2].level C[-1].level = lvl if interlink: C[-1].velvet_interlink = C[-1].real_interlink return C
def test_at_correct_level(self): k = 1 m = 3 # both chains will compare at level 30 # ensure there's at least m = 3 blocks of level 30 G = Block.genesis() C1 = Chain(G) C2 = Chain(G) # C1 has 3 blocks at 30 and then 10+k blocks at 0 for i in range(3): C1.mine() C1[-1].level = 30 for i in range(10 + k): C1.mine() C1[-1].level = 0 # C2 has 6 blocks at 30, then k blocks at 0 for i in range(6): C2.mine() C2[-1].level = 30 for i in range(k): C2.mine() C2[-1].level = 0 # Ensure only blocks of the right level count proof1 = NIPoPoW.prove(k, m, C1) proof2 = NIPoPoW.prove(k, m, C2) b, (score1, mu1), (score2, mu2) = NIPoPoW.score(proof1, proof2) self.assertEqual(mu1, 30) self.assertEqual(mu2, 30) self.assertEqual(b, G) self.assertEqual(score1, 2**30 * 3) self.assertEqual(score2, 2**30 * 6) assert (len(C1) > len(C2)) self.assertWins(proof2, proof1)
if __name__ == '__main__': t = 1 n = 5 m = 3 k = 3 mu_B = 4 monte_carlo_count = 100 sample_run = False if sample_run: monte_carlo_count = 1 adversarial_victories = 0 for i in range(monte_carlo_count): G = Block.genesis() honest = Honest(G) adversary = Adversary(G, k, m, mu_B) while not adversary.ready(): r = random() adversary_turn = (r < t / n) if adversary_turn: chain = adversary.play() if chain is not None: honest.block_arrival(chain) else: chain = honest.play() adversary.block_arrival(chain) honest_proof = NIPoPoW.prove(k, m, honest.chain) if sample_run:
def test_block(self): G = Block.genesis() self.assertTrue(G.genesis) self.assertEqual(G.height, 0)