Merge #838: Index the genesis block with txindex

fd4dcf9c7 Improve coinbase and issuance tx testing for txindex (Steven Roose)
ac9966f65 Index the genesis block with txindex (Steven Roose)

Pull request description:

  This reverts commit ed12d5df1b in which Core removed the genesis txs from the txindex.

  Since they are spendable in Elements (as opposed to Core), they should be added to the index as well.

Tree-SHA512: a9067032f80a78f5393437d287022756816a4baa6bfb8fc382d04dc7831a536dc68959a039636aa4b1bb268b2b849e67a0d4ca59abe835c2834ac358f8175e9e
This commit is contained in:
Steven Roose 2020-03-24 17:15:21 +00:00
commit ac5a435247
No known key found for this signature in database
GPG key ID: 2F2A88D7F8D68E87
3 changed files with 18 additions and 9 deletions

View file

@ -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<std::pair<uint256, CDiskTxPos>> vPos;

View file

@ -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.

View file

@ -16,7 +16,7 @@ class ConnectGenesisTest(BitcoinTestFramework):
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 @@ class ConnectGenesisTest(BitcoinTestFramework):
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)
# Node 0 has txindex.
self.nodes[0].getrawtransaction(coinbase_tx, False)
self.nodes[0].getrawtransaction(issuance_tx, False)
# 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)
# 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)
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()