def __generate_block_data(self) -> Block: """ block data generate :return: unsigned block """ genesis = Block(channel_name=conf.LOOPCHAIN_DEFAULT_CHANNEL) genesis.generate_block() # Block 생성 block = Block(channel_name=conf.LOOPCHAIN_DEFAULT_CHANNEL) # Transaction(s) 추가 for x in range(0, 10): block.put_transaction(test_util.create_basic_tx(self.__peer_id, self.peer_auth)) # Hash 생성 이 작업까지 끝내고 나서 Block을 peer에 보낸다 block.generate_block(genesis) return block
def test_block_hash_must_be_the_same_regardless_of_the_commit_state(self): # ENGINE-302 # GIVEN block1 = Block(channel_name=conf.LOOPCHAIN_DEFAULT_CHANNEL) block2 = Block(channel_name=conf.LOOPCHAIN_DEFAULT_CHANNEL) # WHEN block1.commit_state = {"TEST": "TEST_VALUE1234"} block1.generate_block() block2.generate_block() utils.logger.spam(f"block1 hash({block1.block_hash})") utils.logger.spam(f"block1 hash({block2.block_hash})") # THEN self.assertEqual(block1.block_hash, block2.block_hash)
def test_block_prevent_tx_duplication(self): origin_send_tx_type = conf.CHANNEL_OPTION[ conf.LOOPCHAIN_DEFAULT_CHANNEL]["send_tx_type"] conf.CHANNEL_OPTION[conf.LOOPCHAIN_DEFAULT_CHANNEL][ "send_tx_type"] = conf.SendTxType.icx tx_validator.refresh_tx_validators() try: block = Block(channel_name=conf.LOOPCHAIN_DEFAULT_CHANNEL) client = IcxWallet() client.to_address = 'hxebf3a409845cd09dcb5af31ed5be5e34e2af9433' client.value = 1 hash_generator = get_tx_hash_generator( conf.LOOPCHAIN_DEFAULT_CHANNEL) validator = IconValidateStrategy(hash_generator) icx_origin = client.create_icx_origin() for i in range(10): tx = validator.restore(json.dumps(icx_origin), 'icx/score') block.put_transaction(tx) block.generate_block() self.assertEqual(block.confirmed_tx_len, 1) finally: conf.CHANNEL_OPTION[conf.LOOPCHAIN_DEFAULT_CHANNEL][ "send_tx_type"] = origin_send_tx_type tx_validator.refresh_tx_validators()
def add_genesis_block(): tx_info = None channel = conf.LOOPCHAIN_DEFAULT_CHANNEL if "genesis_data_path" in conf.CHANNEL_OPTION[channel]: genesis_data_path = conf.CHANNEL_OPTION[channel][ 'initial_genesis_block_data_file_path'] util.logger.spam( f"Try load a file of initial genesis block from ({genesis_data_path})" ) try: with open(genesis_data_path) as json_file: tx_info = json.load(json_file)["transaction_data"] util.logger.spam( f"generate_genesis_block::tx_info >>>> {tx_info}") except FileNotFoundError as e: exit(f"cannot open json file in ({genesis_data_path}): " f"{e}") block = Block(channel_name=channel) block.block_status = BlockStatus.confirmed genesis_validator = get_genesis_tx_validator(channel) is_valid, tx = genesis_validator.init_genesis_tx(tx_info) if is_valid: block.put_genesis_transaction(tx) block.generate_block() # 제네시스 블럭을 추가 합니다. return block
def generate_test_block(self): """ 임시 블럭 생성하는 메소드 :return: 임시 블럭 """ if self.last_block is None: self.last_block = Block(channel_name=conf.LOOPCHAIN_DEFAULT_CHANNEL) self.last_block.generate_block() block = Block(channel_name=conf.LOOPCHAIN_DEFAULT_CHANNEL) for x in range(0, 10): tx = test_util.create_basic_tx(self.__peer_id, self.peer_auth) self.assertNotEqual(tx.tx_hash, "", "트랜잭션 생성 실패") self.assertTrue(block.put_transaction(tx), "Block에 트랜잭션 추가 실패") block.generate_block(self.last_block) self.last_block = block return block
def _deserialize(self, json_data): header_data = self._deserialize_header_data(json_data) header = self.BlockHeaderClass(**header_data) body_data = self._deserialize_body_data(json_data) body = self.BlockBodyClass(**body_data) return Block(header, body)
def test_serialize_and_deserialize(self): """ 블럭 serialize and deserialize 테스트 """ block = self.__generate_block() test_dmp = block.serialize_block() block2 = Block(channel_name=conf.LOOPCHAIN_DEFAULT_CHANNEL) block2.deserialize_block(test_dmp) logging.debug("serialize block hash : %s , deserialize block hash %s", block.merkle_tree_root_hash, block2.merkle_tree_root_hash) self.assertEqual(block.merkle_tree_root_hash, block2.merkle_tree_root_hash, "블럭이 같지 않습니다 ")
def test_put_transaction(self): """ Block 에 여러 개 transaction 들을 넣는 것을 test. """ block = Block(channel_name=conf.LOOPCHAIN_DEFAULT_CHANNEL) tx_list = [] tx_size = 10 for x in range(0, tx_size): tx = test_util.create_basic_tx(self.__peer_id, self.peer_auth) tx2 = test_util.create_basic_tx(self.__peer_id, self.peer_auth) tx_list.append(tx2) self.assertNotEqual(tx.tx_hash, "", "트랜잭션 생성 실패") self.assertTrue(block.put_transaction(tx), "Block에 트랜잭션 추가 실패") self.assertTrue(block.put_transaction(tx_list), "Block에 여러 트랜잭션 추가 실패") self.assertEqual(block.confirmed_tx_len, tx_size * 2, "트랜잭션 사이즈 확인 실패")
def __add_single_tx_block_blockchain_return_tx(self): last_block = self.chain.last_block block = Block(channel_name=conf.LOOPCHAIN_DEFAULT_CHANNEL) tx = test_util.create_basic_tx(self.__peer_id, self.peer_auth) block.put_transaction(tx) logging.debug("tx_hash: " + tx.tx_hash) block.generate_block(last_block) block.block_status = BlockStatus.confirmed # add_block to blockchain self.assertTrue(self.chain.add_block(block), "Fail Add Block to BlockChain") return tx
def test_block_rebuild(self): """ GIVEN 1Block with 3tx, and conf remove failed tx when in block WHEN Block call verify_through_score_invoke THEN all order 3tx must removed in block """ block = Block(conf.LOOPCHAIN_DEFAULT_CHANNEL) fail_tx_hash = None for i in range(3): tx = Transaction() tx.put_meta(Transaction.CHANNEL_KEY, conf.LOOPCHAIN_DEFAULT_CHANNEL) tx.put_data("aaaaa") tx.sign_hash(self.peer_auth) block.put_transaction(tx) if i == 2: fail_tx_hash = tx.tx_hash verify, need_rebuild, invoke_results = block.verify_through_score_invoke(True) self.assertTrue(need_rebuild) logging.debug(f"fail tx hash : {fail_tx_hash}") self.assertEqual(block.confirmed_tx_len, 2) for i, tx in enumerate(block.confirmed_transaction_list): self.assertNotEqual(i, 2, "index 2 must be deleted") self.assertNotEqual(tx.tx_hash, fail_tx_hash)
def build_block(self): header = self.BlockHeaderClass(**self.build_block_header_data()) body = self.BlockBodyClass(**self.build_block_body_data()) return Block(header, body)