def test_toraw_fromsignedraw(self): block = Block.from_signed_raw(raw_block) rendered_raw = block.signed_raw() from_rendered_raw = Block.from_signed_raw(rendered_raw) self.assertEqual(from_rendered_raw.version, 11) self.assertEqual(from_rendered_raw.currency, "zeta_brouzouf") self.assertEqual(from_rendered_raw.nonce, 45079) self.assertEqual(from_rendered_raw.number, 15) self.assertEqual(from_rendered_raw.powmin, 4) self.assertEqual(from_rendered_raw.time, 1418083330) self.assertEqual(from_rendered_raw.mediantime, 1418080208) self.assertEqual( from_rendered_raw.issuer, "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk" ) self.assertEqual( from_rendered_raw.prev_hash, "0000E73C340601ACA1AD5AAA5B5E56B03E178EF8" ) self.assertEqual( from_rendered_raw.prev_issuer, "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk", ) self.assertEqual(from_rendered_raw.members_count, 4) self.assertEqual(from_rendered_raw.identities, []) self.assertEqual(from_rendered_raw.joiners, []) self.assertEqual(from_rendered_raw.actives, []) self.assertEqual(from_rendered_raw.leavers, []) self.assertEqual(from_rendered_raw.excluded, []) self.assertEqual(from_rendered_raw.certifications, []) self.assertEqual(from_rendered_raw.transactions, []) self.assertEqual(block.signed_raw(), raw_block)
def test_toraw_fromsignedraw(self): block = Block.from_signed_raw(raw_block) rendered_raw = block.signed_raw() from_rendered_raw = Block.from_signed_raw(rendered_raw) self.assertEqual(from_rendered_raw.version, 11) self.assertEqual(from_rendered_raw.currency, "zeta_brouzouf") self.assertEqual(from_rendered_raw.noonce, 45079) self.assertEqual(from_rendered_raw.number, 15) self.assertEqual(from_rendered_raw.powmin, 4) self.assertEqual(from_rendered_raw.time, 1418083330) self.assertEqual(from_rendered_raw.mediantime, 1418080208) self.assertEqual(from_rendered_raw.issuer, "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk") self.assertEqual(from_rendered_raw.prev_hash, "0000E73C340601ACA1AD5AAA5B5E56B03E178EF8") self.assertEqual(from_rendered_raw.prev_issuer, "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk") self.assertEqual(from_rendered_raw.members_count, 4) self.assertEqual(from_rendered_raw.identities, []) self.assertEqual(from_rendered_raw.joiners, []) self.assertEqual(from_rendered_raw.actives, []) self.assertEqual(from_rendered_raw.leavers, []) self.assertEqual(from_rendered_raw.excluded, []) self.assertEqual(from_rendered_raw.certifications, []) self.assertEqual(from_rendered_raw.transactions, []) self.assertEqual(block.signed_raw(), raw_block)
def test_proof_of_work(self): block = """Version: 11 Type: Block Currency: test_net Number: 60803 PoWMin: 80 Time: 1480979125 MedianTime: 1480975879 UnitBase: 7 Issuer: 9bZEATXBGPUSsk8oAYi4KAChg3rHKwNt67hVdErbNGCW IssuersFrame: 120 IssuersFrameVar: 0 DifferentIssuersCount: 18 PreviousHash: 0000083FB6E3435ADCDF0F86B0A1BCA108B6B47D4B4BA61D0B4FDC21A262CF4C PreviousIssuer: BnSRjMjJ7gWy13asCRz9rQ6G5Njytdf3pvR1GMkJgtu6 MembersCount: 187 Identities: Joiners: Actives: Leavers: Revoked: Excluded: Certifications: Transactions: InnerHash: 310F57575EA865EF47BFA236108B2B1CAEBFBF8EF70960E32E214E413E9C836B Nonce: 10200000037440 AywstQpC0S5iaA/YQvbz2alpP6zTYG3tjkWpxy1jgeCo028Te2V327bBZbfDGDzsjxOrF4UVmEBiGsgbqhL9CA== """ block_doc = Block.from_signed_raw(block) self.assertEqual( block_doc.proof_of_work(), "00000A84839226046082E2B1AD49664E382D98C845644945D133D4A90408813A", )
def test_from_signed_raw_block_zero(self): block = Block.from_signed_raw(raw_block_zero) self.assertEqual(block.version, 2) self.assertEqual(block.currency, "zeta_brouzouf") self.assertEqual(block.noonce, 2125) self.assertEqual(block.number, 0) self.assertEqual(block.powmin, 3) self.assertEqual(block.time, 1418077277) self.assertEqual(block.mediantime, 1418077277) self.assertEqual(block.issuer, "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk") self.assertEqual( block.parameters, ("0.007376575", "300", "10", "0", "40", "1209600", "31536000", "0", "0.9", "31536000", "3", "20", "60", "10", "20", "0.66")) self.assertEqual(block.members_count, 4) self.assertEqual(len(block.identities), 4) self.assertEqual(len(block.joiners), 4) self.assertEqual(block.actives, []) self.assertEqual(block.leavers, []) self.assertEqual(block.excluded, []) self.assertEqual(len(block.certifications), 12) self.assertEqual(block.transactions, []) self.assertEqual(block.signed_raw(), raw_block_zero)
def test_raw_with_leavers(self): block = Block.from_signed_raw(raw_block_with_leavers) rendered_raw = block.signed_raw() from_rendered_raw = block.from_signed_raw(rendered_raw) self.assertEqual(from_rendered_raw.version, 11) self.assertEqual(from_rendered_raw.currency, "meta_brouzouf") self.assertEqual(from_rendered_raw.nonce, 9906) self.assertEqual(from_rendered_raw.number, 34895) self.assertEqual(from_rendered_raw.powmin, 4) self.assertEqual(from_rendered_raw.time, 1444434128) self.assertEqual(from_rendered_raw.mediantime, 1444426438) self.assertEqual( from_rendered_raw.issuer, "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk" ) self.assertEqual( from_rendered_raw.prev_hash, "0000E88115ADDF79344372C0212928501E21622B" ) self.assertEqual( from_rendered_raw.prev_issuer, "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk", ) self.assertEqual(from_rendered_raw.parameters, None) self.assertEqual(from_rendered_raw.members_count, 21) self.assertEqual(from_rendered_raw.identities, []) self.assertEqual(from_rendered_raw.joiners, []) self.assertEqual(from_rendered_raw.actives, []) self.assertEqual(len(from_rendered_raw.leavers), 1) self.assertEqual(from_rendered_raw.excluded, []) self.assertEqual(from_rendered_raw.certifications, []) self.assertEqual(from_rendered_raw.transactions, []) self.assertEqual(block.signed_raw(), raw_block_with_leavers)
def test_toraw_fromrawzero(self): block = Block.from_signed_raw(raw_block_zero) rendered_raw = block.signed_raw() from_rendered_raw = block.from_signed_raw(rendered_raw) self.assertEqual(from_rendered_raw.version, 11) self.assertEqual(from_rendered_raw.currency, "zeta_brouzouf") self.assertEqual(from_rendered_raw.nonce, 2125) self.assertEqual(from_rendered_raw.number, 0) self.assertEqual(from_rendered_raw.powmin, 3) self.assertEqual(from_rendered_raw.time, 1418077277) self.assertEqual(from_rendered_raw.mediantime, 1418077277) self.assertEqual( from_rendered_raw.issuer, "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk" ) self.assertEqual(from_rendered_raw.members_count, 4) self.assertEqual(len(from_rendered_raw.identities), 4) self.assertEqual(len(from_rendered_raw.joiners), 4) self.assertEqual(from_rendered_raw.actives, []) self.assertEqual(from_rendered_raw.leavers, []) self.assertEqual(from_rendered_raw.excluded, []) self.assertEqual(len(from_rendered_raw.certifications), 12) self.assertEqual(from_rendered_raw.transactions, []) self.assertEqual(block.signed_raw(), raw_block_zero)
def test_raw_with_tx(self): block = Block.from_signed_raw(raw_block_with_tx) rendered_raw = block.signed_raw() from_rendered_raw = block.from_signed_raw(rendered_raw) self.assertEqual(from_rendered_raw.version, 11) self.assertEqual(from_rendered_raw.currency, "meta_brouzouf") self.assertEqual(from_rendered_raw.nonce, 581) self.assertEqual(from_rendered_raw.number, 34436) self.assertEqual(from_rendered_raw.powmin, 5) self.assertEqual(from_rendered_raw.time, 1443896211) self.assertEqual(from_rendered_raw.mediantime, 1443881811) self.assertEqual( from_rendered_raw.issuer, "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk" ) self.assertEqual(from_rendered_raw.parameters, None) self.assertEqual(from_rendered_raw.members_count, 19) self.assertEqual(from_rendered_raw.identities, []) self.assertEqual(from_rendered_raw.joiners, []) self.assertEqual(len(from_rendered_raw.actives), 1) self.assertEqual(from_rendered_raw.leavers, []) self.assertEqual(from_rendered_raw.excluded, []) self.assertEqual(len(from_rendered_raw.certifications), 2) self.assertEqual(len(from_rendered_raw.transactions), 2) self.assertEqual(block.signed_raw(), raw_block_with_tx)
def test_from_signed_raw_block_zero(self): block = Block.from_signed_raw(raw_block_zero) self.assertEqual(block.version, 11) self.assertEqual(block.currency, "zeta_brouzouf") self.assertEqual(block.noonce, 2125) self.assertEqual(block.number, 0) self.assertEqual(block.powmin, 3) self.assertEqual(block.time, 1418077277) self.assertEqual(block.mediantime, 1418077277) self.assertEqual(block.issuer, "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk") self.assertEqual( block.parameters, ("0.0488", "86400", "1000", "432000", "100", "5259600", "63115200", "5", "5259600", "5259600", "0.8", "31557600", "5", "24", "300", "12", "0.67", "1488970800", "1490094000", "15778800")) self.assertEqual(block.members_count, 4) self.assertEqual(len(block.identities), 4) self.assertEqual(len(block.joiners), 4) self.assertEqual(block.actives, []) self.assertEqual(block.leavers, []) self.assertEqual(block.excluded, []) self.assertEqual(len(block.certifications), 12) self.assertEqual(block.transactions, []) self.assertEqual(block.signed_raw(), raw_block_zero)
def test_proof_of_work(self): block = """Version: 11 Type: Block Currency: test_net Number: 60803 PoWMin: 80 Time: 1480979125 MedianTime: 1480975879 UnitBase: 7 Issuer: 9bZEATXBGPUSsk8oAYi4KAChg3rHKwNt67hVdErbNGCW IssuersFrame: 120 IssuersFrameVar: 0 DifferentIssuersCount: 18 PreviousHash: 0000083FB6E3435ADCDF0F86B0A1BCA108B6B47D4B4BA61D0B4FDC21A262CF4C PreviousIssuer: BnSRjMjJ7gWy13asCRz9rQ6G5Njytdf3pvR1GMkJgtu6 MembersCount: 187 Identities: Joiners: Actives: Leavers: Revoked: Excluded: Certifications: Transactions: InnerHash: 310F57575EA865EF47BFA236108B2B1CAEBFBF8EF70960E32E214E413E9C836B Nonce: 10200000037440 AywstQpC0S5iaA/YQvbz2alpP6zTYG3tjkWpxy1jgeCo028Te2V327bBZbfDGDzsjxOrF4UVmEBiGsgbqhL9CA== """ block_doc = Block.from_signed_raw(block) self.assertEqual(block_doc.proof_of_work(), "00000A84839226046082E2B1AD49664E382D98C845644945D133D4A90408813A")
async def _get_block_doc(self, community, number): """ Retrieve the current block document :param sakia.core.Community community: The community we look for a block :param int number: The block number to retrieve :return: the block doc or None if no block was found """ tries = 0 block_doc = None block = None while block is None and tries < 3: try: block = await community.bma_access.future_request(bma.blockchain.Block, req_args={'number': number}) signed_raw = "{0}{1}\n".format(block['raw'], block['signature']) try: block_doc = Block.from_signed_raw(signed_raw) except TypeError: logging.debug("Error in {0}".format(number)) block = None tries += 1 except errors.DuniterError as e: if e.ucode == errors.BLOCK_NOT_FOUND: block = None tries += 1 return block_doc
def test_raw_with_leavers(self): block = Block.from_signed_raw(raw_block_with_leavers) rendered_raw = block.signed_raw() from_rendered_raw = block.from_signed_raw(rendered_raw) self.assertEqual(from_rendered_raw.version, 11) self.assertEqual(from_rendered_raw.currency, "meta_brouzouf") self.assertEqual(from_rendered_raw.noonce, 9906) self.assertEqual(from_rendered_raw.number, 34895) self.assertEqual(from_rendered_raw.powmin, 4) self.assertEqual(from_rendered_raw.time, 1444434128) self.assertEqual(from_rendered_raw.mediantime, 1444426438) self.assertEqual(from_rendered_raw.issuer, "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk") self.assertEqual(from_rendered_raw.prev_hash, "0000E88115ADDF79344372C0212928501E21622B") self.assertEqual(from_rendered_raw.prev_issuer, "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk") self.assertEqual(from_rendered_raw.parameters, None) self.assertEqual(from_rendered_raw.members_count, 21) self.assertEqual(from_rendered_raw.identities, []) self.assertEqual(from_rendered_raw.joiners, []) self.assertEqual(from_rendered_raw.actives, []) self.assertEqual(len(from_rendered_raw.leavers), 1) self.assertEqual(from_rendered_raw.excluded, []) self.assertEqual(from_rendered_raw.certifications, []) self.assertEqual(from_rendered_raw.transactions, []) self.assertEqual(block.signed_raw(), raw_block_with_leavers)
def test_toraw_fromrawzero(self): block = Block.from_signed_raw(raw_block_zero) rendered_raw = block.signed_raw() from_rendered_raw = block.from_signed_raw(rendered_raw) self.assertEqual(from_rendered_raw.version, 11) self.assertEqual(from_rendered_raw.currency, "zeta_brouzouf") self.assertEqual(from_rendered_raw.noonce, 2125) self.assertEqual(from_rendered_raw.number, 0) self.assertEqual(from_rendered_raw.powmin, 3) self.assertEqual(from_rendered_raw.time, 1418077277) self.assertEqual(from_rendered_raw.mediantime, 1418077277) self.assertEqual(from_rendered_raw.issuer, "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk") self.assertEqual(from_rendered_raw.members_count, 4) self.assertEqual(len(from_rendered_raw.identities), 4) self.assertEqual(len(from_rendered_raw.joiners), 4) self.assertEqual(from_rendered_raw.actives, []) self.assertEqual(from_rendered_raw.leavers, []) self.assertEqual(from_rendered_raw.excluded, []) self.assertEqual(len(from_rendered_raw.certifications), 12) self.assertEqual(from_rendered_raw.transactions, []) self.assertEqual(block.signed_raw(), raw_block_zero)
def test_from_signed_raw_block_zero(self): block = Block.from_signed_raw(raw_block_zero) self.assertEqual(block.version, 11) self.assertEqual(block.currency, "zeta_brouzouf") self.assertEqual(block.noonce, 2125) self.assertEqual(block.number, 0) self.assertEqual(block.powmin, 3) self.assertEqual(block.time, 1418077277) self.assertEqual(block.mediantime, 1418077277) self.assertEqual(block.issuer, "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk") self.assertEqual(block.parameters, ("0.0488", "86400", "1000", "432000", "100", "5259600", "63115200", "5", "5259600", "5259600", "0.8", "31557600", "5", "24", "300", "12", "0.67", "1488970800", "1490094000", "15778800")) self.assertEqual(block.members_count, 4) self.assertEqual(len(block.identities), 4) self.assertEqual(len(block.joiners), 4) self.assertEqual(block.actives, []) self.assertEqual(block.leavers, []) self.assertEqual(block.excluded, []) self.assertEqual(len(block.certifications), 12) self.assertEqual(block.transactions, []) self.assertEqual(block.signed_raw(), raw_block_zero)
def test_raw_with_tx(self): block = Block.from_signed_raw(raw_block_with_tx) rendered_raw = block.signed_raw() from_rendered_raw = block.from_signed_raw(rendered_raw) self.assertEqual(from_rendered_raw.version, 11) self.assertEqual(from_rendered_raw.currency, "meta_brouzouf") self.assertEqual(from_rendered_raw.noonce, 581) self.assertEqual(from_rendered_raw.number, 34436) self.assertEqual(from_rendered_raw.powmin, 5) self.assertEqual(from_rendered_raw.time, 1443896211) self.assertEqual(from_rendered_raw.mediantime, 1443881811) self.assertEqual(from_rendered_raw.issuer, "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk") self.assertEqual(from_rendered_raw.parameters, None) self.assertEqual(from_rendered_raw.members_count, 19) self.assertEqual(from_rendered_raw.identities, []) self.assertEqual(from_rendered_raw.joiners, []) self.assertEqual(len(from_rendered_raw.actives), 1) self.assertEqual(from_rendered_raw.leavers, []) self.assertEqual(from_rendered_raw.excluded, []) self.assertEqual(len(from_rendered_raw.certifications), 2) self.assertEqual(len(from_rendered_raw.transactions), 2) self.assertEqual(block.signed_raw(), raw_block_with_tx)
async def _refresh(self, community, block_number_from, block_to, received_list): """ Refresh last transactions :param sakia.core.Community community: The community :param list received_list: List of transactions received """ new_transfers = [] new_dividends = [] try: logging.debug("Refresh from : {0} to {1}".format(block_number_from, block_to['number'])) dividends = await self.request_dividends(community, block_number_from) with_tx_data = await community.bma_access.future_request(bma.blockchain.TX) blocks_with_tx = with_tx_data['result']['blocks'] while block_number_from <= block_to['number']: udid = 0 for d in [ud for ud in dividends if ud['block_number'] == block_number_from]: state = TransferState.VALIDATED if block_number_from + MAX_CONFIRMATIONS <= block_to['number'] \ else TransferState.VALIDATING if d['block_number'] not in [ud['block_number'] for ud in self._dividends]: d['id'] = udid d['state'] = state new_dividends.append(d) udid += 1 else: known_dividend = [ud for ud in self._dividends if ud['block_number'] == d['block_number']][0] known_dividend['state'] = state # We parse only blocks with transactions if block_number_from in blocks_with_tx: transfers = await self._parse_block(community, block_number_from, received_list, udid + len(new_transfers)) new_transfers += transfers self.wallet.refresh_progressed.emit(block_number_from, block_to['number'], self.wallet.pubkey) block_number_from += 1 signed_raw = "{0}{1}\n".format(block_to['raw'], block_to['signature']) block_to = Block.from_signed_raw(signed_raw) for transfer in [t for t in self._transfers + new_transfers if t.state == TransferState.VALIDATING]: transfer.run_state_transitions((False, block_to, MAX_CONFIRMATIONS)) # We check if latest parsed block_number is a new high number if block_number_from > self.latest_block: self.available_sources = await self.wallet.sources(community) if self._stop_coroutines: return self.latest_block = block_number_from parameters = await community.parameters() for transfer in [t for t in self._transfers if t.state == TransferState.AWAITING]: transfer.run_state_transitions((False, block_to, parameters['avgGenTime'], parameters['medianTimeBlocks'])) except NoPeerAvailable as e: logging.debug(str(e)) self.wallet.refresh_finished.emit([]) return self._transfers = self._transfers + new_transfers self._dividends = self._dividends + new_dividends self.wallet.refresh_finished.emit(received_list)
def test_parse_negative_issuers_frame_var(self): block = Block.from_signed_raw(negative_issuers_frame_var) rendered_raw = block.signed_raw() from_rendered_raw = block.from_signed_raw(rendered_raw) self.assertEqual(from_rendered_raw.signed_raw(), negative_issuers_frame_var)
def test_parse_with_excluded(self): block = Block.from_signed_raw(raw_block_with_excluded) rendered_raw = block.signed_raw() from_rendered_raw = block.from_signed_raw(rendered_raw) self.assertEqual(from_rendered_raw.signed_raw(), raw_block_with_excluded)