Я просматриваю исходный код клиента сатоши, особенно то, как транзакции сериализуются и отправляются по сети или сохраняются на диск.
В CTransaction
классе есть этот блок:
IMPLEMENT_SERIALIZE
(
READWRITE(this->nVersion);
nVersion = this->nVersion;
READWRITE(vin);
READWRITE(vout);
READWRITE(nLockTime);
)
Если я не ошибаюсь, часть сериализации IMPLEMENT_SERIALIZE
расширяется до:
template<typename Stream>
void Serialize(Stream& s, int nType, int nVersion) const
{
CSerActionSerialize ser_action;
const bool fGetSize = false;
const bool fWrite = true;
const bool fRead = false;
unsigned int nSerSize = 0;
assert(fGetSize||fWrite||fRead); /* suppress warning */
{
(nSerSize += ::SerReadWrite(s, (this->nVersion), nType, nVersion, ser_action))
nVersion = this->nVersion;
(nSerSize += ::SerReadWrite(s, (vin), nType, nVersion, ser_action))
(nSerSize += ::SerReadWrite(s, (vout), nType, nVersion, ser_action))
(nSerSize += ::SerReadWrite(s, (nLockTime), nType, nVersion, ser_action))
}
}
Давайте nLockTime
пока сосредоточимся на том, что представляет собой файл unsigned int
. SerReadWrite
определяется как:
template<typename Stream, typename T>
inline unsigned int SerReadWrite(Stream& s, const T& obj, int nType, int nVersion, CSerActionSerialize ser_action)
{
::Serialize(s, obj, nType, nVersion);
return 0;
}
Функция Serialize
для unsigned int
s определяется как:
template<typename Stream>
inline void Serialize(Stream& s, unsigned int a, int, int=0) {
WRITEDATA(s, a);
}
Что расширяется до:
template<typename Stream>
inline void Serialize(Stream& s, unsigned int a, int, int=0) {
s.write((char*)&(a), sizeof(a))
}
Итак, это преобразует 4 байта unsigned int
в a, char*
а затем записывает его в поток.
Однако не будет ли это иметь другой результат на машинах с обратным порядком байтов по сравнению с машинами с прямым порядком байтов? Как к этому относится клиент? Или протокол определен в терминах прямого порядка байтов, и на машинах, на которых построен клиент сатоши, он просто работает?
Ответ прост: архитектуры с обратным порядком байтов не поддерживаются .
Нейт Элдридж
Клаудиу
nType
является одним изSER_NETWORK
,SER_DISK
иSER_GETHASH
, поэтому я думаю, что этот код также используется для этого. (это третий параметр дляSerialize
, а не безымянный, потому что он не используется). Это похоже на ошибку новичка, поэтому я и спрашиваю!Питер Мортенсен
Клаудиу