Bitcoin Forum
November 08, 2024, 04:03:29 AM *
News: Latest Bitcoin Core release: 28.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: [1]
  Print  
Author Topic: transactionrecord CWalletTx &wtx help!  (Read 1677 times)
info_infoman (OP)
Sr. Member
****
Offline Offline

Activity: 460
Merit: 250



View Profile
October 06, 2014, 10: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;
        }
    }

amaclin
Legendary
*
Offline Offline

Activity: 1260
Merit: 1019


View Profile
October 06, 2014, 12:39:49 PM
 #2

Не очень понял вопрос.
Но в мемпуле транзакции, которые еще не включены в блок. Да.

Что значит "на стадии генерации"? Неподписанные чтоли? Ну это вообще не транзакции собственно, а набор байтов.
(Что означает данный код - я понять не могу - не разбирался конкретно с этим)
Sheogorath
Newbie
*
Offline Offline

Activity: 41
Merit: 0


View Profile
October 06, 2014, 02:17:19 PM
 #3

Но в мемпуле транзакции, которые еще не включены в блок. Да.
+1
И внимание, транзакция может исчезнуть из основной цепочки блоков при реорганизации.
amaclin
Legendary
*
Offline Offline

Activity: 1260
Merit: 1019


View Profile
October 06, 2014, 02:30:36 PM
 #4

Quote
И внимание, транзакция может исчезнуть из основной цепочки блоков при реорганизации.
Ну, да. Причем она в этом случае может как вытряхнуться в мемпул, так и вообще оказаться конфликтущей с уже имеющимися в мемпуле и даже в мейнчейне - тогда клиент её просто отбрасывает.
Sheogorath
Newbie
*
Offline Offline

Activity: 41
Merit: 0


View Profile
October 06, 2014, 03:00:09 PM
 #5

Ну, да. Причем она в этом случае может как вытряхнуться в мемпул, так и вообще оказаться конфликтущей с уже имеющимися в мемпуле и даже в мейнчейне - тогда клиент её просто отбрасывает.
Там какая-то непонятная логика, у меня на форках иногда сгенерированный блок совсем пропадал из списка, а иногда оставался висеть как неподтверждённый.
amaclin
Legendary
*
Offline Offline

Activity: 1260
Merit: 1019


View Profile
October 06, 2014, 03:19:29 PM
 #6

Quote
Там какая-то непонятная логика, у меня на форках иногда сгенерированный блок совсем пропадал из списка, а иногда оставался висеть как неподтверждённый.
Ээээ! Полегче! Что такое неподтвержденный блок? Орфан что ли?
Если у вас блоки 100500-100501-100502... И тут приходит блок 100504 (а пятьсот третьего нет)
то клиент вообще говоря просто его может выкинуть и ждать, когда придет сперва пятьсот третий, а потом от той же ноды и пятьсот четвертый
Куда клиент сует орфан-блок - это его собачье дело.
Может сохранять, может отбрасывать
Важно то, что орфан-блок никак не влияет на мемпул и мейнчейн
Sheogorath
Newbie
*
Offline Offline

Activity: 41
Merit: 0


View Profile
October 06, 2014, 03:26:38 PM
 #7

Quote
Там какая-то непонятная логика, у меня на форках иногда сгенерированный блок совсем пропадал из списка, а иногда оставался висеть как неподтверждённый.
Ээээ! Полегче! Что такое неподтвержденный блок? Орфан что ли?
Если у вас блоки 100500-100501-100502... И тут приходит блок 100504 (а пятьсот третьего нет)
то клиент вообще говоря просто его может выкинуть и ждать, когда придет сперва пятьсот третий, а потом от той же ноды и пятьсот четвертый
Куда клиент сует орфан-блок - это его собачье дело.
Может сохранять, может отбрасывать
Важно то, что орфан-блок никак не влияет на мемпул и мейнчейн
Майнил соло, прямо на qt кошелёк, вот такие варианты и наблюдал. Потом приходилось пересканировать, иначе при попытке отправить намайненое транзакции не проходили. Хз, это глюки форка, исходного bitcoin кода или мои собственные Smiley))
Что-то не то с терминами, орфан, по идее, блок без предка. А как выкинутый от реорганизации блок называется?
amaclin
Legendary
*
Offline Offline

Activity: 1260
Merit: 1019


View Profile
October 06, 2014, 03:30:16 PM
 #8

Quote
Что-то не то с терминами, орфан, по идее, блок без предка. А как выкинутый от реорганизации блок называется?
А фиг знает. Если приходят два разных блока и оба пятьсот-третьи, то клиент при приходе второго из них выбирает большую сложность цепочки
и либо игнорирует второй, либо реорганизует. В этом случае в самом blk-файле блок остается (вдруг потом придется опять реорганизовывать?)

UPD: а, ну значит нельзя "просто выкидывать". чтоб потом от него тоже можно было бы чейн строить.
я бы предложил так:
орфан - блок без предка вообще
блок с предком но не в мейнчейне - это сайдчейн или сайдблок
Но это моё понимание, может быть имеются более устоявшиеся названия
Sheogorath
Newbie
*
Offline Offline

