nanocurrency 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +7 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +6 -0
  7. data/Gemfile.lock +40 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +43 -0
  10. data/Rakefile +16 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +8 -0
  13. data/ext/.DS_Store +0 -0
  14. data/ext/nanocurrency_ext/blake2-config.h +72 -0
  15. data/ext/nanocurrency_ext/blake2-impl.h +160 -0
  16. data/ext/nanocurrency_ext/blake2.h +195 -0
  17. data/ext/nanocurrency_ext/blake2b-load-sse2.h +68 -0
  18. data/ext/nanocurrency_ext/blake2b-load-sse41.h +402 -0
  19. data/ext/nanocurrency_ext/blake2b-ref.c +373 -0
  20. data/ext/nanocurrency_ext/blake2b-round.h +157 -0
  21. data/ext/nanocurrency_ext/curve25519-donna-32bit.h +579 -0
  22. data/ext/nanocurrency_ext/curve25519-donna-64bit.h +413 -0
  23. data/ext/nanocurrency_ext/curve25519-donna-helpers.h +67 -0
  24. data/ext/nanocurrency_ext/curve25519-donna-sse2.h +1112 -0
  25. data/ext/nanocurrency_ext/ed25519-donna-32bit-sse2.h +513 -0
  26. data/ext/nanocurrency_ext/ed25519-donna-32bit-tables.h +61 -0
  27. data/ext/nanocurrency_ext/ed25519-donna-64bit-sse2.h +436 -0
  28. data/ext/nanocurrency_ext/ed25519-donna-64bit-tables.h +53 -0
  29. data/ext/nanocurrency_ext/ed25519-donna-64bit-x86-32bit.h +435 -0
  30. data/ext/nanocurrency_ext/ed25519-donna-64bit-x86.h +351 -0
  31. data/ext/nanocurrency_ext/ed25519-donna-basepoint-table.h +259 -0
  32. data/ext/nanocurrency_ext/ed25519-donna-batchverify.h +275 -0
  33. data/ext/nanocurrency_ext/ed25519-donna-impl-base.h +364 -0
  34. data/ext/nanocurrency_ext/ed25519-donna-impl-sse2.h +390 -0
  35. data/ext/nanocurrency_ext/ed25519-donna-portable-identify.h +103 -0
  36. data/ext/nanocurrency_ext/ed25519-donna-portable.h +135 -0
  37. data/ext/nanocurrency_ext/ed25519-donna.h +115 -0
  38. data/ext/nanocurrency_ext/ed25519-hash-custom.c +28 -0
  39. data/ext/nanocurrency_ext/ed25519-hash-custom.h +30 -0
  40. data/ext/nanocurrency_ext/ed25519-hash.h +219 -0
  41. data/ext/nanocurrency_ext/ed25519-randombytes-custom.h +10 -0
  42. data/ext/nanocurrency_ext/ed25519-randombytes.h +91 -0
  43. data/ext/nanocurrency_ext/ed25519.c +150 -0
  44. data/ext/nanocurrency_ext/ed25519.h +30 -0
  45. data/ext/nanocurrency_ext/extconf.rb +3 -0
  46. data/ext/nanocurrency_ext/fuzz/README.md +173 -0
  47. data/ext/nanocurrency_ext/fuzz/build-nix.php +134 -0
  48. data/ext/nanocurrency_ext/fuzz/curve25519-ref10.c +1272 -0
  49. data/ext/nanocurrency_ext/fuzz/curve25519-ref10.h +8 -0
  50. data/ext/nanocurrency_ext/fuzz/ed25519-donna-sse2.c +3 -0
  51. data/ext/nanocurrency_ext/fuzz/ed25519-donna.c +1 -0
  52. data/ext/nanocurrency_ext/fuzz/ed25519-donna.h +34 -0
  53. data/ext/nanocurrency_ext/fuzz/ed25519-ref10.c +4647 -0
  54. data/ext/nanocurrency_ext/fuzz/ed25519-ref10.h +9 -0
  55. data/ext/nanocurrency_ext/fuzz/fuzz-curve25519.c +172 -0
  56. data/ext/nanocurrency_ext/fuzz/fuzz-ed25519.c +219 -0
  57. data/ext/nanocurrency_ext/modm-donna-32bit.h +469 -0
  58. data/ext/nanocurrency_ext/modm-donna-64bit.h +361 -0
  59. data/ext/nanocurrency_ext/rbext.c +164 -0
  60. data/ext/nanocurrency_ext/regression.h +1024 -0
  61. data/lib/nano/account.rb +59 -0
  62. data/lib/nano/base32.rb +87 -0
  63. data/lib/nano/block.rb +142 -0
  64. data/lib/nano/check.rb +65 -0
  65. data/lib/nano/conversion.rb +102 -0
  66. data/lib/nano/hash.rb +43 -0
  67. data/lib/nano/key.rb +69 -0
  68. data/lib/nano/utils.rb +45 -0
  69. data/lib/nano/work.rb +51 -0
  70. data/lib/nanocurrency.rb +7 -0
  71. data/lib/nanocurrency/version.rb +3 -0
  72. data/lib/nanocurrency_ext.bundle +0 -0
  73. data/nanocurrency.gemspec +44 -0
  74. metadata +192 -0
data/lib/nano/hash.rb ADDED
@@ -0,0 +1,43 @@
1
+ require "blake2b"
2
+ require_relative "./conversion"
3
+ require_relative "./utils"
4
+
5
+ module Nano
6
+ ##
7
+ # The Hash module is responsible for producing a block hash given a
8
+ # Block object.
9
+ module Hash
10
+ extend self
11
+
12
+ STATE_BLOCK_PREAMBLE_BITS = Nano::Utils.bytes_to_bin(
13
+ Array.new(32) {|i| i == 31 ? 6 : 0}
14
+ ).freeze
15
+
16
+ ##
17
+ # This method will produce a hash for the given block
18
+ #
19
+ # @param block [Nano::Block] The block to derive a hash from
20
+ #
21
+ # @return [String] The hash in a hexadecimal formatted string.
22
+ def hash_block(block)
23
+ account_bits = Nano::Utils.hex_to_bin(
24
+ Nano::Key.derive_public_key(block.account)
25
+ )
26
+ previous_bits = Nano::Utils.hex_to_bin(
27
+ block.previous
28
+ )
29
+ representative_bits = Nano::Utils.hex_to_bin(
30
+ Nano::Key.derive_public_key(block.representative)
31
+ )
32
+ balance_bits = Nano::Utils.hex_to_bin(
33
+ Nano::Unit.convert(block.balance, :raw, :hex)
34
+ )
35
+ link_bits = Nano::Utils.hex_to_bin(
36
+ block.link
37
+ )
38
+ bits = STATE_BLOCK_PREAMBLE_BITS + account_bits + previous_bits +
39
+ representative_bits + balance_bits + link_bits;
40
+ Blake2b.hex(bits).upcase
41
+ end
42
+ end
43
+ end
data/lib/nano/key.rb ADDED
@@ -0,0 +1,69 @@
1
+ require "securerandom"
2
+ require "blake2b"
3
+ require "nanocurrency_ext"
4
+ require_relative "./account"
5
+ require_relative "./check"
6
+
7
+ module Nano
8
+ ##
9
+ # The key module is responsible for handling the key and seed based
10
+ # operations in the Nano module.
11
+ module Key
12
+ extend self
13
+
14
+ ##
15
+ # Generates a 32 byte seed as a hexidecimal string. Cryptographically
16
+ # secure.
17
+ # return [String] A 64 length string of hexidecimal.
18
+ def generate_seed
19
+ SecureRandom.hex(32)
20
+ end
21
+
22
+ ##
23
+ # Derive a secret key from a seed, given an index.
24
+ # @param seed [String] The seed to generate the secret key from,
25
+ # in hexadecimal format
26
+ # @param index [Integer] The index to generate the secret key from
27
+ def derive_secret_key(seed, index)
28
+ raise(
29
+ ArgumentError, "Seed is invalid"
30
+ ) unless Nano::Check.is_seed_valid?(seed)
31
+ raise(
32
+ ArgumentError, "Index is invalid"
33
+ ) unless Nano::Check.is_index_valid?(index)
34
+
35
+ seed_bin = Nano::Utils.hex_to_bin(seed)
36
+ Blake2b.hex(seed_bin + [index].pack('L>'), Blake2b::Key.none, 32).upcase
37
+ end
38
+
39
+ def derive_public_key(input)
40
+ is_secret_key = Nano::Check.is_key?(input)
41
+ account = Nano::Account.from_address(input)
42
+ is_address = !account.nil?
43
+ raise ArgumentError, "Incorrect input" unless is_secret_key || is_address
44
+
45
+ if is_secret_key
46
+ res = NanocurrencyExt.public_key(Nano::Utils.hex_to_bin(input))
47
+ Nano::Utils.bin_to_hex(res).upcase
48
+ else
49
+ account.public_key
50
+ end
51
+ end
52
+
53
+ def derive_address(public_key, prefix = "nano_")
54
+ is_public_key = Nano::Check.is_key?(public_key)
55
+ raise ArgumentError, "Incorrect key type" unless is_public_key
56
+
57
+ is_valid_prefix = prefix == "nano_" || prefix == "xrb_"
58
+ raise ArgumentError, "Invalid prefix" unless is_valid_prefix
59
+
60
+ public_key_bytes = Nano::Utils.hex_to_bytes public_key
61
+ public_key_enc = Nano::Base32.encode public_key_bytes
62
+ pk_bin = Nano::Utils.hex_to_bin(public_key)
63
+ checksum = Blake2b.hex(pk_bin, Blake2b::Key.none, 5)
64
+ checksum_bytes = Nano::Utils.hex_to_bytes(checksum).reverse
65
+ enc_chk = Nano::Base32.encode(checksum_bytes)
66
+ "#{prefix}#{public_key_enc}#{enc_chk}"
67
+ end
68
+ end
69
+ end
data/lib/nano/utils.rb ADDED
@@ -0,0 +1,45 @@
1
+ module Nano
2
+ module Utils
3
+ extend self
4
+
5
+ ##
6
+ # Converts a byte array into hexidecimal string
7
+ # @param bytes [Array<Int8>] An array of integers representing bytes.
8
+ # @return [String] A hexidecimal byte string.
9
+ def bytes_to_hex(bytes)
10
+ bytes.map { |x| "%02X" % x }.join
11
+ end
12
+
13
+ ##
14
+ # Converts a hexidecimal string into a byte array.
15
+ # @param hex [String] A hexidecimal string of arbitrary length.
16
+ # @return [Array<Int8>] An array of integers representing the hex string.
17
+ def hex_to_bytes(hex)
18
+ hex.scan(/../).map { |x| x.hex }
19
+ end
20
+
21
+ ##
22
+ # Converts a hex string into a binary.
23
+ # @param hex [String] A hexidecimal string of arbitrary length.
24
+ # @return [Binary] A binary representing the hex string
25
+ def hex_to_bin(hex)
26
+ bytes_to_bin(hex_to_bytes(hex))
27
+ end
28
+
29
+ ##
30
+ # Converts a binary into a hexidecimal string
31
+ # @param bin [Binary] The binary value.
32
+ # @return [String] The hexidecimal string representing the binary value.
33
+ def bin_to_hex(bin)
34
+ bin.unpack('H*').first
35
+ end
36
+
37
+ ##
38
+ # Converts a byte array into a binary value.
39
+ # @param bytes [Array<Int8>] The byte array of integers.
40
+ # @return [Binary] The binary value representing the byte array.
41
+ def bytes_to_bin(bytes)
42
+ bytes.pack("C*")
43
+ end
44
+ end
45
+ end
data/lib/nano/work.rb ADDED
@@ -0,0 +1,51 @@
1
+ require "blake2b"
2
+ require "nanocurrency_ext"
3
+ require_relative "./check"
4
+
5
+ module Nano
6
+
7
+ ##
8
+ # This module is responsible for generating and validating the proof
9
+ # of work for a block hash
10
+ module Work
11
+ extend self
12
+
13
+ ##
14
+ # The maximum value a nonce can be
15
+ MAX_NONCE = 0xffffffffffffffff
16
+
17
+ ##
18
+ # The minimum threshold a proof of work needs to meet to be valid.
19
+ WORK_THRESHOLD = Integer(0xffffffc000000000)
20
+
21
+ ##
22
+ # Compute the proof of work for the hash.
23
+ # @param hash [String] the previous block hash to compute the work for.
24
+ # @return [String] the computed work as an 8 byte hex string.
25
+ def compute_work(hash)
26
+ NanocurrencyExt.compute_work(hash)
27
+ end
28
+
29
+ ##
30
+ # Checks if a proof of work is valid for the hash
31
+ # @param hash [String] The block hash the work was calculated for.
32
+ # @param work [String] The block work that was calculated for the hash.
33
+ # @return [Boolean] true if the work is valid and fits for the block hash.
34
+ def is_work_valid?(hash, work)
35
+ hash_valid = Nano::Check.is_hash_valid?(hash)
36
+ work_valid = Nano::Check.is_work_valid?(work)
37
+ throw ArgumentError, "Invalid block hash" unless hash_valid
38
+ throw ArgumentError, "Invalid work" unless work_valid
39
+
40
+ hash_bin = Nano::Utils.hex_to_bin(hash)
41
+ work_bin = Nano::Utils.hex_to_bin(work).reverse
42
+
43
+ input = work_bin + hash_bin
44
+ output_hex = Nano::Utils.bytes_to_hex(
45
+ Blake2b.bytes(input, Blake2b::Key.none, 8).reverse
46
+ )
47
+
48
+ output_hex.to_i(16) >= WORK_THRESHOLD
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,7 @@
1
+ require "nanocurrency/version"
2
+ require "nano/base32"
3
+ require "nano/block"
4
+ require "nano/check"
5
+ require "nano/conversion"
6
+ require "nano/key"
7
+ require "nano/work"
@@ -0,0 +1,3 @@
1
+ module Nanocurrency
2
+ VERSION = "0.1.0"
3
+ end
Binary file
@@ -0,0 +1,44 @@
1
+ lib = File.expand_path("../lib", __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "nanocurrency/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "nanocurrency"
7
+ spec.version = Nanocurrency::VERSION
8
+ spec.authors = ["Elliott Minns"]
9
+ spec.email = ["elliott@nanotify.io"]
10
+
11
+ spec.summary = "A toolkit for the Nano cryptocurrency, allowing you to derive keys, generate seeds, hashes, signatures, proofs of work and blocks."
12
+ spec.description = "A toolkit for the Nano cryptocurrency, allowing you to derive keys, generate seeds, hashes, signatures, proofs of work and blocks."
13
+ spec.homepage = "https://github.com/nanotify/nanocurrency"
14
+ spec.license = "MIT"
15
+
16
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
17
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
18
+ if spec.respond_to?(:metadata)
19
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
20
+
21
+ spec.metadata["homepage_uri"] = spec.homepage
22
+ spec.metadata["source_code_uri"] = "https://github.com/nanotify/nanocurrency.git"
23
+ spec.metadata["changelog_uri"] = "https://github.com/nanotify/nanocurrency"
24
+ else
25
+ raise "RubyGems 2.0 or newer is required to protect against " \
26
+ "public gem pushes."
27
+ end
28
+
29
+ # Specify which files should be added to the gem when it is released.
30
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
31
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
32
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
33
+ end
34
+ spec.bindir = "exe"
35
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
36
+ spec.require_paths = ["lib"]
37
+
38
+ spec.add_dependency "blake2b"
39
+
40
+ spec.add_development_dependency "bundler", "~> 1.16"
41
+ spec.add_development_dependency "rake", "~> 10.0"
42
+ spec.add_development_dependency "rspec", "~> 3.0"
43
+ spec.add_development_dependency "rake-compiler", "~> 1.0"
44
+ end
metadata ADDED
@@ -0,0 +1,192 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nanocurrency
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Elliott Minns
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-05-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: blake2b
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.16'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.16'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake-compiler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.0'
83
+ description: A toolkit for the Nano cryptocurrency, allowing you to derive keys, generate
84
+ seeds, hashes, signatures, proofs of work and blocks.
85
+ email:
86
+ - elliott@nanotify.io
87
+ executables: []
88
+ extensions: []
89
+ extra_rdoc_files: []
90
+ files:
91
+ - ".gitignore"
92
+ - ".rspec"
93
+ - ".travis.yml"
94
+ - CODE_OF_CONDUCT.md
95
+ - Gemfile
96
+ - Gemfile.lock
97
+ - LICENSE.txt
98
+ - README.md
99
+ - Rakefile
100
+ - bin/console
101
+ - bin/setup
102
+ - ext/.DS_Store
103
+ - ext/nanocurrency_ext/blake2-config.h
104
+ - ext/nanocurrency_ext/blake2-impl.h
105
+ - ext/nanocurrency_ext/blake2.h
106
+ - ext/nanocurrency_ext/blake2b-load-sse2.h
107
+ - ext/nanocurrency_ext/blake2b-load-sse41.h
108
+ - ext/nanocurrency_ext/blake2b-ref.c
109
+ - ext/nanocurrency_ext/blake2b-round.h
110
+ - ext/nanocurrency_ext/curve25519-donna-32bit.h
111
+ - ext/nanocurrency_ext/curve25519-donna-64bit.h
112
+ - ext/nanocurrency_ext/curve25519-donna-helpers.h
113
+ - ext/nanocurrency_ext/curve25519-donna-sse2.h
114
+ - ext/nanocurrency_ext/ed25519-donna-32bit-sse2.h
115
+ - ext/nanocurrency_ext/ed25519-donna-32bit-tables.h
116
+ - ext/nanocurrency_ext/ed25519-donna-64bit-sse2.h
117
+ - ext/nanocurrency_ext/ed25519-donna-64bit-tables.h
118
+ - ext/nanocurrency_ext/ed25519-donna-64bit-x86-32bit.h
119
+ - ext/nanocurrency_ext/ed25519-donna-64bit-x86.h
120
+ - ext/nanocurrency_ext/ed25519-donna-basepoint-table.h
121
+ - ext/nanocurrency_ext/ed25519-donna-batchverify.h
122
+ - ext/nanocurrency_ext/ed25519-donna-impl-base.h
123
+ - ext/nanocurrency_ext/ed25519-donna-impl-sse2.h
124
+ - ext/nanocurrency_ext/ed25519-donna-portable-identify.h
125
+ - ext/nanocurrency_ext/ed25519-donna-portable.h
126
+ - ext/nanocurrency_ext/ed25519-donna.h
127
+ - ext/nanocurrency_ext/ed25519-hash-custom.c
128
+ - ext/nanocurrency_ext/ed25519-hash-custom.h
129
+ - ext/nanocurrency_ext/ed25519-hash.h
130
+ - ext/nanocurrency_ext/ed25519-randombytes-custom.h
131
+ - ext/nanocurrency_ext/ed25519-randombytes.h
132
+ - ext/nanocurrency_ext/ed25519.c
133
+ - ext/nanocurrency_ext/ed25519.h
134
+ - ext/nanocurrency_ext/extconf.rb
135
+ - ext/nanocurrency_ext/fuzz/README.md
136
+ - ext/nanocurrency_ext/fuzz/build-nix.php
137
+ - ext/nanocurrency_ext/fuzz/curve25519-ref10.c
138
+ - ext/nanocurrency_ext/fuzz/curve25519-ref10.h
139
+ - ext/nanocurrency_ext/fuzz/ed25519-donna-sse2.c
140
+ - ext/nanocurrency_ext/fuzz/ed25519-donna.c
141
+ - ext/nanocurrency_ext/fuzz/ed25519-donna.h
142
+ - ext/nanocurrency_ext/fuzz/ed25519-ref10.c
143
+ - ext/nanocurrency_ext/fuzz/ed25519-ref10.h
144
+ - ext/nanocurrency_ext/fuzz/fuzz-curve25519.c
145
+ - ext/nanocurrency_ext/fuzz/fuzz-ed25519.c
146
+ - ext/nanocurrency_ext/modm-donna-32bit.h
147
+ - ext/nanocurrency_ext/modm-donna-64bit.h
148
+ - ext/nanocurrency_ext/rbext.c
149
+ - ext/nanocurrency_ext/regression.h
150
+ - lib/nano/account.rb
151
+ - lib/nano/base32.rb
152
+ - lib/nano/block.rb
153
+ - lib/nano/check.rb
154
+ - lib/nano/conversion.rb
155
+ - lib/nano/hash.rb
156
+ - lib/nano/key.rb
157
+ - lib/nano/utils.rb
158
+ - lib/nano/work.rb
159
+ - lib/nanocurrency.rb
160
+ - lib/nanocurrency/version.rb
161
+ - lib/nanocurrency_ext.bundle
162
+ - nanocurrency.gemspec
163
+ homepage: https://github.com/nanotify/nanocurrency
164
+ licenses:
165
+ - MIT
166
+ metadata:
167
+ allowed_push_host: https://rubygems.org
168
+ homepage_uri: https://github.com/nanotify/nanocurrency
169
+ source_code_uri: https://github.com/nanotify/nanocurrency.git
170
+ changelog_uri: https://github.com/nanotify/nanocurrency
171
+ post_install_message:
172
+ rdoc_options: []
173
+ require_paths:
174
+ - lib
175
+ required_ruby_version: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ required_rubygems_version: !ruby/object:Gem::Requirement
181
+ requirements:
182
+ - - ">="
183
+ - !ruby/object:Gem::Version
184
+ version: '0'
185
+ requirements: []
186
+ rubyforge_project:
187
+ rubygems_version: 2.7.9
188
+ signing_key:
189
+ specification_version: 4
190
+ summary: A toolkit for the Nano cryptocurrency, allowing you to derive keys, generate
191
+ seeds, hashes, signatures, proofs of work and blocks.
192
+ test_files: []