Към съдържанието
ДаретеEN

Данни

Little-endian

Little-endian в биткойн записва първо младшия байт. Повечето числа в трансакциите и заглавията на блоковете са в този ред. Научете как да ги четете.

От Dimitar Zurnov · Обновено на 4 ноември 2026
Адаптирано от Learn Me a Bitcoin на Greg Walker.

Little-endian записва байтовете на едно число, като започва с младшия, тоест най-малко значимия байт. Биткойн го използва почти за всяко число в суровите трансакции и заглавията на блоковете, включително суми на изходи, версии и времеви клейма. За да прочетете такова поле, обърнете байтовете му и после прочетете резултата като обикновено hex число.

Как изглежда little-endian?

Вземете 12,345,678 сатоши в поле за сума от 8 байта. Като hex число това е 0xBC614E. Допълнено до осем байта, big-endian записът започва със старшия байт, а little-endian записът започва с младшия. Байтовете са едни и същи и в двата. Различава се само редът им.

12,345,678 в 8 байта: big-endian 00 00 00 00 00 bc 61 4e, little-endian 4e 61 bc 00 00 00 00 00. 12,345,678 сатоши в 8 байта Big-endian: първо старшият байт 00 00 00 00 00 bc 61 4e Little-endian: първо младшият байт 4e 61 bc 00 00 00 00 00 4e е младшият байт, затова стои първи. 12,345,678 е 0xBC614E в hex. Пет от осемте байта са нули.
Същите осем байта в два реда. Little-endian започва с 4e.

Тук само три от осемте байта носят данни, а останалите пет са нули. Полето може да съхрани число до 0xFFFFFFFFFFFFFFFF, което е 18,446,744,073,709,551,615. Реалните суми са много по-малки, защото общото предлагане е 21 милиона BTC, или 2,100,000,000,000,000 сатоши.

Как е подредено в паметта?

Паметта пази по един байт на всеки адрес. Big-endian пази старшия байт на най-ниския адрес, така че числото се чете отляво надясно, както го пишат хората. Little-endian прави обратното: пази младшия байт на най-ниския адрес, така че числото започва с най-малката си част.

Биткойн записва тези полета по този начин, затова те изглеждат обърнати, когато четете hex.

Защо се казва little-endian?

Името идва от Пътешествията на Гъливер на Джонатан Суифт (1726). В книгата две групи спорят дали да счупят сварено яйце от малкия или от големия край. Компютърните специалисти заимстват имената за двата начина на подреждане на байтовете. Статията за endianness в английската Уикипедия разказва историята и хардуерната страна.

Кои полета ползват little-endian?

Почти всяко поле, което пази число. Таблицата показва реални стойности, декодирани от суровите данни, с полетата, както се срещат в биткойн.

Поле Размер Hex в суровите данни Стойност
Transaction version 4 байта 02000000 2
Input vout 4 байта 01000000 1
Input sequence 4 байта fdffffff 4,294,967,293
Output amount 8 байта 2a5f020000000000 155,434 сатоши
Block version 4 байта 00000020 536,870,912
Block time 4 байта daf0d861 1,641,607,386
Block bits 4 байта ab980b17 386,635,947
Block nonce 4 байта 0e69d05c 1,557,162,254

Числата в последните четири реда са от заглавието на блок 717,664. Времето му е Unix времево клеймо. Записаните байтове, daf0d861, прочетени в big-endian ред като 61d8f0da, дават 1,641,607,386. Този момент е 8 януари 2022 г., 02:03:06 UTC.

Вътре в трансакция версията, vout, sequence, сумата и locktime са little-endian.

Хешовете са изключение. Хешът е низ от байтове, а не число, затова никога не се чете като little-endian. Редът, в който се показва, е описан на страницата за реда на байтовете. Броевете и дължините ползват compact size, който е little-endian само в многобайтовите си форми.

Как превръщаме little-endian число?

Обръщате байтовете и после прочитате резултата като big-endian. Python може да направи и двете стъпки. Аргументът "little" казва на to_bytes и from_bytes да ползват little-endian реда:

amount = 12345678
# осем байта, най-младшият първи
le = amount.to_bytes(8, "little")
# 4e61bc0000000000
print(le.hex())
# 12345678
print(int.from_bytes(le, "little"))

Модулът struct на Python прави същото с форматен низ. Знакът < означава little-endian, а буквата след него задава размера: H е 2 байта, I е 4 байта, а Q е 8 байта. Така struct.pack("<Q", amount) дава същите осем байта. Методът pack на Ruby работи с подобна идея, с Q< за 8-байтово little-endian цяло число.

Ако имате само hex текста, обърнете двойките цифри. Например bytes.fromhex("daf0d861")[::-1].hex() дава 61d8f0da.

За да разберете дали вашата машина е little-endian, изпълнете sys.byteorder в Python. Повечето компютри печатат little.

Има ли изключения?

Да, и най-полезното е в мрежата. Портовете и IP адресите в мрежовите съобщения са big-endian. В съобщението version стандартният mainnet порт 8333 е записан като 208d, със старшия байт първи. Правилото е да проверите определението на полето, а не да предполагате.

Откъде идва little-endian?

Обичайното обяснение е, че Сатоши е писал софтуера на машина с little-endian. Повечето процесори в употреба днес работят така. Много разработчици биха предпочели big-endian, защото съвпада с начина, по който хората пишат числата. Разработчиците спорят за това от 2011 година.

Някои разработчици посочват, че big-endian навсякъде би съвпаднал с обратното показване на хешовете. Други, включително Pieter Wuille, разработчик на Bitcoin Core, са отбелязали, че процесорите работят нативно в little-endian. Така изборът важи по-малко, отколкото хората смятат. Промяната на едно поле би счупила всяка трансакция и всеки блок, затова на практика редът е фиксиран.

След като знаете реда, прочетете следващата страница за compact size. Многобайтовите му стойности също са little-endian.

В този раздел: Данни

Целият курс „Биткойн от нулата“

Нещо не изглежда наред? Кажете ни