Bitcoin Forum
June 16, 2024, 03:52:17 AM *
News: Latest Bitcoin Core release: 27.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: [1]
  Print  
Author Topic: [РЕШЕНО]просто ужас какой то с этими CCoinsView  (Read 1836 times)
info_infoman (OP)
Sr. Member
****
Offline Offline

Activity: 460
Merit: 250



View Profile
December 03, 2015, 06:00:11 AM
Last edit: December 04, 2015, 09:02:13 PM by info_infoman
 #1

может мне кто нибудь внятно объяснить как функцию из файла txdb.cpp
втащить в main.cpp (использовать)

я так понимаю что происходит это двумя способами
выделяется некоторая память для виртуальных функций
CCoinsViewCash
и
CCoinsViewBackend

только как правильно не пойму.....

вроде все сделал по аналогии с другими функциями однако на переменные передаваемые компилятор  ругается матом  типа:
expected primery-expression .... параметр

kcaterpillar
Full Member
***
Offline Offline

Activity: 173
Merit: 100


View Profile
December 03, 2015, 10:27:43 AM
 #2

А вы про bitcoin вообще говорите? Можно поконкретнее, что вы из txdb.cpp вызвать хотите в main? Просто я в коде этих виртуальных функций, о которых вы говорите, не вижу. Может ссылку дадите или кусок кода. Судя по сообщению компилятора пропустили чего-то.
info_infoman (OP)
Sr. Member
****
Offline Offline

Activity: 460
Merit: 250



View Profile
December 03, 2015, 11:03:49 AM
 #3