Activity: 41
Merit: 0


View Profile
October 06, 2014, 03:47:25 PM
 #9

Quote
Что-то не то с терминами, орфан, по идее, блок без предка. А как выкинутый от реорганизации блок называется?
А фиг знает. Если приходят два разных блока и оба пятьсот-третьи, то клиент при приходе второго из них выбирает большую сложность цепочки
и либо игнорирует второй, либо реорганизует. В этом случае в самом blk-файле блок остается (вдруг потом придется опять реорганизовывать?)

UPD: а, ну значит нельзя "просто выкидывать". чтоб потом от него тоже можно было бы чейн строить.
я бы предложил так:
орфан - блок без предка вообще
блок с предком но не в мейнчейне - это сайдчейн или сайдблок
Но это моё понимание, может быть имеются более устоявшиеся названия
Когда имеются два блока-"брата" нельзя выбирать из них лучший по сложности, иначе можно придержать удачный блок и запустить в сеть позже. Вроде в такой ситуации выбирается первый пришедший блок, надо посмотреть в код.
В моей ситуации (майнил молодую валюту, сидел за NAT - хороший хешрейт, плохая connectivity) непонятно как блок умудрялся совсем исчезнуть, вроде должен был остаться в sidechain (блин, этот термин уже занят под валидные цепочки, которые целиком в основной blockchain не включаются!) и висеть неподтверждённым.
amaclin
Legendary
*
Offline Offline

Activity: 1260
Merit: 1019


View Profile
October 06, 2014, 03:53:07 PM
 #10

Quote
Когда имеются два блока-"брата" нельзя выбирать из них лучший по сложности, иначе можно придержать удачный блок и запустить в сеть позже.
А откуда взялся второй?
Если он пришел из сети и имеет большую сложность - то нода должна взять его в мейнчейн и майнить от него
Иначе большой риск майнить сайдчейн.

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

Какая пох разница? ТС не об этом спрашивал!
Sheogorath
Newbie
*
Offline Offline

Activity: 41
Merit: 0


View Profile
October 06, 2014, 04:03:26 PM
 #11

Если он пришел из сети и имеет большую сложность - то нода должна взять его в мейнчейн и майнить от него
Если считать чисто по сложности, у кого хэш меньше, тот и главный, то придержав свой удачный блок можно почти гарантированно выбить чужой. Отсюда selfish-mining и зародыш даблспенда. Надо подумать, вдруг что полезное придумается.

Какая пох разница? ТС не об этом спрашивал!
Кстати, да. Ещё научим чему плохому Smiley))
amaclin
Legendary
*
Offline Offline

Activity: 1260
Merit: 1019


View Profile
October 06, 2014, 04:18:36 PM
 #12

Quote
Если считать чисто по сложности, у кого хэш меньше, тот и главный, то придержав свой удачный блок можно почти гарантированно выбить чужой. Отсюда selfish-mining и зародыш даблспенда. Надо подумать, вдруг что полезное придумается.
А сложность по-моему меряется не только по хешу блока, но и с учетом транзакций в нем
То есть блок с большим числом транзакций будет в некоторых случаях перешибать блок с меньшим хешом
А уж в случае если в цепочке несколько блоков - то там суммируется.

То есть "придержав" свой случайно найденный блок с очень маленьким хешом вы рискуете что его сеть не примет в мейнчейн.
info_infoman (OP)
Sr. Member
****
Offline Offline

Activity: 460
Merit: 250



View Profile
October 07, 2014, 04:36:24 AM
 #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

in100
Legendary
*
Offline Offline

Activity: 1200
Merit: 1021



View Profile
October 07, 2014, 05:31:43 AM
 #14

судя по коду там отображаются вообще все транзакции поступившие ноде и созданные нодой
а именно дебитовые(входящие) и кредитовые(исходящие) на адреса в кошельке
причем судя по коду там отображаются все транзакции попавшие в mempool то есть еще не включенные в блок

Да, достаточно понаблюдать за работой кошелька Smiley Сначала он видит входящую или исходящую транзакцию в mempool, выдает всплывающее сообщение и добавляет эту транзакцию в список. После того, как транзакция будет включена в блок, кошель начинает отсчитывать подтверждения.

1BTCin1ooigFtHHD82qquqysdfxFZGdd8a  |  LTCin1oo9JhxcZu8ZK5HivqwvzAdQSaoua  |  4NVCin1ooAd2XKoEfEhBn6tYNUHhojf4QS
Блокчейн биткоина с его алгоритмом децентрализованного консенсуса на самом деле неэффективен, но неэффективность – это та цена, которую мы платим за свободу.© Andreas Antonopoulos
info_infoman (OP)
Sr. Member
****
Offline Offline

Activity: 460
Merit: 250



View Profile
October 07, 2014, 05:54:08 AM
 #15

спасибо!
просто я не мог наблюдать входящие транзы... никто не шлет и монетка специфическая

Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!