Changes to support threading through account roots, offers, and ripple state nodes.

Fix tracking the last transaction signed by an account.
This commit is contained in:
JoelKatz
2012-08-20 13:45:58 -07:00
parent a99f814c20
commit 68b044ddde
6 changed files with 17 additions and 5 deletions

View File

@@ -10,6 +10,8 @@ LedgerEntryFormat LedgerFormats[]=
{ S_FIELD(Sequence), STI_UINT32, SOE_REQUIRED, 0 }, { S_FIELD(Sequence), STI_UINT32, SOE_REQUIRED, 0 },
{ S_FIELD(Balance), STI_AMOUNT, SOE_REQUIRED, 0 }, { S_FIELD(Balance), STI_AMOUNT, SOE_REQUIRED, 0 },
{ S_FIELD(LastReceive), STI_UINT32, SOE_REQUIRED, 0 }, { S_FIELD(LastReceive), STI_UINT32, SOE_REQUIRED, 0 },
{ S_FIELD(LastSignedSeq), STI_UINT32, SOE_REQUIRED, 0 },
{ S_FIELD(LastTxnID), STI_HASH256, SOE_REQUIRED, 0 },
{ S_FIELD(LastTxnSeq), STI_UINT32, SOE_REQUIRED, 0 }, { S_FIELD(LastTxnSeq), STI_UINT32, SOE_REQUIRED, 0 },
{ S_FIELD(AuthorizedKey), STI_ACCOUNT, SOE_IFFLAG, 1 }, { S_FIELD(AuthorizedKey), STI_ACCOUNT, SOE_IFFLAG, 1 },
{ S_FIELD(EmailHash), STI_HASH128, SOE_IFFLAG, 2 }, { S_FIELD(EmailHash), STI_HASH128, SOE_IFFLAG, 2 },
@@ -52,6 +54,8 @@ LedgerEntryFormat LedgerFormats[]=
{ S_FIELD(BookDirectory), STI_HASH256, SOE_REQUIRED, 0 }, { S_FIELD(BookDirectory), STI_HASH256, SOE_REQUIRED, 0 },
{ S_FIELD(BookNode), STI_UINT64, SOE_REQUIRED, 0 }, { S_FIELD(BookNode), STI_UINT64, SOE_REQUIRED, 0 },
{ S_FIELD(OwnerNode), STI_UINT64, SOE_REQUIRED, 0 }, { S_FIELD(OwnerNode), STI_UINT64, SOE_REQUIRED, 0 },
{ S_FIELD(LastTxnID), STI_HASH256, SOE_REQUIRED, 0 },
{ S_FIELD(LastTxnSeq), STI_UINT32, SOE_REQUIRED, 0 },
{ S_FIELD(PaysIssuer), STI_ACCOUNT, SOE_IFFLAG, 1 }, { S_FIELD(PaysIssuer), STI_ACCOUNT, SOE_IFFLAG, 1 },
{ S_FIELD(GetsIssuer), STI_ACCOUNT, SOE_IFFLAG, 2 }, { S_FIELD(GetsIssuer), STI_ACCOUNT, SOE_IFFLAG, 2 },
{ S_FIELD(Expiration), STI_UINT32, SOE_IFFLAG, 4 }, { S_FIELD(Expiration), STI_UINT32, SOE_IFFLAG, 4 },
@@ -65,6 +69,8 @@ LedgerEntryFormat LedgerFormats[]=
{ S_FIELD(LowLimit), STI_AMOUNT, SOE_REQUIRED, 0 }, { S_FIELD(LowLimit), STI_AMOUNT, SOE_REQUIRED, 0 },
{ S_FIELD(HighID), STI_ACCOUNT, SOE_REQUIRED, 0 }, { S_FIELD(HighID), STI_ACCOUNT, SOE_REQUIRED, 0 },
{ S_FIELD(HighLimit), STI_AMOUNT, SOE_REQUIRED, 0 }, { S_FIELD(HighLimit), STI_AMOUNT, SOE_REQUIRED, 0 },
{ S_FIELD(LastTxnID), STI_HASH256, SOE_REQUIRED, 0 },
{ S_FIELD(LastTxnSeq), STI_UINT32, SOE_REQUIRED, 0 },
{ S_FIELD(LowQualityIn), STI_UINT32, SOE_IFFLAG, 1 }, { S_FIELD(LowQualityIn), STI_UINT32, SOE_IFFLAG, 1 },
{ S_FIELD(LowQualityOut), STI_UINT32, SOE_IFFLAG, 2 }, { S_FIELD(LowQualityOut), STI_UINT32, SOE_IFFLAG, 2 },
{ S_FIELD(HighQualityIn), STI_UINT32, SOE_IFFLAG, 4 }, { S_FIELD(HighQualityIn), STI_UINT32, SOE_IFFLAG, 4 },

