Пример #1
0
 def test_receive_chain_accept(self):
     n1 = None
     try:
         blk = {
             'timestamp': '2017-01-02T03:04:05.000123Z',
             'prev_hash': '1234',
             'data': {
                 'foo': 'bar'
             }
         }
         dct = {'blocks': [blk]}
         chain = Chain.from_dict(dct)
         node_id = 'blah'
         backend = MockFileBackend(chains={node_id: chain})
         n1 = Node.start(node_id=node_id, backend=backend)
         p1 = n1.proxy()
         chain2 = copy.deepcopy(chain)
         blk2 = {
             'timestamp': '2017-01-02T03:04:05.000123Z',
             'prev_hash': Block.from_dict(blk).hash,
             'data': {
                 'a': 'b'
             }
         }
         chain2.add_block(Block.from_dict(blk2))
         res = p1.receive_chain(chain2).get()
         self.assertEqual(res, ACCEPTED)
         self.assertEqual(p1.chain.get(), chain2)
     finally:
         n1.stop()
Пример #2
0
    def test_share_chain_rejected(self):
        try:
            blk = {
                'timestamp': '2017-01-02T03:04:05.000123Z',
                'prev_hash': '1234',
                'data': {
                    'foo': 'bar'
                }
            }
            blk2 = {
                'timestamp': '2017-01-02T03:04:05.000123Z',
                'prev_hash': Block.from_dict(blk).hash,
                'data': {
                    'woo': 'hoo'
                }
            }
            dct = {'blocks': [blk, blk2]}
            chain = Chain.from_dict(dct)
            node_id = 'blah'
            backend = MockFileBackend(chains={node_id: chain})
            n1 = Node.start(node_id=node_id, backend=backend)
            p1 = n1.proxy()

            short_chain = Chain.from_dict({'blocks': [blk]})
            blk3 = {
                'timestamp': '2017-01-02T03:04:05.000123Z',
                'prev_hash': Block.from_dict(blk).hash,
                'data': {
                    'p': 'b'
                }
            }
            dct2 = {'blocks': [blk, blk3]}
            chain2 = Chain.from_dict(dct2)
            n2 = Node.start(node_id='2',
                            backend=MockFileBackend({'2': short_chain}))
            n3 = Node.start(node_id='3',
                            backend=MockFileBackend({'3': chain2}))
            n4 = Node.start(node_id='4',
                            backend=MockFileBackend({'4': chain2}))
            p2 = n2.proxy()
            p3 = n3.proxy()
            p4 = n4.proxy()
            p1.register_peer(p2)
            p1.register_peer(p3)
            p1.register_peer(p4)
            p1.share_chain().get()
            self.assertEqual(p1.chain.get(), short_chain)
            self.assertEqual(p2.chain.get(), short_chain)
            self.assertEqual(p3.chain.get(), chain2)
            self.assertEqual(p4.chain.get(), chain2)
        finally:
            n1.stop()
            n2.stop()
            n3.stop()
            n4.stop()
Пример #3
0
 def test_from_dict_to_dict(self):
     dct = {
         'timestamp': '2017-01-02T03:04:05.000123Z',
         'prev_hash': '1234',
         'data': {'foo': 'bar'}
     }
     b = Block.from_dict(dct)
     dct['hash'] = b.hash
     self.assertEqual(b.to_dict(), dct)
Пример #4
0
 def test_json(self):
     dct = {
         'timestamp': '2017-01-02T03:04:05.000123Z',
         'prev_hash': '1234',
         'data': {'foo': 'bar'}
     }
     b = Block.from_json(json.dumps(dct))
     dct['hash'] = b.hash
     self.maxDiff = None
     self.assertEqual(json.loads(b.to_json()), dct)
Пример #5
0
 def test_load_chain(self):
     chain = Chain(
         blocks=[Block(
             timestamp=datetime(2017, 8, 9, 10, 11, 12, tzinfo=pytz.UTC),
             prev_hash='xxyy',
             data={'foo': 'bar'}
         )])
     json.dump(chain.to_dict(), open(os.path.join(FileBackend.FILE_DIR, 'n2.json'), 'w'))
     c2 = self.backend.load_chain('n2')
     self.assertEqual(c2.to_dict(), chain.to_dict())
