本文整理汇总了C++中LedgerManager类的典型用法代码示例。如果您正苦于以下问题:C++ LedgerManager类的具体用法?C++ LedgerManager怎么用?C++ LedgerManager使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了LedgerManager类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: innerResult
bool
CreateAccountOpFrame::doApply(medida::MetricsRegistry& metrics,
LedgerDelta& delta, LedgerManager& ledgerManager)
{
AccountFrame::pointer destAccount;
Database& db = ledgerManager.getDatabase();
destAccount = AccountFrame::loadAccount(mCreateAccount.destination, db);
if (!destAccount)
{
if (mCreateAccount.startingBalance < ledgerManager.getMinBalance(0))
{ // not over the minBalance to make an account
metrics.NewMeter({"op-create-account", "failure", "low-reserve"},
"operation").Mark();
innerResult().code(CREATE_ACCOUNT_LOW_RESERVE);
return false;
}
else
{
int64_t minBalance =
mSourceAccount->getMinimumBalance(ledgerManager);
if (mSourceAccount->getAccount().balance <
(minBalance + mCreateAccount.startingBalance))
{ // they don't have enough to send
metrics.NewMeter({"op-create-account", "failure", "underfunded"},
"operation").Mark();
innerResult().code(CREATE_ACCOUNT_UNDERFUNDED);
return false;
}
mSourceAccount->getAccount().balance -=
mCreateAccount.startingBalance;
mSourceAccount->storeChange(delta, db);
destAccount = make_shared<AccountFrame>(mCreateAccount.destination);
destAccount->getAccount().seqNum =
delta.getHeaderFrame().getStartingSequenceNumber();
destAccount->getAccount().balance = mCreateAccount.startingBalance;
destAccount->storeAdd(delta, db);
metrics.NewMeter({"op-create-account", "success", "apply"},
"operation").Mark();
innerResult().code(CREATE_ACCOUNT_SUCCESS);
return true;
}
}
else
{
metrics.NewMeter({"op-create-account", "failure", "already-exist"},
"operation").Mark();
innerResult().code(CREATE_ACCOUNT_ALREADY_EXIST);
return false;
}
}
示例2: if
void
TxSetFrame::surgePricingFilter(LedgerManager const& lm)
{
size_t max = lm.getMaxTxSetSize();
if (mTransactions.size() > max)
{ // surge pricing in effect!
CLOG(WARNING, "Herder")
<< "surge pricing in effect! " << mTransactions.size();
// determine the fee ratio for each account
map<AccountID, double> accountFeeMap;
for (auto& tx : mTransactions)
{
double r = tx->getFeeRatio(lm);
double now = accountFeeMap[tx->getSourceID()];
if (now == 0)
accountFeeMap[tx->getSourceID()] = r;
else if (r < now)
accountFeeMap[tx->getSourceID()] = r;
}
// sort tx by amount of fee they have paid
// remove the bottom that aren't paying enough
std::vector<TransactionFramePtr> tempList = mTransactions;
std::sort(tempList.begin(), tempList.end(), SurgeSorter(accountFeeMap));
for (auto iter = tempList.begin() + max; iter != tempList.end(); iter++)
{
removeTx(*iter);
}
}
}
示例3: innerResult
bool
CreateAccountOpFrame::doApply(LedgerDelta& delta, LedgerManager& ledgerManager)
{
AccountFrame destAccount;
Database& db = ledgerManager.getDatabase();
if (!AccountFrame::loadAccount(mCreateAccount.destination, destAccount, db))
{
if (mCreateAccount.startingBalance < ledgerManager.getMinBalance(0))
{ // not over the minBalance to make an account
innerResult().code(CREATE_ACCOUNT_LOW_RESERVE);
return false;
}
else
{
int64_t minBalance =
mSourceAccount->getMinimumBalance(ledgerManager);
if (mSourceAccount->getAccount().balance <
(minBalance + mCreateAccount.startingBalance))
{ // they don't have enough to send
innerResult().code(CREATE_ACCOUNT_UNDERFUNDED);
return false;
}
mSourceAccount->getAccount().balance -=
mCreateAccount.startingBalance;
mSourceAccount->storeChange(delta, db);
destAccount.getAccount().accountID = mCreateAccount.destination;
destAccount.getAccount().seqNum =
delta.getHeaderFrame().getStartingSequenceNumber();
destAccount.getAccount().balance = mCreateAccount.startingBalance;
destAccount.storeAdd(delta, db);
innerResult().code(CREATE_ACCOUNT_SUCCESS);
return true;
}
}
else
{
innerResult().code(CREATE_ACCOUNT_ALREADY_EXIST);
return false;
}
}
示例4: innerResult
bool
ManageDataOpFrame::doApply(Application& app,
LedgerDelta& delta, LedgerManager& ledgerManager)
{
Database& db = ledgerManager.getDatabase();
auto dataFrame = DataFrame::loadData(mSourceAccount->getID(), mManageData.dataName, db);
if(mManageData.dataValue)
{
if(!dataFrame)
{ // create a new data entry
if(!mSourceAccount->addNumEntries(1, ledgerManager))
{
app.getMetrics().NewMeter({ "op-manage-data", "invalid", "low reserve" },
"operation").Mark();
innerResult().code(MANAGE_DATA_LOW_RESERVE);
return false;
}
dataFrame= std::make_shared<DataFrame>();
dataFrame->getData().accountID= mSourceAccount->getID();
dataFrame->getData().dataName = mManageData.dataName;
dataFrame->getData().dataValue = *mManageData.dataValue;
dataFrame->storeAdd(delta, db);
mSourceAccount->storeChange(delta, db);
} else
{ // modify an existing entry
dataFrame->getData().dataValue = *mManageData.dataValue;
dataFrame->storeChange(delta, db);
}
} else
{ // delete an existing piece of data
if(!dataFrame)
{
app.getMetrics().NewMeter({ "op-manage-data", "invalid", "not-found" },
"operation").Mark();
innerResult().code(MANAGE_DATA_NAME_NOT_FOUND);
return false;
}
mSourceAccount->addNumEntries(-1, ledgerManager);
mSourceAccount->storeChange(delta, db);
dataFrame->storeDelete(delta, db);
}
innerResult().code(MANAGE_DATA_SUCCESS);
app.getMetrics().NewMeter({"op-manage-data", "success", "apply"}, "operation")
.Mark();
return true;
}
示例5: txBytes
void
TransactionFrame::storeTransaction(LedgerManager& ledgerManager,
LedgerDelta const& delta, int txindex,
SHA256& resultHasher) const
{
auto txBytes(xdr::xdr_to_opaque(mEnvelope));
auto txResultBytes(xdr::xdr_to_opaque(getResultPair()));
resultHasher.add(txResultBytes);
std::string txBody = base64::encode(
reinterpret_cast<const unsigned char*>(txBytes.data()), txBytes.size());
std::string txResult = base64::encode(
reinterpret_cast<const unsigned char*>(txResultBytes.data()),
txResultBytes.size());
xdr::opaque_vec<> txMeta(delta.getTransactionMeta());
std::string meta = base64::encode(
reinterpret_cast<const unsigned char*>(txMeta.data()), txMeta.size());
string txIDString(binToHex(getContentsHash()));
auto timer = ledgerManager.getDatabase().getInsertTimer("txhistory");
soci::statement st =
(ledgerManager.getDatabase().getSession().prepare
<< "INSERT INTO txhistory (txid, ledgerseq, txindex, txbody, "
"txresult, txmeta) VALUES "
"(:id,:seq,:txindex,:txb,:txres,:meta)",
soci::use(txIDString),
soci::use(ledgerManager.getCurrentLedgerHeader().ledgerSeq),
soci::use(txindex), soci::use(txBody), soci::use(txResult),
soci::use(meta));
st.execute(true);
if (st.get_affected_rows() != 1)
{
throw std::runtime_error("Could not update data in SQL");
}
}
示例6: sendNoCreate
bool
PaymentOpFrame::doApply(LedgerDelta& delta, LedgerManager& ledgerManager)
{
AccountFrame destAccount;
// if sending to self directly, just mark as success
if (mPayment.destination == getSourceID() && mPayment.path.empty())
{
innerResult().code(PAYMENT_SUCCESS);
return true;
}
Database& db = ledgerManager.getDatabase();
if (!AccountFrame::loadAccount(mPayment.destination, destAccount, db))
{ // this tx is creating an account
if (mPayment.currency.type() == CURRENCY_TYPE_NATIVE)
{
if (mPayment.amount < ledgerManager.getMinBalance(0))
{ // not over the minBalance to make an account
innerResult().code(PAYMENT_LOW_RESERVE);
return false;
}
else
{
destAccount.getAccount().accountID = mPayment.destination;
destAccount.getAccount().seqNum =
delta.getHeaderFrame().getStartingSequenceNumber();
destAccount.getAccount().balance = 0;
destAccount.storeAdd(delta, db);
}
}
else
{ // trying to send credit to an unmade account
innerResult().code(PAYMENT_NO_DESTINATION);
return false;
}
}
return sendNoCreate(destAccount, delta, ledgerManager);
}
示例7: innerResult
// make sure the deleted Account hasn't issued credit
// make sure we aren't holding any credit
// make sure the we delete all the offers
// make sure the we delete all the trustlines
// move the XLM to the new account
bool
MergeOpFrame::doApply(LedgerDelta& delta, LedgerManager& ledgerManager)
{
AccountFrame::pointer otherAccount;
Database& db = ledgerManager.getDatabase();
otherAccount = AccountFrame::loadAccount(mOperation.body.destination(), db);
if (!otherAccount)
{
innerResult().code(ACCOUNT_MERGE_NO_ACCOUNT);
return false;
}
if (TrustFrame::hasIssued(getSourceID(), db))
{
innerResult().code(ACCOUNT_MERGE_CREDIT_HELD);
return false;
}
std::vector<TrustFrame::pointer> lines;
TrustFrame::loadLines(getSourceID(), lines, db);
for(auto &l : lines)
{
if(l->getBalance() > 0)
{
innerResult().code(ACCOUNT_MERGE_HAS_CREDIT);
return false;
}
}
// delete offers
std::vector<OfferFrame::pointer> offers;
OfferFrame::loadOffers(getSourceID(), offers, db);
for (auto& offer : offers)
{
offer->storeDelete(delta, db);
}
// delete trust lines
for (auto& l : lines)
{
l->storeDelete(delta, db);
}
otherAccount->getAccount().balance += mSourceAccount->getAccount().balance;
otherAccount->storeChange(delta, db);
mSourceAccount->storeDelete(delta, db);
innerResult().code(ACCOUNT_MERGE_SUCCESS);
return true;
}
示例8: getBalance
int64_t
AccountFrame::getBalanceAboveReserve(LedgerManager const& lm) const
{
int64_t avail =
getBalance() - lm.getMinBalance(mAccountEntry.numSubEntries);
if (avail < 0)
{
// nothing can leave this account if below the reserve
// (this can happen if the reserve is raised)
avail = 0;
}
return avail;
}
示例9: runtime_error
// returns true if successfully updated,
// false if balance is not sufficient
bool
AccountFrame::addNumEntries(int count, LedgerManager const& lm)
{
int newEntriesCount = mAccountEntry.numSubEntries + count;
if (newEntriesCount < 0)
{
throw std::runtime_error("invalid account state");
}
if (getBalance() < lm.getMinBalance(newEntriesCount))
{
// balance too low
return false;
}
mAccountEntry.numSubEntries = newEntriesCount;
return true;
}
示例10: runtime_error
void
LedgerHeaderFrame::storeInsert(LedgerManager& ledgerManager) const
{
if (!isValid(mHeader))
{
throw std::runtime_error("invalid ledger header (insert)");
}
getHash();
string hash(binToHex(mHash)),
prevHash(binToHex(mHeader.previousLedgerHash)),
bucketListHash(binToHex(mHeader.bucketListHash));
auto headerBytes(xdr::xdr_to_opaque(mHeader));
std::string headerEncoded;
headerEncoded = decoder::encode_b64(headerBytes);
auto& db = ledgerManager.getDatabase();
// note: columns other than "data" are there to faciliate lookup/processing
auto prep = db.getPreparedStatement(
"INSERT INTO ledgerheaders "
"(ledgerhash, prevhash, bucketlisthash, ledgerseq, closetime, data) "
"VALUES "
"(:h, :ph, :blh, :seq, :ct, :data)");
auto& st = prep.statement();
st.exchange(use(hash));
st.exchange(use(prevHash));
st.exchange(use(bucketListHash));
st.exchange(use(mHeader.ledgerSeq));
st.exchange(use(mHeader.scpValue.closeTime));
st.exchange(use(headerEncoded));
st.define_and_bind();
{
auto timer = db.getInsertTimer("ledger-header");
st.execute(true);
}
if (st.get_affected_rows() != 1)
{
throw std::runtime_error("Could not update data in SQL");
}
}
示例11: getResult
void
TransactionFrame::prepareResult(LedgerDelta& delta,
LedgerManager& ledgerManager)
{
Database& db = ledgerManager.getDatabase();
int64_t fee = getResult().feeCharged;
if (fee > 0)
{
int64_t avail = mSigningAccount->getAccount().balance;
if (avail < fee)
{
// take all their balance to be safe
fee = avail;
}
mSigningAccount->setSeqNum(mEnvelope.tx.seqNum);
mSigningAccount->getAccount().balance -= fee;
delta.getHeader().feePool += fee;
mSigningAccount->storeChange(delta, db);
}
}
示例12: innerResult
bool
AllowTrustOpFrame::doApply(LedgerDelta& delta, LedgerManager& ledgerManager)
{
if (!(mSourceAccount->getAccount().flags & AUTH_REQUIRED_FLAG))
{ // this account doesn't require authorization to hold credit
innerResult().code(ALLOW_TRUST_TRUST_NOT_REQUIRED);
return false;
}
if (!(mSourceAccount->getAccount().flags & AUTH_REVOCABLE_FLAG) &&
!mAllowTrust.authorize)
{
innerResult().code(ALLOW_TRUST_CANT_REVOKE);
return false;
}
Currency ci;
ci.type(CURRENCY_TYPE_ALPHANUM);
ci.alphaNum().currencyCode = mAllowTrust.currency.currencyCode();
ci.alphaNum().issuer = getSourceID();
Database& db = ledgerManager.getDatabase();
TrustFrame::pointer trustLine;
trustLine = TrustFrame::loadTrustLine(mAllowTrust.trustor, ci, db);
if (!trustLine)
{
innerResult().code(ALLOW_TRUST_NO_TRUST_LINE);
return false;
}
innerResult().code(ALLOW_TRUST_SUCCESS);
trustLine->setAuthorized(mAllowTrust.authorize);
trustLine->storeChange(delta, db);
return true;
}
示例13: oe
bool
PathPaymentOpFrame::doApply(medida::MetricsRegistry& metrics,
LedgerDelta& delta, LedgerManager& ledgerManager)
{
AccountFrame::pointer destination;
Database& db = ledgerManager.getDatabase();
destination = AccountFrame::loadAccount(mPathPayment.destination, db);
if (!destination)
{
metrics.NewMeter({"op-path-payment", "failure", "no-destination"},
"operation").Mark();
innerResult().code(PATH_PAYMENT_NO_DESTINATION);
return false;
}
innerResult().code(PATH_PAYMENT_SUCCESS);
// tracks the last amount that was traded
int64_t curBReceived = mPathPayment.destAmount;
Asset curB = mPathPayment.destAsset;
// update balances, walks backwards
// build the full path to the destination, starting with sendAsset
std::vector<Asset> fullPath;
fullPath.emplace_back(mPathPayment.sendAsset);
fullPath.insert(fullPath.end(), mPathPayment.path.begin(),
mPathPayment.path.end());
// update last balance in the chain
{
if (curB.type() == ASSET_TYPE_NATIVE)
{
destination->getAccount().balance += curBReceived;
destination->storeChange(delta, db);
}
else
{
TrustFrame::pointer destLine;
destLine =
TrustFrame::loadTrustLine(destination->getID(), curB, db);
if (!destLine)
{
metrics.NewMeter({"op-path-payment", "failure", "no-trust"},
"operation").Mark();
innerResult().code(PATH_PAYMENT_NO_TRUST);
return false;
}
if (!destLine->isAuthorized())
{
metrics.NewMeter(
{"op-path-payment", "failure", "not-authorized"},
"operation").Mark();
innerResult().code(PATH_PAYMENT_NOT_AUTHORIZED);
return false;
}
if (!destLine->addBalance(curBReceived))
{
metrics.NewMeter({"op-path-payment", "failure", "line-full"},
"operation").Mark();
innerResult().code(PATH_PAYMENT_LINE_FULL);
return false;
}
destLine->storeChange(delta, db);
}
innerResult().success().last =
SimplePaymentResult(destination->getID(), curB, curBReceived);
}
// now, walk the path backwards
for (int i = (int)fullPath.size() - 1; i >= 0; i--)
{
int64_t curASent, actualCurBReceived;
Asset const& curA = fullPath[i];
if (curA == curB)
{
continue;
}
OfferExchange oe(delta, ledgerManager);
// curA -> curB
OfferExchange::ConvertResult r =
oe.convertWithOffers(curA, INT64_MAX, curASent, curB, curBReceived,
actualCurBReceived, nullptr);
switch (r)
{
case OfferExchange::eFilterStop:
assert(false); // no filter -> should not happen
break;
case OfferExchange::eOK:
//.........这里部分代码省略.........
示例14: sqlTx
// you are selling sheep for wheat
// need to check the counter offers selling wheat for sheep
// see if this is modifying an old offer
// see if this offer crosses any existing offers
bool
ManageOfferOpFrame::doApply(medida::MetricsRegistry& metrics,
LedgerDelta& delta, LedgerManager& ledgerManager)
{
Database& db = ledgerManager.getDatabase();
if (!checkOfferValid(metrics, db, delta))
{
return false;
}
Asset const& sheep = mManageOffer.selling;
Asset const& wheat = mManageOffer.buying;
bool creatingNewOffer = false;
uint64_t offerID = mManageOffer.offerID;
if (offerID)
{ // modifying an old offer
mSellSheepOffer =
OfferFrame::loadOffer(getSourceID(), offerID, db, &delta);
if (!mSellSheepOffer)
{
metrics.NewMeter({"op-manage-offer", "invalid", "not-found"},
"operation").Mark();
innerResult().code(MANAGE_OFFER_NOT_FOUND);
return false;
}
// rebuild offer based off the manage offer
mSellSheepOffer->getOffer() = buildOffer(
getSourceID(), mManageOffer, mSellSheepOffer->getOffer().flags);
mPassive = mSellSheepOffer->getFlags() & PASSIVE_FLAG;
}
else
{ // creating a new Offer
creatingNewOffer = true;
LedgerEntry le;
le.data.type(OFFER);
le.data.offer() = buildOffer(getSourceID(), mManageOffer,
mPassive ? PASSIVE_FLAG : 0);
mSellSheepOffer = std::make_shared<OfferFrame>(le);
}
int64_t maxSheepSend = mSellSheepOffer->getAmount();
int64_t maxAmountOfSheepCanSell;
innerResult().code(MANAGE_OFFER_SUCCESS);
soci::transaction sqlTx(db.getSession());
LedgerDelta tempDelta(delta);
if (mManageOffer.amount == 0)
{
mSellSheepOffer->getOffer().amount = 0;
}
else
{
if (sheep.type() == ASSET_TYPE_NATIVE)
{
maxAmountOfSheepCanSell =
mSourceAccount->getBalanceAboveReserve(ledgerManager);
}
else
{
maxAmountOfSheepCanSell = mSheepLineA->getBalance();
}
// the maximum is defined by how much wheat it can receive
int64_t maxWheatCanSell;
if (wheat.type() == ASSET_TYPE_NATIVE)
{
maxWheatCanSell = INT64_MAX;
}
else
{
maxWheatCanSell = mWheatLineA->getMaxAmountReceive();
if (maxWheatCanSell == 0)
{
metrics.NewMeter({"op-manage-offer", "invalid", "line-full"},
"operation").Mark();
innerResult().code(MANAGE_OFFER_LINE_FULL);
return false;
}
}
Price const& sheepPrice = mSellSheepOffer->getPrice();
{
int64_t maxSheepBasedOnWheat;
if (!bigDivide(maxSheepBasedOnWheat, maxWheatCanSell, sheepPrice.d,
sheepPrice.n))
{
maxSheepBasedOnWheat = INT64_MAX;
//.........这里部分代码省略.........
示例15: ppayment
bool
PaymentOpFrame::doApply(LedgerDelta& delta, LedgerManager& ledgerManager)
{
AccountFrame destination;
// if sending to self directly, just mark as success
if (mPayment.destination == getSourceID())
{
innerResult().code(PAYMENT_SUCCESS);
return true;
}
Database& db = ledgerManager.getDatabase();
if (!AccountFrame::loadAccount(mPayment.destination, destination, db))
{
innerResult().code(PAYMENT_NO_DESTINATION);
return false;
}
// build a pathPaymentOp
Operation op;
op.sourceAccount = mOperation.sourceAccount;
op.body.type(PATH_PAYMENT);
PathPaymentOp& ppOp = op.body.pathPaymentOp();
ppOp.sendCurrency = mPayment.currency;
ppOp.destCurrency = mPayment.currency;
ppOp.destAmount = mPayment.amount;
ppOp.sendMax = mPayment.amount;
ppOp.destination = mPayment.destination;
OperationResult opRes;
opRes.code(opINNER);
opRes.tr().type(PATH_PAYMENT);
PathPaymentOpFrame ppayment(op, opRes, mParentTx);
ppayment.setSourceAccountPtr(mSourceAccount);
if (!ppayment.doCheckValid() || !ppayment.doApply(delta, ledgerManager))
{
if (ppayment.getResultCode() != opINNER)
{
throw std::runtime_error("Unexpected error code from pathPayment");
}
PaymentResultCode res;
switch (PathPaymentOpFrame::getInnerCode(ppayment.getResult()))
{
case PATH_PAYMENT_UNDERFUNDED:
res = PAYMENT_UNDERFUNDED;
break;
case PATH_PAYMENT_NO_DESTINATION:
res = PAYMENT_NO_DESTINATION;
break;
case PATH_PAYMENT_NO_TRUST:
res = PAYMENT_NO_TRUST;
break;
case PATH_PAYMENT_NOT_AUTHORIZED:
res = PAYMENT_NOT_AUTHORIZED;
break;
case PATH_PAYMENT_LINE_FULL:
res = PAYMENT_LINE_FULL;
break;
default:
throw std::runtime_error("Unexpected error code from pathPayment");
}
innerResult().code(res);
return false;
}
assert(PathPaymentOpFrame::getInnerCode(ppayment.getResult()) ==
PATH_PAYMENT_SUCCESS);
innerResult().code(PAYMENT_SUCCESS);
return true;
}