Как сгенерировать собственный адрес Segwit и адрес P2SH Segwit из стандартного WIF?

Могу ли я получить шаги для создания собственного адреса Segwit из стандартного WIF? И шаги для создания адреса P2SH Segwit из того же WIF?

Чем отличаются эти два формата и почему их два? Я видел, что версия P2SH совместима со старыми клиентами, а собственные адреса Segwit — нет?

Ответы (1)

wif -> закрытый ключ

  • Используйте base58-decode для преобразования строки base58 в байты
  • Удалите первый байт (сетевой байт) и последние 4 байта (контрольная сумма). Остальное - ключ
  • Убедитесь, что первые 4 байта sha256(sha256(сетевой байт || ключ)) равны контрольной сумме
  • Если ключ заканчивается на 0x01(сжатый), удалите последний байт. У вас остался закрытый ключ

закрытый ключ -> открытый ключ

  • Приведите закрытый ключ как целое число
  • Умножьте на точку генератора secp256k1, чтобы получить точку (x, y) на кривой. Это ваш открытый ключ

  • Закодируйте свой открытый ключ в сжатом формате. Байт 0x03(если y нечетный) или 0x02(если y четный), за которым следует x как 256-битное целое число

Открытый ключ -> адрес P2WPKH

  • Создайте программу-свидетель = ripemd160(sha256(открытый ключ))
  • Закодируйте в bech32 , предоставив программу-свидетель, bcкак удобочитаемую часть и 0как версию-свидетель.

Открытый ключ -> адрес P2SH-P2WPKH

  • Создайте программу-свидетель = ripemd160(sha256(открытый ключ))
  • Создайте сценарий выкупа = 0x0014<witness program>= свидетельская версия + push20 + свидетельская программа
  • Вычислить hash160 = ripemd160(sha256(сценарий))
  • Добавьте к хэшу байт версии0x05
  • Вычислить контрольную сумму = sha256(sha256(байт версии || хэш-код))
  • Кодировка Base58 (байт версии || хеш-код || первые 4 байта контрольной суммы)

Чем отличаются эти два формата и почему их два? Я видел, что версия P2SH совместима со старыми клиентами, а собственные адреса Segwit — нет?

Старые клиенты не могут отправлять на адреса segwit, но они могут отправлять на адреса P2SH и, соответственно, на P2SH-P2WPKH.

Есть ли инструмент, который я могу использовать для проверки правильности моих адресов segwit во время тестирования?
@arshbot Я использую эту библиотеку Python (отказ от ответственности: я написал ее) github.com/mcdallas/cryptotools , а также есть этот онлайн-инструмент, но он не поддерживает segwit gobittest.appspot.com