fix wallet.dat compatibility problem if you downgrade from 0.3.17 and then upgrade again

git-svn-id: https://bitcoin.svn.sourceforge.net/svnroot/bitcoin/trunk@196 1a98c847-1fd6-4fd8-948a-caf3550aa51b
This commit is contained in:
s_nakamoto 2010-12-06 15:59:28 +00:00
parent f03304a9c7
commit 865c3a2383
3 changed files with 36 additions and 15 deletions

24
db.cpp
View File

@ -656,6 +656,7 @@ bool CWalletDB::LoadWallet()
{ {
vchDefaultKey.clear(); vchDefaultKey.clear();
int nFileVersion = 0; int nFileVersion = 0;
vector<uint256> vWalletUpgrade;
// Modify defaults // Modify defaults
#ifndef __WXMSW__ #ifndef __WXMSW__
@ -705,6 +706,25 @@ bool CWalletDB::LoadWallet()
if (wtx.GetHash() != hash) if (wtx.GetHash() != hash)
printf("Error in wallet.dat, hash mismatch\n"); printf("Error in wallet.dat, hash mismatch\n");
// Undo serialize changes in 31600
if (31404 <= wtx.fTimeReceivedIsTxTime && wtx.fTimeReceivedIsTxTime <= 31703)
{
if (!ssValue.empty())
{
char fTmp;
char fUnused;
ssValue >> fTmp >> fUnused >> wtx.strFromAccount;
printf("LoadWallet() upgrading tx ver=%d %d '%s' %s\n", wtx.fTimeReceivedIsTxTime, fTmp, wtx.strFromAccount.c_str(), hash.ToString().c_str());
wtx.fTimeReceivedIsTxTime = fTmp;
}
else
{
printf("LoadWallet() repairing tx ver=%d %s\n", wtx.fTimeReceivedIsTxTime, hash.ToString().c_str());
wtx.fTimeReceivedIsTxTime = 0;
}
vWalletUpgrade.push_back(hash);
}
//// debug print //// debug print
//printf("LoadWallet %s\n", wtx.GetHash().ToString().c_str()); //printf("LoadWallet %s\n", wtx.GetHash().ToString().c_str());
//printf(" %12I64d %s %s %s\n", //printf(" %12I64d %s %s %s\n",
@ -774,6 +794,9 @@ bool CWalletDB::LoadWallet()
pcursor->close(); pcursor->close();
} }
foreach(uint256 hash, vWalletUpgrade)
WriteTx(hash, mapWallet[hash]);
printf("nFileVersion = %d\n", nFileVersion); printf("nFileVersion = %d\n", nFileVersion);
printf("fGenerateBitcoins = %d\n", fGenerateBitcoins); printf("fGenerateBitcoins = %d\n", fGenerateBitcoins);
printf("nTransactionFee = %"PRI64d"\n", nTransactionFee); printf("nTransactionFee = %"PRI64d"\n", nTransactionFee);
@ -794,6 +817,7 @@ bool CWalletDB::LoadWallet()
WriteVersion(VERSION); WriteVersion(VERSION);
} }
return true; return true;
} }

25
main.h
View File

@ -751,11 +751,10 @@ public:
vector<CMerkleTx> vtxPrev; vector<CMerkleTx> vtxPrev;
map<string, string> mapValue; map<string, string> mapValue;
vector<pair<string, string> > vOrderForm; vector<pair<string, string> > vOrderForm;
unsigned int fTimeReceivedIsTxTime;
unsigned int nTimeReceived; // time received by this node unsigned int nTimeReceived; // time received by this node
char fFromMe; char fFromMe;
char fSpent; char fSpent;
char fTimeReceivedIsTxTime;
char fUnused;
string strFromAccount; string strFromAccount;
// memory only // memory only
@ -792,11 +791,10 @@ public:
vtxPrev.clear(); vtxPrev.clear();
mapValue.clear(); mapValue.clear();
vOrderForm.clear(); vOrderForm.clear();
fTimeReceivedIsTxTime = false;
nTimeReceived = 0; nTimeReceived = 0;
fFromMe = false; fFromMe = false;
fSpent = false; fSpent = false;
fTimeReceivedIsTxTime = false;
fUnused = false;
strFromAccount.clear(); strFromAccount.clear();
fDebitCached = false; fDebitCached = false;
fCreditCached = false; fCreditCached = false;
@ -811,24 +809,23 @@ public:
IMPLEMENT_SERIALIZE IMPLEMENT_SERIALIZE
( (
CWalletTx* pthis = const_cast<CWalletTx*>(this);
if (fRead) if (fRead)
const_cast<CWalletTx*>(this)->Init(); pthis->Init();
nSerSize += SerReadWrite(s, *(CMerkleTx*)this, nType, nVersion, ser_action); nSerSize += SerReadWrite(s, *(CMerkleTx*)this, nType, nVersion, ser_action);
READWRITE(vtxPrev); READWRITE(vtxPrev);
pthis->mapValue["fromaccount"] = pthis->strFromAccount;
READWRITE(mapValue); READWRITE(mapValue);
pthis->strFromAccount = pthis->mapValue["fromaccount"];
pthis->mapValue.erase("fromaccount");
pthis->mapValue.erase("version");
READWRITE(vOrderForm); READWRITE(vOrderForm);
READWRITE(nVersion); READWRITE(fTimeReceivedIsTxTime);
if (fRead && nVersion < 100)
const_cast<CWalletTx*>(this)->fTimeReceivedIsTxTime = nVersion;
READWRITE(nTimeReceived); READWRITE(nTimeReceived);
READWRITE(fFromMe); READWRITE(fFromMe);
READWRITE(fSpent); READWRITE(fSpent);
if (nVersion >= 31404)
{
READWRITE(fTimeReceivedIsTxTime);
READWRITE(fUnused);
READWRITE(strFromAccount);
}
) )
int64 GetDebit() const int64 GetDebit() const

View File

@ -25,7 +25,7 @@ class CDataStream;
class CAutoFile; class CAutoFile;
static const unsigned int MAX_SIZE = 0x02000000; static const unsigned int MAX_SIZE = 0x02000000;
static const int VERSION = 31703; static const int VERSION = 31704;
static const char* pszSubVer = ""; static const char* pszSubVer = "";