Как проверить, является ли это транзакцией Segwit или нет?

Пример диаграммы использования Segwit: https://p2sh.info/dashboard/db/segwit-usage?orgId=1

Я хотел бы проверить, проверив tx, является ли это транзакцией Segwit или нет.

Есть ли простой способ сделать это?

  • legacy -> P2SH tx (это транзакция Segwit?)
  • P2SH -> устаревший tx (это транзакция Segwit?)
  • bech32 -> устаревший tx (это транзакция Segwit?)

А как насчет того, когда в качестве входов и выходов задано множество типов адресов?

Ответы (1)

Транзакция является segwit tx, если хотя бы один из входов содержит свидетеля. Или, если вы проверяете необработанный tx, вы проверяете 5-й байт (количество входов), и если это так, то 0x00это segwit tx.

Пример: тх1

02000000 05 5f4e5315ffe854e75db92f8dda952a8db2f63b37838fca4c32bd4bb692fe7ea2000000006a47304402200ab62a9d1858dceeaa2101cda3f31b7bae60471c0355c54a6eae48f723555806022010d2aad6362a8c56ed66b0670ff84175f534f4f0995f8724a9b2a5fc89a2a4b4012102c424c2670a7aade9cf867576064013d02cc7669c418968993e73e6b25fc122bcfeffffff80cb1bfcde0f309490c717eca07f1353f121fb13e105...

не является segwit tx, потому что количество входов 0x05= 5

тх2

01000000 00 010106325bac2f2e7ca67fa46c8304fb3b747e5578df1eef0394349ce2cdd744f7f10100000000ffffffff02db355202000000001976a91489ea1263056ac068adba4844efb376a3a19635ad88ac43b72f07000000002...

является segwit tx, потому что количество входов 0x00= 0

Также:

  • Транзакции, использующие входы P2PKH (адрес, начинающийся с 1), не могут быть segwit.
  • Транзакции, расходующие входные данные P2SH, будут segwit, если они являются вложенными P2SH, в противном случае — нет.
  • Транзакции, тратящие P2WPKH или P2WSH (начиная с bc1), будут segwit.

В вашем примере:

наследие -> P2SH

Это не может быть segwit tx, потому что он использует входные данные с устаревшего адреса.

P2SH -> наследие

Это может быть segwit tx, если адрес P2SH-P2WPKH или P2SH-P2WSH (вложенный segwit в P2SH). Вы не узнаете, является ли он вложенным, если он не ваш, если только кто-то уже не потратил его (в этом случае вы проверяете транзакцию расходов).

bech32 -> наследие

Это всегда segwit tx