Pages:
Author

Topic: Исходники bitcoin - page 2. (Read 5484 times)

legendary
Activity: 3108
Merit: 1359
May 12, 2012, 06:09:22 PM
#7
Вышеприведенный код работает нормально на большинстве платформ, потому что размер структуры 80 байт ( кратно 2 и 8 ) . Со структурой других размеров (81 байт, к примеру) данный код уже неработоспособен без #pragma pack(push, 1) ... #pragma pack(pop). Но структура не может иметь размер, отличный от 80 байт, потому что заголовок блока всегда имеет размер 80 байт, это требование протокола, поэтому можно не думать о выравнивании.
sr. member
Activity: 658
Merit: 250
May 12, 2012, 02:44:36 PM
#6
здесь вообще зависимость от little-endian и big-endian


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

да и ХЭШ(&int) в little-endian и big-endian по-любому разный будет, не нужно так много строк кода приводить для того, чтобы это показать...
legendary
Activity: 1286
Merit: 1004
May 12, 2012, 01:57:06 PM
#5
здесь вообще зависимость от little-endian и big-endian
legendary
Activity: 1120
Merit: 1069
May 12, 2012, 02:57:22 AM
#4
хм, а как это собирается на x86_64 платформе О_о, я имею в виду int
p.s. не ожидал, как минимум прагма и __int32 должны были стоять.
sr. member
Activity: 658
Merit: 250
May 12, 2012, 02:18:01 AM
#3
меня в этой конструкции только отсутствие pragma pack смущает. Но все так пишут и это, обычно, работает.
Написане кода - всегда компромис Smiley
LZ
legendary
Activity: 1722
Merit: 1072
P2P Cryptocurrency
May 11, 2012, 03:13:55 PM
#2
Главное, чтобы работало. Cool
legendary
Activity: 1286
Merit: 1004
May 11, 2012, 12:25:49 AM
#1
Это так круто брать хеш ?  Shocked
Я уже боюсь дальше читать )
Кто считает что это нормальный способ, и этот способ не зависит от архитектуры компьютера ?

Code:
#define BEGIN(a)            ((char*)&(a))
#define END(a)              ((char*)&((&(a))[1]))

class CBlock
{
public:
    // header
    int nVersion;
    uint256 hashPrevBlock;
    uint256 hashMerkleRoot;
    unsigned int nTime;
    unsigned int nBits;
    unsigned int nNonce;

    uint256 GetHash() const
    {
        return Hash(BEGIN(nVersion), END(nNonce));
    }


Code:
inline uint256 Hash(const T1 pbegin, const T1 pend)
{
    static unsigned char pblank[1];
    uint256 hash1;
    SHA256((pbegin == pend ? pblank : (unsigned char*)&pbegin[0]), (pend - pbegin) * sizeof(pbegin[0]), (unsigned char*)&hash1);
    uint256 hash2;
    SHA256((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2);
    return hash2;
}
Pages:
Jump to: