Exemple #1
0
    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
Exemple #2
0
    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)
Exemple #3
0
    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()
Exemple #4
0
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)
Exemple #7
0
 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, "블럭이 같지 않습니다 ")
Exemple #8
0
 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, "트랜잭션 사이즈 확인 실패")
Exemple #9
0
    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
Exemple #10
0
 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)
Exemple #11
0
 def build_block(self):
     header = self.BlockHeaderClass(**self.build_block_header_data())
     body = self.BlockBodyClass(**self.build_block_body_data())
     return Block(header, body)