nanocurrency 0.1.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.
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: []