示例#1
0
    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)
示例#2
0
 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())
示例#3
0
    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
示例#4
0
    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)
示例#5
0

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:
示例#6
0
 def test_block(self):
     G = Block.genesis()
     self.assertTrue(G.genesis)
     self.assertEqual(G.height, 0)