А вы про bitcoin вообще говорите? Можно поконкретнее, что вы из txdb.cpp вызвать хотите в main? Просто я в коде этих виртуальных функций, о которых вы говорите, не вижу. Может ссылку дадите или кусок кода. Судя по сообщению компилятора пропустили чего-то.
файл
txdb.cpp
функция
bool CCoinsViewDB::GetStats(.......

создал копию данной функции с другим именем  и прописал ее во всех файлах в которых указывается функция CCoinsViewDB::GetStats

сама функция ошибок не вызывает
а вот вызвать ее из main не могу

другие функции класса CCoinsView в main работают а моя не хочет

вызываю функцию  методом pcoinTip->Название функции....

единственное отличие функции которую я брал за основу CCoinsViewDB::GetStats от других функций (например CCoinsViewDB::GetCoins) в том что CCoinsViewDB::GetStats вызывается только в файле rpcblockchain.cpp а CCoinsViewDB::GetCoins и там и там , в main.h эта группа функций даже называется по другому - standart

info_infoman (OP)
Sr. Member
****
Offline Offline

Activity: 460
Merit: 250



View Profile
December 03, 2015, 11:15:38 AM
 #4

правильно ли я рассуждаю что сначало в main.cpp грузится txdb.h обрабатывается и только потом результаты обработки  txdb.h фиксируются внектороем кеше main.cpp

CCoinsViewCash
и
CCoinsViewBackend

который фиксирует данные только для стандартных функций прописанных в классах  main.h

и потом естественно я не могу обратится к классу CCoinsView который прописан в txdb.h из-за того что такой же класс прописан в main.h для работы кешей 
CCoinsViewCash
и
CCoinsViewBackend

kcaterpillar
Full Member
***
Offline Offline

Activity: 173
Merit: 100


View Profile
December 03, 2015, 12:08:04 PM
 #5

правильно ли я рассуждаю что сначало в main.cpp грузится txdb.h обрабатывается и только потом результаты обработки  txdb.h фиксируются внектороем кеше main.cpp

CCoinsViewCash
и
CCoinsViewBackend

который фиксирует данные только для стандартных функций прописанных в классах  main.h

и потом естественно я не могу обратится к классу CCoinsView который прописан в txdb.h из-за того что такой же класс прописан в main.h для работы кешей 
CCoinsViewCash
и
CCoinsViewBackend

Нет, думаю тут проблема в другом, у вас кстати ошибка в названии  CCoinsViewBackend (вместо CCoinsViewBacked) и CCoinsViewCash - тоже такого класса нет в первоисточнике. Но вероятно это просто опечатка здесь в форуме у вас. Уточните.

Хотя да, возможно он просто видит другой объект, тогда попробуйте везде в коде переименовать класс, будет видно.  Если не знает, к какому классу обратиться, он бы написал ambiguous или что-то в этом роде. Но честно мне тяжело так сказать, потому что не очень понимаю как вы в мэйне её вызываете. Он нормально видит структуру CCoinsStats в main? Попробуйте все максимально разбить в тестовом коде на мелкие части и понять, что ему не нравится, нужно также посмотреть, может те функции, которые нормально работают, реализованы еще в каких-то других наследуемых классах. Попробуйте CCoinsView переименовать, тогда неоднозначность исчезнет, он сразу напишет уже, будет понятно какой он видет класс и его функции или что-то подобное. Пока я не очень понял проблемы.
kcaterpillar
Full Member
***
Offline Offline

Activity: 173
Merit: 100


View Profile
December 03, 2015, 12:15:32 PM
 #6

Да, и еще, плиз, напишите полный текст сообщения компилятора об ошибке, без сокращений, возможно чуть понятнее так будет.
kcaterpillar
Full Member
***
Offline Offline

Activity: 173
Merit: 100


View Profile
December 03, 2015, 12:57:17 PM
 #7

Попробую пояснить ход моих мыслей. У вас компилятор выдаёт сообщение на этапе анализа кода. Т.е. он никакой там памяти на этот момент не выделяет ещё и тем более проект не собирает.  Он пока работает только с  кодом - идентификаторы, синтаксис и т.д. - то есть с текстом.  Он что-то ждал и не получил на момент анализа кода. Нужно понять что - часто это просто опечатка в коде. Если какой-то класс, или функция реализована дважды, или другие подобные ситуации, он может написать о неоднозначности, но если он видит в области видимости только одну реализацию - то он будет и обрабатывать только её. В таких случаях помогает переименования. Т.е. вы предполагаете, что он видит что-то с связанное с кэшем - там переименуйте, и он сразу сообщит об ошибке. Ну и так далее.

У вас возможно или просто ошибка в синтаксисе или названиях идентификаторов. Или скорей всего не та область видимости, обратите на это внимание, т.е. он видит не то, что вы считаете в коде.

Но это просто мои общие соображения по поиску ошибки, возможно конечно там ещё какая-то проблема.
info_infoman (OP)
Sr. Member
****
Offline Offline

Activity: 460
Merit: 250



View Profile
December 03, 2015, 06:40:32 PM
 #8

спасибо, я понял, да действительно очепятка в форуме....

поясню свою мысль, дело в том что данная функция нужна для работы с блокчейном в клиенте
как вы понимаете работа с блокчейном это львиная работа клиента и демона, поэтому CCoinsView объявляемый в main.h работает в режиме кэширования данных:

Quote
bool CCoinsView::GetCoins(const uint256 &txid, CCoins &coins) { return false; }
bool CCoinsView::SetCoins(const uint256 &txid, const CCoins &coins) { return false; }
bool CCoinsView::HaveCoins(const uint256 &txid) { return false; }
CBlockIndex *CCoinsView::GetBestBlock() { return NULL; }
bool CCoinsView::SetBestBlock(CBlockIndex *pindex) { return false; }
bool CCoinsView::BatchWrite(const std::map<uint256, CCoins> &mapCoins, CBlockIndex *pindex) { return false; }
bool CCoinsView::GetStats(CCoinsStats &stats) { return false; }


CCoinsViewBacked::CCoinsViewBacked(CCoinsView &viewIn) : base(&viewIn) { }
bool CCoinsViewBacked::GetCoins(const uint256 &txid, CCoins &coins) { return base->GetCoins(txid, coins); }
bool CCoinsViewBacked::SetCoins(const uint256 &txid, const CCoins &coins) { return base->SetCoins(txid, coins); }
bool CCoinsViewBacked::HaveCoins(const uint256 &txid) { return base->HaveCoins(txid); }
CBlockIndex *CCoinsViewBacked::GetBestBlock() { return base->GetBestBlock(); }
bool CCoinsViewBacked::SetBestBlock(CBlockIndex *pindex) { return base->SetBestBlock(pindex); }
void CCoinsViewBacked::SetBackend(CCoinsView &viewIn) { base = &viewIn; }
bool CCoinsViewBacked::BatchWrite(const std::map<uint256, CCoins> &mapCoins, CBlockIndex *pindex) { return base->BatchWrite(mapCoins, pindex); }
bool CCoinsViewBacked::GetStats(CCoinsStats &stats) { return base->GetStats(stats); }



CCoinsViewCache::CCoinsViewCache(CCoinsView &baseIn, bool fDummy) : CCoinsViewBacked(baseIn), pindexTip(NULL) { }


задача добавить туда еще одну функцию
bool CCoinsView::CheckAdressAmount(std::string &chadress, int64 &amount) { return false; }
и соответственно
bool CCoinsViewBacked::CheckAdressAmount(std::string &chadress, int64 &amount) { return base->CheckAdressAmount(chadress, amount); }

эта штука работает с базо данных напрямую(должна работать но не работает)

ибо обращение к базе данных транзакций висит в txdb.cpp

так вот, хотелось бы чтобы новая функция тоже кешировалась как например CCoinsViewBacked::GetCoins

в целом я вас понял, попробую подсунуть обработчику функцию CCoinsViewBacked::GetStats ибо она есть в txdb.cpp и она не указанна как стандартная в main.h
Quote
/** CCoinsView backed by another CCoinsView */
class CCoinsViewBacked : public CCoinsView
{
protected:
    CCoinsView *base;

public:
    CCoinsViewBacked(CCoinsView &viewIn);
    bool GetCoins(const uint256 &txid, CCoins &coins);
    bool SetCoins(const uint256 &txid, const CCoins &coins);
    bool HaveCoins(const uint256 &txid);
    CBlockIndex *GetBestBlock();
    bool SetBestBlock(CBlockIndex *pindex);
    void SetBackend(CCoinsView &viewIn);
    bool BatchWrite(const std::map<uint256, CCoins> &mapCoins, CBlockIndex *pindex);
    bool GetStats(CCoinsStats &stats);
    bool CheckAdressAmount (std::string &chadress, int64 &amount);
};



info_infoman (OP)
Sr. Member
****
Offline Offline

Activity: 460
Merit: 250



View Profile
December 04, 2015, 04:58:05 AM
 #9

сейчас вот такая ошибка:
Quote
src\main.cpp: In member function 'bool CTransaction::CheckTransaction(CValidationState&, int) const':
src\main.cpp:693:84: error: no matching function for call to 'CCoinsViewCache::CheckAdressAmount(std::string, int64&)'
     if (pcoinsTip->CheckAdressAmount(CBitcoinAddress(nAddress).ToString(), nValueIn))
    ^
src\main.cpp:693:84: note: candidate is:
src\main.cpp:291:6: note: virtual bool CCoinsViewBacked::CheckAdressAmount(std::string&, int64&)
bool CCoinsViewBacked::CheckAdressAmount(std::string &chadress, int64 &amount)
{ return base->CheckAdressAmount(chadress, amount); }

типа он ищет функцию в CCoinsViewCache а ее там нет
зато типа есть в CCoinsViewBacked
только вот как вызвать из CCoinsViewBacked?

info_infoman (OP)
Sr. Member
****
Offline Offline

Activity: 460
Merit: 250



View Profile
December 04, 2015, 11:55:19 AM
 #10

интересно девки пляшут....
оказывается pcoinTip->getstats(stats) отлично вызывается из main.cpp
более того этот getstats(stats) фигурирует в файлах version_set и db_impl
и там типа он  и кешируется помоему
осталось узнать как в stats подсунуть мою переменную

kcaterpillar
Full Member
***
Offline Offline

Activity: 173
Merit: 100


View Profile
December 04, 2015, 03:28:02 PM
 #11

интересно девки пляшут....
оказывается pcoinTip->getstats(stats) отлично вызывается из main.cpp
более того этот getstats(stats) фигурирует в файлах version_set и db_impl
и там типа он  и кешируется помоему
осталось узнать как в stats подсунуть мою переменную

Так если getstats(stats) вызывается, то перед передачей параметра stats просто инициализировать нужное. Правда скороей всего перетрёт, но нужно по коду смотреть. Или нужно добавить новое поле в структуре? Тогда там, где она определяется - в coins.h

struct CCoinsStats
{
    int nHeight;
    uint256 hashBlock;
    uint64_t nTransactions;
    uint64_t nTransactionOutputs;
    uint64_t nSerializedSize;
    uint256 hashSerialized;
    CAmount nTotalAmount;

    CCoinsStats() : nHeight(0), nTransactions(0), nTransactionOutputs(0), nSerializedSize(0), nTotalAmount(0) {}
};
info_infoman (OP)
Sr. Member
****
Offline Offline

Activity: 460
Merit: 250



View Profile
December 04, 2015, 04:58:19 PM
 #12

интересно девки пляшут....
оказывается pcoinTip->getstats(stats) отлично вызывается из main.cpp
более того этот getstats(stats) фигурирует в файлах version_set и db_impl
и там типа он  и кешируется помоему
осталось узнать как в stats подсунуть мою переменную

Так если getstats(stats) вызывается, то перед передачей параметра stats просто инициализировать нужное. Правда скороей всего перетрёт, но нужно по коду смотреть. Или нужно добавить новое поле в структуре? Тогда там, где она определяется - в coins.h

struct CCoinsStats
{
    int nHeight;
    uint256 hashBlock;
    uint64_t nTransactions;
    uint64_t nTransactionOutputs;
    uint64_t nSerializedSize;
    uint256 hashSerialized;
    CAmount nTotalAmount;

    CCoinsStats() : nHeight(0), nTransactions(0), nTransactionOutputs(0), nSerializedSize(0), nTotalAmount(0) {}
};


до этого я уже дошел, но при добавлении в структуру дополнительного типа  nAdress;
компилятор ругается что не может найти его, хотя он указан везде где ранее был указан например CAmount nTotalAmount

такое ощущение ему просто ненравится слово nAdress, причем неважно какой тип данных передавать
например пробовал подсовывать int64 nAdress казалось бы простой большой тип числа, но нифига!
с другой стороны пробовал  CAmount nTotalAmount; заменить на int64 nTotalAmount; и все ок
думал это ограничение на размер структуры, но нет если менять местами CAmount nTotalAmount; с int64 nAdress
он все равно ругается именно на int64 nAdress;

но это все лирика, дело в том что мне нужно передать через эту структуру данные типа CTxDestination nAdress; и вот тут беда беда......

ухожу от проблемы ввода ной переменной nAdress; в структуру вместо нее просто использую переменную  nTotalAmount;
везде ее прописываю (и на входе и на выходе как CTxDestination)

и соответственно в структуре прописываю  CTxDestination nTotalAmount;
запускаю компилятор, и там вообще страх господень начинается :

заранее поясню, в main.h где сидит эта структура base58.h где описан тип CTxDestination инклюдил
вот результат
Quote
encing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
..\deps\boost_1_55_0/boost/thread/win32/shared_mutex.hpp:53:52: warning: derefer
encing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
             return *reinterpret_cast<T const*>(&res);
                                                    ^
..\deps\boost_1_55_0/boost/thread/win32/shared_mutex.hpp:53:52: warning: derefer
encing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
In file included from ..\deps\boost_1_55_0/boost/variant.hpp:17:0,
                 from src/script.h:12,
                 from src/main.h:11,
                 from src/wallet.h:13,
                 from src/init.h:8,
                 from src\qt\bitcoin.cpp:13:
..\deps\boost_1_55_0/boost/variant/variant.hpp: In instantiation of 'void boost:
:variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T
16, T17, T18, T19>::convert_construct(T&, int, mpl_::false_) [with T = const int
; T0_ = CNoDestination; T1 = CKeyID; T2 = CScriptID; T3 = boost::detail::variant
::void_; T4 = boost::detail::variant::void_; T5 = boost::detail::variant::void_;
 T6 = boost::detail::variant::void_; T7 = boost::detail::variant::void_; T8 = bo
ost::detail::variant::void_; T9 = boost::detail::variant::void_; T10 = boost::de
tail::variant::void_; T11 = boost::detail::variant::void_; T12 = boost::detail::
variant::void_; T13 = boost::detail::variant::void_; T14 = boost::detail::varian
t::void_; T15 = boost::detail::variant::void_; T16 = boost::detail::variant::voi
d_; T17 = boost::detail::variant::void_; T18 = boost::detail::variant::void_; T1
9 = boost::detail::variant::void_; mpl_::false_ = mpl_::bool_<false>]':
..\deps\boost_1_55_0/boost/variant/variant.hpp:1740:38:   required from 'boost::
variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T1
6, T17, T18, T19>::variant(const T&) [with T = int; T0_ = CNoDestination; T1 = C
KeyID; T2 = CScriptID; T3 = boost::detail::variant::void_; T4 = boost::detail::v
ariant::void_; T5 = boost::detail::variant::void_; T6 = boost::detail::variant::
void_; T7 = boost::detail::variant::void_; T8 = boost::detail::variant::void_; T
9 = boost::detail::variant::void_; T10 = boost::detail::variant::void_; T11 = bo
ost::detail::variant::void_; T12 = boost::detail::variant::void_; T13 = boost::d
etail::variant::void_; T14 = boost::detail::variant::void_; T15 = boost::detail:
:variant::void_; T16 = boost::detail::variant::void_; T17 = boost::detail::varia
nt::void_; T18 = boost::detail::variant::void_; T19 = boost::detail::variant::vo
id_]'
src/main.h:2166:142:   required from here
..\deps\boost_1_55_0/boost/variant/variant.hpp:1594:17: error: no matching funct
ion for call to 'boost::variant<CNoDestination, CKeyID, CScriptID>::initializer:
:initialize(void*, const int&)'
                 )
                 ^
..\deps\boost_1_55_0/boost/variant/variant.hpp:1594:17: note: candidates are:
In file included from ..\deps\boost_1_55_0/boost/variant/variant.hpp:33:0,
                 from ..\deps\boost_1_55_0/boost/variant.hpp:17,
                 from src/script.h:12,
                 from src/main.h:11,
                 from src/wallet.h:13,
                 from src/init.h:8,
                 from src\qt\bitcoin.cpp:13:
..\deps\boost_1_55_0/boost/variant/detail/initializer.hpp:104:24: note: static i
nt boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>
::initializer_node::initialize(void*, boost::detail::variant::make_initializer_n
ode::apply<BaseIndexPair, Iterator>::initializer_node::param_T) [with BaseIndexP
air = boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boos
t::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pa
ir<boost::detail::variant::initializer_root, mpl_::int_<0> >, boost::mpl::l_iter
<boost::mpl::list3<CNoDestination, CKeyID, CScriptID> > >::initializer_node, mpl
_::int_<1> >, boost::mpl::l_iter<boost::mpl::list2<CKeyID, CScriptID> > >::initi
alizer_node, mpl_::int_<2> >; Iterator = boost::mpl::l_iter<boost::mpl::list1<CS
criptID> >; boost::detail::variant::make_initializer_node::apply<BaseIndexPair,
Iterator>::initializer_node::param_T = const CScriptID&]
             static int initialize(void* dest, param_T operand)
                        ^
..\deps\boost_1_55_0/boost/variant/detail/initializer.hpp:104:24: note:   no kno
wn conversion for argument 2 from 'const int' to 'boost::detail::variant::make_i
nitializer_node::apply<boost::mpl::pair<boost::detail::variant::make_initializer
_node::apply<boost::mpl::pair<boost::detail::variant::make_initializer_node::app
ly<boost::mpl::pair<boost::detail::variant::initializer_root, mpl_::int_<0> >, b
oost::mpl::l_iter<boost::mpl::list3<CNoDestination, CKeyID, CScriptID> > >::init
ializer_node, mpl_::int_<1> >, boost::mpl::l_iter<boost::mpl::list2<CKeyID, CScr
iptID> > >::initializer_node, mpl_::int_<2> >, boost::mpl::l_iter<boost::mpl::li
st1<CScriptID> > >::initializer_node::param_T {aka const CScriptID&}'
..\deps\boost_1_55_0/boost/variant/detail/initializer.hpp:104:24: note: static i
nt boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>
::initializer_node::initialize(void*, boost::detail::variant::make_initializer_n
ode::apply<BaseIndexPair, Iterator>::initializer_node::param_T) [with BaseIndexP
air = boost::mpl::pair<boost::detail::variant::initializer_root, mpl_::int_<0> >
; Iterator = boost::mpl::l_iter<boost::mpl::list3<CNoDestination, CKeyID, CScrip
tID> >; boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iter
ator>::initializer_node::param_T = const CNoDestination&]
..\deps\boost_1_55_0/boost/variant/detail/initializer.hpp:104:24: note:   no kno
wn conversion for argument 2 from 'const int' to 'boost::detail::variant::make_i
nitializer_node::apply<boost::mpl::pair<boost::detail::variant::initializer_root
, mpl_::int_<0> >, boost::mpl::l_iter<boost::mpl::list3<CNoDestination, CKeyID,
CScriptID> > >::initializer_node::param_T {aka const CNoDestination&}'
..\deps\boost_1_55_0/boost/variant/detail/initializer.hpp:149:17: note: static v
oid boost::detail::variant::initializer_root::initialize()
     static void initialize();
                 ^
..\deps\boost_1_55_0/boost/variant/detail/initializer.hpp:149:17: note:   candid
ate expects 0 arguments, 2 provided
..\deps\boost_1_55_0/boost/variant/detail/initializer.hpp:104:24: note: static i
nt boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>
::initializer_node::initialize(void*, boost::detail::variant::make_initializer_n
ode::apply<BaseIndexPair, Iterator>::initializer_node::param_T) [with BaseIndexP
air = boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boos
t::mpl::pair<boost::detail::variant::initializer_root, mpl_::int_<0> >, boost::m
pl::l_iter<boost::mpl::list3<CNoDestination, CKeyID, CScriptID> > >::initializer
_node, mpl_::int_<1> >; Iterator = boost::mpl::l_iter<boost::mpl::list2<CKeyID,
CScriptID> >; boost::detail::variant::make_initializer_node::apply<BaseIndexPair
, Iterator>::initializer_node::param_T = const CKeyID&]
             static int initialize(void* dest, param_T operand)
                        ^
..\deps\boost_1_55_0/boost/variant/detail/initializer.hpp:104:24: note:   no kno
wn conversion for argument 2 from 'const int' to 'boost::detail::variant::make_i
nitializer_node::apply<boost::mpl::pair<boost::detail::variant::make_initializer
_node::apply<boost::mpl::pair<boost::detail::variant::initializer_root, mpl_::in
t_<0> >, boost::mpl::l_iter<boost::mpl::list3<CNoDestination, CKeyID, CScriptID>
 > >::initializer_node, mpl_::int_<1> >, boost::mpl::l_iter<boost::mpl::list2<CK
eyID, CScriptID> > >::initializer_node::param_T {aka const CKeyID&}'
In file included from ..\deps\boost_1_55_0/boost/system/system_error.hpp:14:0,
                 from ..\deps\boost_1_55_0/boost/thread/exceptions.hpp:22,
                 from ..\deps\boost_1_55_0/boost/thread/win32/thread_primitives.
hpp:16,
                 from ..\deps\boost_1_55_0/boost/thread/win32/basic_timed_mutex.
hpp:14,
                 from ..\deps\boost_1_55_0/boost/thread/win32/mutex.hpp:9,
                 from ..\deps\boost_1_55_0/boost/thread/mutex.hpp:14,
                 from src/allocators.h:10,
                 from src\qt\walletmodel.h:12,
                 from src\qt\bitcoin.cpp:9:
..\deps\boost_1_55_0/boost/system/error_code.hpp: At global scope:
..\deps\boost_1_55_0/boost/system/error_code.hpp:222:36: warning: 'boost::system
::posix_category' defined but not used [-Wunused-variable]
     static const error_category &  posix_category = generic_category();
                                    ^
..\deps\boost_1_55_0/boost/system/error_code.hpp:223:36: warning: 'boost::system
::errno_ecat' defined but not used [-Wunused-variable]
     static const error_category &  errno_ecat     = generic_category();
                                    ^
..\deps\boost_1_55_0/boost/system/error_code.hpp:224:36: warning: 'boost::system
::native_ecat' defined but not used [-Wunused-variable]
     static const error_category &  native_ecat    = system_category();
                                    ^
Makefile.Release:823: recipe for target 'build/bitcoin.o' failed
mingw32-make: *** [build/bitcoin.o] Error 1

kcaterpillar
Full Member
***
Offline Offline

Activity: 173
Merit: 100


View Profile
December 04, 2015, 05:33:31 PM
 #13

Т.е. вы меняете в структуре тип поля nTotalAmount на CTxDestination? Думаю, это не лучшее решение, не стоит так делать. Т.е. можно конечно, но перелопачивать слишком многое придётся.

Не думаю, что он реагирует как-то просто на имя nAdress. Поверьте, ему имя абсолютно все равно какое, лишь бы не было конфликта имён.

Что компилятор пишет, когда вы добавляете в структуру  поле uint64_t nAdress? Выложите всё сообщение об ошибке. Думаю, что добавить туда можно такое поле, если проблемы возникнут - они решаемы. С более сложными типами позже поэкспериментировать можно.
info_infoman (OP)
Sr. Member
****
Offline Offline

Activity: 460
Merit: 250



View Profile
December 04, 2015, 07:26:02 PM
 #14

да действительно, удалось добавить поле назвал его просто adr
сейчас тип данных простой int64

задача такая :
из main.cpp вызвать функцию GetStats используя в поле adr с типом данных CTxDestination

само сами данные для adr получаем так:

