Esempio n. 1
0
    def __add_genesisblock(self, tx_info: dict = None):
        """제네시스 블럭을 추가 합니다.

        :param tx_info: Transaction data for making genesis block from an initial file
        :return:
        """
        logging.info("Make Genesis Block....")
        block = Block(channel_name=self.__channel_name)
        block.block_status = BlockStatus.confirmed
        if tx_info:
            keys = tx_info.keys()
            if "accounts" in keys and "message" in keys:
                genesis_validator = get_genesis_tx_validator(
                    self.__channel_name)
                is_valid, tx = genesis_validator.init_genesis_tx(tx_info)
                if is_valid:
                    block.put_genesis_transaction(tx)
                else:
                    raise TransactionInvalidError(
                        message=f"The Genesis block data is invalid."
                        f"That's why Genesis block couldn't be generated.")

        block.generate_block()
        # 제네시스 블럭을 추가 합니다.
        self.add_block(block)
Esempio n. 2
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()
Esempio n. 3
0
 def __add_genesisblock(self):
     """
     제네시스 블럭을 추가 합니다.
     :return:
     """
     logging.info("Make Genesis Block....")
     block = Block()
     block.block_type = BlockType.confirmed
     block.generate_block()
     # 제네시스 블럭을 추가 합니다.
     self.add_block(block)
Esempio n. 4
0
    def __add_genesisblock(self):
        """제네시스 블럭을 추가 합니다.

        :return:
        """
        logging.info("Make Genesis Block....")
        block = Block(channel_name=self.__channel_name)
        block.block_status = BlockStatus.confirmed
        block.generate_block()
        # 제네시스 블럭을 추가 합니다.
        self.add_block(block)
Esempio n. 5
0
    def generate_block(self):
        """임시 블럭 생성하는 메소드

        :return: 임시 블럭
        """
        block = Block(channel_name=conf.LOOPCHAIN_DEFAULT_CHANNEL)
        for x in range(10):
            tx = test_util.create_basic_tx(self.__peer_id, self.__peer_auth)
            block.put_transaction(tx)
        block.generate_block(self.chain.last_block)
        return block
Esempio n. 6
0
    def generate_block(self):
        """
        임시 블럭 생성하는 메소드
        :return: 임시 블럭
        """

        block = Block()
        for x in range(10):
            tx = Transaction()
            tx.put_data("{args:[]}")
            block.put_transaction(tx)
        block.generate_block(self.chain.last_block)
        return block
Esempio n. 7
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()
        util.logger.spam(f"block1 hash({block1.block_hash})")
        util.logger.spam(f"block1 hash({block2.block_hash})")

        # THEN
        self.assertEqual(block1.block_hash, block2.block_hash)
