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 записът започва с младшия. Байтовете са едни и същи и в двата. Различава се само редът им.
Тук само три от осемте байта носят данни, а останалите пет са нули. Полето може да съхрани число до 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.
В този раздел: Данни
Целият курс „Биткойн от нулата“
Нещо не изглежда наред? Кажете ни