Author

Topic: transactionrecord CWalletTx &wtx help! (Read 1677 times)

sr. member
Activity: 460
Merit: 250
October 07, 2014, 12:54:08 AM
#15
спасибо!
просто я не мог наблюдать входящие транзы... никто не шлет и монетка специфическая
legendary
Activity: 1200
Merit: 1021
October 07, 2014, 12:31:43 AM
#14
судя по коду там отображаются вообще все транзакции поступившие ноде и созданные нодой
а именно дебитовые(входящие) и кредитовые(исходящие) на адреса в кошельке
причем судя по коду там отображаются все транзакции попавшие в mempool то есть еще не включенные в блок

Да, достаточно понаблюдать за работой кошелька Smiley Сначала он видит входящую или исходящую транзакцию в mempool, выдает всплывающее сообщение и добавляет эту транзакцию в список. После того, как транзакция будет включена в блок, кошель начинает отсчитывать подтверждения.
sr. member
Activity: 460
Merit: 250
October 06, 2014, 11:36:24 PM
#13
я имею ввиду интерфейс вкладки "Транзакции"
в клиенте
что там отображается?
судя по коду там отображаются вообще все транзакции поступившие ноде и созданные нодой
а именно дебитовые(входящие) и кредитовые(исходящие) на адреса в кошельке
причем судя по коду там отображаются все транзакции попавшие в mempool то есть еще не включенные в блок:

ниже кусок кода transactionrecord.cpp
он подгружается в transactionmodel и transactiontable
а они отвечают именно за вкладку "Транзакции"

я прав?
Code:
        //
        // Credit
        //
        BOOST_FOREACH(const CTxOut& txout, wtx.vout)
        {
            if(wallet->IsMine(txout))
            {
                TransactionRecord sub(hash, nTime);
                CTxDestination address;
                sub.txcomment = txcomment;
                sub.idx = parts.size(); // sequence number
                sub.credit = txout.nValue;
                if (ExtractDestination(txout.scriptPubKey, address) && IsMine(*wallet, address))
                {
                    // Received by Bitcoin Address
                    sub.type = TransactionRecord::RecvWithAddress;
                    sub.address = CBitcoinAddress(address).ToString();
                }
                else
                {
                    // Received by IP connection (deprecated features), or a multisignature or other non-simple transaction
                    sub.type = TransactionRecord::RecvFromOther;
                    sub.address = mapValue["from"];
                }
                if (wtx.IsCoinBase())
                {
                    // Generated
                    sub.type = TransactionRecord::Generated;
                }

                parts.append(sub);
            }
        }
    }
    else
    {
        bool fAllFromMe = true;
        BOOST_FOREACH(const CTxIn& txin, wtx.vin)
            fAllFromMe = fAllFromMe && wallet->IsMine(txin);

        bool fAllToMe = true;
        BOOST_FOREACH(const CTxOut& txout, wtx.vout)
            fAllToMe = fAllToMe && wallet->IsMine(txout);

        if (fAllFromMe && fAllToMe)
        {
            // Payment to self
            int64 nChange = wtx.GetChange();

            parts.append(TransactionRecord(hash, nTime, TransactionRecord::SendToSelf, "",
                            -(nDebit - nChange), nCredit - nChange, txcomment));
        }
        else if (fAllFromMe)
        {
            //
            // Debit
            //
            int64 nTxFee = nDebit - wtx.GetValueOut();

            for (unsigned int nOut = 0; nOut < wtx.vout.size(); nOut++)
            {
                const CTxOut& txout = wtx.vout[nOut];
                TransactionRecord sub(hash, nTime);
                sub.idx = parts.size();
                sub.txcomment = txcomment;

                if(wallet->IsMine(txout))
                {
                    // Ignore parts sent to self, as this is usually the change
                    // from a transaction sent back to our own address.
                    continue;
                }

                CTxDestination address;
                if (ExtractDestination(txout.scriptPubKey, address))
                {
                    // Sent to Bitcoin Address
                    sub.type = TransactionRecord::SendToAddress;
                    sub.address = CBitcoinAddress(address).ToString();
                }
                else
                {
                    // Sent to IP, or other non-address transaction like OP_EVAL
                    sub.type = TransactionRecord::SendToOther;
                    sub.address = mapValue["to"];
                }

                int64 nValue = txout.nValue;
                /* Add fee to first output */
                if (nTxFee > 0)
                {
                    nValue += nTxFee;
                    nTxFee = 0;
                }
                sub.debit = -nValue;

                parts.append(sub);
            }
        }
        else
legendary
Activity: 1260
Merit: 1019
October 06, 2014, 11:18:36 AM
#12
Quote
Если считать чисто по сложности, у кого хэш меньше, тот и главный, то придержав свой удачный блок можно почти гарантированно выбить чужой. Отсюда selfish-mining и зародыш даблспенда. Надо подумать, вдруг что полезное придумается.
А сложность по-моему меряется не только по хешу блока, но и с учетом транзакций в нем
То есть блок с большим числом транзакций будет в некоторых случаях перешибать блок с меньшим хешом
А уж в случае если в цепочке несколько блоков - то там суммируется.

То есть "придержав" свой случайно найденный блок с очень маленьким хешом вы рискуете что его сеть не примет в мейнчейн.
newbie
Activity: 41
Merit: 0
October 06, 2014, 11:03:26 AM
#11
Если он пришел из сети и имеет большую сложность - то нода должна взять его в мейнчейн и майнить от него
Если считать чисто по сложности, у кого хэш меньше, тот и главный, то придержав свой удачный блок можно почти гарантированно выбить чужой. Отсюда selfish-mining и зародыш даблспенда. Надо подумать, вдруг что полезное придумается.

Какая пох разница? ТС не об этом спрашивал!
Кстати, да. Ещё научим чему плохому Smiley))
legendary
Activity: 1260
Merit: 1019
October 06, 2014, 10:53:07 AM
#10
Quote
Когда имеются два блока-"брата" нельзя выбирать из них лучший по сложности, иначе можно придержать удачный блок и запустить в сеть позже.
А откуда взялся второй?
Если он пришел из сети и имеет большую сложность - то нода должна взять его в мейнчейн и майнить от него
Иначе большой риск майнить сайдчейн.