Пример #6
0
 def test_save_chain(self):
     chain = Chain(
         blocks=[Block(
             timestamp=datetime(2017, 8, 9, 10, 11, 12, tzinfo=pytz.UTC),
             prev_hash='abcd',
             data={'foo': 'bar'}
         )])
     self.backend.save_chain(chain, 'n1')
     d = json.load(open(os.path.join(FileBackend.FILE_DIR, 'n1.json')))
     self.assertEqual(d, chain.to_dict())
Пример #7
0
 def mine_block(self):
     self.logger.debug('mining now')
     t = pytz.UTC.localize(datetime.utcnow())
     data = json.dumps(
         {k: v.to_dict()
          for k, v in self.pending_transactions.iteritems()})
     new_block = Block(timestamp=t,
                       prev_hash=self.chain.latest_hash(),
                       data=data)
     self.chain.add_block(new_block)
     self.share_chain()
Пример #8
0
    def test_add_block(self):
        blk = {
            'timestamp': '2017-01-02T03:04:05.000123Z',
            'prev_hash': '1234',
            'data': {'foo': 'bar'}
        }
        dct = {
            'blocks': [blk]
        }
        chain = Chain.from_dict(dct)
        b2 = {
            'timestamp': '2017-01-02T03:04:05.000123Z',
            'prev_hash': Block.from_dict(blk).hash,
            'data': {'on': 'point'}
        }
        chain.add_block(Block.from_dict(b2))
        self.assertEqual(
            chain.to_dict(),
            {'blocks': [Block.from_dict(blk).to_dict(), Block.from_dict(b2).to_dict()]}
        )

        # prev_hash doesn't match last hash - should fail
        b3 = {
            'timestamp': '2017-01-02T03:04:05.000123Z',
            'prev_hash': Block.from_dict(blk).hash,
            'data': {'some': 'thing'}
        }
        self.assertRaises(ValueError, chain.add_block, Block.from_dict(b3))
Пример #9
0
    def test_receive_chain_reject_same_length_different_blocks(self):
        n1 = None
        try:
            blk = {
                'timestamp': '2017-01-02T03:04:05.000123Z',
                'prev_hash': '1234',
                'data': {
                    'foo': 'bar'
                }
            }
            blk2 = {
                'timestamp': '2017-01-02T03:04:05.000123Z',
                'prev_hash': Block.from_dict(blk).hash,
                'data': {
                    'woo': 'hoo'
                }
            }
            dct = {'blocks': [blk, blk2]}
            chain = Chain.from_dict(dct)
            node_id = 'blah'
            backend = MockFileBackend(chains={node_id: chain})
            n1 = Node.start(node_id=node_id, backend=backend)
            p1 = n1.proxy()

            blk3 = {
                'timestamp': '2017-01-02T03:04:05.000123Z',
                'prev_hash': Block.from_dict(blk).hash,
                'data': {
                    'p': 'b'
                }
            }
            dct2 = {'blocks': [blk, blk3]}
            chain2 = Chain.from_dict(dct2)
            res = p1.receive_chain(chain2).get()
            self.assertEqual(res, REJECTED)
            self.assertEqual(p1.chain.get(), chain)
        finally:
            n1.stop()
Пример #10
0
 def test_latest_hash(self):
     block_dicts = [
         {
             'timestamp': '2017-01-02T03:04:05.000123Z',
             'prev_hash': '1234',
             'data': {'foo': 'bar'}
         },
         {
             'timestamp': '2017-01-02T03:04:05.000123Z',
             'prev_hash': '5678',
             'data': {'on': 'point'}
         }
     ]
     chain = Chain.from_dict(
         {'blocks': block_dicts}
     )
     self.assertEqual(chain.latest_hash(), Block.from_dict(block_dicts[-1]).hash)
     chain2 = Chain(blocks=[])
     self.assertIsNone(chain2.latest_hash())