bech32 uses real address type checks

This commit is contained in:
timlucmiptev 2020-10-16 14:02:55 +03:00 committed by ixv
parent 5280f8f43e
commit a4901b7efa
3 changed files with 29 additions and 26 deletions

View File

@ -151,22 +151,22 @@ The below code also shows how to convert from bech32 back to a 20-byte hash. Thi
``` ```
=pubkey 0x2.79be.667e.f9dc.bbac.55a0.6295.ce87.0b07.029b.fcdb.2dce.28d9.59f2.815b.16f8.1798 =pubkey 0x2.79be.667e.f9dc.bbac.55a0.6295.ce87.0b07.029b.fcdb.2dce.28d9.59f2.815b.16f8.1798
(encode-pubkey:bech32:btc %main pubkey) (encode-pubkey:bech32:btc %main pubkey)
:: should be [~ "bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4"] :: gives [~ %bech32 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4']
`[@ @ux]`(hash-160:btc pubkey) `[@ @ux]`(hash-160:btc pubkey)
:: gives [20 0x751e.76e8.1991.96d4.5494.1c45.d1b3.a323.f143.3bd6] :: gives [20 0x751e.76e8.1991.96d4.5494.1c45.d1b3.a323.f143.3bd6]
(encode-hash-160:bech32:btc %main (hash-160:btc pubkey)) (encode-hash-160:bech32:btc %main (hash-160:btc pubkey))
:: gives [~ "bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4"] :: gives [~ %bech32 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4']
``` ```
### Decode Bech32 to hex ### Decode Bech32 to hex
Return val as `byts` to preserve leading zeros. Return val as `byts` to preserve leading zeros.
``` ```
(decode-raw:bech32:btc "bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4") (decode-raw:bech32:btc [%bech32 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4'])
:: prints data: ~[0 14 20 15 7 13 26 0 25 18 6 11 13 8 21 4 20 3 17 2 29 3 12 29 3 4 15 24 20 6 14 30 22] :: prints data: ~[0 14 20 15 7 13 26 0 25 18 6 11 13 8 21 4 20 3 17 2 29 3 12 29 3 4 15 24 20 6 14 30 22]
`[@ @ux]`(to-hex:bech32:btc "bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4") (to-hex:bech32:btc [%bech32 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4'])
:: gives [20 0x751e.76e8.1991.96d4.5494.1c45.d1b3.a323.f143.3bd6] :: gives [20 0x751e.76e8.1991.96d4.5494.1c45.d1b3.a323.f143.3bd6]
``` ```

View File

@ -24,17 +24,17 @@
%- sha256 [(met 3 pubkey) pubkey] %- sha256 [(met 3 pubkey) pubkey]
:: ::
++ to-script-pubkey ++ to-script-pubkey
|= script=buffer:tx ^- buffer:tx |= script=^buffer ^- ^buffer
%- zing %- zing
:~ ~[0x19 0x76 0xa9 0x14] :~ ~[0x19 0x76 0xa9 0x14]
script script
~[0x88 0xac] ~[0x88 0xac]
== ==
++ address-to-script-pubkey ++ address-to-script-pubkey
|= =address ^- buffer:tx |= =address ^- ^buffer
?. ?=(%bech32 -.address) ?. ?=(%bech32 -.address)
~|("Only bech32 addresses supported right now" !!) ~|("Only bech32 addresses supported right now" !!)
=/ hex=byts (to-hex:bech32 (trip +.address)) =/ hex=byts (to-hex:bech32 address)
?. =(wid.hex 20) ?. =(wid.hex 20)
~|("Only 20-byte P2WPKH bech32 supported" !!) ~|("Only 20-byte P2WPKH bech32 supported" !!)
(to-script-pubkey (from-byts:buffer hex)) (to-script-pubkey (from-byts:buffer hex))
@ -44,7 +44,7 @@
++ buffer ++ buffer
|% |%
++ from-byts ++ from-byts
|= =byts ^- buffer:tx |= =byts ^- ^buffer
=/ b=(list @ux) =/ b=(list @ux)
(flop (rip 3 dat.byts)) (flop (rip 3 dat.byts))
=/ pad=@ (sub wid.byts (lent b)) =/ pad=@ (sub wid.byts (lent b))
@ -54,16 +54,16 @@
:: 0xff11 with wid=8 becomes ~[0x11 0xff 0x0 0x0 0x0 0x0 0x0 0x0] :: 0xff11 with wid=8 becomes ~[0x11 0xff 0x0 0x0 0x0 0x0 0x0 0x0]
:: ::
++ from-atom-le ++ from-atom-le
|= [wid=@ a=@] ^- buffer:tx |= [wid=@ a=@] ^- ^buffer
=/ b=(list @ux) (rip 3 a) =/ b=(list @ux) (rip 3 a)
=/ pad=@ (sub wid (lent b)) =/ pad=@ (sub wid (lent b))
(weld b (reap pad 0x0)) (weld b (reap pad 0x0))
:: ::
++ to-byts ++ to-byts
|= b=buffer:tx ^- byts |= b=^buffer ^- byts
[(lent b) (rep 3 (flop b))] [(lent b) (rep 3 (flop b))]
++ concat-as-byts ++ concat-as-byts
|= bs=(list buffer:tx) ^- byts |= bs=(list ^buffer) ^- byts
%- to-byts (zing bs) %- to-byts (zing bs)
-- --
:: ::
@ -71,17 +71,17 @@
=, buffer =, buffer
|_ ut=unsigned:tx |_ ut=unsigned:tx
++ prevouts-buffer ++ prevouts-buffer
|= =input:tx ^- buffer:tx |= =input:tx ^- ^buffer
%+ weld %+ weld
(from-byts tx-hash.input) (from-byts tx-hash.input)
(from-atom-le 4 witness-ver.input) (from-atom-le 4 witness-ver.input)
:: ::
++ sequence-buffer ++ sequence-buffer
|= =input:tx ^- buffer:tx |= =input:tx ^- ^buffer
(from-byts sequence.input) (from-byts sequence.input)
:: ::
++ outputs-buffer ++ outputs-buffer
|= =output:tx ^- buffer:tx |= =output:tx ^- ^buffer
%+ weld %+ weld
(from-atom-le 8 value.output) (from-atom-le 8 value.output)
(address-to-script-pubkey address.output) (address-to-script-pubkey address.output)
@ -104,11 +104,13 @@
(turn inputs.ut sequence-buffer) (turn inputs.ut sequence-buffer)
=/ outputs=byts =/ outputs=byts
%- concat-as-byts (turn outputs.ut outputs-buffer) %- concat-as-byts (turn outputs.ut outputs-buffer)
=/ script-code=buffer:tx :: all the variables
=/ script-code=^buffer
%- to-script-pubkey %- to-script-pubkey
(slag 2 (from-byts script-pubkey.input)) (slag 2 (from-byts script-pubkey.input))
=/ amount=buffer:tx =/ amount=^buffer
(from-atom-le 8 value.input) (from-atom-le 8 value.input)
=/ n-sequence=^buffer (sequence-buffer input)
~& > [prevouts=(dsha256 prevouts) sequences=(dsha256 sequences) outputs=(dsha256 outputs)] ~& > [prevouts=(dsha256 prevouts) sequences=(dsha256 sequences) outputs=(dsha256 outputs)]
[0 0x0] [0 0x0]
:: ::
@ -243,14 +245,16 @@
:: ::
++ encode-raw ++ encode-raw
|= [hrp=tape data=(list @)] |= [hrp=tape data=(list @)]
^- tape ^- bech32-address
=/ combined=(list @) =/ combined=(list @)
(weld data (checksum hrp data)) (weld data (checksum hrp data))
:- %bech32
%- crip
(zing ~[hrp "1" (tape (murn combined value-to-charset))]) (zing ~[hrp "1" (tape (murn combined value-to-charset))])
++ decode-raw ++ decode-raw
|= bech=tape |= b=bech32-address
^- (unit raw-decoded) ^- (unit raw-decoded)
=. bech (cass bech) :: to lowercase =/ bech (cass (trip +.b)) :: to lowercase
=/ pos (flop (fand "1" bech)) =/ pos (flop (fand "1" bech))
?~ pos ~ ?~ pos ~
=/ last-1=@ i.pos =/ last-1=@ i.pos
@ -271,9 +275,8 @@
:: goes from a bech32 address to hex. Returns byts to preserve leading 0s :: goes from a bech32 address to hex. Returns byts to preserve leading 0s
:: ::
++ to-hex ++ to-hex
|= bech=tape |= b=bech32-address ^- hash
^- byts =/ d=(unit raw-decoded) (decode-raw b)
=/ d=(unit raw-decoded) (decode-raw bech)
?~ d ~|("Invalid bech32 address" !!) ?~ d ~|("Invalid bech32 address" !!)
=/ bs=(list @) =/ bs=(list @)
(from-digits:bits 5 (slag 1 data.u.d)) (from-digits:bits 5 (slag 1 data.u.d))
@ -284,7 +287,7 @@
:: ::
++ encode-pubkey ++ encode-pubkey
|= [=network pubkey=@ux] |= [=network pubkey=@ux]
^- (unit tape) ^- (unit bech32-address)
?. =(33 (met 3 pubkey)) ?. =(33 (met 3 pubkey))
~|('pubkey must be a 33 byte ECC compressed public key' !!) ~|('pubkey must be a 33 byte ECC compressed public key' !!)
=/ prefix (~(get by prefixes) network) =/ prefix (~(get by prefixes) network)
@ -294,7 +297,7 @@
[0 (convert:bits 5 (zeros-brip:bits 160 dat:(hash-160 pubkey)))] [0 (convert:bits 5 (zeros-brip:bits 160 dat:(hash-160 pubkey)))]
++ encode-hash-160 ++ encode-hash-160
|= [=network h160=byts] |= [=network h160=byts]
^- (unit tape) ^- (unit bech32-address)
=/ prefix (~(get by prefixes) network) =/ prefix (~(get by prefixes) network)
?~ prefix ~ ?~ prefix ~
:- ~ :- ~

View File

@ -5,9 +5,9 @@
+$ address ?(legacy-address bech32-address) +$ address ?(legacy-address bech32-address)
+$ sats @ud +$ sats @ud
+$ hash [wid=@ dat=@ux] +$ hash [wid=@ dat=@ux]
+$ buffer (list @ux)
++ tx ++ tx
|% |%
+$ buffer (list @ux)
+$ unsigned +$ unsigned
$: inputs=(list input) $: inputs=(list input)
outputs=(list output) outputs=(list output)