View File

@@ -96,13 +96,17 @@ uint32 SerializedLedgerEntry::getThreadedLedger()
return getIFieldU32(sfLastTxnSeq); return getIFieldU32(sfLastTxnSeq);
} }
void SerializedLedgerEntry::thread(const uint256& txID, uint32 ledgerSeq, uint256& prevTxID, uint32& prevLedgerID) bool SerializedLedgerEntry::thread(const uint256& txID, uint32 ledgerSeq, uint256& prevTxID, uint32& prevLedgerID)
{ {
prevTxID = getIFieldH256(sfLastTxnID); uint256 oldPrevTxID = getIFieldH256(sfLastTxnID);
if (oldPrevTxID == txID)
return false;
prevTxID = oldPrevTxID;
prevLedgerID = getIFieldU32(sfLastTxnID); prevLedgerID = getIFieldU32(sfLastTxnID);
assert(prevTxID != txID); assert(prevTxID != txID);
setIFieldH256(sfLastTxnID, txID); setIFieldH256(sfLastTxnID, txID);
setIFieldU32(sfLastTxnSeq, ledgerSeq); setIFieldU32(sfLastTxnSeq, ledgerSeq);
return true;
} }
std::vector<uint256> SerializedLedgerEntry::getOwners() std::vector<uint256> SerializedLedgerEntry::getOwners()

View File

@@ -67,7 +67,7 @@ public:
bool isThreaded(); // is this ledger entry actually threaded bool isThreaded(); // is this ledger entry actually threaded
uint256 getThreadedTransaction(); uint256 getThreadedTransaction();
uint32 getThreadedLedger(); uint32 getThreadedLedger();
void thread(const uint256& txID, uint32 ledgerSeq, uint256& prevTxID, uint32& prevLedgerID); bool thread(const uint256& txID, uint32 ledgerSeq, uint256& prevTxID, uint32& prevLedgerID);
std::vector<uint256> getOwners(); // nodes notified if this node is deleted std::vector<uint256> getOwners(); // nodes notified if this node is deleted
void setIFieldU8(SOE_Field field, unsigned char v) { return mObject.setValueFieldU8(field, v); } void setIFieldU8(SOE_Field field, unsigned char v) { return mObject.setValueFieldU8(field, v); }

View File

@@ -63,6 +63,7 @@ enum SOE_Field
sfInvoiceID, sfInvoiceID,
sfLastNode, sfLastNode,
sfLastReceive, sfLastReceive,
sfLastSignedSeq,
sfLastTxnID, sfLastTxnID,
sfLastTxnSeq, sfLastTxnSeq,
sfLedgerHash, sfLedgerHash,

View File

@@ -1219,6 +1219,7 @@ TransactionEngineResult TransactionEngine::applyTransaction(const SerializedTran
terResult = terPAST_SEQ; terResult = terPAST_SEQ;
} }
} }
mTxnAccount->setIFieldU32(sfLastSignedSeq, mLedger->getLedgerSeq());
if (terSUCCESS == terResult) if (terSUCCESS == terResult)
{ {

View File

@@ -16,11 +16,11 @@
// Version we prefer to speak: // Version we prefer to speak:
#define PROTO_VERSION_MAJOR 0 #define PROTO_VERSION_MAJOR 0
#define PROTO_VERSION_MINOR 4 #define PROTO_VERSION_MINOR 5
// Version we wil speak to: // Version we wil speak to:
#define MIN_PROTO_MAJOR 0 #define MIN_PROTO_MAJOR 0
#define MIN_PROTO_MINOR 4 #define MIN_PROTO_MINOR 5
#define MAKE_VERSION_INT(maj,min) ((maj << 16) | min) #define MAKE_VERSION_INT(maj,min) ((maj << 16) | min)
#define GET_VERSION_MAJOR(ver) (ver >> 16) #define GET_VERSION_MAJOR(ver) (ver >> 16)