Esempio n. 8
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
Esempio n. 9
0
    def __generate_block_data(self) -> Block:
        """ block data generate
        :return: unsigned block
        """
        genesis = Block(channel_name="test_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
Esempio n. 10
0
    def __add_single_tx_to_block_return_tx_with_test(self):
        last_block = self.chain.last_block
        block = Block()
        tx = Transaction()
        hashed_value = tx.put_data("1234")
        self.assertNotEqual(hashed_value, "", "트랜잭션 생성 실패")
        self.assertTrue(block.put_transaction(tx), "Block에 트랜잭션 추가 실패")

        logging.debug("tx_hash: " + tx.get_tx_hash())

        block.generate_block(last_block)
        block.block_status = BlockStatus.confirmed
        # add_block include __add_tx_to_block_db what we want to test
        self.assertTrue(self.chain.add_block(block),
                        "Fail Add Block to BlockChain in test_add_tx_to_block_db")
        return tx
Esempio n. 11
0
 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
Esempio n. 12
0
    def generate_block(self):
        """
        블럭 생성기
        :return: 임의생성블럭
        """
        genesis = Block()
        genesis.generate_block()
        # Block 생성
        block = Block()
        # Transaction(s) 추가
        for x in range(0, 10):
            tx = Transaction()
            tx.put_data("{args:[]}")
            block.put_transaction(tx)

        # Hash 생성 이 작업까지 끝내고 나서 Block을 peer에 보낸다
        block.generate_block(genesis)
        return block
Esempio n. 13
0
class TestGeneratorBlock(unittest.TestCase):
    last_block = None
    __peer_id = 'aaa'

    def setUp(self):
        test_util.print_testname(self._testMethodName)
        self.peer_auth = test_util.create_default_peer_auth()

        set_mock(self)

    def tearDown(self):
        pass

    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 test_block_genesis(self):
        """
        제네시스 블럭 생성 테스트
        """
        db_name = 'genesis_db'
        test_db = test_util.make_level_db(db_name)
        self.assertIsNotNone(test_db, "DB생성 불가")
        chain = BlockChain(test_db)
        block = test_util.add_genesis_block()
        chain.add_block(block)

        self.assertIsNotNone(chain.last_block.block_hash, "제너릭 블럭 생성 불가")
        # 테스트 DB 제거
        leveldb.DestroyDB(db_name)

    def test_block_add(self):
        """
        블럭 추가 테스트
        제네시스 블럭을 만든후 10개의 트랜잭션을 가진 10개의 블럭을 생성하여
        블럭체인에 추가
        """
        db_name = 'add_test_db'
        test_db = test_util.make_level_db(db_name)
        self.assertIsNotNone(test_db, "DB생성 불가")
        chain = BlockChain(test_db)

        block = test_util.add_genesis_block()
        chain.add_block(block)
        genesis_hash = chain.last_block.block_hash

        for x in range(0, 10):
            # 신규 블럭 생성 추가 x 10
            tmp_block = self.generate_test_block()
            tmp_block.block_status = BlockStatus.confirmed
            tmp_block.generate_block(chain.last_block)
            chain.add_block(tmp_block)
            logging.debug("신규 블럭 생성 및 블럭 HASH : %s",
                          chain.last_block.block_hash)

        self.assertNotEqual(genesis_hash, chain.last_block.block_hash,
                            "블럭 추가 불가")

        # 미인증 블럭 추가
        tmp_block = self.generate_test_block()
        tmp_block.block_status = BlockStatus.unconfirmed
        self.assertRaises(TypeError, "미인증 블럭 추가", chain.add_block, tmp_block)

        # Store_data Function 추가
        tmp_block.block_status = BlockStatus.confirmed
        tmp_block.generate_block(chain.last_block)
        # 블럭 저장함수
        last_block_hash = chain.last_block.block_hash

        chain.add_block(tmp_block)

        self.assertNotEqual(last_block_hash, chain.last_block.block_hash)
        self.assertIsNotNone(chain.last_block)

        # 테스트 DB 제거
        leveldb.DestroyDB(db_name)

    def test_block_confirm(self):
        db_name = 'block_confirm_db'
        test_db = test_util.make_level_db(db_name)
        self.assertIsNotNone(test_db, "DB생성 불가")
        chain = BlockChain(test_db)
        block = test_util.add_genesis_block()
        chain.add_block(block)
        self.last_block = block
        # block을 하나 생성해서 unconfirm 상태에서 추가
        unconfirm_block = self.generate_test_block()
        unconfirm_block.generate_block(chain.last_block)

        self.assertTrue(chain.add_unconfirm_block(unconfirm_block),
                        "미검증블럭 추가에 실패하였습니다.")

        # 블럭 검증작업후 블럭을 검증완료 상태로 바꾸며, 블럭체인에 등록 해 줍니다.
        chain.confirm_prev_block(unconfirm_block)

        # 블럭 검증완료
        self.assertEqual(chain.last_block.block_hash,
                         unconfirm_block.block_hash, "블럭이 추가되지 않았습니다.")

        leveldb.DestroyDB(db_name)