github.com/piotrnar/gocoin@v0.0.0-20240512203912-faa0448c5e96/lib/others/bech32/segwit_test.go (about) 1 package bech32 2 3 import ( 4 "bytes" 5 "strings" 6 "testing" 7 ) 8 9 type valid_address_data struct { 10 address string 11 scriptPubKey []byte 12 } 13 14 type invalid_address_data struct { 15 hrp string 16 version int 17 program_length int 18 } 19 20 var valid_address = []valid_address_data{ 21 { 22 address: "BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4", 23 scriptPubKey: []byte{ 24 0x00, 0x14, 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, 25 0x94, 0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6}}, 26 { 27 address: "tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7", 28 scriptPubKey: []byte{ 29 0x00, 0x20, 0x18, 0x63, 0x14, 0x3c, 0x14, 0xc5, 0x16, 0x68, 0x04, 30 0xbd, 0x19, 0x20, 0x33, 0x56, 0xda, 0x13, 0x6c, 0x98, 0x56, 0x78, 31 0xcd, 0x4d, 0x27, 0xa1, 0xb8, 0xc6, 0x32, 0x96, 0x04, 0x90, 0x32, 32 0x62}}, 33 { 34 address: "bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kt5nd6y", 35 scriptPubKey: []byte{ 36 0x51, 0x28, 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, 37 0x94, 0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6, 38 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, 0x94, 0x1c, 39 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6}}, 40 { 41 address: "BC1SW50QGDZ25J", 42 scriptPubKey: []byte{ 43 0x60, 0x02, 0x75, 0x1e}}, 44 { 45 address: "bc1zw508d6qejxtdg4y5r3zarvaryvaxxpcs", 46 scriptPubKey: []byte{ 47 0x52, 0x10, 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, 48 0x94, 0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23}}, 49 { 50 address: "tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy", 51 scriptPubKey: []byte{ 52 0x00, 0x20, 0x00, 0x00, 0x00, 0xc4, 0xa5, 0xca, 0xd4, 0x62, 0x21, 53 0xb2, 0xa1, 0x87, 0x90, 0x5e, 0x52, 0x66, 0x36, 0x2b, 0x99, 0xd5, 54 0xe9, 0x1c, 0x6c, 0xe2, 0x4d, 0x16, 0x5d, 0xab, 0x93, 0xe8, 0x64, 55 0x33}}, 56 { 57 address: "tb1pqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesf3hn0c", 58 scriptPubKey: []byte{ 59 0x51, 0x20, 0x00, 0x00, 0x00, 0xc4, 0xa5, 0xca, 0xd4, 0x62, 0x21, 60 0xb2, 0xa1, 0x87, 0x90, 0x5e, 0x52, 0x66, 0x36, 0x2b, 0x99, 0xd5, 61 0xe9, 0x1c, 0x6c, 0xe2, 0x4d, 0x16, 0x5d, 0xab, 0x93, 0xe8, 0x64, 62 0x33}}, 63 { 64 address: "bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqzk5jj0", 65 scriptPubKey: []byte{ 66 0x51, 0x20, 0x79, 0xbe, 0x66, 0x7e, 0xf9, 0xdc, 0xbb, 0xac, 0x55, 67 0xa0, 0x62, 0x95, 0xce, 0x87, 0x0b, 0x07, 0x02, 0x9b, 0xfc, 0xdb, 68 0x2d, 0xce, 0x28, 0xd9, 0x59, 0xf2, 0x81, 0x5b, 0x16, 0xf8, 0x17, 69 0x98}}, 70 } 71 72 var invalid_address = []string{ 73 "tc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vq5zuyut", 74 "bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqh2y7hd", 75 "tb1z0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqglt7rf", 76 "BC1S0XLXVLHEMJA6C4DQV22UAPCTQUPFHLXM9H8Z3K2E72Q4K9HCZ7VQ54WELL", 77 "bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kemeawh", 78 "tb1q0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vq24jc47", 79 "bc1p38j9r5y49hruaue7wxjce0updqjuyyx0kh56v8s25huc6995vvpql3jow4", 80 "BC130XLXVLHEMJA6C4DQV22UAPCTQUPFHLXM9H8Z3K2E72Q4K9HCZ7VQ7ZWS8R", 81 "bc1pw5dgrnzv", 82 "bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7v8n0nx0muaewav253zgeav", 83 "BC1QR508D6QEJXTDG4Y5R3ZARVARYV98GJ9P", 84 "tb1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vq47Zagq", 85 "bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7v07qwwzcrf", 86 "tb1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vpggkg4j", 87 "bc1gmk9yu", 88 } 89 90 var invalid_address_enc = []invalid_address_data{ 91 {hrp: "BC", version: 0, program_length: 20}, 92 {hrp: "bc", version: 0, program_length: 21}, 93 {hrp: "bc", version: 17, program_length: 32}, 94 {hrp: "bc", version: 1, program_length: 1}, 95 {hrp: "bc", version: 16, program_length: 41}} 96 97 func segwit_scriptpubkey(witver int, witprog []byte) (scriptpubkey []byte) { 98 scriptpubkey = make([]byte, len(witprog)+2) 99 if witver != 0 { 100 scriptpubkey[0] = byte(0x50 + witver) 101 } 102 scriptpubkey[1] = byte(len(witprog)) 103 copy(scriptpubkey[2:], witprog) 104 return 105 } 106 107 func TestValidAddress(t *testing.T) { 108 for _, rec := range valid_address { 109 hrp := "bc" 110 witver, witprog, er := SegwitDecode(hrp, rec.address) 111 if witprog == nil || er != nil { 112 hrp = "tb" 113 witver, witprog, er = SegwitDecode(hrp, rec.address) 114 } 115 if witprog == nil { 116 t.Error("SegwitDecode fails: ", rec.address) 117 continue 118 } 119 scriptpubkey := segwit_scriptpubkey(witver, witprog) 120 if !bytes.Equal(scriptpubkey, rec.scriptPubKey) { 121 t.Error("SegwitDecode produces wrong result: ", rec.address) 122 continue 123 } 124 rebuild := SegwitEncode(hrp, witver, witprog) 125 if rebuild == "" { 126 t.Error("SegwitEncode fails: ", rec.address) 127 continue 128 } 129 if !strings.EqualFold(rec.address, rebuild) { 130 t.Error("SegwitEncode produces wrong result: ", rec.address) 131 } 132 } 133 } 134 135 func TestInvalidAddress(t *testing.T) { 136 for _, s := range invalid_address { 137 _, witprog, er := SegwitDecode("bc", s) 138 if witprog != nil || er == nil { 139 t.Error("SegwitDecode succeeds on invalid address: ", s) 140 } 141 _, witprog, er = SegwitDecode("tb", s) 142 if witprog != nil || er == nil { 143 t.Error("SegwitDecode succeeds on invalid address: ", s) 144 } 145 } 146 } 147 148 func TestInvalidAddressEnc(t *testing.T) { 149 for _, rec := range invalid_address_enc { 150 rebuild := SegwitEncode(rec.hrp, rec.version, []byte{0}) 151 if rebuild != "" { 152 t.Error("SegwitEncode succeeds on invalid input: ", rebuild) 153 } 154 } 155 }