bech32 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +5 -1
- data/exe/bech32 +9 -5
- data/lib/bech32/segwit_addr.rb +3 -26
- data/lib/bech32/version.rb +1 -1
- data/lib/bech32.rb +29 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b9dfad105c52c27a05e99b0576a46de13aac736914b8172b59766e393531857e
|
4
|
+
data.tar.gz: bdadf23d8b3ea58fbbc6c303ca657e6d151d4096cbb6dfc260d105c2d5b5869e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 17c8acca310a4ebc24ba5e4b4f58132d79262ca73d6ebbe6b50952b2f0703c70b915b28500d866af86d3b9f715afdc614ddc2af9feb07d6de5fb16fff68dc16e
|
7
|
+
data.tar.gz: ae1ad3dd861bed9849878241ae9edac81d26980a4cf8a6e911ecb36b7bdc547756404347232aff5608d4b9f24d2b0f6ecfc0e6476c6f37855bfbc2ff0410a8e9
|
data/README.md
CHANGED
@@ -104,10 +104,14 @@ After installing the gem, the `bech32` command will be available. Encoding and d
|
|
104
104
|
|
105
105
|
#### Encode
|
106
106
|
|
107
|
+
The `encode` command takes `HRP`, `data`, and type (`bech32` or `bech32m`) as arguments and outputs a bech32/bech32m string.
|
108
|
+
|
107
109
|
$ bech32 encode genesis 000409190707111719041a120308120a060c161408110d091b090009021b1e1d150e190215010d0a1603091e1f0b100609090d1a1c1a13030c120c0c0f1c020d1d1a0e170b1c17021018121e0a021c121a1c0d161b16131d1609130f1d13180f1e081d041d0a110f110d1313081c11100600180b000c08140c1e130e0f090c160e0018191e1d1c0016060c11101214121e19070d1a0c1c15020414001f10100c09090600181806001809080e180507021913031100030216141b100908160c1213120f1912011f07021c13190d1900170c1d1203040f071c1908050504130e080d0a100d130b03000a0a08191310090918120f11031104120c15180c15120a0f1919070c1c12060c1911091010120a0d191b040c1613020e1911081f000b1a0b0514150c1613010d0c1c030b17011805090119061e0b051e130c00030419000112030110181d011a000f020c0901080c1113060201041a0e1b060a15160506181c11140c1c1d0b1b14020c131e0b0f071519181e0b1f0e0a08170f1d0c05060e1c1b0e160c0f0a171d0b101a1a1f1417160e0d1414030e161b0a000709100d15020c000e010c00000000 bech32
|
108
110
|
genesis1qyfe883hey6jrgj2xvk5g3dfmfqfzm7a4wez4pd2krf7ltsxffd6u6nrvjvv0uzda6whtuhzscj72zuj6udkmknakfn0anc07gaya2303dnngu3sxqctqvg5v7nw0fvkwqce7auqkxv3sj5j7e8d6vu4zy5qlssvffxqccxqcfgwc98zenr3qrzk5msfgkvjnj0ejpl8zunedeqhvajry08ueg99ynwgd2sdntrq22gensffcj03r3yjv4cv4j20ee8vujxve3fssj2demyvknzwe3glqt6t954vknpdvurthpc9fpex7t97nvqryeqpjrpscap6q0zvfpgv3nxzpy6wmx24k9xcu35vuatm5zvn7t084ec7tlw2gh0av9xwumwkv02hats66l5hkwd55rwkm2q8fsd4zvqwpvqqqqtdc6rp
|
109
111
|
|
110
|
-
|
112
|
+
#### Decode
|
113
|
+
|
114
|
+
The `decode` command takes bech32/bech32m string as arguments and outputs `HRP`, `data`, and type.
|
111
115
|
|
112
116
|
$ bech32 decode genesis1qyfe883hey6jrgj2xvk5g3dfmfqfzm7a4wez4pd2krf7ltsxffd6u6nrvjvv0uzda6whtuhzscj72zuj6udkmknakfn0anc07gaya2303dnngu3sxqctqvg5v7nw0fvkwqce7auqkxv3sj5j7e8d6vu4zy5qlssvffxqccxqcfgwc98zenr3qrzk5msfgkvjnj0ejpl8zunedeqhvajry08ueg99ynwgd2sdntrq22gensffcj03r3yjv4cv4j20ee8vujxve3fssj2demyvknzwe3glqt6t954vknpdvurthpc9fpex7t97nvqryeqpjrpscap6q0zvfpgv3nxzpy6wmx24k9xcu35vuatm5zvn7t084ec7tlw2gh0av9xwumwkv02hats66l5hkwd55rwkm2q8fsd4zvqwpvqqqqtdc6rp
|
113
117
|
HRP: genesis
|
data/exe/bech32
CHANGED
@@ -19,11 +19,15 @@ class CLI < Thor
|
|
19
19
|
desc 'decode "bech32string"', 'Decoding bech32/bech32m string.'
|
20
20
|
def decode(bech32_str)
|
21
21
|
bech32 = Bech32.decode(bech32_str, bech32_str.length)
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
22
|
+
if bech32
|
23
|
+
puts <<~EOS
|
24
|
+
HRP: #{bech32[0]}
|
25
|
+
DATA: #{bech32[1].pack('C*').unpack1('H*')}
|
26
|
+
TYPE: #{bech32[2] == Bech32::Encoding::BECH32 ? 'bech32' : 'bech32m'}
|
27
|
+
EOS
|
28
|
+
else
|
29
|
+
puts 'Can not decode.'
|
30
|
+
end
|
27
31
|
end
|
28
32
|
|
29
33
|
end
|
data/lib/bech32/segwit_addr.rb
CHANGED
@@ -18,7 +18,7 @@ module Bech32
|
|
18
18
|
# Returns segwit script pubkey which generated from witness version and witness program.
|
19
19
|
def to_script_pubkey
|
20
20
|
v = ver == 0 ? ver : ver + 0x50
|
21
|
-
([v, prog.length]
|
21
|
+
([v, prog.length] + prog).pack('C*').unpack("H*").first
|
22
22
|
end
|
23
23
|
|
24
24
|
# parse script pubkey into witness version and witness program
|
@@ -31,7 +31,7 @@ module Bech32
|
|
31
31
|
# Returns segwit address string which generated from hrp, witness version and witness program.
|
32
32
|
def addr
|
33
33
|
spec = (ver == 0 ? Bech32::Encoding::BECH32 : Bech32::Encoding::BECH32M)
|
34
|
-
Bech32.encode(hrp, [ver] + convert_bits(prog, 8, 5), spec)
|
34
|
+
Bech32.encode(hrp, [ver] + Bech32.convert_bits(prog, 8, 5), spec)
|
35
35
|
end
|
36
36
|
|
37
37
|
private
|
@@ -41,34 +41,11 @@ module Bech32
|
|
41
41
|
raise 'Invalid address.' if hrp.nil? || data[0].nil? || ![HRP_MAINNET, HRP_TESTNET, HRP_REGTEST].include?(hrp)
|
42
42
|
@ver = data[0]
|
43
43
|
raise 'Invalid witness version' if @ver > 16
|
44
|
-
@prog = convert_bits(data[1..-1], 5, 8, false)
|
44
|
+
@prog = Bech32.convert_bits(data[1..-1], 5, 8, false)
|
45
45
|
raise 'Invalid witness program' if @prog.nil? || @prog.length < 2 || @prog.length > 40
|
46
46
|
raise 'Invalid witness program with version 0' if @ver == 0 && (@prog.length != 20 && @prog.length != 32)
|
47
47
|
raise 'Witness version and encoding spec do not match' if (@ver == 0 && spec != Bech32::Encoding::BECH32) || (@ver != 0 && spec != Bech32::Encoding::BECH32M)
|
48
48
|
end
|
49
49
|
|
50
|
-
def convert_bits(data, from, to, padding=true)
|
51
|
-
acc = 0
|
52
|
-
bits = 0
|
53
|
-
ret = []
|
54
|
-
maxv = (1 << to) - 1
|
55
|
-
max_acc = (1 << (from + to - 1)) - 1
|
56
|
-
data.each do |v|
|
57
|
-
return nil if v < 0 || (v >> from) != 0
|
58
|
-
acc = ((acc << from) | v) & max_acc
|
59
|
-
bits += from
|
60
|
-
while bits >= to
|
61
|
-
bits -= to
|
62
|
-
ret << ((acc >> bits) & maxv)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
if padding
|
66
|
-
ret << ((acc << (to - bits)) & maxv) unless bits == 0
|
67
|
-
elsif bits >= from || ((acc << (to - bits)) & maxv) != 0
|
68
|
-
return nil
|
69
|
-
end
|
70
|
-
ret
|
71
|
-
end
|
72
|
-
|
73
50
|
end
|
74
51
|
end
|
data/lib/bech32/version.rb
CHANGED
data/lib/bech32.rb
CHANGED
@@ -86,6 +86,35 @@ module Bech32
|
|
86
86
|
hrp.each_char.map{|c|c.ord >> 5} + [0] + hrp.each_char.map{|c|c.ord & 31}
|
87
87
|
end
|
88
88
|
|
89
|
+
# Convert a +data+ where each byte is encoding +from+ bits to a byte slice where each byte is encoding +to+ bits.
|
90
|
+
# @param [Array] data
|
91
|
+
# @param [Integer] from
|
92
|
+
# @param [Integer] to
|
93
|
+
# @param [Boolean] padding
|
94
|
+
# @return [Array]
|
95
|
+
def convert_bits(data, from, to, padding=true)
|
96
|
+
acc = 0
|
97
|
+
bits = 0
|
98
|
+
ret = []
|
99
|
+
maxv = (1 << to) - 1
|
100
|
+
max_acc = (1 << (from + to - 1)) - 1
|
101
|
+
data.each do |v|
|
102
|
+
return nil if v < 0 || (v >> from) != 0
|
103
|
+
acc = ((acc << from) | v) & max_acc
|
104
|
+
bits += from
|
105
|
+
while bits >= to
|
106
|
+
bits -= to
|
107
|
+
ret << ((acc >> bits) & maxv)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
if padding
|
111
|
+
ret << ((acc << (to - bits)) & maxv) unless bits == 0
|
112
|
+
elsif bits >= from || ((acc << (to - bits)) & maxv) != 0
|
113
|
+
return nil
|
114
|
+
end
|
115
|
+
ret
|
116
|
+
end
|
117
|
+
|
89
118
|
# Compute Bech32 checksum
|
90
119
|
def polymod(values)
|
91
120
|
generator = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bech32
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shigeyuki Azuchi
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-10-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|