diff --git a/src/index/txindex.cpp b/src/index/txindex.cpp index 10bc8419dd..5c546e1e8d 100644 --- a/src/index/txindex.cpp +++ b/src/index/txindex.cpp @@ -246,7 +246,8 @@ bool TxIndex::Init() bool TxIndex::WriteBlock(const CBlock& block, const CBlockIndex* pindex) { // Exclude genesis block transaction because outputs are not spendable. - if (pindex->nHeight == 0) return true; + //ELEMENTS: we do index the genesis block + //if (pindex->nHeight == 0) return true; CDiskTxPos pos(pindex->GetBlockPos(), GetSizeOfCompactSize(block.vtx.size())); std::vector> vPos; diff --git a/src/test/txindex_tests.cpp b/src/test/txindex_tests.cpp index 095371941b..929530f520 100644 --- a/src/test/txindex_tests.cpp +++ b/src/test/txindex_tests.cpp @@ -40,9 +40,10 @@ BOOST_FIXTURE_TEST_CASE(txindex_initial_sync, TestChain100Setup) } // Check that txindex excludes genesis block transactions. + //ELEMENTS: we do include them const CBlock& genesis_block = Params().GenesisBlock(); for (const auto& txn : genesis_block.vtx) { - BOOST_CHECK(!txindex.FindTx(txn->GetHash(), block_hash, tx_disk)); + BOOST_CHECK(txindex.FindTx(txn->GetHash(), block_hash, tx_disk)); } // Check that txindex has all txs that were in the chain before it started. diff --git a/test/functional/feature_connect_genesis_outputs.py b/test/functional/feature_connect_genesis_outputs.py index ef97c76168..d5f95649df 100755 --- a/test/functional/feature_connect_genesis_outputs.py +++ b/test/functional/feature_connect_genesis_outputs.py @@ -16,7 +16,7 @@ def set_test_params(self): self.num_nodes = 2 self.setup_clean_chain = True # First node doesn't connect coinbase output to db, second does - self.extra_args = [["-con_connect_genesis_outputs=0", "-initialfreecoins={}".format(NUM_INITIAL_COINS * COIN)], + self.extra_args = [["-con_connect_genesis_outputs=0", "-initialfreecoins={}".format(NUM_INITIAL_COINS * COIN), '-txindex=1'], ["-con_connect_genesis_outputs=1", "-initialfreecoins={}".format(NUM_INITIAL_COINS * COIN), '-anyonecanspendaremine=1']] def skip_test_if_missing_module(self): @@ -49,15 +49,22 @@ def run_test(self): assert_equal(unspent[0]["amount"], NUM_INITIAL_COINS) assert_equal(unspent[0]["confirmations"], 1) - # Test rpc getraw functionality + # Test rpc getraw functionality. - # Coinbase transaction is provably unspendable (OP_RETURN), so even AddCoin won't add it - assert_raises_rpc_error(-5, "No such mempool transaction. Use -txindex to enable blockchain transaction queries. Use gettransaction for wallet transactions.", self.nodes[0].getrawtransaction, coinbase_tx) - assert_raises_rpc_error(-5, "No such mempool transaction. Use -txindex to enable blockchain transaction queries. Use gettransaction for wallet transactions.", self.nodes[1].getrawtransaction, coinbase_tx) + # Node 0 has txindex. + self.nodes[0].getrawtransaction(coinbase_tx, False) + self.nodes[0].getrawtransaction(issuance_tx, False) - # Issuance transaction is an OP_TRUE, so will be available to second node - assert_raises_rpc_error(-5, "No such mempool transaction. Use -txindex to enable blockchain transaction queries. Use gettransaction for wallet transactions.", self.nodes[0].getrawtransaction, issuance_tx) + # Node 1 doesn't. + assert_raises_rpc_error(-5, "No such mempool transaction. Use -txindex to enable blockchain transaction queries. Use gettransaction for wallet transactions.", self.nodes[1].getrawtransaction, coinbase_tx) + assert_raises_rpc_error(-5, "No such mempool transaction. Use -txindex to enable blockchain transaction queries. Use gettransaction for wallet transactions.", self.nodes[1].getrawtransaction, issuance_tx) + # But it can still access them by providing the genesis block hash. + self.nodes[1].getrawtransaction(coinbase_tx, False, self.nodes[0].getblockhash(0)) self.nodes[1].getrawtransaction(issuance_tx, False, self.nodes[0].getblockhash(0)) + # Because the issuance tx is OP_TRUE, node 1 (with anyonecanspendaremine) has them in the wallet. + assert_raises_rpc_error(-5, "Invalid or non-wallet transaction id", self.nodes[0].gettransaction, issuance_tx) + self.nodes[1].gettransaction(issuance_tx) + if __name__ == '__main__': ConnectGenesisTest().main()