Checksum P2WSH failed My goal is replicate the same P2WSH of https://en.bitcoin.it/wiki/BIP_0173 


  tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7


I'm able to generate the "first" part before checksum. 
There are my binary


  00000 00011 00001 10001 10001 01000 01111 00000 10100 11000 10100
  01011 00110 10000 00001 00101 11101 00011 00100 10000 00011 00110
  10101 10110 11010 00010 01101 10110 01001 10000 10101 10011 11000
  11001 10101 00110 10010 01111 01000 01101 11000 11000 11000 11001
  01001 01100 00001 00100 10000 00110 01001 10001


And Their values in base10


  0, 3, 1, 17, 17, 8, 15, 0, 20, 24, 20, 11, 6, 16, 1, 5, 29, 3, 4, 16,
  3, 6, 21, 22, 26, 2, 13, 22, 9, 16, 21, 19, 24, 25, 21, 6, 18, 15, 8,
  13, 24, 24, 24, 25, 9, 12, 1, 4, 16, 6, 9, 17


After that I use Python function

python -c "import bech32; print bech32.bech32_create_checksum('tb', [0, 3, 1, 17, 17, 8, 15, 0, 20, 24, 20, 11, 6, 16, 1, 5, 29, 3, 4, 16, 3, 6, 21, 22, 26, 2, 13, 22, 9, 16, 21, 19, 24, 25, 21, 6, 18, 15, 8, 13, 24, 24, 24, 25, 9, 12, 1, 4, 16, 6, 9, 17] )"


And I get that result:

[3, 1, 3, 10, 2, 25]


After that I can map on charset ("qpzry9x8gf2tvdw0s3jn54khce6mua7l")

The final result is:
My address is:

tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3rpr2ze


the address of https://en.bitcoin.it/wiki/BIP_0173

tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7


As you can see the problem is only the checksum, the first part tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3 is the same.
Ok, I've found the problem.

Input has 52 5-bit groups. 260 bits. Remember that every encode calls convertBits to convert from 8 bit groups to 5-bit groups. But 260 bits made of bytes is impossible! So there were 264 bits originally, = 33bytes. 264 bits need to be padded by convertBits (convertBits can/will pad when encoding but won't while decoding). So we have 265 bits. 53 5-bit groups. So you need to add a zero at the end of your input to achieve the intended result.

While decoding, convertBits will, until the number of bits is a multiple of 8, check that the last bit is 0, drop it. In your case, the last bit is not zero, so the only way not to discard it is to pad it, which it's not allowed to do while decoding.

TLDR all 5-bit groups as input are converted from 8-bit groups (addresses are designed for hash outputs and hashes output full bytes). If decoding can't decode to 8-bit groups without padding, the address is considered invalid.



Let's try to do what convertBits does to decode!

First, to simplify ignore first few multiples of 40 bits in the input. The last few bits remaining are:

10000 00110 01001 10001


Convertbits, while decoding converts from 5 to 8:

10000001 10010011 0001


Does the last group have exactly 8 bits? (In that case no further action would be needed) No.
Does the last group have zeros only? (In that case we can just erase the last group) No.
Throw an error. We either need to discard bits or pad, which is not allowed while decoding.

This is why the address you generated is can't be decoded. (Try it)