Если второй блок мы сами сгенерировали - то мы сами себе злобные буратины - надо было при приходе "первого" блока переключиться и не майнить сайдчейн.

Какая пох разница? ТС не об этом спрашивал!
newbie
Activity: 41
Merit: 0
October 06, 2014, 10:47:25 AM
#9
Quote
Что-то не то с терминами, орфан, по идее, блок без предка. А как выкинутый от реорганизации блок называется?
А фиг знает. Если приходят два разных блока и оба пятьсот-третьи, то клиент при приходе второго из них выбирает большую сложность цепочки
и либо игнорирует второй, либо реорганизует. В этом случае в самом blk-файле блок остается (вдруг потом придется опять реорганизовывать?)

UPD: а, ну значит нельзя "просто выкидывать". чтоб потом от него тоже можно было бы чейн строить.
я бы предложил так:
орфан - блок без предка вообще
блок с предком но не в мейнчейне - это сайдчейн или сайдблок
Но это моё понимание, может быть имеются более устоявшиеся названия
Когда имеются два блока-"брата" нельзя выбирать из них лучший по сложности, иначе можно придержать удачный блок и запустить в сеть позже. Вроде в такой ситуации выбирается первый пришедший блок, надо посмотреть в код.
В моей ситуации (майнил молодую валюту, сидел за NAT - хороший хешрейт, плохая connectivity) непонятно как блок умудрялся совсем исчезнуть, вроде должен был остаться в sidechain (блин, этот термин уже занят под валидные цепочки, которые целиком в основной blockchain не включаются!) и висеть неподтверждённым.
legendary
Activity: 1260
Merit: 1019
October 06, 2014, 10:30:16 AM
#8
Quote
Что-то не то с терминами, орфан, по идее, блок без предка. А как выкинутый от реорганизации блок называется?
А фиг знает. Если приходят два разных блока и оба пятьсот-третьи, то клиент при приходе второго из них выбирает большую сложность цепочки
и либо игнорирует второй, либо реорганизует. В этом случае в самом blk-файле блок остается (вдруг потом придется опять реорганизовывать?)

