bech32 1.4.2 → 1.5.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/.github/workflows/main.yml +2 -2
- data/.ruby-version +1 -1
- data/README.md +45 -5
- data/exe/bech32 +10 -2
- data/lib/bech32/silent_payment_addr.rb +57 -0
- data/lib/bech32/version.rb +1 -1
- data/lib/bech32.rb +1 -0
- metadata +4 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 368eb6deb6248ddb8f5cbcba18ec90a3ed11b84f60a3de80bb59301eb5c7f1a2
|
4
|
+
data.tar.gz: a0d8654790ab71f8460eecdbf17248e8acd3748bf2011b94afe32dd079b2248b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f3aad0caf6fce5ce425bd0c4e59e934ecfe96bc6fec30cd5c5c7a6ee73f266824c7f90193f4e008ea24f8a65239d13c3763d35c8211d5fa2485cb8317e56d527
|
7
|
+
data.tar.gz: 4891f6c6f80b6b11cd136637c9fd204070a2fab2b170919b34c976219d9885eb8ed43ba688b2002fcc1db4df4b2755d1b169744cfaea578e64336afa327b4b65
|
data/.github/workflows/main.yml
CHANGED
@@ -19,10 +19,10 @@ jobs:
|
|
19
19
|
runs-on: ubuntu-latest
|
20
20
|
strategy:
|
21
21
|
matrix:
|
22
|
-
ruby-version: ['3.0', '3.1', '3.2']
|
22
|
+
ruby-version: ['3.0', '3.1', '3.2', '3.3', '3.4']
|
23
23
|
|
24
24
|
steps:
|
25
|
-
- uses: actions/checkout@
|
25
|
+
- uses: actions/checkout@v4
|
26
26
|
- name: Set up Ruby
|
27
27
|
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
28
28
|
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby-3.
|
1
|
+
ruby-3.4.1
|
data/README.md
CHANGED
@@ -100,6 +100,34 @@ segwit_addr.addr
|
|
100
100
|
=> 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4'
|
101
101
|
```
|
102
102
|
|
103
|
+
### Silent payment address
|
104
|
+
|
105
|
+
Decode silent payment address.
|
106
|
+
|
107
|
+
```ruby
|
108
|
+
addr = Bech32::SilentPaymentAddr.parse('sp1qqgste7k9hx0qftg6qmwlkqtwuy6cycyavzmzj85c6qdfhjdpdjtdgqjuexzk6murw56suy3e0rd2cgqvycxttddwsvgxe2usfpxumr70xc9pkqwv')
|
109
|
+
|
110
|
+
# sp version
|
111
|
+
addr.version
|
112
|
+
=> 0
|
113
|
+
# scan public key
|
114
|
+
addr.scan_key
|
115
|
+
=> '0220bcfac5b99e04ad1a06ddfb016ee13582609d60b6291e98d01a9bc9a16c96d4'
|
116
|
+
# spend public key
|
117
|
+
addr.spend_key
|
118
|
+
=> '025cc9856d6f8375350e123978daac200c260cb5b5ae83106cab90484dcd8fcf36'
|
119
|
+
```
|
120
|
+
|
121
|
+
Encode sp address.
|
122
|
+
|
123
|
+
```ruby
|
124
|
+
addr = Bech32::SilentPaymentAddr.new('sp', 0, '0220bcfac5b99e04ad1a06ddfb016ee13582609d60b6291e98d01a9bc9a16c96d4', '025cc9856d6f8375350e123978daac200c260cb5b5ae83106cab90484dcd8fcf36')
|
125
|
+
|
126
|
+
# sp address
|
127
|
+
addr.to_s
|
128
|
+
=> 'sp1qqgste7k9hx0qftg6qmwlkqtwuy6cycyavzmzj85c6qdfhjdpdjtdgqjuexzk6murw56suy3e0rd2cgqvycxttddwsvgxe2usfpxumr70xc9pkqwv'
|
129
|
+
```
|
130
|
+
|
103
131
|
### Nostr
|
104
132
|
|
105
133
|
Supports encoding/decoding of Nostr's [NIP-19](https://github.com/nostr-protocol/nips/blob/master/19.md) entities.
|
@@ -147,22 +175,22 @@ The `encode` command takes `HRP`, `data`, and type (`bech32` or `bech32m`) as ar
|
|
147
175
|
$ bech32 encode genesis 000409190707111719041a120308120a060c161408110d091b090009021b1e1d150e190215010d0a1603091e1f0b100609090d1a1c1a13030c120c0c0f1c020d1d1a0e170b1c17021018121e0a021c121a1c0d161b16131d1609130f1d13180f1e081d041d0a110f110d1313081c11100600180b000c08140c1e130e0f090c160e0018191e1d1c0016060c11101214121e19070d1a0c1c15020414001f10100c09090600181806001809080e180507021913031100030216141b100908160c1213120f1912011f07021c13190d1900170c1d1203040f071c1908050504130e080d0a100d130b03000a0a08191310090918120f11031104120c15180c15120a0f1919070c1c12060c1911091010120a0d191b040c1613020e1911081f000b1a0b0514150c1613010d0c1c030b17011805090119061e0b051e130c00030419000112030110181d011a000f020c0901080c1113060201041a0e1b060a15160506181c11140c1c1d0b1b14020c131e0b0f071519181e0b1f0e0a08170f1d0c05060e1c1b0e160c0f0a171d0b101a1a1f1417160e0d1414030e161b0a000709100d15020c000e010c00000000 bech32
|
148
176
|
genesis1qyfe883hey6jrgj2xvk5g3dfmfqfzm7a4wez4pd2krf7ltsxffd6u6nrvjvv0uzda6whtuhzscj72zuj6udkmknakfn0anc07gaya2303dnngu3sxqctqvg5v7nw0fvkwqce7auqkxv3sj5j7e8d6vu4zy5qlssvffxqccxqcfgwc98zenr3qrzk5msfgkvjnj0ejpl8zunedeqhvajry08ueg99ynwgd2sdntrq22gensffcj03r3yjv4cv4j20ee8vujxve3fssj2demyvknzwe3glqt6t954vknpdvurthpc9fpex7t97nvqryeqpjrpscap6q0zvfpgv3nxzpy6wmx24k9xcu35vuatm5zvn7t084ec7tlw2gh0av9xwumwkv02hats66l5hkwd55rwkm2q8fsd4zvqwpvqqqqtdc6rp
|
149
177
|
|
178
|
+
Note: `data` must be converted from 8-bit to 5-bit units.
|
179
|
+
|
150
180
|
#### Decode
|
151
181
|
|
152
182
|
The `decode` command takes bech32/bech32m string as arguments and outputs `HRP`, `data`, and type.
|
153
183
|
|
154
184
|
$ bech32 decode genesis1qyfe883hey6jrgj2xvk5g3dfmfqfzm7a4wez4pd2krf7ltsxffd6u6nrvjvv0uzda6whtuhzscj72zuj6udkmknakfn0anc07gaya2303dnngu3sxqctqvg5v7nw0fvkwqce7auqkxv3sj5j7e8d6vu4zy5qlssvffxqccxqcfgwc98zenr3qrzk5msfgkvjnj0ejpl8zunedeqhvajry08ueg99ynwgd2sdntrq22gensffcj03r3yjv4cv4j20ee8vujxve3fssj2demyvknzwe3glqt6t954vknpdvurthpc9fpex7t97nvqryeqpjrpscap6q0zvfpgv3nxzpy6wmx24k9xcu35vuatm5zvn7t084ec7tlw2gh0av9xwumwkv02hats66l5hkwd55rwkm2q8fsd4zvqwpvqqqqtdc6rp
|
155
185
|
HRP: genesis
|
156
|
-
DATA:
|
186
|
+
DATA: 000409190707111719041a120308120a060c161408110d091b090009021b1e1d150e190215010d0a1603091e1f0b100609090d1a1c1a13030c120c0c0f1c020d1d1a0e170b1c17021018121e0a021c121a1c0d161b16131d1609130f1d13180f1e081d041d0a110f110d1313081c11100600180b000c08140c1e130e0f090c160e0018191e1d1c0016060c11101214121e19070d1a0c1c15020414001f10100c09090600181806001809080e180507021913031100030216141b100908160c1213120f1912011f07021c13190d1900170c1d1203040f071c1908050504130e080d0a100d130b03000a0a08191310090918120f11031104120c15180c15120a0f1919070c1c12060c1911091010120a0d191b040c1613020e1911081f000b1a0b0514150c1613010d0c1c030b17011805090119061e0b051e130c00030419000112030110181d011a000f020c0901080c1113060201041a0e1b060a15160506181c11140c1c1d0b1b14020c131e0b0f071519181e0b1f0e0a08170f1d0c05060e1c1b0e160c0f0a171d0b101a1a1f1417160e0d1414030e161b0a000709100d15020c000e010c00000000
|
157
187
|
TYPE: bech32
|
158
188
|
|
159
|
-
Note: `DATA` is not bit-converted.
|
160
|
-
|
161
189
|
If bech32 string has segwit hrp, it will also output witness version and witness program:
|
162
190
|
|
163
191
|
$ bech32 decode bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kt5nd6y
|
164
192
|
HRP: bc
|
165
|
-
DATA:
|
193
|
+
DATA: 010e140f070d1a001912060b0d081504140311021d030c1d03040f1814060e1e160e140f070d1a001912060b0d081504140311021d030c1d03040f1814060e1e16
|
166
194
|
TYPE: bech32m
|
167
195
|
WITNESS VERSION: 1
|
168
196
|
WITNESS PROGRAM: 751e76e8199196d454941c45d1b3a323f1433bd6751e76e8199196d454941c45d1b3a323f1433bd6
|
@@ -171,13 +199,25 @@ If bech32 string has NIP-19 hrp, it will also output NIP-19 entry:
|
|
171
199
|
|
172
200
|
$ bech32 decode nprofile1qqsrhuxx8l9ex335q7he0f09aej04zpazpl0ne2cgukyawd24mayt8gpp4mhxue69uhhytnc9e3k7mgpz4mhxue69uhkg6nzv9ejuumpv34kytnrdaksjlyr9p
|
173
201
|
HRP: nprofile
|
174
|
-
DATA:
|
202
|
+
DATA: 00001003171c0606071f051906111114001e17190f090f051d19120f1502011d02011f0f13190a18081c16041d0e0d0a151b1d040b07080101151b17061c191a051c1717040b1318051911161e1b080102151b17061c191a051c1716081a13020c0519121c1c1b010c111516040b13030d1d1610
|
175
203
|
TYPE: bech32
|
176
204
|
NIP19 Entities:
|
177
205
|
special: 3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d
|
178
206
|
relay: wss://r.x.com
|
179
207
|
relay: wss://djbas.sadkb.com
|
180
208
|
|
209
|
+
If sp address, it will also output scan/spend public key:
|
210
|
+
|
211
|
+
$ bech32 decode sp1qqgste7k9hx0qftg6qmwlkqtwuy6cycyavzmzj85c6qdfhjdpdjtdgqjuexzk6murw56suy3e0rd2cgqvycxttddwsvgxe2usfpxumr70xc9pkqwv
|
212
|
+
HRP: sp
|
213
|
+
DATA: 000008100b191e160517060f00090b081a001b0e1f16000b0e1c041a180418041d0c021b02120714181a000d0917120d010d120b0d0800121c190602161a1b1c030e141a101c0411190f030d0a1808000c0418060b0b0d0d0e100c0806190a1c100901061c1b031e0f0618
|
214
|
+
TYPE: bech32m
|
215
|
+
version: 0
|
216
|
+
scan public key: 0220bcfac5b99e04ad1a06ddfb016ee13582609d60b6291e98d01a9bc9a16c96d4
|
217
|
+
spend public key: 025cc9856d6f8375350e123978daac200c260cb5b5ae83106cab90484dcd8fcf36
|
218
|
+
|
219
|
+
Note: `DATA` is data without bit conversion. When used, the `DATA` must be converted from 5-bit to 8-bit and padded as necessary.
|
220
|
+
|
181
221
|
## License
|
182
222
|
|
183
223
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/exe/bech32
CHANGED
@@ -25,13 +25,14 @@ class CLI < Thor
|
|
25
25
|
DATA: #{data.pack('C*').unpack1('H*')}
|
26
26
|
TYPE: #{spec == Bech32::Encoding::BECH32 ? 'bech32' : 'bech32m'}
|
27
27
|
EOS
|
28
|
-
|
28
|
+
case hrp
|
29
|
+
when Bech32::SegwitAddr::HRP_MAINNET, Bech32::SegwitAddr::HRP_TESTNET, Bech32::SegwitAddr::HRP_REGTEST
|
29
30
|
addr = Bech32::SegwitAddr.new(bech32_str)
|
30
31
|
puts <<~EOS
|
31
32
|
WITNESS VERSION: #{addr.ver}
|
32
33
|
WITNESS PROGRAM: #{addr.prog.pack('C*').unpack1('H*')}
|
33
34
|
EOS
|
34
|
-
|
35
|
+
when *Bech32::Nostr::NIP19::ALL_PREFIXES
|
35
36
|
entity = Bech32::Nostr::NIP19.decode(bech32_str)
|
36
37
|
if entity.is_a?(Bech32::Nostr::BareEntity)
|
37
38
|
puts <<~EOS
|
@@ -43,6 +44,13 @@ class CLI < Thor
|
|
43
44
|
puts " #{entry.to_s}"
|
44
45
|
end
|
45
46
|
end
|
47
|
+
when Bech32::SilentPaymentAddr::HRP_MAINNET, Bech32::SilentPaymentAddr::HRP_TESTNET
|
48
|
+
addr = Bech32::SilentPaymentAddr.parse(bech32_str)
|
49
|
+
puts <<~EOS
|
50
|
+
version: #{addr.version}
|
51
|
+
scan public key: #{addr.scan_key}
|
52
|
+
spend public key: #{addr.spend_key}
|
53
|
+
EOS
|
46
54
|
end
|
47
55
|
else
|
48
56
|
puts 'Can not decode.'
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Bech32
|
2
|
+
# BIP-352 silent payment address.
|
3
|
+
# https://github.com/bitcoin/bips/blob/master/bip-0352.mediawiki#user-content-Address_encoding
|
4
|
+
class SilentPaymentAddr
|
5
|
+
HRP_MAINNET = 'sp'
|
6
|
+
HRP_TESTNET = 'tsp'
|
7
|
+
|
8
|
+
attr_reader :hrp
|
9
|
+
attr_reader :version
|
10
|
+
attr_reader :scan_key
|
11
|
+
attr_reader :spend_key
|
12
|
+
|
13
|
+
# Constructor
|
14
|
+
# @param [String] hrp HRP for silent payment address.
|
15
|
+
# @param [Integer] version The version of sp address.
|
16
|
+
# @param [String] scan_key The scan public key with hex format.
|
17
|
+
# @param [String] spend_key The spend public key with hex format.
|
18
|
+
def initialize(hrp, version, scan_key, spend_key)
|
19
|
+
raise ArgumentError, "hrp must be sp or tsp." unless [HRP_MAINNET, HRP_TESTNET].include?(hrp)
|
20
|
+
raise ArgumentError, "version must be Integer." unless version.is_a?(Integer)
|
21
|
+
raise ArgumentError, "scan_key must be String." unless scan_key.is_a?(String)
|
22
|
+
raise ArgumentError, "spend_key must be String." unless spend_key.is_a?(String)
|
23
|
+
raise ArgumentError, 'scan_key must be 33 bytes.' unless [scan_key].pack('H*').bytesize == 33
|
24
|
+
raise ArgumentError, 'spend_key must be 33 bytes.' unless [spend_key].pack('H*').bytesize == 33
|
25
|
+
@hrp = hrp
|
26
|
+
@version = version
|
27
|
+
@scan_key = scan_key
|
28
|
+
@spend_key = spend_key
|
29
|
+
end
|
30
|
+
|
31
|
+
# Parse silent payment address.
|
32
|
+
# @param [String] addr Silent payment address.
|
33
|
+
# @return [Bech32::SilentPaymentAddr]
|
34
|
+
# @raise [ArgumentError]
|
35
|
+
def self.parse(addr)
|
36
|
+
raise ArgumentError, "addr must be String." unless addr.is_a?(String)
|
37
|
+
hrp, data, spec = Bech32.decode(addr, addr.length)
|
38
|
+
raise ArgumentError, "addr must be encoded with bech32m." unless spec == Bech32::Encoding::BECH32M
|
39
|
+
raise ArgumentError, 'Invalid hrp.' if hrp.nil? || data[0].nil? || ![HRP_MAINNET, HRP_TESTNET].include?(hrp)
|
40
|
+
version = data[0]
|
41
|
+
keys = Bech32.convert_bits(data[1..-1], 5, 8, false).pack('C*').unpack1('H*')
|
42
|
+
raise ArgumentError, "Invalid key size." unless keys.length == 132
|
43
|
+
scan = keys[0...66]
|
44
|
+
spend = keys[66..-1]
|
45
|
+
Bech32::SilentPaymentAddr.new(hrp, version, scan, spend)
|
46
|
+
end
|
47
|
+
|
48
|
+
# Get silent payment address.
|
49
|
+
# @return [String]
|
50
|
+
def to_s
|
51
|
+
keys = scan_key + spend_key
|
52
|
+
data = [keys].pack('H*').unpack('C*')
|
53
|
+
Bech32.encode(hrp, [version] + Bech32.convert_bits(data, 8, 5), Bech32::Encoding::BECH32M)
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
data/lib/bech32/version.rb
CHANGED
data/lib/bech32.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bech32
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shigeyuki Azuchi
|
8
|
-
autorequire:
|
9
8
|
bindir: exe
|
10
9
|
cert_chain: []
|
11
|
-
date:
|
10
|
+
date: 2025-03-25 00:00:00.000000000 Z
|
12
11
|
dependencies:
|
13
12
|
- !ruby/object:Gem::Dependency
|
14
13
|
name: thor
|
@@ -79,12 +78,12 @@ files:
|
|
79
78
|
- lib/bech32/nostr/entity.rb
|
80
79
|
- lib/bech32/nostr/nip19.rb
|
81
80
|
- lib/bech32/segwit_addr.rb
|
81
|
+
- lib/bech32/silent_payment_addr.rb
|
82
82
|
- lib/bech32/version.rb
|
83
83
|
homepage: https://github.com/azuchi/bech32rb
|
84
84
|
licenses:
|
85
85
|
- MIT
|
86
86
|
metadata: {}
|
87
|
-
post_install_message:
|
88
87
|
rdoc_options: []
|
89
88
|
require_paths:
|
90
89
|
- lib
|
@@ -99,8 +98,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
99
98
|
- !ruby/object:Gem::Version
|
100
99
|
version: '0'
|
101
100
|
requirements: []
|
102
|
-
rubygems_version: 3.
|
103
|
-
signing_key:
|
101
|
+
rubygems_version: 3.6.3
|
104
102
|
specification_version: 4
|
105
103
|
summary: The implementation of Bech32 encoder and decoder.
|
106
104
|
test_files: []
|