substrate_common.rb 0.1.0 → 0.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f72ffe22e9039554feee750f0d5eef00f6cc95f63df3e20780174f1926b46530
4
- data.tar.gz: 67ba8ed682462fc23ad1439982dada786d63527310c96a567ec2107c6eec8969
3
+ metadata.gz: c601856518e431bc9a8a4623a659406c6d7a9d1826fcbb8b6cca5e0a90a06bfa
4
+ data.tar.gz: 71d880364a9777dffe1dc3f70b0dedfc2ea44c2bb12e4200d66d55ed5350f38e
5
5
  SHA512:
6
- metadata.gz: 906b043f2735ab30950fbbf1204d28d31b769d550660b1fffafd6eaa42e90460b308c409dc332642dd7aafa01810d225a6ff33b9e057a9a6fefe3f8c0be4b1a3
7
- data.tar.gz: 4167d6c20c335b432b9ef6a77e0348bb452ea085c06f96c5badaabf31f7a6ac31c20b9700eb30c308d7453ff4e219dedf8a283debdc892c413ccc8084e5112ad
6
+ metadata.gz: b3876a5c03ff8215684cf984c73ace0674045d9964c4d55f1628a66ac2c482f93f0b11ab235dabf71a6c611d15876c2d72a07e297da4bbafdf0eee31239810bd
7
+ data.tar.gz: ecefaeb3df900db65c6e48354814cd6a2792b9a144c695e39757e18557e711ea62f75956695d0694f60e1221a300850367b884d0f87b72f96f0e19ff11ea66f6
@@ -0,0 +1 @@
1
+ 2.6.4
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- substrate_common.rb (0.1.0)
4
+ substrate_common.rb (0.1.1)
5
5
  base58
6
6
  blake2b
7
7
  xxhash
@@ -13,19 +13,20 @@ GEM
13
13
  blake2b (0.10.0)
14
14
  coderay (1.1.2)
15
15
  method_source (0.9.2)
16
+ minitest (5.12.2)
16
17
  pry (0.12.2)
17
18
  coderay (~> 1.1.0)
18
19
  method_source (~> 0.9.0)
19
- rake (10.5.0)
20
+ rake (12.3.1)
20
21
  xxhash (0.4.0)
21
22
 
22
23
  PLATFORMS
23
24
  ruby
24
25
 
25
26
  DEPENDENCIES
26
- bundler (~> 1.17)
27
+ minitest
27
28
  pry
28
- rake (~> 10.0)
29
+ rake (~> 12.0)
29
30
  substrate_common.rb!
30
31
 
31
32
  BUNDLED WITH
data/Rakefile CHANGED
@@ -1,2 +1,13 @@
1
1
  require "bundler/gem_tasks"
2
- task :default => :spec
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.test_files = Dir.glob("#{__dir__}/test/*_test.rb")
7
+ t.warning = false
8
+ t.verbose = true
9
+ end
10
+
11
+ task :default => :test
12
+
13
+
@@ -3,28 +3,31 @@ require 'xxhash'
3
3
  require 'blake2b'
4
4
  require 'base58'
5
5
 
6
+
7
+ require 'substrate_common/address'
8
+
6
9
  class Array
7
- def to_hex_string
10
+ def bytes_to_hex
8
11
  raise "Not a byte array" unless self.is_byte_array?
9
12
  '0x' + self.map { |b| b.to_s(16).rjust(2, '0') }.join
10
13
  end
11
14
 
12
- def to_bin_string
15
+ def bytes_to_bin
13
16
  raise "Not a byte array" unless self.is_byte_array?
14
17
  '0b' + self.map { |b| b.to_s(2).rjust(8, '0') }.join
15
18
  end
16
19
 
17
- def to_hex_array
20
+ def bytes_to_hex
18
21
  raise "Not a byte array" unless self.is_byte_array?
19
22
  self.map { |b| b.to_s(16).rjust(2, '0') }
20
23
  end
21
24
 
22
- def to_bin_array
25
+ def bytes_to_bin
23
26
  raise "Not a byte array" unless self.is_byte_array?
24
27
  self.map { |b| b.to_s(2).rjust(8, '0') }
25
28
  end
26
29
 
27
- def to_utf8
30
+ def bytes_to_utf8
28
31
  raise "Not a byte array" unless self.is_byte_array?
29
32
  self.pack('C*').force_encoding('utf-8')
30
33
  end
@@ -39,7 +42,7 @@ class String
39
42
  Object.const_get(self)
40
43
  end
41
44
 
42
- def to_byte_array
45
+ def hex_to_bytes
43
46
  data = self.start_with?('0x') ? self[2..] : self
44
47
  raise "Not valid hex string" if data.length % 2 != 0
45
48
  data.scan(/../).map(&:hex)
@@ -54,20 +57,3 @@ def xxhash128(data)
54
57
  end
55
58
  bytes.to_hex_string
56
59
  end
57
-
58
- # https://github.com/paritytech/substrate/wiki/External-Address-Format-(SS58)
59
- # base58encode ( concat ( <address-type>, <address>, <checksum> ) )
60
- def ss58_encode(address, address_type=42)
61
- address_bytes = address.to_byte_array
62
- checksum_length = address_bytes.length == 32 ? 2 : 1
63
- input = [address_type] + address_bytes
64
- checksum = sshash(input)
65
- content = input + checksum[0...checksum_length]
66
- Base58.encode(content.to_hex_string.to_i(16), :bitcoin)
67
- end
68
-
69
- def sshash(input)
70
- checksum_prefix = 'SS58PRE'.unpack('C*')
71
- data = checksum_prefix + input
72
- Blake2b.bytes(input.to_utf8, Blake2b::Key.none, 64)
73
- end
@@ -0,0 +1,84 @@
1
+ require 'blake2b'
2
+ require 'base58'
3
+
4
+ class Address
5
+ SS58_PREFIX = 'SS58PRE'
6
+
7
+ TYPES = [
8
+ # Polkadot Live (SS58, AccountId)
9
+ 0, 1,
10
+ # Polkadot Canary (SS58, AccountId)
11
+ 2, 3,
12
+ # Kulupu (SS58, Reserved)
13
+ 16, 17,
14
+ # Dothereum (SS58, AccountId)
15
+ 20, 21,
16
+ # Generic Substrate wildcard (SS58, AccountId)
17
+ 42, 43,
18
+
19
+ # Schnorr/Ristretto 25519 ("S/R 25519") key
20
+ 48,
21
+ # Edwards Ed25519 key
22
+ 49,
23
+ # ECDSA SECP256k1 key
24
+ 50,
25
+
26
+ # Reserved for future address format extensions.
27
+ *64..255
28
+ ]
29
+
30
+ class << self
31
+
32
+ def array_to_hex_string(arr)
33
+ body = arr.map { |i| i.to_s(16).rjust(2, '0') }.join
34
+ "0x#{body}"
35
+ end
36
+
37
+ def decode(address, addr_type = 42, ignore_checksum = true)
38
+ decoded = Base58.base58_to_binary(address, :bitcoin)
39
+ is_pubkey = decoded.size == 35
40
+
41
+ size = decoded.size - ( is_pubkey ? 2 : 1 )
42
+
43
+ prefix = decoded[0, 1].unpack("C*").first
44
+
45
+ raise "Invalid address type" unless TYPES.include?(addr_type)
46
+
47
+ hash_bytes = make_hash(decoded[0, size])
48
+ if is_pubkey
49
+ is_valid_checksum = decoded[-2].unpack("C*").first == hash_bytes[0] && decoded[-1].unpack("C*").first == hash_bytes[1]
50
+ else
51
+ is_valid_checksum = decoded[-1].unpack("C*").first == hash_bytes[0]
52
+ end
53
+
54
+ raise "Invalid decoded address checksum" unless is_valid_checksum && ignore_checksum
55
+
56
+ decoded[1...size].unpack("H*").first
57
+ end
58
+
59
+
60
+ def encode(pubkey, addr_type = 42)
61
+ pubkey = pubkey[2..-1] if pubkey =~ /^0x/i
62
+ key = [pubkey].pack("H*")
63
+
64
+ u8_array = key.bytes
65
+
66
+ u8_array.unshift(addr_type)
67
+
68
+ bytes = make_hash(u8_array.pack("C*"))
69
+
70
+ checksum = bytes[0, key.size == 32 ? 2 : 1]
71
+
72
+ u8_array.push(*checksum)
73
+
74
+ input = u8_array.pack("C*")
75
+
76
+ Base58.binary_to_base58(input, :bitcoin)
77
+ end
78
+
79
+ def make_hash(body)
80
+ Blake2b.bytes("#{SS58_PREFIX}#{body}", Blake2b::Key.none, 64)
81
+ end
82
+
83
+ end
84
+ end
@@ -1,3 +1,3 @@
1
1
  module SubstrateCommon
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -38,7 +38,8 @@ Gem::Specification.new do |spec|
38
38
  spec.add_dependency "xxhash"
39
39
  spec.add_dependency "base58"
40
40
 
41
- spec.add_development_dependency "bundler", "~> 1.17"
42
- spec.add_development_dependency "rake", "~> 10.0"
41
+ # spec.add_development_dependency "bundler", "~> 1.17"
42
+ spec.add_development_dependency "rake", "~> 12.0"
43
43
  spec.add_development_dependency "pry"
44
+ spec.add_development_dependency "minitest"
44
45
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: substrate_common.rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wu Minzhe
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-10-22 00:00:00.000000000 Z
11
+ date: 2019-10-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: blake2b
@@ -53,35 +53,35 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: bundler
56
+ name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '1.17'
61
+ version: '12.0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '1.17'
68
+ version: '12.0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rake
70
+ name: pry
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: '10.0'
75
+ version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: '10.0'
82
+ version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: pry
84
+ name: minitest
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
@@ -102,6 +102,7 @@ extensions: []
102
102
  extra_rdoc_files: []
103
103
  files:
104
104
  - ".gitignore"
105
+ - ".ruby-version"
105
106
  - Gemfile
106
107
  - Gemfile.lock
107
108
  - LICENSE.txt
@@ -110,6 +111,7 @@ files:
110
111
  - bin/console
111
112
  - bin/setup
112
113
  - lib/substrate_common.rb
114
+ - lib/substrate_common/address.rb
113
115
  - lib/substrate_common/version.rb
114
116
  - substrate_common.gemspec
115
117
  homepage: https://github.com/wuminzhe/substrate_common.rb