UPD: а, ну значит нельзя "просто выкидывать". чтоб потом от него тоже можно было бы чейн строить.
я бы предложил так:
орфан - блок без предка вообще
блок с предком но не в мейнчейне - это сайдчейн или сайдблок
Но это моё понимание, может быть имеются более устоявшиеся названия
newbie
Activity: 41
Merit: 0
October 06, 2014, 10:26:38 AM
#7
Quote
Там какая-то непонятная логика, у меня на форках иногда сгенерированный блок совсем пропадал из списка, а иногда оставался висеть как неподтверждённый.
Ээээ! Полегче! Что такое неподтвержденный блок? Орфан что ли?
Если у вас блоки 100500-100501-100502... И тут приходит блок 100504 (а пятьсот третьего нет)
то клиент вообще говоря просто его может выкинуть и ждать, когда придет сперва пятьсот третий, а потом от той же ноды и пятьсот четвертый
Куда клиент сует орфан-блок - это его собачье дело.
Может сохранять, может отбрасывать
Важно то, что орфан-блок никак не влияет на мемпул и мейнчейн
Майнил соло, прямо на qt кошелёк, вот такие варианты и наблюдал. Потом приходилось пересканировать, иначе при попытке отправить намайненое транзакции не проходили. Хз, это глюки форка, исходного bitcoin кода или мои собственные Smiley))
Что-то не то с терминами, орфан, по идее, блок без предка. А как выкинутый от реорганизации блок называется?
legendary
Activity: 1260
Merit: 1019
October 06, 2014, 10:19:29 AM
#6
Quote
Там какая-то непонятная логика, у меня на форках иногда сгенерированный блок совсем пропадал из списка, а иногда оставался висеть как неподтверждённый.
Ээээ! Полегче! Что такое неподтвержденный блок? Орфан что ли?
Если у вас блоки 100500-100501-100502... И тут приходит блок 100504 (а пятьсот третьего нет)
то клиент вообще говоря просто его может выкинуть и ждать, когда придет сперва пятьсот третий, а потом от той же ноды и пятьсот четвертый
Куда клиент сует орфан-блок - это его собачье дело.
Может сохранять, может отбрасывать
Важно то, что орфан-блок никак не влияет на мемпул и мейнчейн
newbie
Activity: 41
Merit: 0
October 06, 2014, 10:00:09 AM
#5
Ну, да. Причем она в этом случае может как вытряхнуться в мемпул, так и вообще оказаться конфликтущей с уже имеющимися в мемпуле и даже в мейнчейне - тогда клиент её просто отбрасывает.
Там какая-то непонятная логика, у меня на форках иногда сгенерированный блок совсем пропадал из списка, а иногда оставался висеть как неподтверждённый.
legendary
Activity: 1260
Merit: 1019
October 06, 2014, 09:30:36 AM
#4
Quote
И внимание, транзакция может исчезнуть из основной цепочки блоков при реорганизации.
Ну, да. Причем она в этом случае может как вытряхнуться в мемпул, так и вообще оказаться конфликтущей с уже имеющимися в мемпуле и даже в мейнчейне - тогда клиент её просто отбрасывает.
newbie
Activity: 41
Merit: 0
October 06, 2014, 09:17:19 AM
#3
Но в мемпуле транзакции, которые еще не включены в блок. Да.
+1
И внимание, транзакция может исчезнуть из основной цепочки блоков при реорганизации.
legendary
Activity: 1260
Merit: 1019
October 06, 2014, 07:39:49 AM
#2
Не очень понял вопрос.
Но в мемпуле транзакции, которые еще не включены в блок. Да.

Что значит "на стадии генерации"? Неподписанные чтоли? Ну это вообще не транзакции собственно, а набор байтов.
(Что означает данный код - я понять не могу - не разбирался конкретно с этим)
sr. member
Activity: 460
Merit: 250
October 06, 2014, 05:33:31 AM
#1
подскажите пжлст

вкладка "транзакции"
там отображаются транзакции находящиеся на стадии генерации? (mempool)
и отображаются ли там транзакции входящие которые еще не приняты в блок (на стадии генерации)

на эту мысль меня натолкнул этот кусок кода в transactionrecord.cpp

я правильно понимаю что туда падают транзакции еще даже не включенные в блок?:
Code:
// For generated transactions, determine maturity
    if(type == TransactionRecord::Generated)
    {
        int64 nCredit = wtx.GetCredit(true);
        if (nCredit == 0)
        {
            status.maturity = TransactionStatus::Immature;

            if (wtx.IsInMainChain())
            {
                status.matures_in = wtx.GetBlocksToMaturity();

                // Check if the block was requested by anyone
                if (GetAdjustedTime() - wtx.nTimeReceived > 2 * 60 && wtx.GetRequestCount() == 0)
                    status.maturity = TransactionStatus::MaturesWarning;
            }
            else
            {
                status.maturity = TransactionStatus::NotAccepted;
            }
        }
        else
        {
            status.maturity = TransactionStatus::Mature;
        }
    }
Jump to: