24 июля 2010, 1:27:32 AM   # 1
 
 
Сообщений: 16
Цитировать по имени
цитировать ответ
по умолчанию Re: Чтение / запись блоков и FLATDATA

Взлом Биткоин адресов.
500 Биткоинов взломаны в "мозговом кошельке" с паролем "bitcoin is awesome"
Адрес кошелька: 14NWDXkQwcGN1Pd9fboL8npVynD5SfyJAE
Приватный ключ: 5J64pq77XjeacCezwmAr2V1s7snvvJkuAz8sENxw7xCkikceV6e
подробнее...


Всем кто хочет заработать Биткоины без вложений - рекомендую сайт http://bitcoin-zarabotat.ru
Я пытаюсь понять, как Bitcoin хранит блок данных - среди других вещей, которые я хочу, чтобы запустить некоторые статистические данные о блочной истории цепи / сделки и проверить, насколько анонимными Bitcoin на самом деле. Так что я пошел к источнику, чтобы увидеть, как Bitcoin чтения / записи данных блока в файл.

(ЕТ: это в 0.3.2)

В main.h мы имеем:

Код: (CBlock :: WriteToDisk)
BOOL WriteToDisk (BOOL fWriteTransactions, неподписанных INT& nFileRet, беззнаковое целочисленное значение& nBlockPosRet)

    // Открыть файл истории для добавления
    CAutoFile fileout = AppendBlockFile (nFileRet);
    если (! fileout)
        возвращать ошибку ("CBlock :: WriteToDisk (): AppendBlockFile не удалось");
    если (! fWriteTransactions)
        fileout.nType

а также

Код: (CBlock :: ReadFromDisk)
BOOL ReadFromDisk (неподписанных INT nFile неподписанные INT nBlockPos, BOOL fReadTransactions = истина)
= SER_BLOCKHEADERONLY;

    // Читает блок
    filein >> *это;

    // Проверка заголовка
    если (CBigNum (). SetCompact (Nbits) > bnProofOfWorkLimit)
        возвращать ошибку ("CBlock :: ReadFromDisk (): Nbits ошибки в заголовке блока");
    если (GetHash () > CBigNum (). SetCompact (Nbits) .getuint256 ())
        возвращать ошибку ("CBlock :: ReadFromDisk (): GetHash () ошибки в заголовке блока");

    возвращает истину;


FLATDATA определяется в serialize.h следующим образом:
Код: (FLATDATA)
//
// Wrapper для сериализации массивов и POD
// Там умный шаблон способ сделать массивы сериализации нормально, но MSVC6 не поддерживает
//
#define FLATDATA (объект) REF (CFlatData ((символ *)&(Объект), (символ *)&(OBJ) + SizeOf (OBJ)))
класс CFlatData
{
защищенный:
    символ * pbegin;
    символ * ПЭНД;
общественности:
    CFlatData (недействительный * pbeginIn, недействительный * pendIn): pbegin ((символ *) pbeginIn), ПЭНД ((символ *) pendIn) {}
    символ * начать () {возвращение pbegin; }
    Const символ * начинается () сопзЬ {возвращение pbegin; }
    символ * конец () {вернуться PEND; }
    Const символ * конец () сопзЬ {вернуть PEND; }

    беззнаковое INT GetSerializeSize (INT, INT = 0) Const
    {
        вернуться PEND - pbegin;
    }

    шаблон<имяТипа поток>
    аннулированию Serialize (поток& с, INT, INT = 0) Const
    {
        s.write (pbegin, ПЭНД - pbegin);
    }

    шаблон<имяТипа поток>
    аннулированию десериализируются (поток& с, INT, INT = 0)
    {
        s.read (pbegin, ПЭНД - pbegin);
    }
};

Теперь - и я прошу прощения, если я читаю это неправильно, это немного более продвинутый C код / ​​C ++, чем я привык - как я понимаю, вызов FLATDATA интерпретирует исходные байты объекта CBlock как массив ( поток ??) символов. Метод CBlock :: WriteToDisk пишет постоянный 4-байтовый заголовок сообщения (0xf9, 0xbe, 0xb4, 0xd9), размер объекта CBlock в байтах, а затем FLATDATA из CBlock это писать на диск - который только сырье байтов объекта CBlock. Таким образом, после того, как заголовок, данные, записанные в файле байт-в-байт такой же, как объект CBlock, представленного в памяти. Кроме того, если я правильно читать, CBlock :: ReadFromFile копирует эти байты непосредственно в пространство, выделенное для объекта CBlock в памяти, чтобы заново создать блок. Это верно?

