def run_test(self): for i in range(4): initialize_datadir(self.options.tmpdir, i) self.writeGenesisBlockToFile(self.nodes[i].datadir, networkid=2) self.nodes[0].generate(101, self.signblockprivkey_wif) self.sync_all([self.nodes]) self.log.info("Network is at block height 101") start_time = time.time() current_time = start_time tips = self.nodes[0].getchaintips() assert_equal(len(tips), 1) assert_equal(tips[0]['branchlen'], 0) assert_equal(tips[0]['height'], 101) assert_equal(tips[0]['status'], 'active') # run 24 hours self.log.info("Running for 24 hours") while (current_time - start_time < 86400): for i in range(4): self.nodes[i].generate(1, self.signblockprivkey_wif) time.sleep(10) self.sync_all([self.nodes]) current_time = time.time()
def run_test(self): self.stop_node(0) shutil.rmtree(self.nodes[0].datadir) initialize_datadir(self.options.tmpdir, 0) self.log.info("Starting with invalid indexdir ...") protected_path = os.path.join(self.options.tmpdir, "protected") open(protected_path, 'a', encoding='utf-8').close() self.nodes[0].assert_start_raises_init_error( ["-indexdir=" + protected_path], 'Error: Error creating index directory: ', match=ErrorMatch.PARTIAL_REGEX) self.log.info("Starting with valid indexdir ...") indexdir_path = os.path.join(self.options.tmpdir, "foo", "test") self.start_node(0, ["-indexdir=" + indexdir_path]) self.log.info("mining blocks..") self.nodes[0].generatetoaddress( 10, self.nodes[0].get_deterministic_priv_key().address) assert os.path.isdir(os.path.join(indexdir_path, "regtest", "index")) assert os.path.isfile( os.path.join(indexdir_path, "regtest", "index", "CURRENT")) self.stop_node(0) shutil.rmtree(self.nodes[0].datadir) initialize_datadir(self.options.tmpdir, 0) self.log.info("Starting with default indexdir ...") self.start_node(0) self.log.info("mining blocks..") self.nodes[0].generatetoaddress( 10, self.nodes[0].get_deterministic_priv_key().address) assert os.path.isdir( os.path.join(self.nodes[0].datadir, "regtest", "blocks", "index")) assert os.path.isfile( os.path.join(self.nodes[0].datadir, "regtest", "blocks", "index", "CURRENT"))
def run_test(self): self.stop_node(0) shutil.rmtree(self.nodes[0].datadir) initialize_datadir(self.options.tmpdir, 0) self.log.info("Starting with nonexistent blocksdir ...") blocksdir_path = os.path.join(self.options.tmpdir, 'blocksdir') self.nodes[0].assert_start_raises_init_error(["-blocksdir=" + blocksdir_path], 'Error: Specified blocks directory "{}" does not exist.'.format(blocksdir_path)) os.mkdir(blocksdir_path) self.log.info("Starting with existing blocksdir ...") self.start_node(0, ["-blocksdir=" + blocksdir_path]) self.log.info("mining blocks..") self.nodes[0].generate(10) assert os.path.isfile(os.path.join(blocksdir_path, "regtest", "blocks", "blk00000.dat")) assert os.path.isdir(os.path.join(self.nodes[0].datadir, "regtest", "blocks", "index"))
def run_test(self): self.stop_node(0) shutil.rmtree(self.nodes[0].datadir) initialize_datadir(self.options.tmpdir, 0, self.chain) self.log.info("Starting with nonexistent blocksdir ...") blocksdir_path = os.path.join(self.options.tmpdir, 'blocksdir') self.nodes[0].assert_start_raises_init_error(["-blocksdir=" + blocksdir_path], 'Error: Specified blocks directory "{}" does not exist.'.format(blocksdir_path)) os.mkdir(blocksdir_path) self.log.info("Starting with existing blocksdir ...") self.start_node(0, ["-blocksdir=" + blocksdir_path]) self.log.info("mining blocks..") self.nodes[0].generate(10) assert os.path.isfile(os.path.join(blocksdir_path, "regtest2", "blocks", "blk00000.dat")) assert os.path.isdir(os.path.join(self.nodes[0].datadir, "regtest2", "blocks", "index"))
def run_test(self): self.stop_node(0) assert os.path.isdir(os.path.join(self.nodes[0].datadir, self.chain, "blocks")) assert not os.path.isdir(os.path.join(self.nodes[0].datadir, "blocks")) shutil.rmtree(self.nodes[0].datadir) initialize_datadir(self.options.tmpdir, 0, self.chain) self.log.info("Starting with nonexistent blocksdir ...") blocksdir_path = os.path.join(self.options.tmpdir, 'blocksdir') self.nodes[0].assert_start_raises_init_error([f"-blocksdir={blocksdir_path}"], f'Error: Specified blocks directory "{blocksdir_path}" does not exist.') os.mkdir(blocksdir_path) self.log.info("Starting with existing blocksdir ...") self.start_node(0, [f"-blocksdir={blocksdir_path}"]) self.log.info("mining blocks..") self.nodes[0].generatetoaddress(10, self.nodes[0].get_deterministic_priv_key().address) assert os.path.isfile(os.path.join(blocksdir_path, self.chain, "blocks", "blk00000.dat")) assert os.path.isdir(os.path.join(self.nodes[0].datadir, self.chain, "blocks", "index"))
def run_test(self): self.stop_node(0) assert os.path.isdir(os.path.join(self.nodes[0].datadir, self.chain, "blocks")) assert not os.path.isdir(os.path.join(self.nodes[0].datadir, "blocks")) shutil.rmtree(self.nodes[0].datadir) initialize_datadir(self.options.tmpdir, 0, self.chain) self.log.info("Starting with nonexistent blocksdir ...") blocksdir_path = os.path.join(self.options.tmpdir, 'blocksdir') self.nodes[0].assert_start_raises_init_error(["-blocksdir=" + blocksdir_path], 'Error: Specified blocks directory "{}" does not exist.'.format(blocksdir_path)) os.mkdir(blocksdir_path) self.log.info("Starting with existing blocksdir ...") self.start_node(0, ["-blocksdir=" + blocksdir_path]) self.import_deterministic_coinbase_privkeys() # cause initial datadir with predefined wallets was removed self.log.info("mining blocks..") self.nodes[0].generate(10) assert os.path.isfile(os.path.join(blocksdir_path, self.chain, "blocks", "blk00000.dat")) assert os.path.isdir(os.path.join(self.nodes[0].datadir, self.chain, "blocks", "index"))
def run_test(self): self.stop_node(0) assert os.path.isdir( os.path.join(self.nodes[0].datadir, self.chain, "blocks")) assert not os.path.isdir(os.path.join(self.nodes[0].datadir, "blocks")) shutil.rmtree(self.nodes[0].datadir) initialize_datadir(self.options.tmpdir, 0, self.chain) self.log.info("Starting with nonexistent blocksdir ...") blocksdir_path = os.path.join(self.options.tmpdir, 'blocksdir') self.start_node(0, ["-blocksdir=" + blocksdir_path]) self.log.info("mining blocks..") self.nodes[0].generatetoaddress( 10, self.nodes[0].get_deterministic_priv_key().address) assert os.path.isfile( os.path.join(blocksdir_path, "regtest", "blk00000.dat")) assert os.path.isfile( os.path.join(blocksdir_path, "regtest", "rev00000.dat"))
def run_test(self): self.stop_node(0) node0path = os.path.join(self.options.tmpdir, "node0") shutil.rmtree(node0path) initialize_datadir(self.options.tmpdir, 0) self.log.info("Starting with non exiting blocksdir ...") self.assert_start_raises_init_error( 0, ["-blocksdir="+self.options.tmpdir + "/blocksdir"], "Specified blocks director") os.mkdir(self.options.tmpdir + "/blocksdir") self.log.info("Starting with exiting blocksdir ...") self.start_node(0, ["-blocksdir="+self.options.tmpdir + "/blocksdir"]) self.log.info("mining blocks..") self.nodes[0].generate(10) assert(os.path.isfile(os.path.join(self.options.tmpdir, "blocksdir", "regtest", "blocks", "blk00000.dat"))) assert(os.path.isdir(os.path.join(self.options.tmpdir, "node0", "regtest", "blocks", "index")))
def run_test(self): self.stop_node(0) shutil.rmtree(self.nodes[0].datadir) initialize_datadir(self.options.tmpdir, 0) self.log.info("Test with no genesis file") self.nodes[0].assert_start_raises_init_error([], 'ReadGenesisBlock: unable to read genesis file', match=ErrorMatch.PARTIAL_REGEX) self.log.info("Phase 1: Tests using genesis block") self.log.info("Test correct genesis file") self.writeGenesisBlockToFile(self.nodes[0].datadir) self.start_node(0) self.stop_node(0) self.log.info("Restart with correct genesis file") self.start_node(0) self.stop_node(0) self.log.info("Test incorrect genesis block - No Coinbase") genesis_coinbase = createGenesisCoinbase(self.signblockpubkey) genesis_coinbase.vin[0].prevout.hash = 111111 genesis = createIncorectGenesisBlock(genesis_coinbase, self.signblockprivkey, self.signblockpubkey) writeIncorrectGenesisBlockToFile(self.nodes[0].datadir, genesis) self.nodes[0].assert_start_raises_init_error([], 'ReadGenesisBlock: invalid genesis block', match=ErrorMatch.PARTIAL_REGEX) self.log.info("Test incorrect genesis block - Incorrect height") genesis_coinbase_height = createGenesisCoinbase(self.signblockpubkey) genesis_coinbase_height.vin[0].prevout.n = 10 genesis = createIncorectGenesisBlock(genesis_coinbase_height, self.signblockprivkey, self.signblockpubkey) writeIncorrectGenesisBlockToFile(self.nodes[0].datadir, genesis) self.nodes[0].assert_start_raises_init_error([], 'ReadGenesisBlock: invalid height in genesis block', match=ErrorMatch.PARTIAL_REGEX) self.log.info("Test incorrect genesis block - Multiple transactions") genesis_coinbase = createGenesisCoinbase(self.signblockpubkey) genesis = createIncorectGenesisBlock(genesis_coinbase, self.signblockprivkey, self.signblockpubkey) genesis.vtx.append(CTransaction()) genesis.hashMerkleRoot = genesis.calc_merkle_root() genesis.hashImMerkleRoot = genesis.calc_immutable_merkle_root() genesis.solve(self.signblockprivkey) writeIncorrectGenesisBlockToFile(self.nodes[0].datadir, genesis) self.nodes[0].assert_start_raises_init_error([], 'ReadGenesisBlock: invalid genesis block', match=ErrorMatch.PARTIAL_REGEX) self.log.info("Test incorrect genesis block - No proof") genesis = createIncorectGenesisBlock(genesis_coinbase, self.signblockprivkey, self.signblockpubkey) genesis.proof.clear() writeIncorrectGenesisBlockToFile(self.nodes[0].datadir, genesis) self.nodes[0].assert_start_raises_init_error([], 'ReadGenesisBlock: invalid genesis block', match=ErrorMatch.PARTIAL_REGEX) self.log.info("Test incorrect genesis block - Insufficient Proof") genesis = createIncorectGenesisBlock(genesis_coinbase, self.signblockprivkey, self.signblockpubkey) genesis.proof = genesis.proof[:-1] writeIncorrectGenesisBlockToFile(self.nodes[0].datadir, genesis) self.nodes[0].assert_start_raises_init_error([], 'ReadGenesisBlock: invalid genesis block', match=ErrorMatch.PARTIAL_REGEX) self.log.info("Test incorrect genesis block - Incorrect xfieldType") genesis_coinbase = createGenesisCoinbase(self.signblockpubkey) genesis = CBlock() genesis.nTime = int(time.time() + 600) genesis.hashPrevBlock = 0 genesis.vtx.append(genesis_coinbase) genesis.hashMerkleRoot = genesis.calc_merkle_root() genesis.hashImMerkleRoot = genesis.calc_immutable_merkle_root() genesis.xfieldType = 0 genesis.xfield = hex_str_to_bytes(self.signblockpubkey) genesis.solve(self.signblockprivkey) writeIncorrectGenesisBlockToFile(self.nodes[0].datadir, genesis) self.nodes[0].assert_start_raises_init_error([], 'ReadGenesisBlock: invalid xfieldType in genesis block', match=ErrorMatch.PARTIAL_REGEX) self.log.info("Test incorrect genesis block - Incorrect xfield") genesis_coinbase = createGenesisCoinbase(self.signblockpubkey) genesis = CBlock() genesis.nTime = int(time.time() + 600) genesis.hashPrevBlock = 0 genesis.vtx.append(genesis_coinbase) genesis.hashMerkleRoot = genesis.calc_merkle_root() genesis.hashImMerkleRoot = genesis.calc_immutable_merkle_root() genesis.xfieldType = 1 genesis.xfield = hex_str_to_bytes(self.signblockpubkey[:32]) genesis.solve(self.signblockprivkey) writeIncorrectGenesisBlockToFile(self.nodes[0].datadir, genesis) self.nodes[0].assert_start_raises_init_error([], 'Aggregate Public Key for Signed Block is invalid', match=ErrorMatch.PARTIAL_REGEX) self.log.info("Test incorrect genesis block - No hashMerkleRoot") genesis_coinbase = createGenesisCoinbase(self.signblockpubkey) genesis = CBlock() genesis.nTime = int(time.time() + 600) genesis.hashPrevBlock = 0 genesis.vtx.append(genesis_coinbase) genesis.xfieldType = 1 genesis.xfield = hex_str_to_bytes(self.signblockpubkey) # not populating hashMerkleRoot and hashImMerkleRoot genesis.solve(self.signblockprivkey) writeIncorrectGenesisBlockToFile(self.nodes[0].datadir, genesis) self.nodes[0].assert_start_raises_init_error([], 'ReadGenesisBlock: invalid MerkleRoot in genesis block', match=ErrorMatch.PARTIAL_REGEX) self.log.info("Test incorrect genesis block - No hashImMerkleRoot") genesis_coinbase = createGenesisCoinbase(self.signblockpubkey) genesis = CBlock() genesis.nTime = int(time.time() + 600) genesis.hashPrevBlock = 0 genesis.vtx.append(genesis_coinbase) genesis.hashMerkleRoot = genesis.calc_merkle_root() genesis.xfieldType = 1 genesis.xfield = hex_str_to_bytes(self.signblockpubkey) # not populating hashImMerkleRoot genesis.solve(self.signblockprivkey) writeIncorrectGenesisBlockToFile(self.nodes[0].datadir, genesis) self.nodes[0].assert_start_raises_init_error([], 'ReadGenesisBlock: invalid MerkleRoot in genesis block', match=ErrorMatch.PARTIAL_REGEX) self.log.info("Phase 2: Tests using genesis.dat file") self.log.info("Test new genesis file") self.genesisBlock = None self.writeGenesisBlockToFile(self.nodes[0].datadir, nTime=int(time.time())) #different genesis file self.nodes[0].assert_start_raises_init_error([], 'Error: Incorrect or no genesis block found.', match=ErrorMatch.PARTIAL_REGEX) datadir = self.nodes[0].datadir genesisFile = os.path.join(datadir, "genesis.dat") self.log.info("Test incorrect genesis file - append 2 bytes") self.writeGenesisBlockToFile(self.nodes[0].datadir) with open(genesisFile, 'a', encoding='utf8') as f: f.write("abcd") self.nodes[0].assert_start_raises_init_error([], 'ReadGenesisBlock: invalid genesis file', match=ErrorMatch.PARTIAL_REGEX) os.remove(genesisFile) self.log.info("Test incorrect genesis file - append many bytes") self.writeGenesisBlockToFile(self.nodes[0].datadir) with open(genesisFile, 'a', encoding='utf8') as f: s = "".join([str(i) for i in range(0,16) for j in range(0, 100)]) f.write(s) self.nodes[0].assert_start_raises_init_error([], 'ReadGenesisBlock: invalid genesis file', match=ErrorMatch.PARTIAL_REGEX) os.remove(genesisFile) self.log.info("Test incorrect genesis file - replace 2 bytes") self.writeGenesisBlockToFile(self.nodes[0].datadir) with open(genesisFile, 'r+', encoding='utf8') as f: content = f.readline() clen = len(content) content = content[:500] + "0000" + content[504:] assert(len(content) == clen) f.write(content) self.nodes[0].assert_start_raises_init_error([], 'ReadGenesisBlock: invalid genesis file', match=ErrorMatch.PARTIAL_REGEX) os.remove(genesisFile) self.log.info("Test incorrect genesis file - insert 2 bytes") content = "" self.writeGenesisBlockToFile(self.nodes[0].datadir) with open(genesisFile, 'r+', encoding='utf8') as f: content = f.readline() clen = len(content) content = content[:550] + "1111" + content[550:] assert(len(content) == clen + 4) f.write(content) self.nodes[0].assert_start_raises_init_error([], 'ReadGenesisBlock: invalid genesis file', match=ErrorMatch.PARTIAL_REGEX) os.remove(genesisFile) self.log.info("Test incorrect genesis file - remove 2 bytes") content = "" self.writeGenesisBlockToFile(self.nodes[0].datadir) with open(genesisFile, 'r+', encoding='utf8') as f: content = f.readline() clen = len(content) content = content[:100] + content[104:] assert(len(content) == clen - 4) f.write(content) self.nodes[0].assert_start_raises_init_error([], 'ReadGenesisBlock: invalid genesis file', match=ErrorMatch.PARTIAL_REGEX) os.remove(genesisFile) self.log.info("Test incorrect genesis file - truncate file") self.writeGenesisBlockToFile(self.nodes[0].datadir) with open(genesisFile, 'r+', encoding='utf8') as f: f.truncate(500) self.nodes[0].assert_start_raises_init_error([], 'CDataStream::read().*end of data', match=ErrorMatch.PARTIAL_REGEX) self.log.info("Phase 3: Edit genesis file after sarting the blockchain") self.stop_node(0) shutil.rmtree(self.nodes[0].datadir) initialize_datadir(self.options.tmpdir, 0) self.log.info("Starting node") self.writeGenesisBlockToFile(self.nodes[0].datadir) self.start_node(0) self.nodes[0].add_p2p_connection(P2PInterface()) self.log.info("Generating 10 blocks") blocks = self.nodes[0].generate(10, self.signblockprivkey_wif) self.sync_all([self.nodes[0:1]]) assert_equal(self.nodes[0].getbestblockhash(), blocks[-1]) self.stop_node(0) shutil.copytree(self.nodes[0].datadir, os.path.join(self.options.tmpdir, "backup")) self.log.info("Creating corrupt genesis file") with open(genesisFile, 'r+', encoding='utf8') as f: content = f.readline() clen = len(content) content = content[:500] + "0000" + content[504:] assert(len(content) == clen) f.write(content) self.nodes[0].assert_start_raises_init_error([]) self.log.info("Starting node again") self.genesisBlock = None self.writeGenesisBlockToFile(self.nodes[0].datadir) self.nodes[0].assert_start_raises_init_error([], 'Error: Incorrect or no genesis block found.', match=ErrorMatch.PARTIAL_REGEX) self.log.info("Recovering original blockchain") shutil.rmtree(self.nodes[0].datadir) shutil.copytree(os.path.join(self.options.tmpdir, "backup"), self.nodes[0].datadir) self.start_node(0) self.nodes[0].add_p2p_connection(P2PInterface()) self.sync_all([self.nodes[0:1]]) assert_equal(self.nodes[0].getbestblockhash(), blocks[-1]) self.log.info("Blockchain intact!")