Генерация адреса бумажного кошелька SegWit

Я пытаюсь сгенерировать адрес бумажного кошелька SegWit из WIF:

Мой вайфай такой L5mHKZsCLS27nSoGM3RdAwuxjvg7XhJdP25LgqdXe6zF11wpWdbT.

Я конвертирую WIF в сжатый открытый ключ:

Сжатый открытый ключ:03fac6879502c4c939cfaadc45999c7ed7366203ad523ab83ad5502c71621a85bb

Я создаю адрес P2SH-P2WPKH, используя инструкции в разделе Создание адреса P2SH-P2WPKH.

по следующему алгоритму:

  1. Рассчитайте RIPEMD160 SHA256 открытого ключа:

SHA256 открытого ключа:cfad24b0bc2bba2c8bb2c8d619dca2b74221930793bca50df73856f0bbba10c9

RIPEMD160 хэша SHA256:d5e5d05edfe2ed61099bf3f0d53be2775bbc6d0d

  1. Создайте P2SH redeemScript как OP_PUSH publicKeyHash:

искупитьСценарий:0014d5e5d05edfe2ed61099bf3f0d53be2775bbc6d0d

  1. Сгенерировать scriptPubKey какOP_HASH160 hash160(redeemScript) OP_EQUAL

СкриптПубКей:a914a19949e546c2f4d410cbb061c986b9ff3099ae7087

  1. Сгенерируйте хэш RIPEMD160 scriptPubKey:

хэш:dc62e525af22d1f0f17cc2a091cf2c9fb36bf553

  1. Генерируем адрес с 0x05префиксом и двойной контрольной суммой SHA256:

результат:3MnK46gvixm8hk7mJTQTAqenniSodjXPrJ

Ожидаемый результат согласно segwitaddress :

33voQqbNAYyig272KjcX8GkucWn2x25WEg

Что я делаю не так?

Обновлять

Благодаря принятому ответу, вот правильные шаги для этого:

Public key - compressed: 
03fac6879502c4c939cfaadc45999c7ed7366203ad523ab83ad5502c71621a85bb

SHA256(public key) =
cfad24b0bc2bba2c8bb2c8d619dca2b74221930793bca50df73856f0bbba10c9

RIPEMD160(SHA256(public key)) =
7646c030f7e75b80f0a31cdcab731e6f424f22b2

redeemScript (OP_0 pubkeyHash160):
00147646c030f7e75b80f0a31cdcab731e6f424f22b2

SHA256(redeemScript) =
a10e523968ba784d24ccd54e613d8f747d6649e42b1df4fdcec6658262620651

RIPEMD160(SHA256(redeemScript)) =
188ba16284702258959d8bb63bb9a5d979b57875

P2SH address base58(0x05 | hash | 4-byte sha256 checksum) =
33voQqbNAYyig272KjcX8GkucWn2x25WEg

Ответы (1)

  1. Создайте P2SH redeemScript как OP_PUSH publicKeyHash:

искупитьСценарий:0014d5e5d05edfe2ed61099bf3f0d53be2775bbc6d0d

На самом деле это `OP_0, но вы все равно пришли к правильному результату.

  1. Сгенерировать scriptPubKey какOP_HASH160 hash160(redeemScript) OP_EQUAL

СкриптПубКей:a914a19949e546c2f4d410cbb061c986b9ff3099ae7087

  1. Сгенерируйте хэш RIPEMD160 scriptPubKey:

хэш:dc62e525af22d1f0f17cc2a091cf2c9fb36bf553

Эти шаги неверны. То, что хэшируется для адреса P2SH, — это redeemScript, а не scriptPubKey. Вместо шага 3 вы сразу переходите к шагу 4 и хешируете redeemScript вместо scriptPubKey.

Привет, Андрей, я надеялся, что ты поможешь. Я думаю, что я не правильно генерирую контрольную сумму. Перед кодировкой base58 у меня есть следующая строка: 05188ba16284702258959d8bb63bb9a5d979b5787555c30444. После base58 это 33voQqbNAYyig272KjcX8GkucWn2uJk5WT. Последние 6 символов неверны. В какой части я ошибаюсь?
@ user2298995 Ваша контрольная сумма неверна. Шестнадцатеричный код должен быть 05188BA16284702258959D8BB63BB9A5D979B57875BFE2FCFD.
Большое спасибо за ваш комментарий! Как тогда генерируется контрольная сумма? Я взял 4 байта sha256(sha256(redeemScript)). Разве это не правильный путь?
Нет, это первые 4 байта sha256 (sha256 (полезная нагрузка)), где полезная нагрузка — это данные, которые вы кодируете с помощью кодировки проверки base58. В этом случае полезная нагрузка равна 05188BA16284702258959D8BB63BB9A5D979B57875.
О, большое спасибо. Очень ценю!