richardkiss / pycoin

Python-based Bitcoin and alt-coin utility library.
MIT License
1.4k stars 497 forks source link

generates invalid segwit address for altcoins #323

Open jeremyandrews opened 5 years ago

jeremyandrews commented 5 years ago

Generating addresses with ku or the underlying code does not seem to produce valid segwit addresses. For example, with Litecoins:

# ku create -n LTC

input                         : create
network                       : Litecoin mainnet
netcode                       : LTC
wallet key                    : Ltpv71G8qDifUiNesqu6AyN8g4qLywcLjUwGagMKwqN12WYVJady9shLQZmtU67wRH\
                                  Gbv9rspZXZmpn5eS4hXq59w4mDo8UEQEstSrxgUgjXpvJ
public version                : Ltub2SSUS19CirucVibvRarWkefZRWJXojVvfCTMcp8HxhL5twq3UnjmRAt9iVTpNR\
                                  CGG5Bv691NAkCMRzBuZ7TiY9DLeTvUHub6e1GssBHKM6t
tree depth                    : 0
fingerprint                   : c42f17d0
parent f'print                : 00000000
child index                   : 0
chain code                    : 513561b9bc0c910dec3b8352995ff41bf7aabd4d3bea6cd4590e6f68c9c98d29
private key                   : yes
secret exponent               : 34575236147056911239591035144402508862646266482272128134893335817312484427212
 hex                          : 4c70e3e1c8059b82e48412092e5373e9443d120a6f673dfc6eeaeea9f3a385cc
wif                           : T5cZvST6NXerBMFZodArYChaYNJvjre9SgesNWtLdsXBUViTTFmf
 uncompressed                 : 6uhgdaQaqqBPUGTs2W3EVNEGkoyAuksZGngr2FUVTw3JnDXEmEn
public pair x                 : 57533722974472304867416126916841714930993964699739747175225683981194744586833
public pair y                 : 30756973524015994330496347975877951914923254549199421294852357952864945322497
 x as hex                     : 7f32eee749e0f4432c23e2bbc55f19aa40d2d70b01620cfe9140b6fa63106251
 y as hex                     : 43ffd481b7d5992e07e5c72a2ebfe09a36b76c4bf79fe712f0c3007c12f63a01
y parity                      : odd
key pair as sec               : 037f32eee749e0f4432c23e2bbc55f19aa40d2d70b01620cfe9140b6fa63106251
 uncompressed                 : 047f32eee749e0f4432c23e2bbc55f19aa40d2d70b01620cfe9140b6fa63106251\
                                  43ffd481b7d5992e07e5c72a2ebfe09a36b76c4bf79fe712f0c3007c12f63a01
hash160                       : c42f17d0e2c4d436ce67a74b667a5948771d09da
 uncompressed                 : 20fd6b3990642e9b4abf6bab0b0a15657267397c
Litecoin address              : Ld7H7tk6q5UCMLmv491H2uj5oSLzw1qx8f
Litecoin address uncompressed : LNEPUCf1Q1Qbh2fNhT5E8QgXf8ZwrsnazT
Litecoin segwit address       : lc1qcsh3058zcn2rdnn85a9kv7jefpm36zw6udaza9
p2sh segwit                   : 36f5PQhwQqRwzw2haYdrsJ3SizWNiaKcow
 corresponding p2sh script    : 0014c42f17d0e2c4d436ce67a74b667a5948771d09da

The Litecoin address of LToeNsqvhD5uC6irm7Pd9QkSUF2HpiHvtH validates fine:

# ./litecoin-0.16.3/bin/litecoin-cli validateaddress LToeNsqvhD5uC6irm7Pd9QkSUF2HpiHvtH
{
  "isvalid": true,
  "address": "LToeNsqvhD5uC6irm7Pd9QkSUF2HpiHvtH",
  "scriptPubKey": "76a9145e203820691d3fe9531188fa1b1c625ddcadf2ca88ac",
  "ismine": false,
  "iswatchonly": false,
  "isscript": false,
  "iswitness": false
}

The Litecoin segwit address of lc1qcsh3058zcn2rdnn85a9kv7jefpm36zw6udaza9 does not:

# ./litecoin-0.16.3/bin/litecoin-cli validateaddress lc1qtcsrsgrfr5l7j5c33rapk8rzthw2muk2vqpj6l
{
  "isvalid": false
}

And while the p2sh segwit address validates, litecoin-cli claims it's not segwit:

# ./litecoin-0.16.3/bin/litecoin-cli validateaddress 3Ei3ke64tK3Pqq9JWAd2GzYiieXmybAAt9
{
  "isvalid": true,
  "address": "MLvC4XW2qRtpeLRCc3cN6do83M8E1RcZkk",
  "scriptPubKey": "a9148ecb940073cc1b99237f2848f8147953ccdfc22a87",
  "ismine": false,
  "iswatchonly": false,
  "isscript": true,
  "iswitness": false
}
richardkiss commented 5 years ago

The design of bech32 should be such that it's easy to turn a bitcoin bech32 address to a litecoin one. Can you give me an example of a bech32 segwit address that is known to be valid in Litecoin (or a reference)?

jeremyandrews commented 5 years ago

I opened Litecoin-Qt and asked for a new testnet bech32 address from the UI:

# ./litecoin-0.16.3/bin/litecoin-cli validateaddress tltc1qd9hf4rh9zlrdxqwvqwa88nq67pzz0agstxmql6
{
  "isvalid": true,
  "address": "tltc1qd9hf4rh9zlrdxqwvqwa88nq67pzz0agstxmql6",
  "scriptPubKey": "0014696e9a8ee517c6d301cc03ba73cc1af04427f510",
  "ismine": false,
  "iswatchonly": false,
  "isscript": false,
  "iswitness": true,
  "witness_version": 0,
  "witness_program": "696e9a8ee517c6d301cc03ba73cc1af04427f510"
}
jeremyandrews commented 5 years ago

main network human-readable part: https://github.com/litecoin-project/litecoin/blob/master/src/chainparams.cpp#L142

testnet human-readable part: https://github.com/litecoin-project/litecoin/blob/master/src/chainparams.cpp#L247

jeremyandrews commented 5 years ago

Fixing the hrp seems to be all that's required. Patching the latest release:

diff --git a/pycoin/networks/all.py b/pycoin/networks/all.py
index 226672d..e245188 100644
--- a/pycoin/networks/all.py
+++ b/pycoin/networks/all.py
@@ -39,7 +39,7 @@ BUILT_IN_NETWORKS = [
         b'\xb0', b'\x30', b'\5',
         h2b('019d9cfe'), h2b('019da462'),
         tx=BitcoinTx, block=BitcoinBlock,
-        bech32_hrp='lc'
+        bech32_hrp='ltc'
     ),

     # LTC litecoin testnet : ttpv/ttub
@@ -48,7 +48,7 @@ BUILT_IN_NETWORKS = [
         b'\xef', b'\x6f', b'\xc4',
         h2b('0436ef7d'), h2b('0436f6e1'),
         tx=BitcoinTx, block=BitcoinBlock,
-        bech32_hrp='tl'
+        bech32_hrp='tltc'
     )

 ]

And then use ku to generate a new address again:

# ku -n XLT create

input                         : create
network                       : Litecoin testnet
netcode                       : XLT
wallet key                    : ttpv96BtqegdxXceQXFhoStBaKzFjvEog4jEPK4kVPHauWHw848DrEZZhNBdEhFo2f\
                                  kGNzeFTc4MJSq7EU5mXqN3d6T5B7jhcuW2vsHZk1ExZBn
public version                : ttub4XNESS7BCg9c2PxY44NZeupUBUvzkKHtTqAnAN3sqh5XiRKJB9bzhyHtV7X3DR\
                                  2ZxUZPs186C4MuBFtMHYu6ELCwwPRGoP9kX9FJ5ai1wB9
tree depth                    : 0
fingerprint                   : 3ba90ead
parent f'print                : 00000000
child index                   : 0
chain code                    : 62d462eaa55673c34dd229f00a461998696ae4bf9ecab91140a5af2e42c320c3
private key                   : yes
secret exponent               : 37845038028144807838782098839695447733144991305567581675650470884727922533025
 hex                          : 53ab884e451ad794918c83d7a79c24a1a89b7fe6b97b81abff4e9f8bcac2a2a1
wif                           : cQPLynCWKZvrtdCamfFo9st6rVdxccZg3eRsxL4iqTwzjHBQcqMN
 uncompressed                 : 92DmQHasbZqTFsLqtMT1VHxz4WbeyZ5ENtyqhdVV4H5JcVEy263
public pair x                 : 115612213902909738356147523281262529626938256905006807182595770100463653277001
public pair y                 : 39383233902995793223829679229674137839833719027401491347391704629409519538459
 x as hex                     : ff9a31b5085a2f9435a4a47d2d6ad60c10f63ff9246b76eceb8077c52b96cd49
 y as hex                     : 57121ed645002a41e9961cbeb69c4dce44b3d9c7282e513fc2acf8d65450911b
y parity                      : odd
key pair as sec               : 03ff9a31b5085a2f9435a4a47d2d6ad60c10f63ff9246b76eceb8077c52b96cd49
 uncompressed                 : 04ff9a31b5085a2f9435a4a47d2d6ad60c10f63ff9246b76eceb8077c52b96cd49\
                                  57121ed645002a41e9961cbeb69c4dce44b3d9c7282e513fc2acf8d65450911b
hash160                       : 3ba90ead2430d08638e75e659162ee4aa4da1184
 uncompressed                 : 221c9f818f5f5df5f9908f05b2d3d3f803def4d7
Litecoin address              : mkxQggTnD6BGF6xxBkaquRR4N3LiHrD9Ra
Litecoin address uncompressed : midKZLnyvAZnCQSjy2iD2cDNi3qZ1VjuMQ
Litecoin segwit address       : tltc1q8w5satfyxrggvw88tejezchwf2jd5yvynnhs6z
p2sh segwit                   : 2N7o2145iQQtQkf8xriu756SVPdmPTPKWAA
 corresponding p2sh script    : 00143ba90ead2430d08638e75e659162ee4aa4da1184

This bech32 address validates:

# ./litecoin-0.16.3/bin/litecoin-cli validateaddress  tltc1q8w5satfyxrggvw88tejezchwf2jd5yvynnhs6z
{
  "isvalid": true,
  "address": "tltc1q8w5satfyxrggvw88tejezchwf2jd5yvynnhs6z",
  "scriptPubKey": "00143ba90ead2430d08638e75e659162ee4aa4da1184",
  "ismine": false,
  "iswatchonly": false,
  "isscript": false,
  "iswitness": true,
  "witness_version": 0,
  "witness_program": "3ba90ead2430d08638e75e659162ee4aa4da1184"
}
darklow commented 5 years ago

Also experiencing same issue, would be great if PR could be merged in, the fix is really simple. Thank you.