remove unused leveldb code.
This commit is contained in:
parent
4a6a3b1243
commit
e1722b0a63
|
@ -188,8 +188,6 @@ using namespace v8;
|
|||
|
||||
// LevelDB options
|
||||
#define USE_LDB_ADDR 0
|
||||
#define USE_LDB_FILES 1
|
||||
#define USE_LDB_BLOCK 1
|
||||
|
||||
/**
|
||||
* Node.js Exposed Function Templates
|
||||
|
@ -5867,43 +5865,6 @@ jstx_to_ctx(const Local<Object> jstx, CTransaction& ctx_) {
|
|||
}
|
||||
|
||||
#if USE_LDB_ADDR
|
||||
static leveldb::Options
|
||||
GetOptions(size_t nCacheSize) {
|
||||
leveldb::Options options;
|
||||
options.block_cache = leveldb::NewLRUCache(nCacheSize / 2);
|
||||
options.write_buffer_size = nCacheSize / 4; // up to two write buffers may be held in memory simultaneously
|
||||
options.filter_policy = leveldb::NewBloomFilterPolicy(10);
|
||||
options.compression = leveldb::kNoCompression;
|
||||
options.max_open_files = 64;
|
||||
if (leveldb::kMajorVersion > 1 || (leveldb::kMajorVersion == 1 && leveldb::kMinorVersion >= 16)) {
|
||||
// LevelDB versions before 1.16 consider short writes to be corruption. Only trigger error
|
||||
// on corruption in later versions.
|
||||
options.paranoid_checks = true;
|
||||
}
|
||||
return options;
|
||||
}
|
||||
|
||||
// http://leveldb.googlecode.com/svn/tags/1.17/doc/index.html
|
||||
|
||||
#if 0
|
||||
class TwoPartComparator : public leveldb::Comparator {
|
||||
public:
|
||||
int Compare(const leveldb::Slice& key, const leveldb::Slice& end) const {
|
||||
std::string key_ = key.ToString();
|
||||
const char *k = key_.c_str();
|
||||
#if USE_LDB_BLOCK
|
||||
if (k[0] == 'b') return -1;
|
||||
#else
|
||||
if (k[0] == 't') return -1;
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
const char* Name() const { return "TwoPartComparator"; }
|
||||
void FindShortestSeparator(std::string*, const leveldb::Slice&) const { }
|
||||
void FindShortSuccessor(std::string*) const { }
|
||||
};
|
||||
#endif
|
||||
|
||||
static ctx_list *
|
||||
read_addr(const std::string addr) {
|
||||
ctx_list *head = new ctx_list();
|
||||
|
@ -5982,70 +5943,6 @@ read_addr(const std::string addr) {
|
|||
}
|
||||
}
|
||||
}
|
||||
#if 0
|
||||
if (k[0] == 't') {
|
||||
char *txhash_ = strdup(k);
|
||||
txhash_++;
|
||||
std::string stxhash = std::string(txhash_);
|
||||
uint256 txhash(stxhash);
|
||||
leveldb::Slice slValue = pcursor->value();
|
||||
CDataStream ssValue(slValue.data(), slValue.data() + slValue.size(), SER_DISK, CLIENT_VERSION);
|
||||
CTransaction ctx;
|
||||
ssValue >> ctx;
|
||||
BOOST_FOREACH(const CTxIn& txin, ctx.vin) {
|
||||
if (txin.scriptSig.ToString() != expectedScriptSig.ToString()) {
|
||||
continue;
|
||||
}
|
||||
if (cur == NULL) {
|
||||
head->ctx = ctx;
|
||||
uint256 hash(((CMerkleTx)ctx).hashBlock.GetHex());
|
||||
head->blockhash = hash;
|
||||
head->next = NULL;
|
||||
cur = head;
|
||||
} else {
|
||||
ctx_list *item = new ctx_list();
|
||||
item->ctx = ctx;
|
||||
uint256 hash(((CMerkleTx)ctx).hashBlock.GetHex());
|
||||
item->blockhash = hash;
|
||||
item->next = NULL;
|
||||
cur->next = item;
|
||||
cur = item;
|
||||
}
|
||||
goto found;
|
||||
}
|
||||
for (unsigned int vo = 0; vo < ctx.vout.size(); vo++) {
|
||||
const CTxOut& txout = ctx.vout[vo];
|
||||
const CScript& scriptPubKey = txout.scriptPubKey;
|
||||
int nRequired;
|
||||
txnouttype type;
|
||||
vector<CTxDestination> addresses;
|
||||
if (!ExtractDestinations(scriptPubKey, type, addresses, nRequired)) {
|
||||
continue;
|
||||
}
|
||||
BOOST_FOREACH(const CTxDestination& address, addresses) {
|
||||
if (CBitcoinAddress(address).ToString() != addr) {
|
||||
continue;
|
||||
}
|
||||
if (cur == NULL) {
|
||||
head->ctx = ctx;
|
||||
uint256 hash(((CMerkleTx)ctx).hashBlock.GetHex());
|
||||
head->blockhash = hash;
|
||||
head->next = NULL;
|
||||
cur = head;
|
||||
} else {
|
||||
ctx_list *item = new ctx_list();
|
||||
item->ctx = ctx;
|
||||
uint256 hash(((CMerkleTx)ctx).hashBlock.GetHex());
|
||||
item->blockhash = hash;
|
||||
item->next = NULL;
|
||||
cur->next = item;
|
||||
cur = item;
|
||||
}
|
||||
goto found;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
found:
|
||||
pcursor->Next();
|
||||
}
|
||||
|
@ -6053,537 +5950,6 @@ found:
|
|||
|
||||
return head;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static ctx_list *
|
||||
read_addr(const std::string addr) {
|
||||
ctx_list *head = new ctx_list();
|
||||
ctx_list *cur = NULL;
|
||||
|
||||
#if 0
|
||||
// XXX TEST
|
||||
const CBlock& cblock = Params().GenesisBlock();
|
||||
CTransaction ctx = cblock.vtx[0];
|
||||
if (cur == NULL) {
|
||||
head->ctx = ctx;
|
||||
//uint256 hash(((CMerkleTx)ctx).hashBlock.GetHex());
|
||||
//head->blockhash = hash;
|
||||
head->blockhash = cblock.GetHash();
|
||||
head->next = NULL;
|
||||
cur = head;
|
||||
} else {
|
||||
ctx_list *item = new ctx_list();
|
||||
item->ctx = ctx;
|
||||
//uint256 hash(((CMerkleTx)ctx).hashBlock.GetHex());
|
||||
//item->blockhash = hash;
|
||||
item->blockhash = cblock.GetHash();
|
||||
item->next = NULL;
|
||||
cur->next = item;
|
||||
cur = item;
|
||||
}
|
||||
return head;
|
||||
#endif
|
||||
|
||||
|
||||
// custom environment this database is using (may be NULL in case of default environment)
|
||||
leveldb::Env* penv;
|
||||
|
||||
// database options used
|
||||
leveldb::Options options;
|
||||
|
||||
// options used when reading from the database
|
||||
leveldb::ReadOptions readoptions;
|
||||
|
||||
// options used when iterating over values of the database
|
||||
leveldb::ReadOptions iteroptions;
|
||||
|
||||
// options used when writing to the database
|
||||
leveldb::WriteOptions writeoptions;
|
||||
|
||||
// options used when sync writing to the database
|
||||
leveldb::WriteOptions syncoptions;
|
||||
|
||||
// the database itself
|
||||
leveldb::DB* pdb;
|
||||
|
||||
size_t nCacheSize = 0x100000;
|
||||
bool fMemory = false;
|
||||
bool fWipe = false;
|
||||
|
||||
// Options:
|
||||
// https://code.google.com/p/leveldb/source/browse/include/leveldb/options.h
|
||||
|
||||
penv = NULL;
|
||||
readoptions.verify_checksums = true;
|
||||
iteroptions.verify_checksums = true;
|
||||
iteroptions.fill_cache = false;
|
||||
syncoptions.sync = true;
|
||||
options = GetOptions(nCacheSize);
|
||||
//options.create_if_missing = true;
|
||||
options.create_if_missing = false;
|
||||
|
||||
#if 0
|
||||
TwoPartComparator cmp;
|
||||
options.comparator = &cmp;
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#if 0
|
||||
int64_t nMaxDbCache = sizeof(void*) > 4 ? 4096 : 1024;
|
||||
size_t nTotalCache = (100 << 20);
|
||||
if (nTotalCache < (4 << 20)) {
|
||||
nTotalCache = (4 << 20);
|
||||
} else if (nTotalCache > (nMaxDbCache << 20)) {
|
||||
nTotalCache = (nMaxDbCache << 20);
|
||||
}
|
||||
size_t nBlockTreeDBCache = nTotalCache / 8;
|
||||
if (nBlockTreeDBCache > (1 << 21)) {
|
||||
nBlockTreeDBCache = (1 << 21);
|
||||
}
|
||||
UnloadBlockIndex();
|
||||
pblocktree->Flush();
|
||||
delete pblocktree;
|
||||
// after:
|
||||
pblocktree = new CBlockTreeDB(nBlockTreeDBCache, false, fReindex);
|
||||
#endif
|
||||
|
||||
do {
|
||||
// ~/bitcoin/src/txdb.cpp
|
||||
// pblocktree = 'CBlockTreeDB'
|
||||
// ~/bitcoin/src/init.cpp
|
||||
// ~/bitcoin/src/main.cpp
|
||||
|
||||
// const boost::filesystem::path path = GetDataDir() / "chainstate";
|
||||
// CLevelDBWrapper db(path, nCacheSize, fMemory, fWipe);
|
||||
// leveldb::Iterator *pcursor = const_cast<CLevelDBWrapper*>(&db)->NewIterator();
|
||||
|
||||
const boost::filesystem::path path = GetDataDir() / "chainstate";
|
||||
leveldb::Status status = leveldb::DB::Open(options, path.string(), &pdb);
|
||||
if (!status.ok()) break;
|
||||
leveldb::Iterator* pcursor = pdb->NewIterator(iteroptions);
|
||||
|
||||
pcursor->SeekToFirst();
|
||||
|
||||
while (pcursor->Valid()) {
|
||||
boost::this_thread::interruption_point();
|
||||
try {
|
||||
leveldb::Slice slKey = pcursor->key();
|
||||
CDataStream ssKey(slKey.data(), slKey.data() + slKey.size(), SER_DISK, CLIENT_VERSION);
|
||||
char chType;
|
||||
ssKey >> chType;
|
||||
if (chType == 'c') {
|
||||
leveldb::Slice slValue = pcursor->value();
|
||||
CDataStream ssValue(slValue.data(), slValue.data() + slValue.size(), SER_DISK, CLIENT_VERSION);
|
||||
CCoins coins;
|
||||
ssValue >> coins;
|
||||
uint256 txhash;
|
||||
ssKey >> txhash;
|
||||
|
||||
#if 0
|
||||
// XXX TEST
|
||||
const CBlock& cblock = Params().GenesisBlock();
|
||||
CTransaction ctx = cblock.vtx[0];
|
||||
if (cur == NULL) {
|
||||
head->ctx = ctx;
|
||||
//uint256 hash(((CMerkleTx)ctx).hashBlock.GetHex());
|
||||
//head->blockhash = hash;
|
||||
head->blockhash = cblock.GetHash();
|
||||
head->next = NULL;
|
||||
cur = head;
|
||||
} else {
|
||||
ctx_list *item = new ctx_list();
|
||||
item->ctx = ctx;
|
||||
//uint256 hash(((CMerkleTx)ctx).hashBlock.GetHex());
|
||||
//item->blockhash = hash;
|
||||
item->blockhash = cblock.GetHash();
|
||||
item->next = NULL;
|
||||
cur->next = item;
|
||||
cur = item;
|
||||
}
|
||||
goto done;
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
// XXX TEST
|
||||
CTransaction ctx;
|
||||
CBlock cblock;
|
||||
uint256 blockhash = 0;
|
||||
if (GetTransaction(txhash, ctx, blockhash, true)) {
|
||||
if (cur == NULL) {
|
||||
head->ctx = ctx;
|
||||
uint256 hash(((CMerkleTx)ctx).hashBlock.GetHex());
|
||||
head->blockhash = hash;
|
||||
head->next = NULL;
|
||||
cur = head;
|
||||
} else {
|
||||
ctx_list *item = new ctx_list();
|
||||
item->ctx = ctx;
|
||||
uint256 hash(((CMerkleTx)ctx).hashBlock.GetHex());
|
||||
item->blockhash = hash;
|
||||
item->next = NULL;
|
||||
cur->next = item;
|
||||
cur = item;
|
||||
}
|
||||
}
|
||||
goto done;
|
||||
#endif
|
||||
|
||||
for (unsigned int i = 0; i < coins.vout.size(); i++) {
|
||||
const CTxOut &out = coins.vout[i];
|
||||
if (out.IsNull()) {
|
||||
continue;
|
||||
}
|
||||
const CScript& scriptPubKey = out.scriptPubKey;
|
||||
int nRequired;
|
||||
txnouttype type;
|
||||
vector<CTxDestination> addresses;
|
||||
if (!ExtractDestinations(scriptPubKey, type, addresses, nRequired)) {
|
||||
continue;
|
||||
}
|
||||
CTransaction ctx;
|
||||
CBlock cblock;
|
||||
BOOST_FOREACH(const CTxDestination& address, addresses) {
|
||||
if (CBitcoinAddress(address).ToString() != addr) {
|
||||
continue;
|
||||
}
|
||||
uint256 blockhash = 0;
|
||||
if (GetTransaction(txhash, ctx, blockhash, true)) {
|
||||
goto found_tx;
|
||||
} else {
|
||||
int64_t i = 0;
|
||||
int64_t height = chainActive.Height();
|
||||
for (; i <= height; i++) {
|
||||
CBlockIndex* pblockindex = chainActive[i];
|
||||
if (ReadBlockFromDisk(cblock, pblockindex)) {
|
||||
BOOST_FOREACH(const CTransaction& tx, cblock.vtx) {
|
||||
if (tx.GetHash() == txhash) {
|
||||
ctx = tx;
|
||||
goto found_tx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
found_tx:
|
||||
if (cur == NULL) {
|
||||
head->ctx = ctx;
|
||||
uint256 hash(((CMerkleTx)ctx).hashBlock.GetHex());
|
||||
head->blockhash = hash;
|
||||
head->next = NULL;
|
||||
cur = head;
|
||||
} else {
|
||||
ctx_list *item = new ctx_list();
|
||||
item->ctx = ctx;
|
||||
uint256 hash(((CMerkleTx)ctx).hashBlock.GetHex());
|
||||
item->blockhash = hash;
|
||||
item->next = NULL;
|
||||
cur->next = item;
|
||||
cur = item;
|
||||
}
|
||||
goto found;
|
||||
}
|
||||
}
|
||||
}
|
||||
found:
|
||||
pcursor->Next();
|
||||
} catch (std::exception &e) {
|
||||
//return error("%s : Deserialize or I/O error - %s", __func__, e.what());
|
||||
delete pcursor;
|
||||
return head;
|
||||
}
|
||||
}
|
||||
|
||||
//found:
|
||||
done:
|
||||
// XXX Maybe put delete it before continue below too:
|
||||
//assert(pcursor->status().ok());
|
||||
delete pcursor;
|
||||
continue;
|
||||
} while (0);
|
||||
|
||||
return head;
|
||||
|
||||
|
||||
|
||||
|
||||
#if 0
|
||||
|
||||
CScript expectedScriptSig = GetScriptForDestination(CBitcoinAddress(addr).Get());
|
||||
|
||||
#if USE_LDB_FILES
|
||||
unsigned int nFile = 0;
|
||||
unsigned int tryFiles = chainActive.Height();
|
||||
for (; nFile <= tryFiles; nFile++) {
|
||||
const boost::filesystem::path path = GetDataDir() / "blocks" / strprintf("%s%05u.dat", "blk", nFile);
|
||||
#else
|
||||
do {
|
||||
const boost::filesystem::path path = GetDataDir() / "blocks" / "index";
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
if (fMemory) {
|
||||
penv = leveldb::NewMemEnv(leveldb::Env::Default());
|
||||
options.env = penv;
|
||||
}
|
||||
|
||||
leveldb::Status status = leveldb::DB::Open(options, path.string(), &pdb);
|
||||
|
||||
if (!status.ok()) {
|
||||
continue;
|
||||
//break;
|
||||
}
|
||||
|
||||
//leveldb::Iterator* it = pdb->NewIterator(leveldb::ReadOptions());
|
||||
leveldb::Iterator* it = pdb->NewIterator(iteroptions);
|
||||
#else
|
||||
// ~/bitcoin/src/txdb.cpp
|
||||
CLevelDBWrapper db(path, nCacheSize, fMemory, fWipe);
|
||||
leveldb::Iterator *it = const_cast<CLevelDBWrapper*>(&db)->NewIterator();
|
||||
#endif
|
||||
|
||||
for (it->SeekToFirst(); it->Valid(); it->Next()) {
|
||||
boost::this_thread::interruption_point();
|
||||
#if USE_LDB_BLOCK
|
||||
// if (it->key().ToString().c_str()[0] != 'b') continue;
|
||||
CBlock cblock;
|
||||
#else
|
||||
// if (it->key().ToString().c_str()[0] != 't') continue;
|
||||
CTransaction ctx;
|
||||
#endif
|
||||
|
||||
std::string strValue = it->value().ToString();
|
||||
|
||||
try {
|
||||
CDataStream ssValue(strValue.data(), strValue.data() + strValue.size(), SER_DISK, CLIENT_VERSION);
|
||||
#if USE_LDB_BLOCK
|
||||
ssValue >> cblock;
|
||||
#else
|
||||
ssValue >> ctx;
|
||||
#endif
|
||||
} catch (const std::exception&) {
|
||||
// delete it;
|
||||
// return NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
#if USE_LDB_BLOCK
|
||||
BOOST_FOREACH(const CTransaction& ctx, cblock.vtx) {
|
||||
#endif
|
||||
// vin
|
||||
BOOST_FOREACH(const CTxIn& txin, ctx.vin) {
|
||||
if (txin.scriptSig.ToString() != expectedScriptSig.ToString()) {
|
||||
continue;
|
||||
}
|
||||
if (cur == NULL) {
|
||||
head->ctx = ctx;
|
||||
uint256 hash(((CMerkleTx)ctx).hashBlock.GetHex());
|
||||
head->blockhash = hash;
|
||||
head->next = NULL;
|
||||
cur = head;
|
||||
} else {
|
||||
ctx_list *item = new ctx_list();
|
||||
item->ctx = ctx;
|
||||
uint256 hash(((CMerkleTx)ctx).hashBlock.GetHex());
|
||||
item->blockhash = hash;
|
||||
item->next = NULL;
|
||||
cur->next = item;
|
||||
cur = item;
|
||||
}
|
||||
goto found;
|
||||
}
|
||||
|
||||
// vout
|
||||
for (unsigned int vo = 0; vo < ctx.vout.size(); vo++) {
|
||||
const CTxOut& txout = ctx.vout[vo];
|
||||
const CScript& scriptPubKey = txout.scriptPubKey;
|
||||
int nRequired;
|
||||
txnouttype type;
|
||||
vector<CTxDestination> addresses;
|
||||
if (!ExtractDestinations(scriptPubKey, type, addresses, nRequired)) {
|
||||
continue;
|
||||
}
|
||||
BOOST_FOREACH(const CTxDestination& address, addresses) {
|
||||
if (CBitcoinAddress(address).ToString() != addr) {
|
||||
continue;
|
||||
}
|
||||
if (cur == NULL) {
|
||||
head->ctx = ctx;
|
||||
uint256 hash(((CMerkleTx)ctx).hashBlock.GetHex());
|
||||
head->blockhash = hash;
|
||||
head->next = NULL;
|
||||
cur = head;
|
||||
} else {
|
||||
ctx_list *item = new ctx_list();
|
||||
item->ctx = ctx;
|
||||
uint256 hash(((CMerkleTx)ctx).hashBlock.GetHex());
|
||||
item->blockhash = hash;
|
||||
item->next = NULL;
|
||||
cur->next = item;
|
||||
cur = item;
|
||||
}
|
||||
goto found;
|
||||
}
|
||||
}
|
||||
#if USE_LDB_BLOCK
|
||||
}
|
||||
#endif
|
||||
|
||||
found:
|
||||
continue;
|
||||
}
|
||||
|
||||
assert(it->status().ok());
|
||||
|
||||
delete it;
|
||||
#if USE_LDB_FILES
|
||||
}
|
||||
#else
|
||||
} while (0);
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
|
||||
#if USE_LDB_FILES
|
||||
unsigned int nFile = 0;
|
||||
unsigned int tryFiles = chainActive.Height();
|
||||
for (; nFile <= tryFiles; nFile++) {
|
||||
const boost::filesystem::path path = GetDataDir() / "blocks" / strprintf("%s%05u.dat", "blk", nFile);
|
||||
#else
|
||||
do {
|
||||
const boost::filesystem::path path = GetDataDir() / "blocks" / "index";
|
||||
#endif
|
||||
|
||||
if (fMemory) {
|
||||
penv = leveldb::NewMemEnv(leveldb::Env::Default());
|
||||
options.env = penv;
|
||||
}
|
||||
|
||||
leveldb::Status status = leveldb::DB::Open(options, path.string(), &pdb);
|
||||
|
||||
if (!status.ok()) {
|
||||
break;
|
||||
}
|
||||
|
||||
leveldb::Slice start = "t";
|
||||
leveldb::Slice end = "t\xFF";
|
||||
//leveldb::Options options;
|
||||
|
||||
leveldb::Iterator* it = pdb->NewIterator(leveldb::ReadOptions());
|
||||
|
||||
for (it->Seek(start); it->Valid(); it->Next()) {
|
||||
leveldb::Slice key = it->key();
|
||||
leveldb::Slice value = it->value();
|
||||
|
||||
if (options.comparator->Compare(key, end) > 0) {
|
||||
break;
|
||||
} else {
|
||||
#if USE_LDB_BLOCK
|
||||
CBlock cblock;
|
||||
#else
|
||||
CTransaction ctx;
|
||||
#endif
|
||||
|
||||
std::string strValue = value.ToString();
|
||||
|
||||
try {
|
||||
CDataStream ssValue(strValue.data(), strValue.data() + strValue.size(), SER_DISK, CLIENT_VERSION);
|
||||
#if USE_LDB_BLOCK
|
||||
ssValue >> cblock;
|
||||
#else
|
||||
ssValue >> ctx;
|
||||
#endif
|
||||
} catch (const std::exception&) {
|
||||
// delete it;
|
||||
// return NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
#if USE_LDB_BLOCK
|
||||
BOOST_FOREACH(const CTransaction& ctx, cblock.vtx) {
|
||||
#endif
|
||||
// vin
|
||||
BOOST_FOREACH(const CTxIn& txin, ctx.vin) {
|
||||
if (txin.scriptSig.ToString() != expectedScriptSig.ToString()) {
|
||||
continue;
|
||||
}
|
||||
if (cur == NULL) {
|
||||
head->ctx = ctx;
|
||||
uint256 hash(((CMerkleTx)ctx).hashBlock.GetHex());
|
||||
head->blockhash = hash;
|
||||
head->next = NULL;
|
||||
cur = head;
|
||||
} else {
|
||||
ctx_list *item = new ctx_list();
|
||||
item->ctx = ctx;
|
||||
uint256 hash(((CMerkleTx)ctx).hashBlock.GetHex());
|
||||
item->blockhash = hash;
|
||||
item->next = NULL;
|
||||
cur->next = item;
|
||||
cur = item;
|
||||
}
|
||||
goto found;
|
||||
}
|
||||
|
||||
// vout
|
||||
for (unsigned int vo = 0; vo < ctx.vout.size(); vo++) {
|
||||
const CTxOut& txout = ctx.vout[vo];
|
||||
const CScript& scriptPubKey = txout.scriptPubKey;
|
||||
int nRequired;
|
||||
txnouttype type;
|
||||
vector<CTxDestination> addresses;
|
||||
if (!ExtractDestinations(scriptPubKey, type, addresses, nRequired)) {
|
||||
continue;
|
||||
}
|
||||
BOOST_FOREACH(const CTxDestination& address, addresses) {
|
||||
if (CBitcoinAddress(address).ToString() != addr) {
|
||||
continue;
|
||||
}
|
||||
if (cur == NULL) {
|
||||
head->ctx = ctx;
|
||||
uint256 hash(((CMerkleTx)ctx).hashBlock.GetHex());
|
||||
head->blockhash = hash;
|
||||
head->next = NULL;
|
||||
cur = head;
|
||||
} else {
|
||||
ctx_list *item = new ctx_list();
|
||||
item->ctx = ctx;
|
||||
uint256 hash(((CMerkleTx)ctx).hashBlock.GetHex());
|
||||
item->blockhash = hash;
|
||||
item->next = NULL;
|
||||
cur->next = item;
|
||||
cur = item;
|
||||
}
|
||||
goto found;
|
||||
}
|
||||
}
|
||||
#if USE_LDB_BLOCK
|
||||
}
|
||||
#endif
|
||||
|
||||
found:
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
delete it;
|
||||
#if USE_LDB_FILES
|
||||
}
|
||||
#else
|
||||
} while (0);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
return head;
|
||||
|
||||
#endif
|
||||
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static int64_t
|
||||
|
|
Loading…
Reference in New Issue