Skip to content

Commit

Permalink
rpc: fix issue with querying txids by block heights
Browse files Browse the repository at this point in the history
  • Loading branch information
braydonf committed Apr 13, 2016
1 parent b9e0deb commit 9070af6
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 22 deletions.
11 changes: 6 additions & 5 deletions qa/rpc-tests/addressindex.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,14 +85,15 @@ def run_test(self):
assert_equal(txidsb[2], txidb2)

# Check that limiting by height works
chain_height = self.nodes[1].getblockcount()
print "Testing querying txids by range of block heights.."
height_txids = self.nodes[1].getaddresstxids({
"addresses": ["2N2JD6wb56AfK4tfmM6PwdVmoYk2dCKf4Br"],
"start": 111,
"end": 111
"start": 105,
"end": 110
})
assert_equal(len(height_txids), 1)
assert_equal(height_txids[0], txidb2)
assert_equal(len(height_txids), 2)
assert_equal(height_txids[0], txidb0)
assert_equal(height_txids[1], txidb1)

# Check that multiple addresses works
multitxids = self.nodes[1].getaddresstxids({"addresses": ["2N2JD6wb56AfK4tfmM6PwdVmoYk2dCKf4Br", "mo9ncXisMeAoXwqcV5EWuyncbmCcQN4rVs"]})
Expand Down
50 changes: 35 additions & 15 deletions src/main.h
Original file line number Diff line number Diff line change
Expand Up @@ -552,23 +552,14 @@ struct CAddressIndexKey {
struct CAddressIndexIteratorKey {
unsigned int type;
uint160 hashBytes;
bool includeHeight;
int blockHeight;

size_t GetSerializeSize(int nType, int nVersion) const {
if (includeHeight) {
return 25;
} else {
return 21;
}
return 21;
}
template<typename Stream>
void Serialize(Stream& s, int nType, int nVersion) const {
ser_writedata8(s, type);
hashBytes.Serialize(s, nType, nVersion);
if (includeHeight) {
ser_writedata32be(s, blockHeight);
}
}
template<typename Stream>
void Unserialize(Stream& s, int nType, int nVersion) {
Expand All @@ -579,24 +570,53 @@ struct CAddressIndexIteratorKey {
CAddressIndexIteratorKey(unsigned int addressType, uint160 addressHash) {
type = addressType;
hashBytes = addressHash;
includeHeight = false;
}

CAddressIndexIteratorKey(unsigned int addressType, uint160 addressHash, int height) {
CAddressIndexIteratorKey() {
SetNull();
}

void SetNull() {
type = 0;
hashBytes.SetNull();
}
};

struct CAddressIndexIteratorHeightKey {
unsigned int type;
uint160 hashBytes;
int blockHeight;

size_t GetSerializeSize(int nType, int nVersion) const {
return 25;
}
template<typename Stream>
void Serialize(Stream& s, int nType, int nVersion) const {
ser_writedata8(s, type);
hashBytes.Serialize(s, nType, nVersion);
ser_writedata32be(s, blockHeight);
}
template<typename Stream>
void Unserialize(Stream& s, int nType, int nVersion) {
type = ser_readdata8(s);
hashBytes.Unserialize(s, nType, nVersion);
blockHeight = ser_readdata32be(s);
}

CAddressIndexIteratorHeightKey(unsigned int addressType, uint160 addressHash, int height) {
type = addressType;
hashBytes = addressHash;
blockHeight = height;
includeHeight = true;
}

CAddressIndexIteratorKey() {
CAddressIndexIteratorHeightKey() {
SetNull();
}

void SetNull() {
type = 0;
hashBytes.SetNull();
includeHeight = false;
blockHeight = 0;
}
};

Expand Down
2 changes: 1 addition & 1 deletion src/rpcmisc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -675,7 +675,7 @@ UniValue getaddresstxids(const UniValue& params, bool fHelp)
UniValue endValue = find_value(params[0].get_obj(), "end");
if (startValue.isNum() && endValue.isNum()) {
start = startValue.get_int();
end = startValue.get_int();
end = endValue.get_int();
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/txdb.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ bool CBlockTreeDB::ReadAddressIndex(uint160 addressHash, int type,
boost::scoped_ptr<CDBIterator> pcursor(NewIterator());

if (start > 0 && end > 0) {
pcursor->Seek(make_pair(DB_ADDRESSINDEX, CAddressIndexIteratorKey(type, addressHash, start)));
pcursor->Seek(make_pair(DB_ADDRESSINDEX, CAddressIndexIteratorHeightKey(type, addressHash, start)));
} else {
pcursor->Seek(make_pair(DB_ADDRESSINDEX, CAddressIndexIteratorKey(type, addressHash)));
}
Expand Down
1 change: 1 addition & 0 deletions src/txdb.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ struct CAddressUnspentKey;
struct CAddressUnspentValue;
struct CAddressIndexKey;
struct CAddressIndexIteratorKey;
struct CAddressIndexIteratorHeightKey;
struct CTimestampIndexKey;
struct CTimestampIndexIteratorKey;
struct CSpentIndexKey;
Expand Down

0 comments on commit 9070af6

Please sign in to comment.