LedgerDelegate BlockDataViewer::getLedgerDelegateForScrAddr( const BinaryData& wltID, const BinaryData& scrAddr) { BtcWallet* wlt = nullptr; for (auto& group : groups_) { ReadWriteLock::WriteLock wl(group.lock_); auto wltIter = group.wallets_.find(wltID); if (wltIter != group.wallets_.end()) { wlt = wltIter->second.get(); break; } } if (wlt == nullptr) throw runtime_error("Unregistered wallet ID"); ScrAddrObj& sca = wlt->getScrAddrObjRef(scrAddr); auto getHist = [&](uint32_t pageID)->vector<LedgerEntry> { return sca.getHistoryPageById(pageID); }; auto getBlock = [&](uint32_t block)->uint32_t { return sca.getBlockInVicinity(block); }; auto getPageId = [&](uint32_t block)->uint32_t { return sca.getPageIdForBlockHeight(block); }; return LedgerDelegate(getHist, getBlock, getPageId); }
void TestZeroConf(void) { BlockDataManager_MMAP & bdm = BlockDataManager_MMAP::GetInstance(); BinaryData myAddress; BtcWallet wlt; /* bdm.Reset(); bdm.readBlkFile_FromScratch("zctest/blk0001.dat"); // More testnet addresses, with only a few transactions myAddress.createFromHex("4c98e1fb7aadce864b310b2e52b685c09bdfd5e7"); wlt.addAddress(myAddress); myAddress.createFromHex("08ccdf1ef9269b95f6ce93899ece9f68cd5afb22"); wlt.addAddress(myAddress); myAddress.createFromHex("edf6bbd7ba7aad222c2b28e6d8d5001178e3680c"); wlt.addAddress(myAddress); myAddress.createFromHex("18d9cae7ee0be5c6d58f02a992442d2cdb9914fa"); wlt.addAddress(myAddress); bdm.scanBlockchainForTx(wlt); bdm.enableZeroConf("zctest/mempool_new.bin"); uint32_t currBlk = bdm.getTopBlockHeader().getBlockHeight(); ifstream zcIn("zctest/mempool.bin", ios::in | ios::binary); zcIn.seekg(0, ios::end); uint64_t filesize = (size_t)zcIn.tellg(); zcIn.seekg(0, ios::beg); BinaryData memPool(filesize); zcIn.read((char*)memPool.getPtr(), filesize); BinaryRefReader brr(memPool); cout << "Starting Wallet:" << endl; bdm.rescanWalletZeroConf(wlt); wlt.pprintLedger(); while(brr.getSizeRemaining() > 8) { cout << endl << endl; cout << "Inserting another 0-conf tx..." << endl; uint64_t txtime = brr.get_uint64_t(); TxRef zcTx(brr); bool wasAdded = bdm.addNewZeroConfTx(zcTx.serialize(), txtime, true); if(wasAdded) bdm.rescanWalletZeroConf(wlt); cout << "UltBal: " << wlt.getFullBalance() << endl; cout << "SpdBal: " << wlt.getSpendableBalance() << endl; cout << "UncBal: " << wlt.getUnconfirmedBalance(currBlk) << endl; wlt.pprintLedger(); cout << "Unspent TxOuts:" << endl; vector<UnspentTxOut> utxoList = wlt.getSpendableTxOutList(currBlk); uint64_t bal = 0; for(uint32_t i=0; i<utxoList.size(); i++) { bal += utxoList[i].getValue(); utxoList[i].pprintOneLine(currBlk); } cout << "Sum of TxOuts: " << bal/1e8 << endl; } */ ifstream is("zctest/mempool_new.bin", ios::in | ios::binary); ofstream os("zctest/mempool.bin", ios::out | ios::binary); is.seekg(0, ios::end); uint64_t filesize = (size_t)is.tellg(); is.seekg(0, ios::beg); BinaryData mempool(filesize); is.read ((char*)mempool.getPtr(), filesize); os.write((char*)mempool.getPtr(), filesize); is.close(); os.close(); //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// // Start testing balance/wlt update after a new block comes in bdm.Reset(); bdm.readBlkFile_FromScratch("zctest/blk0001.dat"); // More testnet addresses, with only a few transactions wlt = BtcWallet(); myAddress.createFromHex("4c98e1fb7aadce864b310b2e52b685c09bdfd5e7"); wlt.addAddress(myAddress); myAddress.createFromHex("08ccdf1ef9269b95f6ce93899ece9f68cd5afb22"); wlt.addAddress(myAddress); myAddress.createFromHex("edf6bbd7ba7aad222c2b28e6d8d5001178e3680c"); wlt.addAddress(myAddress); myAddress.createFromHex("18d9cae7ee0be5c6d58f02a992442d2cdb9914fa"); wlt.addAddress(myAddress); uint32_t topBlk = bdm.getTopBlockHeader().getBlockHeight(); // This will load the memory pool into the zeroConfPool_ in BDM bdm.enableZeroConf("zctest/mempool.bin"); // Now scan all transactions, which ends with scanning zero-conf bdm.scanBlockchainForTx(wlt); wlt.pprintAlot(topBlk, true); // The new blkfile has about 10 new blocks, one of which has these tx bdm.readBlkFileUpdate("zctest/blk0001_updated.dat"); bdm.scanBlockchainForTx(wlt, topBlk); topBlk = bdm.getTopBlockHeader().getBlockHeight(); wlt.pprintAlot(topBlk, true); }
void TestScanForWalletTx(string blkfile) { BlockDataManager_MMAP & bdm = BlockDataManager_MMAP::GetInstance(); bdm.readBlkFile_FromScratch(blkfile); ///////////////////////////////////////////////////////////////////////////// BinaryData myAddress; BtcWallet wlt; // Main-network addresses myAddress.createFromHex("604875c897a079f4db88e5d71145be2093cae194"); wlt.addAddress(myAddress); myAddress.createFromHex("8996182392d6f05e732410de4fc3fa273bac7ee6"); wlt.addAddress(myAddress); myAddress.createFromHex("b5e2331304bc6c541ffe81a66ab664159979125b"); wlt.addAddress(myAddress); myAddress.createFromHex("ebbfaaeedd97bc30df0d6887fd62021d768f5cb8"); wlt.addAddress(myAddress); myAddress.createFromHex("11b366edfc0a8b66feebae5c2e25a7b6a5d1cf31"); wlt.addAddress(myAddress); // This address contains a tx with a non-std TxOut, but the other TxOuts are valid myAddress.createFromHex("6c27c8e67b7376f3ab63553fe37a4481c4f951cf"); wlt.addAddress(myAddress); // More testnet addresses, with only a few transactions myAddress.createFromHex("0c6b92101c7025643c346d9c3e23034a8a843e21"); wlt.addAddress(myAddress); myAddress.createFromHex("34c9f8dc91dfe1ae1c59e76cbe1aa39d0b7fc041"); wlt.addAddress(myAddress); myAddress.createFromHex("d77561813ca968270d5f63794ddb6aab3493605e"); wlt.addAddress(myAddress); myAddress.createFromHex("0e0aec36fe2545fb31a41164fb6954adcd96b342"); wlt.addAddress(myAddress); TIMER_WRAP(bdm.scanBlockchainForTx(wlt)); TIMER_WRAP(bdm.scanBlockchainForTx(wlt)); TIMER_WRAP(bdm.scanBlockchainForTx(wlt)); cout << "Checking balance of all addresses: " << wlt.getNumAddr() << " addrs" << endl; for(uint32_t i=0; i<wlt.getNumAddr(); i++) { BinaryData addr20 = wlt.getAddrByIndex(i).getAddrStr20(); cout << " Addr: " << wlt.getAddrByIndex(i).getFullBalance() << "," << wlt.getAddrByHash160(addr20).getFullBalance() << endl; vector<LedgerEntry> const & ledger = wlt.getAddrByIndex(i).getTxLedger(); for(uint32_t j=0; j<ledger.size(); j++) { cout << " Tx: " << ledger[j].getAddrStr20().getSliceCopy(0,4).toHexStr() << " " << ledger[j].getValue()/(float)(CONVERTBTC) << " (" << ledger[j].getBlockNum() << ") TxHash: " << ledger[j].getTxHash().getSliceCopy(0,4).toHexStr() << endl; } } cout << endl << endl; cout << "Printing SORTED allAddr ledger..." << endl; wlt.sortLedger(); vector<LedgerEntry> const & ledgerAll = wlt.getTxLedger(); for(uint32_t j=0; j<ledgerAll.size(); j++) { cout << " Tx: " << ledgerAll[j].getAddrStr20().toHexStr() << " " << ledgerAll[j].getValue()/1e8 << " (" << ledgerAll[j].getBlockNum() << ") TxHash: " << ledgerAll[j].getTxHash().getSliceCopy(0,4).toHexStr() << endl; } ///////////////////////////////////////////////////////////////////////////// cout << "Test txout aggregation, with different prioritization schemes" << endl; BtcWallet myWallet; #ifndef TEST_NETWORK // TODO: I somehow borked my list of test addresses. Make sure I have some // test addresses in here for each network that usually has lots of // unspent TxOuts // Main-network addresses myAddress.createFromHex("0e0aec36fe2545fb31a41164fb6954adcd96b342"); myWallet.addAddress(myAddress); #else // Testnet addresses //myAddress.createFromHex("d184cea7e82c775d08edd288344bcd663c3f99a2"); myWallet.addAddress(myAddress); //myAddress.createFromHex("205fa00890e6898b987de6ff8c0912805416cf90"); myWallet.addAddress(myAddress); //myAddress.createFromHex("fc0ef58380e6d4bcb9599c5369ce82d0bc01a5c4"); myWallet.addAddress(myAddress); #endif cout << "Rescanning the blockchain for new addresses." << endl; bdm.scanBlockchainForTx(myWallet); //vector<UnspentTxOut> sortedUTOs = bdm.getUnspentTxOutsForWallet(myWallet, 1); vector<UnspentTxOut> sortedUTOs = myWallet.getSpendableTxOutList(); int i=1; cout << " Sorting Method: " << i << endl; cout << " Value\t#Conf\tTxHash\tTxIdx" << endl; for(int j=0; j<sortedUTOs.size(); j++) { cout << " " << sortedUTOs[j].getValue()/1e8 << "\t" << sortedUTOs[j].getNumConfirm() << "\t" << sortedUTOs[j].getTxHash().toHexStr() << "\t" << sortedUTOs[j].getTxOutIndex() << endl; } cout << endl; // Test the zero-conf ledger-entry detection //le.pprint(); //vector<LedgerEntry> levect = wlt.getAddrLedgerEntriesForTx(txSelf); //for(int i=0; i<levect.size(); i++) //{ //levect[i].pprint(); //} }
void TestScanForWalletTx(string blkfile) { BlockDataManager_FullRAM & bdm = BlockDataManager_FullRAM::GetInstance(); bdm.readBlkFile_FromScratch(blkfile, false); // don't organize, just index ///////////////////////////////////////////////////////////////////////////// BinaryData myAddress; BtcWallet wlt; #ifndef TEST_NETWORK // Main-network addresses myAddress.createFromHex("604875c897a079f4db88e5d71145be2093cae194"); wlt.addAddress(myAddress); myAddress.createFromHex("8996182392d6f05e732410de4fc3fa273bac7ee6"); wlt.addAddress(myAddress); myAddress.createFromHex("b5e2331304bc6c541ffe81a66ab664159979125b"); wlt.addAddress(myAddress); myAddress.createFromHex("ebbfaaeedd97bc30df0d6887fd62021d768f5cb8"); wlt.addAddress(myAddress); #else // Test-network addresses myAddress.createFromHex("abda0c878dd7b4197daa9622d96704a606d2cd14"); wlt.addAddress(myAddress); myAddress.createFromHex("11b366edfc0a8b66feebae5c2e25a7b6a5d1cf31"); wlt.addAddress(myAddress); myAddress.createFromHex("baa72d8650baec634cdc439c1b84a982b2e596b2"); wlt.addAddress(myAddress); myAddress.createFromHex("fc0ef58380e6d4bcb9599c5369ce82d0bc01a5c4"); wlt.addAddress(myAddress); #endif myAddress.createFromHex("0e0aec36fe2545fb31a41164fb6954adcd96b342"); wlt.addAddress(myAddress); TIMER_WRAP(bdm.scanBlockchainForTx_FromScratch(wlt)); cout << "Checking balance of all addresses: " << wlt.getNumAddr() << " addrs" << endl; for(uint32_t i=0; i<wlt.getNumAddr(); i++) { BinaryData addr20 = wlt.getAddrByIndex(i).getAddrStr20(); cout << " Addr: " << wlt.getAddrByIndex(i).getBalance() << "," << wlt.getAddrByHash160(addr20).getBalance() << endl; vector<LedgerEntry> const & ledger = wlt.getAddrByIndex(i).getTxLedger(); for(uint32_t j=0; j<ledger.size(); j++) { cout << " Tx: " << ledger[j].getAddrStr20().getSliceCopy(0,4).toHexStr() << " " << ledger[j].getValue()/(float)(CONVERTBTC) << " (" << ledger[j].getBlockNum() << ") TxHash: " << ledger[j].getTxHash().getSliceCopy(0,4).toHexStr() << endl; } } cout << endl << endl; cout << "Printing SORTED allAddr ledger..." << endl; wlt.sortLedger(); vector<LedgerEntry> const & ledgerAll = wlt.getTxLedger(); for(uint32_t j=0; j<ledgerAll.size(); j++) { cout << " Tx: " << ledgerAll[j].getAddrStr20().toHexStr() << " " << ledgerAll[j].getValue()/1e8 << " (" << ledgerAll[j].getBlockNum() << ") TxHash: " << ledgerAll[j].getTxHash().getSliceCopy(0,4).toHexStr() << endl; } ///////////////////////////////////////////////////////////////////////////// cout << "Test txout aggregation, with different prioritization schemes" << endl; BtcWallet myWallet; #ifndef TEST_NETWORK // TODO: I somehow borked my list of test addresses. Make sure I have some // test addresses in here for each network that usually has lots of // unspent TxOuts // Main-network addresses myAddress.createFromHex("0e0aec36fe2545fb31a41164fb6954adcd96b342"); myWallet.addAddress(myAddress); #else // Testnet addresses //myAddress.createFromHex("d184cea7e82c775d08edd288344bcd663c3f99a2"); myWallet.addAddress(myAddress); //myAddress.createFromHex("205fa00890e6898b987de6ff8c0912805416cf90"); myWallet.addAddress(myAddress); //myAddress.createFromHex("fc0ef58380e6d4bcb9599c5369ce82d0bc01a5c4"); myWallet.addAddress(myAddress); #endif cout << "Rescanning the blockchain for new addresses." << endl; bdm.scanBlockchainForTx_FromScratch(myWallet); vector<UnspentTxOut> sortedUTOs = bdm.getUnspentTxOutsForWallet(myWallet, 1); int i=1; cout << " Sorting Method: " << i << endl; cout << " Value\t#Conf\tTxHash\tTxIdx" << endl; for(int j=0; j<sortedUTOs.size(); j++) { cout << " " << sortedUTOs[j].getValue()/1e8 << "\t" << sortedUTOs[j].getNumConfirm() << "\t" << sortedUTOs[j].getTxHash().toHexStr() << "\t" << sortedUTOs[j].getTxOutIndex() << endl; } cout << endl; }