Связанный с этим вопрос - я нахожусь под впечатлением, что точный способ экземпляр C ++ класс представляется внутренне не гарантирован по стандартам; компиляции программы с разными компиляторами или разными флагами оптимизации можно изменить порядок, в котором переменные-члены хранятся в памяти, и некоторые компиляторы режим отладки даже добавить несколько байтов между переменными-членами, чтобы сделать осмотр памяти проще. Я не уверен по этому поводу, это просто то, что я взял и никогда серьезно не подвергается сомнению.
Hepatizon сейчас офлайн Пожаловаться на Hepatizon   Ответить с цитированием Мультицитирование сообщения от Hepatizon Быстрый ответ на сообщение Hepatizon


Как заработать Биткоины?
Без вложений. Не майнинг.


24 июля 2010, 1:44:02 AM   # 2
 
 
Сообщения: 1652
Цитировать по имени
цитировать ответ
по умолчанию Re: Чтение / запись блоков и FLATDATA

Получил 1806 Биткоинов
Реальная история.





Они ключевые фрагменты кода являются:
Код:
fileout << FLATDATA (pchMessageStart) << nРазмер:;
...
fileout << *это;
pchMessageStart являются четырьмя волшебными байтами, и те, которые написаны с FLATDATA.

CBlock сама написана << * Это, и это делается с помощью IMPLEMENT_SERIALIZE в main.h:
Код:
    IMPLEMENT_SERIALIZE
    (
        READWRITE (this->nVersion);
        nVersion = этом->nVersion;
        READWRITE (hashPrevBlock);
        READWRITE (hashMerkleRoot);
        READWRITE (Ntime);
        READWRITE (Nbits);
        READWRITE (nNonce);

        // ConnectBlock зависит от фл будучи последним, поэтому он может вычислить смещение                                             
        если (! (nType & (SER_GETHASH | SER_BLOCKHEADERONLY)))
            READWRITE (VTX);
        иначе если (Fread)
            const_cast(это)->vtx.clear ();
    )

В READWRITE макросы Do The Right Thing, чтение или выписывая членов в машинно-независимым способом.

Видеть http://github.com/gavinandresen/bitcointools для упрощенного кода Python, который может разгружать транзакции и блоки.

Гэвин Андресен сейчас офлайн Пожаловаться на Гэвин Андресен   Ответить с цитированием Мультицитирование сообщения от Gavin Andresen Быстрый ответ на сообщение Гэвин Андресен

24 июля 2010, 2:53:05 AM   # 3
 
 
Сообщений: 16
Цитировать по имени
цитировать ответ
по умолчанию Re: Чтение / запись блоков и FLATDATA

Спасибо за очистку, что для меня.

Я продолжаю делать действительно элементарные ошибки коды ....
Hepatizon сейчас офлайн Пожаловаться на Hepatizon   Ответить с цитированием Мультицитирование сообщения от Hepatizon Быстрый ответ на сообщение Hepatizon

24 июля 2010, 4:04:20 AM   # 4
 
 
Сообщения: 364
Цитировать по имени
цитировать ответ
по умолчанию Re: Чтение / запись блоков и FLATDATA

FLATDATA был обходным путем для сериализации массива фиксированной длиной поля. Был уборщиком способ сделать это понять, как сериализовать массивы непосредственно, но MSVC6 не мог сделать это, и я хотел, чтобы сохранить совместимость с MSVC6 в то время. Мы больше не поддерживаем MSVC6, потому что мы используем что-то в Boost, который не делает. Мы потеряли его поддержку после 0.2.0. Может быть, когда-нибудь я буду менять в чистом виде, что просто знает, как сериализовать массивы фиксированной длины без упаковки их в FLATDATA.
Satoshi сейчас офлайн Пожаловаться на Satoshi   Ответить с цитированием Мультицитирование сообщения от Satoshi Быстрый ответ на сообщение Satoshi

24 июля 2010, 10:59:02 PM   # 5
 
 
Сообщений: 70
Цитировать по имени
цитировать ответ
по умолчанию Re: Чтение / запись блоков и FLATDATA

Я бы очень признателен некоторые рука повторно демпинг блок данных в текстовый файл.

Я не программист, и Python Гэвин Андресен является в значительной степени непроницаемой для меня.

Я данных (SQL) выродок, и хотел бы проанализировать историю транзакций Bitcoin, сосредоточив внимание на состав роя и тому подобное. Я особенно заинтересован в подходах для обнаружения атак.

Спасибо за любую помощь, которую вы все могут предоставить.
Ichi сейчас офлайн Пожаловаться на ити   Ответить с цитированием Мультицитирование сообщения от ити Быстрый ответ на сообщение ити



Как заработать Биткоины?

Bitcoin Wallet * Portefeuille Bitcoin * Monedero Bitcoin * Carteira Bitcoin * Portafoglio Bitcoin * Bitcoin Cüzdan * 比特币钱包

bitcoin-zarabotat.ru
Почта для связи: bitcoin-zarabotat.ru@yandex.ru

3HmAQ9FkRFk6HZGuwExYxL62y7C1B9MwPW