base58-alphabets 0.1.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Manifest.txt +3 -0
- data/README.md +160 -17
- data/Rakefile +1 -1
- data/lib/base58-alphabets.rb +1 -0
- data/lib/base58-alphabets/base.rb +99 -21
- data/lib/base58-alphabets/base58.rb +7 -32
- data/lib/base58-alphabets/flickr.rb +85 -0
- data/lib/base58-alphabets/version.rb +2 -2
- data/test/test_base58_bitcoin.rb +88 -14
- data/test/test_base58_flickr.rb +35 -0
- data/test/test_bytes.rb +26 -0
- metadata +9 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8735c482bb9af50045ac3bff88b5418b6e5960e03ea08c58f683063ffefae1ee
|
4
|
+
data.tar.gz: 5125cf91554db05f2036f6c9405c36bcaf87de991f9738f255a63228e916aa9d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fc8da02281febbb8cea46a5c9f7b7c304fcfbff15ea22568195ee12f2d577870e8d2dabf358475de7b36b4e427a720b41e198ca965de2b9e4c1c1de1e4c44dd0
|
7
|
+
data.tar.gz: e5eb2757f961cdb42b5dc8b38796740ee9347ba9d0dcf49244c385468bf3ab8e51ad74a3e3793083961117a6bcf71a0ba61117231bff2a449a431469d5afd695
|
data/Manifest.txt
CHANGED
@@ -6,6 +6,9 @@ lib/base58-alphabets.rb
|
|
6
6
|
lib/base58-alphabets/base.rb
|
7
7
|
lib/base58-alphabets/base58.rb
|
8
8
|
lib/base58-alphabets/bitcoin.rb
|
9
|
+
lib/base58-alphabets/flickr.rb
|
9
10
|
lib/base58-alphabets/version.rb
|
10
11
|
test/helper.rb
|
11
12
|
test/test_base58_bitcoin.rb
|
13
|
+
test/test_base58_flickr.rb
|
14
|
+
test/test_bytes.rb
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Base58 Encoding / Decoding
|
2
2
|
|
3
|
-
Encode / decode numbers with Bitcoin or Flickr base58 notation / alphabet
|
3
|
+
Encode / decode numbers, hex or binary strings (incl. leading zeros) with Bitcoin or Flickr base58 notation / alphabet
|
4
4
|
|
5
5
|
|
6
6
|
* home :: [github.com/rubycoco/blockchain](https://github.com/rubycoco/blockchain)
|
@@ -11,31 +11,22 @@ Encode / decode numbers with Bitcoin or Flickr base58 notation / alphabet
|
|
11
11
|
|
12
12
|
|
13
13
|
|
14
|
-
##
|
15
|
-
|
14
|
+
## Base58 Alphabets
|
16
15
|
|
17
|
-
|
18
|
-
|
19
|
-
> when printed (`0` - zero, `I` - capital i, `O` - capital o and `l` - lower case L).
|
20
|
-
> Satoshi Nakamoto invented the base58 encoding scheme when creating bitcoin.
|
21
|
-
> Some messaging and social media systems line break on non-alphanumeric
|
22
|
-
> strings. This is avoided by not using URI reserved characters such as `+`.
|
23
|
-
>
|
24
|
-
> (Source: [Base58 @ Wikipedia](https://en.wikipedia.org/wiki/Binary-to-text_encoding#Base58))
|
16
|
+
[Bitcoin](#bitcoin) •
|
17
|
+
[Flickr](#flickr)
|
25
18
|
|
26
19
|
|
27
20
|
|
28
|
-
|
21
|
+
### Bitcoin
|
29
22
|
|
30
23
|
The bitcoin notation / alphabet (`123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz`)
|
31
24
|
|
25
|
+
The order of it's 58 characters is numeric, uppercase-alpha, lowercase-alpha.
|
32
26
|
|
33
|
-
Triva Quiz: What characters (digits/letters) are
|
34
|
-
missing in the base 56 alphabets?
|
35
27
|
|
36
|
-
- `0` (Zero), `O` (Upper-O), `I` (Upper-I), `l` (Lower-L)
|
37
28
|
|
38
|
-
Why use
|
29
|
+
Why use base58 (and not "standard" base64)?
|
39
30
|
|
40
31
|
```
|
41
32
|
// - Don't want 0OIl characters that look the same in some fonts and
|
@@ -49,7 +40,7 @@ Why use base56 (and not "standard" base64)?
|
|
49
40
|
|
50
41
|
|
51
42
|
|
52
|
-
|
43
|
+
#### Bitcoin (Base58) Notation
|
53
44
|
|
54
45
|
|Num |Character |Num |Character |Num |Character |Num |Character|
|
55
46
|
|----:|----------:|----:|----------:|----:|----------:|----:|--------:|
|
@@ -69,7 +60,159 @@ Why use base56 (and not "standard" base64)?
|
|
69
60
|
| 52 | **u** | 53 | **v** | 54 | **w** | 55 | **x** |
|
70
61
|
| 56 | **y** | 57 | **z** |
|
71
62
|
|
63
|
+
Note: `0` (Zero), `O` (Upper-O), `I` (Upper-I), `l` (Lower-L) - these four characters (digits/letters) are
|
64
|
+
missing in the base 58 alphabets.
|
65
|
+
|
66
|
+
|
67
|
+
**Usage**
|
68
|
+
|
69
|
+
|
70
|
+
Encode / Decode Numbers
|
71
|
+
|
72
|
+
```ruby
|
73
|
+
require 'base58-alphabets'
|
74
|
+
|
75
|
+
Base58.encode_num( 100 ) #=> "2j"
|
76
|
+
Base58.encode_num( 123456789 ) #=> "BukQL"
|
77
|
+
|
78
|
+
Base58.decode_num( "2j") #=> 100
|
79
|
+
Base58.decode_num( "BukQL" ) #=> 123456789
|
80
|
+
|
81
|
+
# or
|
82
|
+
|
83
|
+
Base58::Bitcoin.encode_num( 100 ) #=> "2j"
|
84
|
+
Base58::Bitcoin.encode_num( 123456789 ) #=> "BukQL"
|
85
|
+
|
86
|
+
Base58::Bitcoin.decode_num( "2j") #=> 100
|
87
|
+
Base58::Bitcoin.decode_num( "BukQL" ) #=> 123456789
|
88
|
+
```
|
89
|
+
|
90
|
+
Encode / Decode Hex Strings
|
91
|
+
|
92
|
+
```ruby
|
93
|
+
Base58.encode_hex( "626262" ) #=> "a3gV"
|
94
|
+
# Note: The `0x` or `0X` hex prefix is optional.
|
95
|
+
Base58.encode_hex( "0x626262" ) #=> "a3gV"
|
96
|
+
Base58.encode_hex( "0X626262" ) #=> "a3gV"
|
97
|
+
Base58.encode_hex( "516b6fcd0f" ) #=> "ABnLTmg"
|
98
|
+
|
99
|
+
Base58.decode_hex( "a3gV" ) #=> "626262"
|
100
|
+
Base58.decode_hex( "ABnLTmg" ) #=> "516b6fcd0f"
|
101
|
+
|
102
|
+
# or
|
103
|
+
|
104
|
+
Base58::Bitcoin.encode_hex( "626262" ) #=> "a3gV"
|
105
|
+
Base58::Bitcoin.encode_hex( "516b6fcd0f" ) #=> "ABnLTmg"
|
106
|
+
|
107
|
+
Base58::Bitcoin.decode_hex( "a3gV" ) #=> "626262"
|
108
|
+
Base58::Bitcoin.decode_hex( "ABnLTmg" ) #=> "516b6fcd0f"
|
109
|
+
```
|
110
|
+
|
111
|
+
|
112
|
+
What about leading zeros?
|
113
|
+
|
114
|
+
Yes, if you use a hex or binary string - the leading zero bytes
|
115
|
+
will get encoded / decoded (converted from `00` to `1` and back):
|
116
|
+
|
117
|
+
```ruby
|
118
|
+
Base58.encode_hex( "00000000000000000000" ) #=> "1111111111"
|
119
|
+
Base58.encode_hex( "00000000000000000000123456789abcdef0" ) #=> "111111111143c9JGph3DZ"
|
120
|
+
|
121
|
+
Base58.decode_hex( "1111111111" ) #=> "00000000000000000000"
|
122
|
+
Base58.decode_hex( "111111111143c9JGph3DZ" ) #=> "00000000000000000000123456789abcdef0"
|
123
|
+
```
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
Encode / Decode Bin(ary) Strings
|
128
|
+
|
129
|
+
```ruby
|
130
|
+
Base58.encode_bin( "\xCE\xE99\x86".b ) #=> "6Hknds"
|
131
|
+
|
132
|
+
Base58.decode_bin( "6Hknds" ) #=> "\xCE\xE99\x86"
|
133
|
+
|
134
|
+
# or
|
135
|
+
|
136
|
+
Base58::Bitcoin.encode_bin( "\xCE\xE99\x86".b ) #=> "6Hknds"
|
137
|
+
|
138
|
+
Base58::Bitcoin.decode_bin( "6Hknds" ) #=> "\xCE\xE99\x86"
|
139
|
+
```
|
140
|
+
|
141
|
+
|
142
|
+
|
143
|
+
|
144
|
+
### Flickr
|
145
|
+
|
146
|
+
The flickr notation / alphabet (`123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ`)
|
147
|
+
|
148
|
+
The order of it's 58 characters is numeric, lowercase-alpha, uppercase-alpha.
|
149
|
+
|
150
|
+
|
151
|
+
|
152
|
+
Encode / Decode Numbers
|
153
|
+
|
154
|
+
```ruby
|
155
|
+
Base58.format = :flickr # switch to flickr alphabet (default is bitcoin)
|
156
|
+
|
157
|
+
Base58.encode_num( 12345 ) #=> "4ER"
|
158
|
+
|
159
|
+
Base58.decode_num( "4ER" ) #=> 12345
|
160
|
+
|
161
|
+
# or
|
162
|
+
|
163
|
+
Base58::Flickr.encode_num( 12345 ) #=> "4ER"
|
164
|
+
|
165
|
+
Base58::Flickr.decode_num( "4ER" ) #=> 12345
|
166
|
+
```
|
167
|
+
|
168
|
+
|
169
|
+
That's it.
|
170
|
+
|
171
|
+
|
172
|
+
|
173
|
+
## What's Base 58?
|
174
|
+
|
175
|
+
The number of characters you are left with when you use
|
176
|
+
all the characters in the alphanumeric alphabet,
|
177
|
+
but remove all the easily mistakable characters like `0`, `O`, `l` and `I`
|
178
|
+
is... 58.
|
179
|
+
|
180
|
+
alphanumeric = `0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz` (62 characters)
|
181
|
+
|
182
|
+
base58 = ` 123456789ABCDEFGH JKLMN PQRSTUVWXYZabcdefghijk mnopqrstuvwxyz` (58 characters)
|
183
|
+
|
184
|
+
|
185
|
+
|
186
|
+
From the Wikipedia:
|
187
|
+
|
188
|
+
> Similar to Base64, but modified to avoid both non-alphanumeric
|
189
|
+
> characters (`+` and `/`) and letters which might look ambiguous
|
190
|
+
> when printed (`0` - zero, `I` - capital i, `O` - capital o and `l` - lower case L).
|
191
|
+
> Satoshi Nakamoto invented the base58 encoding scheme when creating bitcoin.
|
192
|
+
> Some messaging and social media systems line break on non-alphanumeric
|
193
|
+
> strings. This is avoided by not using URI reserved characters such as `+`.
|
194
|
+
>
|
195
|
+
> (Source: [Base58 @ Wikipedia](https://en.wikipedia.org/wiki/Binary-to-text_encoding#Base58))
|
196
|
+
|
197
|
+
|
198
|
+
|
199
|
+
Why use base58?
|
200
|
+
|
201
|
+
The more characters you have in your base, the less you will need to use to represent big numbers.
|
202
|
+
The bigger your base, the shorter your "number". Example:
|
203
|
+
|
204
|
+
``` ruby
|
205
|
+
base10( 9999 ) #=> 9999 - decimal
|
206
|
+
base16( 9999 ) #=> 270f - hexadecimal
|
207
|
+
base58( 9999 ) #=> 3yQ
|
208
|
+
```
|
209
|
+
|
210
|
+
|
211
|
+
## Install
|
212
|
+
|
213
|
+
Just install the gem:
|
72
214
|
|
215
|
+
$ gem install base58-alphabets
|
73
216
|
|
74
217
|
|
75
218
|
|
data/Rakefile
CHANGED
@@ -5,7 +5,7 @@ Hoe.spec 'base58-alphabets' do
|
|
5
5
|
|
6
6
|
self.version = Base58::VERSION
|
7
7
|
|
8
|
-
self.summary = "base58-alphabets - base58 encoding / decoding with bitcoin or flickr notation / alphabet"
|
8
|
+
self.summary = "base58-alphabets - base58 encoding / decoding numbers, hex or binary strings (incl. leading zeros) with bitcoin or flickr notation / alphabet"
|
9
9
|
self.description = summary
|
10
10
|
|
11
11
|
self.urls = { home: 'https://github.com/rubycoco/blockchain' }
|
data/lib/base58-alphabets.rb
CHANGED
@@ -5,37 +5,115 @@
|
|
5
5
|
module Base58
|
6
6
|
class Base
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
end
|
8
|
+
BASE = 58 # ALPHABET.length == 58 ## 58 chars/letters/digits
|
9
|
+
|
10
|
+
## check if it is a hex (string)
|
11
|
+
## - allow optiona 0x or 0X and allow abcdef and ABCDEF
|
12
|
+
HEX_RE = /\A(?:0x)?[0-9a-f]+\z/i
|
13
|
+
|
14
|
+
|
16
15
|
|
17
|
-
|
16
|
+
# Converts a base10 integer to a base58 string.
|
17
|
+
def self.encode_num( num ) ## num_to_base58 / int_to_base58
|
18
|
+
_bytes( num ).reduce( String.new ) do |buf, byte|
|
18
19
|
buf << alphabet[byte]
|
19
20
|
buf
|
20
21
|
end
|
21
22
|
end
|
22
23
|
|
23
24
|
|
25
|
+
# Converts binary string into its Base58 representation.
|
26
|
+
# If string is empty returns an empty string.
|
27
|
+
def self.encode_bin( data ) ## todo/check: add alias such as bin_to_base58 / data_to_base58 - why? why not?
|
28
|
+
leading_zeroes = 0
|
29
|
+
num = 0
|
30
|
+
base = 1
|
31
|
+
data.bytes.reverse_each do |byte|
|
32
|
+
if byte == 0
|
33
|
+
leading_zeroes += 1
|
34
|
+
else
|
35
|
+
leading_zeroes = 0
|
36
|
+
num += base*byte
|
37
|
+
end
|
38
|
+
base *= 256
|
39
|
+
end
|
40
|
+
|
41
|
+
(alphabet[0]*leading_zeroes) + encode_num( num )
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
# Converts hex string into its Base58 representation.
|
46
|
+
def self.encode_hex( str )
|
47
|
+
## todo/check: allow empty string ("") - why? why not?
|
48
|
+
raise ArgumentError, "expected hex string (0-9a-f) - got >#{str}< - can't pack string; sorry" unless str =~ HEX_RE || str.empty?
|
49
|
+
|
50
|
+
str = _strip0x( str ) ## check if input starts with 0x or 0X if yes - (auto-)cut off!!!!!
|
51
|
+
encode_bin( [str].pack('H*') )
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
|
24
57
|
# Converts a base58 string to a base10 integer.
|
25
|
-
def self.
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
58
|
+
def self.decode_num( str ) ## todo/check: add alias base58_to_num / base58_to_int
|
59
|
+
bytes = str.each_char.reduce([]) do |bytes,char|
|
60
|
+
byte = number[char]
|
61
|
+
raise ArgumentError, "Value passed not a valid base58 string - >#{char}< not found in alphabet" if byte.nil?
|
62
|
+
bytes << byte
|
63
|
+
bytes
|
64
|
+
end
|
65
|
+
_pack( bytes )
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
def self.decode_bin( str )
|
70
|
+
num = decode_num( str )
|
71
|
+
|
72
|
+
## use base 256 for characters to binary conversion!!!
|
73
|
+
data = _bytes( num, base: 256 ).pack( 'C*' )
|
74
|
+
|
75
|
+
## check for leading zeros
|
76
|
+
str.bytes.each do |byte|
|
77
|
+
break if byte != alphabet[0].ord
|
78
|
+
data = "\x00" + data
|
36
79
|
end
|
37
|
-
|
80
|
+
data
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.decode_hex( str )
|
84
|
+
decode_bin( str ).unpack( 'H*' )[0]
|
38
85
|
end
|
39
86
|
|
87
|
+
|
88
|
+
|
89
|
+
|
90
|
+
####
|
91
|
+
# (private) helper - note: leading underscore in name e.g. _bytes
|
92
|
+
def self._bytes( num, base: BASE ) ## num_to_bytes
|
93
|
+
## note: 0 leads to empty [] and NOT [0] !!!!
|
94
|
+
b = []
|
95
|
+
while num > 0
|
96
|
+
num, mod = num.divmod( base )
|
97
|
+
b << mod
|
98
|
+
end
|
99
|
+
b = b.reverse
|
100
|
+
b
|
101
|
+
end
|
102
|
+
|
103
|
+
|
104
|
+
def self._pack( bytes ) ## bytes_to_num
|
105
|
+
num = 0
|
106
|
+
bytes.reverse.each_with_index do |byte,index|
|
107
|
+
num += byte * (BASE**(index))
|
108
|
+
end
|
109
|
+
num
|
110
|
+
end
|
111
|
+
|
112
|
+
|
113
|
+
def self._strip0x( str ) ## todo/check: add alias e.g. strip_hex_prefix or such - why? why not?
|
114
|
+
(str[0,2] == '0x' || str[0,2] == '0X') ? str[2..-1] : str
|
115
|
+
end
|
116
|
+
|
117
|
+
|
40
118
|
end # class Base
|
41
119
|
end # module Base58
|
@@ -1,12 +1,10 @@
|
|
1
1
|
module Base58
|
2
2
|
|
3
|
-
BASE = 58 # ALPHABET.length == 58 ## 58 chars/letters/digits
|
4
|
-
|
5
3
|
class Configuration
|
6
4
|
|
7
5
|
MAPPING = {
|
8
6
|
bitcoin: Bitcoin,
|
9
|
-
|
7
|
+
flickr: Flickr,
|
10
8
|
}
|
11
9
|
|
12
10
|
attr_reader :format
|
@@ -44,38 +42,15 @@ module Base58
|
|
44
42
|
|
45
43
|
|
46
44
|
|
47
|
-
def self.
|
48
|
-
|
49
|
-
end
|
50
|
-
|
51
|
-
def self.decode( str_or_bytes, klass: configuration.format )
|
52
|
-
klass.decode( str_or_bytes )
|
53
|
-
end
|
54
|
-
|
55
|
-
|
45
|
+
def self.encode_num( num, klass: configuration.format ) klass.encode_num( num ); end
|
46
|
+
def self.encode_bin( data, klass: configuration.format ) klass.encode_bin( data ); end
|
47
|
+
def self.encode_hex( str, klass: configuration.format ) klass.encode_hex( str ); end
|
56
48
|
|
49
|
+
def self.decode_num( str, klass: configuration.format ) klass.decode_num( str ); end
|
50
|
+
def self.decode_bin( str, klass: configuration.format ) klass.decode_bin( str ); end
|
51
|
+
def self.decode_hex( str, klass: configuration.format ) klass.decode_hex( str ); end
|
57
52
|
|
58
|
-
####
|
59
|
-
# (private) helper - note: leading underscore in name e.g. _bytes
|
60
|
-
def self._bytes( num )
|
61
|
-
b = []
|
62
|
-
while num >= BASE
|
63
|
-
mod = num % BASE
|
64
|
-
b << mod
|
65
|
-
num = (num - mod) / BASE
|
66
|
-
end
|
67
|
-
b << num
|
68
|
-
b = b.reverse
|
69
|
-
b
|
70
|
-
end
|
71
53
|
|
72
|
-
def self._pack( bytes )
|
73
|
-
num = 0
|
74
|
-
bytes.reverse.each_with_index do |byte,index|
|
75
|
-
num += byte * (BASE**(index))
|
76
|
-
end
|
77
|
-
num
|
78
|
-
end
|
79
54
|
|
80
55
|
## encoding alphabet - letter-to-number by index / array
|
81
56
|
def self.alphabet( klass: configuration.format ) klass.alphabet; end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module Base58
|
4
|
+
class Flickr < Base
|
5
|
+
|
6
|
+
ALPHABET = %w[ 1 2 3 4 5 6 7 8 9
|
7
|
+
a b c d e f g h i j k m n o p q r s t u v w x y z
|
8
|
+
A B C D E F G H J K L M N P Q R S T U V W X Y Z ]
|
9
|
+
|
10
|
+
|
11
|
+
def self.alphabet() ALPHABET; end ## add alpha / char aliases - why? why not?
|
12
|
+
|
13
|
+
## Note:
|
14
|
+
## for decoding allow (misspelled) l/I for 1 - why? why not?
|
15
|
+
## and (misspelled) 0/O for o - why? why not?
|
16
|
+
|
17
|
+
|
18
|
+
NUMBER = {
|
19
|
+
'1' => 0, ## 'l' => 0, 'I' => 0,
|
20
|
+
'2' => 1,
|
21
|
+
'3' => 2,
|
22
|
+
'4' => 3,
|
23
|
+
'5' => 4,
|
24
|
+
'6' => 5,
|
25
|
+
'7' => 6,
|
26
|
+
'8' => 7,
|
27
|
+
'9' => 8,
|
28
|
+
'a' => 9,
|
29
|
+
'b' => 10,
|
30
|
+
'c' => 11,
|
31
|
+
'd' => 12,
|
32
|
+
'e' => 13,
|
33
|
+
'f' => 14,
|
34
|
+
'g' => 15,
|
35
|
+
'h' => 16,
|
36
|
+
'i' => 17,
|
37
|
+
'j' => 18,
|
38
|
+
'k' => 19,
|
39
|
+
'm' => 20,
|
40
|
+
'n' => 21,
|
41
|
+
'o' => 22, ## '0' => 22, 'O' => 22,
|
42
|
+
'p' => 23,
|
43
|
+
'q' => 24,
|
44
|
+
'r' => 25,
|
45
|
+
's' => 26,
|
46
|
+
't' => 27,
|
47
|
+
'u' => 28,
|
48
|
+
'v' => 29,
|
49
|
+
'w' => 30,
|
50
|
+
'x' => 31,
|
51
|
+
'y' => 32,
|
52
|
+
'z' => 33,
|
53
|
+
'A' => 34,
|
54
|
+
'B' => 35,
|
55
|
+
'C' => 36,
|
56
|
+
'D' => 37,
|
57
|
+
'E' => 38,
|
58
|
+
'F' => 39,
|
59
|
+
'G' => 40,
|
60
|
+
'H' => 41,
|
61
|
+
'J' => 42,
|
62
|
+
'K' => 43,
|
63
|
+
'L' => 44,
|
64
|
+
'M' => 45,
|
65
|
+
'N' => 46,
|
66
|
+
'P' => 47,
|
67
|
+
'Q' => 48,
|
68
|
+
'R' => 49,
|
69
|
+
'S' => 50,
|
70
|
+
'T' => 51,
|
71
|
+
'U' => 52,
|
72
|
+
'V' => 53,
|
73
|
+
'W' => 54,
|
74
|
+
'X' => 55,
|
75
|
+
'Y' => 56,
|
76
|
+
'Z' => 57,
|
77
|
+
}
|
78
|
+
|
79
|
+
def self.number() NUMBER; end ## add num alias - why? why not?
|
80
|
+
|
81
|
+
## add shortcuts (convenience) aliases
|
82
|
+
NUM = NUMBER
|
83
|
+
|
84
|
+
end # class Flickr
|
85
|
+
end # module Base58
|
data/test/test_base58_bitcoin.rb
CHANGED
@@ -8,25 +8,99 @@ require 'helper'
|
|
8
8
|
|
9
9
|
class TestBase58Bitcoin < MiniTest::Test
|
10
10
|
|
11
|
+
NUM_TESTS = [
|
12
|
+
[100, "2j"],
|
13
|
+
[12345, "4fr"],
|
14
|
+
[6639914, "b2pH"],
|
15
|
+
[123456789, "BukQL"],
|
11
16
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
17
|
+
[3471391110, "6Hknds"],
|
18
|
+
[3470152229, "6HeSMr"],
|
19
|
+
[3470988633, "6Hiizc"],
|
20
|
+
[3470993664, "6HikVM"],
|
21
|
+
[3471485480, "6HmGgw"],
|
22
|
+
[3469844075, "6Hcrkr"],
|
23
|
+
]
|
16
24
|
|
17
|
-
|
18
|
-
|
19
|
-
|
25
|
+
HEX_TESTS = [
|
26
|
+
["", ""],
|
27
|
+
["00","1"],
|
28
|
+
["00000000000000000000", "1111111111"],
|
29
|
+
["00000000000000000000123456789abcdef0", "111111111143c9JGph3DZ"],
|
30
|
+
["13", "L"],
|
31
|
+
["2e", "o"],
|
32
|
+
["61", "2g"],
|
33
|
+
["626262", "a3gV"],
|
34
|
+
["636363", "aPEr"],
|
35
|
+
["73696d706c792061206c6f6e6720737472696e67", "2cFupjhnEsSn59qHXstmK2ffpLv2"],
|
36
|
+
["00eb15231dfceb60925886b67d065299925915aeb172c06647", "1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L"],
|
37
|
+
["0093ce48570b55c42c2af816aeaba06cfee1224faebb6127fe", "1EUXSxuUVy2PC5enGXR1a3yxbEjNWMHuem"],
|
38
|
+
["516b6fcd0f", "ABnLTmg"],
|
39
|
+
["bf4f89001e670274dd", "3SEo3LWLoPntC"],
|
40
|
+
["572e4794", "3EFU7m"],
|
41
|
+
["ecac89cad93923c02321", "EJDM8drfXA6uyA"],
|
42
|
+
["10c8511e", "Rt5zm"],
|
43
|
+
]
|
20
44
|
|
21
45
|
|
22
|
-
Base58.format = :bitcoin
|
23
|
-
assert_equal "2j", Base58.encode( 100 )
|
24
|
-
assert_equal "4fr", Base58.encode( 12345 )
|
25
|
-
assert_equal "b2pH", Base58.encode( 6639914 )
|
26
46
|
|
27
|
-
|
28
|
-
|
29
|
-
|
47
|
+
|
48
|
+
|
49
|
+
BIN_TESTS = [
|
50
|
+
["\xCE\xE99\x86".b, "6Hknds"],
|
51
|
+
["\xCE\xD6R%".b, "6HeSMr"],
|
52
|
+
["\xCE\xE3\x15Y".b, "6Hiizc"],
|
53
|
+
["\xCE\xE3)\x00".b, "6HikVM"],
|
54
|
+
["\xCE\xEA\xAA(".b, "6HmGgw"],
|
55
|
+
["\xCE\xD1\x9Ek".b, "6Hcrkr"],
|
56
|
+
["\x01\xAD<l'\xAF!\x96N\x93u\x93\xE2\xAF\x92p\x96=\x89n\xD7\x953\x17\x12\x8E\xBD\xA2\x04\x84~Z".b, "7Ycsh3K7oGpLTcQpNx1h7Z19fVbZ4TXqEYePfdFwDZT"],
|
57
|
+
|
58
|
+
["".b, ""],
|
59
|
+
[" ".b, "Z"],
|
60
|
+
["-".b, "n"],
|
61
|
+
["0".b, "q"],
|
62
|
+
["1".b, "r"],
|
63
|
+
["-1".b, "4SU"],
|
64
|
+
["11".b, "4k8"],
|
65
|
+
["abc".b, "ZiCa"],
|
66
|
+
["1234598760".b, "3mJr7AoUXx2Wqd"],
|
67
|
+
["abcdefghijklmnopqrstuvwxyz".b, "3yxU3u1igY8WkgtjK92fbJQCd4BZiiT1v25f"],
|
68
|
+
["00000000000000000000000000000000000000000000000000000000000000".b, "3sN2THZeE9Eh9eYrwkvZqNstbHGvrxSAM7gXUXvyFQP8XvQLUqNCS27icwUeDT7ckHm4FUHM2mTVh1vbLmk7y"],
|
69
|
+
]
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
def test_num
|
74
|
+
NUM_TESTS.each do |item|
|
75
|
+
assert_equal item[1], Base58::Bitcoin.encode_num( item[0] )
|
76
|
+
assert_equal item[0], Base58::Bitcoin.decode_num( item[1] )
|
77
|
+
|
78
|
+
Base58.format = :bitcoin
|
79
|
+
assert_equal item[1], Base58.encode_num( item[0] )
|
80
|
+
assert_equal item[0], Base58.decode_num( item[1] )
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_hex
|
85
|
+
HEX_TESTS.each do |item|
|
86
|
+
assert_equal item[1], Base58::Bitcoin.encode_hex( item[0] )
|
87
|
+
assert_equal item[0], Base58::Bitcoin.decode_hex( item[1] )
|
88
|
+
|
89
|
+
Base58.format = :bitcoin
|
90
|
+
assert_equal item[1], Base58.encode_hex( item[0] )
|
91
|
+
assert_equal item[0], Base58.decode_hex( item[1] )
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_bin
|
96
|
+
BIN_TESTS.each do |item|
|
97
|
+
assert_equal item[1], Base58::Bitcoin.encode_bin( item[0] )
|
98
|
+
assert_equal item[0], Base58::Bitcoin.decode_bin( item[1] )
|
99
|
+
|
100
|
+
Base58.format = :bitcoin
|
101
|
+
assert_equal item[1], Base58.encode_bin( item[0] )
|
102
|
+
assert_equal item[0], Base58.decode_bin( item[1] )
|
103
|
+
end
|
30
104
|
end
|
31
105
|
|
32
106
|
|
@@ -0,0 +1,35 @@
|
|
1
|
+
###
|
2
|
+
# to run use
|
3
|
+
# ruby -I ./lib -I ./test test/test_base58_flickr.rb
|
4
|
+
|
5
|
+
|
6
|
+
require 'helper'
|
7
|
+
|
8
|
+
|
9
|
+
class TestBase58Flickr < MiniTest::Test
|
10
|
+
|
11
|
+
NUM_TESTS = [
|
12
|
+
[3471391110, "6hKMCS"],
|
13
|
+
[3470152229, "6hDrmR"],
|
14
|
+
[3470988633, "6hHHZB"],
|
15
|
+
[3470993664, "6hHKum"],
|
16
|
+
[3471485480, "6hLgFW"],
|
17
|
+
[3469844075, "6hBRKR"],
|
18
|
+
[3470820062, "6hGRTd"],
|
19
|
+
[3469966999, "6hCuie"],
|
20
|
+
]
|
21
|
+
|
22
|
+
|
23
|
+
def test_num
|
24
|
+
NUM_TESTS.each do |item|
|
25
|
+
assert_equal item[1], Base58::Flickr.encode_num( item[0] )
|
26
|
+
assert_equal item[0], Base58::Flickr.decode_num( item[1] )
|
27
|
+
|
28
|
+
Base58.format = :flickr
|
29
|
+
assert_equal item[1], Base58.encode_num( item[0] )
|
30
|
+
assert_equal item[0], Base58.decode_num( item[1] )
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
end # class TestBase58Flickr
|
data/test/test_bytes.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
###
|
4
|
+
# to run use
|
5
|
+
# ruby -I ./lib -I ./test test/test_bytes.rb
|
6
|
+
|
7
|
+
|
8
|
+
require 'helper'
|
9
|
+
|
10
|
+
|
11
|
+
class TestBytes < MiniTest::Test
|
12
|
+
|
13
|
+
|
14
|
+
def test_bytes
|
15
|
+
bytes = Base58::Base._bytes( 123456789 )
|
16
|
+
## pp bytes
|
17
|
+
|
18
|
+
assert_equal [10,52,43,23,19], bytes
|
19
|
+
|
20
|
+
assert_equal 123456789, Base58::Base._pack( bytes )
|
21
|
+
|
22
|
+
|
23
|
+
assert_equal 123456789, Base58::Base._pack( Base58::Base._bytes( 123456789 ))
|
24
|
+
end
|
25
|
+
|
26
|
+
end # class TestBytes
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: base58-alphabets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-01-
|
11
|
+
date: 2021-01-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rdoc
|
@@ -44,8 +44,8 @@ dependencies:
|
|
44
44
|
- - "~>"
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: '3.22'
|
47
|
-
description: base58-alphabets - base58 encoding / decoding
|
48
|
-
notation / alphabet
|
47
|
+
description: base58-alphabets - base58 encoding / decoding numbers, hex or binary
|
48
|
+
strings (incl. leading zeros) with bitcoin or flickr notation / alphabet
|
49
49
|
email: wwwmake@googlegroups.com
|
50
50
|
executables: []
|
51
51
|
extensions: []
|
@@ -62,9 +62,12 @@ files:
|
|
62
62
|
- lib/base58-alphabets/base.rb
|
63
63
|
- lib/base58-alphabets/base58.rb
|
64
64
|
- lib/base58-alphabets/bitcoin.rb
|
65
|
+
- lib/base58-alphabets/flickr.rb
|
65
66
|
- lib/base58-alphabets/version.rb
|
66
67
|
- test/helper.rb
|
67
68
|
- test/test_base58_bitcoin.rb
|
69
|
+
- test/test_base58_flickr.rb
|
70
|
+
- test/test_bytes.rb
|
68
71
|
homepage: https://github.com/rubycoco/blockchain
|
69
72
|
licenses:
|
70
73
|
- Public Domain
|
@@ -89,6 +92,6 @@ requirements: []
|
|
89
92
|
rubygems_version: 3.1.4
|
90
93
|
signing_key:
|
91
94
|
specification_version: 4
|
92
|
-
summary: base58-alphabets - base58 encoding / decoding
|
93
|
-
/ alphabet
|
95
|
+
summary: base58-alphabets - base58 encoding / decoding numbers, hex or binary strings
|
96
|
+
(incl. leading zeros) with bitcoin or flickr notation / alphabet
|
94
97
|
test_files: []
|