main.cpp
Quote
CTxDestination nAddress;
///nAddress; переменная в которую извлекается адрес из транзакции
if (ExtractDestination(coins.vout[txin.prevout.n].scriptPubKey, nAddress))
         {
         stats.adr=nAddress;
                        if(pcoinsTip->GetStats(stats)){......}

после этого программа извлекает данные из бд и кладет их обратно в stats

txdb.cpp
Quote
bool CCoinsViewDB::GetStats(CCoinsStats &stats) {
   leveldb::Iterator *pcursor = db.NewIterator();
        pcursor->SeekToFirst();
       
        CTxDestination fAddress;
   CCoinsStats stats;
       CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION);
   
        while (pcursor->Valid()) {
        boost::this_thread::interruption_point();
        try {
            leveldb::Slice slKey = pcursor->key();
            CDataStream ssKey(slKey.data(), slKey.data()+slKey.size(), SER_DISK, CLIENT_VERSION);
            char chType;
            ssKey >> chType;
            if (chType == 'c') {
                leveldb::Slice slValue = pcursor->value();
                CDataStream ssValue(slValue.data(), slValue.data()+slValue.size(), SER_DISK, CLIENT_VERSION);
                CCoins coins;
                ssValue >> coins;
                uint256 txhash;
                ssKey >> txhash;
                ss << txhash;
                ss << VARINT(coins.nVersion);
                ss << (coins.fCoinBase ? 'c' : 'n');
                ss << VARINT(coins.nHeight);
            
                for (unsigned int i=0; i<coins.vout.size(); i++) {
                    const CTxOut &out = coins.vout;
                    if (!out.IsNull()) {
                        ss << VARINT(i+1);
                        ss << out;
                       
                  if (ExtractDestination(out.scriptPubKey, fAddress))
                     {
                        if (stats.adr==fAddress){.....}
..........

может это извращенный способ но я только такой нашел...
это для того чтобы посчитать баланс чужого адреса на который направляются средства из проверяемой транзакции

вопрос как в структуру этот тип данные с типом CTxDestination засунуть?
все оатльное вроде работает....

info_infoman (OP)
Sr. Member
****
Offline Offline

Activity: 460
Merit: 250



View Profile
December 04, 2015, 07:36:02 PM
 #15

можно конечно использовать функционал script_to_json с последующей выборкой поля address  с последующим переводом в простой тип std::string но это еще 2 десятка строк кода что не камильфо....

kcaterpillar
Full Member
***
Offline Offline

Activity: 173
Merit: 100


View Profile
December 04, 2015, 08:01:36 PM
 #16


вопрос как в структуру этот тип данные с типом CTxDestination засунуть?
все оатльное вроде работает....

Вот определение типа CTxDestination в script/standard.h

typedef boost::variant<CNoDestination, CKeyID, CScriptID> CTxDestination;

Вам нужно сделать, чтобы он видел  это в coins.h


В принципе, как вариант,  вы можете создать свой тип, который потом можно будет привести к CTxDestination, но я просто деталей не вижу сразу, возможно это не просто. Так же возможен ещё вариант, передавайте через указатель, т.е. в структуре стат определите пустой указатель, потом в коде, где нужно присвойте ему указатель на тип CTxDestination, и потом разыменовываете его в вашу переменную уже типа CTxDestination.
kcaterpillar
Full Member
***
Offline Offline

Activity: 173
Merit: 100


View Profile
December 04, 2015, 08:04:27 PM
 #17

Но лучше конечно сразу сделайте так, чтобы он видел определение типа CTxDestination в coins.h

Посмотрите там инклюды все, насколько это возможно всё.
info_infoman (OP)
Sr. Member
****
Offline Offline

Activity: 460
Merit: 250



View Profile
December 04, 2015, 09:00:03 PM
 #18

Но лучше конечно сразу сделайте так, чтобы он видел определение типа CTxDestination в coins.h

Посмотрите там инклюды все, насколько это возможно всё.

там есть инклюды script но это не помогает, видимо CTxDestantion какой то сложный тип и в поле сруктуры просто так его не загнать....
я сделал так:

Code:
CTxDestination nAddress;
CBitcoinAddress adrr;
set<COutPoint> vInOutPoints;
CCoinsStats stats;
CCoinsViewCache view(*pcoinsTip, true);
    BOOST_FOREACH(const CTxIn& txin, vin)
    {
if (view.HaveCoins(txin.prevout.hash))
        {
const CCoins &coins = view.GetCoins(txin.prevout.hash);
int64 nValueIn = coins.vout[txin.prevout.n].nValue;
if (ExtractDestination(coins.vout[txin.prevout.n].scriptPubKey, nAddress))
{
if (adrr.Set(nAddress))
{
stats.adr=adrr.ToString();
if(pcoinsTip->GetStats(stats)){}
 

перевел CTxDestantion nAddress в простую строку а на выходе тоже самое сделал с данными из базы данных и тупо строки сравнил

теперь все это оптимизировать и разбить функцию GetCoins на обычную и мою, ну это легко будет...

все ок Grin скомпилировалось!
большое спасибо за помощь! дойду до релиза, вас не забуду!

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!