nanook 2.4.0 → 2.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/CHANGELOG.md +17 -0
- data/README.md +25 -16
- data/lib/nanook.rb +1 -1
- data/lib/nanook/account.rb +13 -13
- data/lib/nanook/block.rb +20 -9
- data/lib/nanook/node.rb +110 -7
- data/lib/nanook/version.rb +1 -1
- data/lib/nanook/wallet.rb +35 -19
- data/lib/nanook/wallet_account.rb +4 -4
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7431dc051a61aef23d118372d17df3c833e0963f05279a246c60b65eea10d478
|
4
|
+
data.tar.gz: cadd03df615dca28120483b30720215d15f357ac3afa57dcf226938a17ca45af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c6249a2d0e98a38d38058c11f50a6b3677d014e35600792d3c18609532f7b97399320d004523eb730863f4bc9bbdab378e3349122e16caa66c394b717be73442
|
7
|
+
data.tar.gz: ba7494dc21db212d20dae2d7a436c5a0766675a76086fa35e9cbc0a98fac4249f451e99f145f8033f77bd1a3966d319a4d3d4d83f2eaf9d9793281100b2875d3
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,23 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
5
5
|
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
6
6
|
|
7
|
+
## 2.5.0
|
8
|
+
|
9
|
+
### Added
|
10
|
+
|
11
|
+
- New `Nanook::Node#bootstrap_lazy` method.
|
12
|
+
- New `Nanook::Node#bootstrap_status` method.
|
13
|
+
- New `Nanook::Node#difficulty` method.
|
14
|
+
- New `Nanook::Node#uptime` method.
|
15
|
+
- New `Nanook::Wallet#lock` method.
|
16
|
+
|
17
|
+
### Changed
|
18
|
+
|
19
|
+
- `Nanook::Node#chain` now takes optional `offset` argument.
|
20
|
+
- `Nanook::Node#successors` now takes optional `offset` argument.
|
21
|
+
- `Nanook::Node#successors` now aliased as `Nanook::Node#ancestors`
|
22
|
+
- Updated docs to use `nano_` prefixed addresses.
|
23
|
+
|
7
24
|
## 2.4.0
|
8
25
|
|
9
26
|
### Added
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Nanook
|
2
2
|
|
3
|
-
This is a Ruby library for managing a [nano currency](https://nano.org/) node, including making and receiving payments, using the [nano RPC protocol](https://
|
3
|
+
This is a Ruby library for managing a [nano currency](https://nano.org/) node, including making and receiving payments, using the [nano RPC protocol](https://developers.nano.org/docs/rpc). Nano is a fee-less, fast, environmentally-friendly cryptocurrency. It's awesome. See [https://nano.org](https://nano.org/).
|
4
4
|
|
5
5
|
[](https://badge.fury.io/rb/nanook)
|
6
6
|
[](https://circleci.com/gh/lukes/nanook/tree/master)
|
@@ -76,7 +76,7 @@ wallet = Nanook.new.wallet(wallet_id)
|
|
76
76
|
wallet.pay(from: your_account_id, to: recipient_account_id, amount: 0.2, id: unique_id)
|
77
77
|
```
|
78
78
|
|
79
|
-
The `id` can be any string and needs to be unique per payment. It serves an important purpose; it allows you to make this call multiple times with the same `id` and be reassured that you will only ever send that nano payment once. From the [Nano RPC](https://
|
79
|
+
The `id` can be any string and needs to be unique per payment. It serves an important purpose; it allows you to make this call multiple times with the same `id` and be reassured that you will only ever send that nano payment once. From the [Nano RPC](https://developers.nano.org/docs/rpc#send):
|
80
80
|
|
81
81
|
> You can (and should) specify a unique id for each spend to provide idempotency. That means that if you [make the payment call] two times with the same id, the second request won't send any additional Nano.
|
82
82
|
|
@@ -86,7 +86,7 @@ The unit of the `amount` is NANO (which is currently technically Mnano — s
|
|
86
86
|
account.pay(to: recipient_account_id, amount: 999, unit: :raw, id: unique_id)
|
87
87
|
```
|
88
88
|
|
89
|
-
Note, there may be a delay in receiving a response due to Proof of Work being done. From the [Nano RPC](https://
|
89
|
+
Note, there may be a delay in receiving a response due to Proof of Work being done. From the [Nano RPC](https://developers.nano.org/docs/rpc#send):
|
90
90
|
|
91
91
|
> Proof of Work is precomputed for one transaction in the background. If it has been a while since your last transaction it will send instantly, the next one will need to wait for Proof of Work to be generated.
|
92
92
|
|
@@ -120,11 +120,11 @@ wallet.receive(block_id, into: account_id)
|
|
120
120
|
|
121
121
|
## All commands
|
122
122
|
|
123
|
-
Below is a quick reference list of commands. See the [full Nanook documentation](https://lukes.github.io/nanook/2.
|
123
|
+
Below is a quick reference list of commands. See the [full Nanook documentation](https://lukes.github.io/nanook/2.5.0/) for a searchable detailed description of every class and method, what the arguments mean, and example responses (Tip: the classes are listed under the "**Nanook** < Object" item in the sidebar).
|
124
124
|
|
125
125
|
### Wallets
|
126
126
|
|
127
|
-
See the [full documentation for Nanook::Wallet](https://lukes.github.io/nanook/2.
|
127
|
+
See the [full documentation for Nanook::Wallet](https://lukes.github.io/nanook/2.5.0/Nanook/Wallet.html) for a detailed description of each method and example responses.
|
128
128
|
|
129
129
|
#### Create wallet:
|
130
130
|
|
@@ -159,6 +159,7 @@ wallet.receive(into: account_id)
|
|
159
159
|
wallet.receive(pending_block_id, into: account_id)
|
160
160
|
|
161
161
|
wallet.account.create
|
162
|
+
wallet.account.create(5)
|
162
163
|
wallet.accounts
|
163
164
|
wallet.contains?(account_id)
|
164
165
|
|
@@ -167,6 +168,7 @@ wallet.change_default_representative(new_representative)
|
|
167
168
|
wallet.info
|
168
169
|
wallet.info(unit: :raw)
|
169
170
|
wallet.export
|
171
|
+
wallet.lock
|
170
172
|
wallet.locked?
|
171
173
|
wallet.unlock(password)
|
172
174
|
wallet.change_password(password)
|
@@ -189,7 +191,7 @@ Nanook.new.wallet(wallet_id).account.create(5)
|
|
189
191
|
|
190
192
|
#### Working with a single account:
|
191
193
|
|
192
|
-
See the [full documentation for Nanook::WalletAccount](https://lukes.github.io/nanook/2.
|
194
|
+
See the [full documentation for Nanook::WalletAccount](https://lukes.github.io/nanook/2.5.0/Nanook/WalletAccount.html) for a detailed description of each method and example responses.
|
193
195
|
|
194
196
|
```ruby
|
195
197
|
account = Nanook.new.wallet(wallet_id).account(account_id)
|
@@ -229,7 +231,7 @@ account.destroy
|
|
229
231
|
|
230
232
|
#### Working with any account (not necessarily in your wallet):
|
231
233
|
|
232
|
-
See the [full documentation for Nanook::Account](https://lukes.github.io/nanook/2.
|
234
|
+
See the [full documentation for Nanook::Account](https://lukes.github.io/nanook/2.5.0/Nanook/Account.html) for a detailed description of each method and example responses.
|
233
235
|
|
234
236
|
```ruby
|
235
237
|
account = Nanook.new.account(account_id)
|
@@ -262,7 +264,7 @@ account.weight
|
|
262
264
|
|
263
265
|
### Blocks
|
264
266
|
|
265
|
-
See the [full documentation for Nanook::Block](https://lukes.github.io/nanook/2.
|
267
|
+
See the [full documentation for Nanook::Block](https://lukes.github.io/nanook/2.5.0/Nanook/Block.html) for a detailed description of each method and example responses.
|
266
268
|
|
267
269
|
```ruby
|
268
270
|
block = Nanook.new.block(block_id)
|
@@ -272,6 +274,7 @@ block.info(allow_unchecked: true) # Verified blocks AND unchecked synchronizing
|
|
272
274
|
block.account
|
273
275
|
block.chain
|
274
276
|
block.chain(limit: 10)
|
277
|
+
block.chain(offset: 10)
|
275
278
|
block.confirm
|
276
279
|
block.confirmed_recently?
|
277
280
|
block.history
|
@@ -283,6 +286,7 @@ block.pending?
|
|
283
286
|
block.publish
|
284
287
|
block.successors
|
285
288
|
block.successors(limit: 10)
|
289
|
+
block.successors(offset: 10)
|
286
290
|
|
287
291
|
block.generate_work
|
288
292
|
block.generate_work(use_peers: true)
|
@@ -292,7 +296,7 @@ block.is_valid_work?(work_id)
|
|
292
296
|
|
293
297
|
### Managing your nano node
|
294
298
|
|
295
|
-
See the [full documentation for Nanook::Node](https://lukes.github.io/nanook/2.
|
299
|
+
See the [full documentation for Nanook::Node](https://lukes.github.io/nanook/2.5.0/Nanook/Node.html) for a detailed description of each method and example responses.
|
296
300
|
|
297
301
|
```ruby
|
298
302
|
node = Nanook.new.node
|
@@ -300,9 +304,14 @@ node = Nanook.new.node
|
|
300
304
|
node.account_count
|
301
305
|
node.block_count
|
302
306
|
node.block_count_by_type
|
303
|
-
node.bootstrap_any
|
304
307
|
node.bootstrap(address: "::ffff:138.201.94.249", port: 7075)
|
308
|
+
node.bootstrap_any
|
309
|
+
node.bootstrap_lazy(block_id)
|
310
|
+
node.bootstrap_lazy(block_id, force: true)
|
311
|
+
node.bootstrap_status
|
305
312
|
node.confirmation_history
|
313
|
+
node.difficulty
|
314
|
+
node.difficulty(include_trend: true)
|
306
315
|
node.peers
|
307
316
|
node.representatives
|
308
317
|
node.representatives(unit: :raw)
|
@@ -344,12 +353,12 @@ key.info
|
|
344
353
|
|
345
354
|
## Nanook Metal
|
346
355
|
|
347
|
-
You can do any call listed in the [Nano RPC](https://
|
356
|
+
You can do any call listed in the [Nano RPC](https://developers.nano.org/docs/rpc) directly through the `rpc` method. The first argument should match the `action` of the RPC call, and then all remaining parameters are passed in as arguments.
|
348
357
|
|
349
|
-
E.g., the [accounts_create command](https://
|
358
|
+
E.g., the [accounts_create command](https://developers.nano.org/docs/rpc#accounts-create) can be called like this:
|
350
359
|
|
351
360
|
```ruby
|
352
|
-
|
361
|
+
Nanook.new.rpc.call(:accounts_create, wallet: wallet_id, count: 2)
|
353
362
|
```
|
354
363
|
|
355
364
|
## Contributing
|
@@ -370,11 +379,11 @@ The gem is available as open source under the terms of the [MIT License](https:/
|
|
370
379
|
|
371
380
|
## Buy me a nano coffee
|
372
381
|
|
373
|
-
This library is totally free to use, but feel free to send some nano [my way](https://www.nanode.co/account/
|
382
|
+
This library is totally free to use, but feel free to send some nano [my way](https://www.nanode.co/account/nano_3c3ek3k8135f6e8qtfy8eruk9q3yzmpebes7btzncccdest8ymzhjmnr196j) if you'd like to!
|
374
383
|
|
375
|
-
|
384
|
+
nano_3c3ek3k8135f6e8qtfy8eruk9q3yzmpebes7btzncccdest8ymzhjmnr196j
|
376
385
|
|
377
|
-

|
378
387
|
|
379
388
|
|
380
389
|
|
data/lib/nanook.rb
CHANGED
@@ -58,7 +58,7 @@ class Nanook
|
|
58
58
|
# Returns a new instance of {Nanook::Account}.
|
59
59
|
#
|
60
60
|
# ==== Example:
|
61
|
-
# account = Nanook.new.account("
|
61
|
+
# account = Nanook.new.account("nano_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000")
|
62
62
|
#
|
63
63
|
# @param account [String] the id of the account you want to work with
|
64
64
|
# @return [Nanook::Account]
|
data/lib/nanook/account.rb
CHANGED
@@ -8,12 +8,12 @@ class Nanook
|
|
8
8
|
# Initialize this class through the convenient {Nanook#account} method:
|
9
9
|
#
|
10
10
|
# nanook = Nanook.new
|
11
|
-
# account = nanook.account("
|
11
|
+
# account = nanook.account("nano_...")
|
12
12
|
#
|
13
13
|
# Or compose the longhand way like this:
|
14
14
|
#
|
15
15
|
# rpc_conn = Nanook::Rpc.new
|
16
|
-
# account = Nanook::Account.new(rpc_conn, "
|
16
|
+
# account = Nanook::Account.new(rpc_conn, "nano_...")
|
17
17
|
class Account
|
18
18
|
|
19
19
|
def initialize(rpc, account)
|
@@ -30,8 +30,8 @@ class Nanook
|
|
30
30
|
# Example response:
|
31
31
|
#
|
32
32
|
# {
|
33
|
-
# :
|
34
|
-
# :
|
33
|
+
# :nano_13bqhi1cdqq8yb9szneoc38qk899d58i5rcrgdk5mkdm86hekpoez3zxw5sd=>500000000000000000000000000000000000,
|
34
|
+
# :nano_17k6ug685154an8gri9whhe5kb5z1mf5w6y39gokc1657sh95fegm8ht1zpn=>961647970820730000000000000000000000
|
35
35
|
# }
|
36
36
|
#
|
37
37
|
# @param unit (see #balance)
|
@@ -89,7 +89,7 @@ class Nanook
|
|
89
89
|
# [
|
90
90
|
# {
|
91
91
|
# type: "send",
|
92
|
-
# account: "
|
92
|
+
# account: "nano_1kdc5u48j3hr5r7eof9iao47szqh81ndqgq5e5hrsn1g9a3sa4hkkcotn3uq",
|
93
93
|
# amount: 2,
|
94
94
|
# hash: "2C3C570EA8898443C0FD04A1C385A3E3A8C985AD792635FCDCEBB30ADF6A0570"
|
95
95
|
# }
|
@@ -146,7 +146,7 @@ class Nanook
|
|
146
146
|
#
|
147
147
|
# ==== Example:
|
148
148
|
#
|
149
|
-
# account.representative # => "
|
149
|
+
# account.representative # => "nano_3pc..."
|
150
150
|
#
|
151
151
|
# @return [String] Representative account of the account
|
152
152
|
def representative
|
@@ -209,7 +209,7 @@ class Nanook
|
|
209
209
|
#
|
210
210
|
# ==== Example:
|
211
211
|
#
|
212
|
-
# account.id # => "
|
212
|
+
# account.id # => "nano_16u..."
|
213
213
|
#
|
214
214
|
# @return [String] the id of the account
|
215
215
|
def id
|
@@ -225,7 +225,7 @@ class Nanook
|
|
225
225
|
# Example response:
|
226
226
|
#
|
227
227
|
# {
|
228
|
-
# id: "
|
228
|
+
# id: "nano_16u1uufyoig8777y6r8iqjtrw8sg8maqrm36zzcm95jmbd9i9aj5i8abr8u5",
|
229
229
|
# balance: 11.439597000000001,
|
230
230
|
# block_count: 4,
|
231
231
|
# frontier: "2C3C570EA8898443C0FD04A1C385A3E3A8C985AD792635FCDCEBB30ADF6A0570",
|
@@ -241,7 +241,7 @@ class Nanook
|
|
241
241
|
# Example response:
|
242
242
|
#
|
243
243
|
# {
|
244
|
-
# id: "
|
244
|
+
# id: "nano_16u1uufyoig8777y6r8iqjtrw8sg8maqrm36zzcm95jmbd9i9aj5i8abr8u5",
|
245
245
|
# balance: 11.439597000000001,
|
246
246
|
# block_count: 4,
|
247
247
|
# frontier: "2C3C570EA8898443C0FD04A1C385A3E3A8C985AD792635FCDCEBB30ADF6A0570",
|
@@ -249,7 +249,7 @@ class Nanook
|
|
249
249
|
# open_block: "C82376314C387080A753871A32AD70F4168080C317C5E67356F0A62EB5F34FF9",
|
250
250
|
# pending: 0,
|
251
251
|
# public_key: "A82C906460046D230D7D37C6663723DC3EFCECC4B3254EBF45294B66746F4FEF",
|
252
|
-
# representative: "
|
252
|
+
# representative: "nano_3pczxuorp48td8645bs3m6c3xotxd3idskrenmi65rbrga5zmkemzhwkaznh",
|
253
253
|
# representative_block: "C82376314C387080A753871A32AD70F4168080C317C5E67356F0A62EB5F34FF9",
|
254
254
|
# weight: 0
|
255
255
|
# }
|
@@ -316,7 +316,7 @@ class Nanook
|
|
316
316
|
# Example response:
|
317
317
|
#
|
318
318
|
# {
|
319
|
-
# :
|
319
|
+
# :nano_3c3ek3k8135f6e8qtfy8eruk9q3yzmpebes7btzncccdest8ymzhjmnr196j=>{
|
320
320
|
# :frontier=>"2C3C570EA8898443C0FD04A1C385A3E3A8C985AD792635FCDCEBB30ADF6A0570",
|
321
321
|
# :open_block=>"C82376314C387080A753871A32AD70F4168080C317C5E67356F0A62EB5F34FF9",
|
322
322
|
# :representative_block=>"C82376314C387080A753871A32AD70F4168080C317C5E67356F0A62EB5F34FF9",
|
@@ -324,7 +324,7 @@ class Nanook
|
|
324
324
|
# :modified_timestamp=>1520500357,
|
325
325
|
# :block_count=>4
|
326
326
|
# },
|
327
|
-
# :
|
327
|
+
# :nano_3c3ettq59kijuuad5fnaq35itc9schtr4r7r6rjhmwjbairowzq3wi5ap7h8=>{ ... }
|
328
328
|
# }
|
329
329
|
#
|
330
330
|
# @param [Integer] limit number of accounts to return in the ledger (default is 1)
|
@@ -380,7 +380,7 @@ class Nanook
|
|
380
380
|
# {
|
381
381
|
# block: "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
|
382
382
|
# amount: 6,
|
383
|
-
# source: "
|
383
|
+
# source: "nano_3dcfozsmekr1tr9skf1oa5wbgmxt81qepfdnt7zicq5x3hk65fg4fqj58mbr"
|
384
384
|
# },
|
385
385
|
# { ... }
|
386
386
|
# ]
|
data/lib/nanook/block.rb
CHANGED
@@ -45,8 +45,11 @@ class Nanook
|
|
45
45
|
rpc(:work_cancel, :hash).empty?
|
46
46
|
end
|
47
47
|
|
48
|
-
# Returns
|
49
|
-
#
|
48
|
+
# Returns a consecutive list of block hashes in the account chain
|
49
|
+
# starting at block back to count (direction from frontier back to
|
50
|
+
# open block, from newer blocks to older). Will list all blocks back
|
51
|
+
# to the open block of this chain when count is set to "-1".
|
52
|
+
# The requested block hash is included in the answer.
|
50
53
|
#
|
51
54
|
# See also #successors.
|
52
55
|
#
|
@@ -60,11 +63,14 @@ class Nanook
|
|
60
63
|
# "36A0FB717368BA8CF8D255B63DC207771EABC6C6FFC22A7F455EC2209464897E",
|
61
64
|
# "FBF8B0E6623A31AB528EBD839EEAA91CAFD25C12294C46754E45FD017F7939EB"
|
62
65
|
# ]
|
66
|
+
#
|
63
67
|
# @param limit [Integer] maximum number of block hashes to return (default is 1000)
|
64
|
-
|
65
|
-
|
68
|
+
# @param offset [Integer] return the account chain block hashes offset by the specified number of blocks (default is 0)
|
69
|
+
def chain(limit: 1000, offset: 0)
|
70
|
+
response = rpc(:chain, :block, count: limit, offset: offset)[:blocks]
|
66
71
|
Nanook::Util.coerce_empty_string_to_type(response, Array)
|
67
72
|
end
|
73
|
+
alias_method :ancestors, :chain
|
68
74
|
|
69
75
|
# Request confirmation for a block from online representative nodes.
|
70
76
|
# Will return immediately with a boolean to indicate if the request for
|
@@ -81,6 +87,9 @@ class Nanook
|
|
81
87
|
rpc(:block_confirm, :hash)[:started] == 1
|
82
88
|
end
|
83
89
|
|
90
|
+
# This call is for internal diagnostics/debug purposes only. Do not
|
91
|
+
# rely on this interface being stable and do not use in a production system.
|
92
|
+
#
|
84
93
|
# Check if the block appears in the list of recently confirmed blocks by
|
85
94
|
# online representatives. The full list of blocks can be queried for with {Nanook::Node#confirmation_history}.
|
86
95
|
#
|
@@ -127,7 +136,7 @@ class Nanook
|
|
127
136
|
#
|
128
137
|
# [
|
129
138
|
# {
|
130
|
-
# :account=>"
|
139
|
+
# :account=>"nano_3x7cjioqahgs5ppheys6prpqtb4rdknked83chf97bot1unrbdkaux37t31b",
|
131
140
|
# :amount=>539834279601145558517940224,
|
132
141
|
# :hash=>"36A0FB717368BA8CF8D255B63DC207771EABC6C6FFC22A7F455EC2209464897E",
|
133
142
|
# :type=>"send"
|
@@ -164,7 +173,7 @@ class Nanook
|
|
164
173
|
# :id=>"36A0FB717368BA8CF8D255B63DC207771EABC6C6FFC22A7F455EC2209464897E",
|
165
174
|
# :type=>"send",
|
166
175
|
# :previous=>"FBF8B0E6623A31AB528EBD839EEAA91CAFD25C12294C46754E45FD017F7939EB",
|
167
|
-
# :destination=>"
|
176
|
+
# :destination=>"nano_3x7cjioqahgs5ppheys6prpqtb4rdknked83chf97bot1unrbdkaux37t31b",
|
168
177
|
# :balance=>"00000000000000000000000000000000",
|
169
178
|
# :work=>"44cc24b60705083a",
|
170
179
|
# :signature=>"42ADFEFE7C3FFF188AE92A202F8A5734DE91779C454613E446EEC93D001D6C953E9FD16730AF32C891791BA8EDAECEB059A213E2FE1EEB7ADF9D5D0815464D06"
|
@@ -260,10 +269,12 @@ class Nanook
|
|
260
269
|
# ["36A0FB717368BA8CF8D255B63DC207771EABC6C6FFC22A7F455EC2209464897E"]
|
261
270
|
#
|
262
271
|
# @param limit [Integer] maximum number of send/receive block hashes
|
263
|
-
#
|
272
|
+
# to return in the chain (default is 1000)
|
273
|
+
# @param offset [Integer] return the account chain block hashes offset
|
274
|
+
# by the specified number of blocks (default is 0)
|
264
275
|
# @return [Array<String>] block hashes in the account chain ending at this block
|
265
|
-
def successors(limit: 1000)
|
266
|
-
response = rpc(:successors, :block, count: limit)[:blocks]
|
276
|
+
def successors(limit: 1000, offset: 0)
|
277
|
+
response = rpc(:successors, :block, count: limit, offset: offset)[:blocks]
|
267
278
|
Nanook::Util.coerce_empty_string_to_type(response, Array)
|
268
279
|
end
|
269
280
|
|
data/lib/nanook/node.rb
CHANGED
@@ -90,7 +90,57 @@ class Nanook
|
|
90
90
|
rpc(:bootstrap_any).has_key?(:success)
|
91
91
|
end
|
92
92
|
|
93
|
-
#
|
93
|
+
# Initialize lazy bootstrap with given block hash
|
94
|
+
#
|
95
|
+
# @param hash [String]
|
96
|
+
# @param force [Boolean] False by default. Manually force closing
|
97
|
+
# of all current bootstraps
|
98
|
+
# @return [Boolean] indicating if the action was successful
|
99
|
+
def bootstrap_lazy(hash, force: false)
|
100
|
+
rpc(:bootstrap_lazy, hash: hash, force: force)[:started] == 1
|
101
|
+
end
|
102
|
+
|
103
|
+
# Returning status of current bootstrap attempt for debug purposes only.
|
104
|
+
# This call is for internal diagnostics/debug purposes only.
|
105
|
+
# Do not rely on this interface being stable and do not use in a
|
106
|
+
# production system.
|
107
|
+
#
|
108
|
+
# ==== Example:
|
109
|
+
#
|
110
|
+
# node.bootstrap_status
|
111
|
+
#
|
112
|
+
# Example response:
|
113
|
+
#
|
114
|
+
# {
|
115
|
+
# clients: 5790,
|
116
|
+
# pulls: 141065,
|
117
|
+
# pulling: 3,
|
118
|
+
# connections: 16,
|
119
|
+
# idle: 0,
|
120
|
+
# target_connections: 64,
|
121
|
+
# total_blocks: 536820,
|
122
|
+
# lazy_mode: true,
|
123
|
+
# lazy_blocks: 423388,
|
124
|
+
# lazy_state_unknown: 2,
|
125
|
+
# lazy_balances: 0,
|
126
|
+
# lazy_pulls: 0,
|
127
|
+
# lazy_stopped: 644,
|
128
|
+
# lazy_keys: 449,
|
129
|
+
# lazy_key_1: "A86EB2B479AAF3CD531C8356A1FBE3CB500DFBF5BF292E5E6B8D1048DE199C32"
|
130
|
+
# }
|
131
|
+
#
|
132
|
+
# @return [Hash{Symbol=>String|Integer|Boolean}]
|
133
|
+
def bootstrap_status
|
134
|
+
rpc(:bootstrap_status)
|
135
|
+
end
|
136
|
+
|
137
|
+
# This call is for internal diagnostics/debug purposes only.
|
138
|
+
# Do not rely on this interface being stable and do not use in a
|
139
|
+
# production system.
|
140
|
+
#
|
141
|
+
# Returns block and tally weight (in raw) election duration (in
|
142
|
+
# milliseconds), election confirmation timestamp for recent elections
|
143
|
+
# winners.
|
94
144
|
#
|
95
145
|
# ==== Example:
|
96
146
|
#
|
@@ -101,11 +151,15 @@ class Nanook
|
|
101
151
|
# [
|
102
152
|
# {
|
103
153
|
# block: "EA70B32C55C193345D625F766EEA2FCA52D3F2CCE0B3A30838CC543026BB0FEA",
|
104
|
-
# tally: 80394786589602980996311817874549318248
|
154
|
+
# tally: 80394786589602980996311817874549318248,
|
155
|
+
# duration: 4000,
|
156
|
+
# time: 1544819986,
|
105
157
|
# },
|
106
158
|
# {
|
107
159
|
# block: "F2F8DA6D2CA0A4D78EB043A7A29E12BDE5B4CE7DE1B99A93A5210428EE5B8667",
|
108
|
-
# tally: 68921714529890443063672782079965877749
|
160
|
+
# tally: 68921714529890443063672782079965877749,
|
161
|
+
# duration: 6000,
|
162
|
+
# time: 1544819988,
|
109
163
|
# }
|
110
164
|
# ]
|
111
165
|
#
|
@@ -118,6 +172,48 @@ class Nanook
|
|
118
172
|
end
|
119
173
|
end
|
120
174
|
|
175
|
+
# Returns the difficulty values (16 hexadecimal digits string, 64 bit)
|
176
|
+
# for the minimum required on the network (network_minimum) as well
|
177
|
+
# as the current active difficulty seen on the network (network_current,
|
178
|
+
# 5 minute trended average of adjusted difficulty seen on confirmed
|
179
|
+
# transactions) which can be used to perform rework for better
|
180
|
+
# prioritization of transaction processing. A multiplier of the
|
181
|
+
# network_current from the base difficulty of network_minimum is also
|
182
|
+
# provided for comparison.
|
183
|
+
#
|
184
|
+
# ==== Example:
|
185
|
+
#
|
186
|
+
# node.difficulty(include_trend: true)
|
187
|
+
#
|
188
|
+
# Example response:
|
189
|
+
#
|
190
|
+
# {
|
191
|
+
# network_minimum: "ffffffc000000000",
|
192
|
+
# network_current: "ffffffc1816766f2",
|
193
|
+
# multiplier: 1.024089858417128,
|
194
|
+
# difficulty_trend: [
|
195
|
+
# 1.156096135149775,
|
196
|
+
# 1.190133894573061,
|
197
|
+
# 1.135567138563921,
|
198
|
+
# 1.000000000000000,
|
199
|
+
# ]
|
200
|
+
# }
|
201
|
+
#
|
202
|
+
# @param include_trend [Boolean] false by default. Also returns the
|
203
|
+
# trend of difficulty seen on the network as a list of multipliers.
|
204
|
+
# Sampling occurs every 16 to 36 seconds. The list is ordered such
|
205
|
+
# that the first value is the most recent sample.
|
206
|
+
# @return [Hash{Symbol=>String|Float|Array}]
|
207
|
+
def difficulty(include_trend: false)
|
208
|
+
rpc(:active_difficulty, include_trend: include_trend).tap do |response|
|
209
|
+
response[:multiplier] = response[:multiplier].to_f
|
210
|
+
|
211
|
+
if response.key?(:difficulty_trend)
|
212
|
+
response[:difficulty_trend].map!(&:to_f)
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
121
217
|
# @return [String]
|
122
218
|
def inspect
|
123
219
|
"#{self.class.name}(object_id: \"#{"0x00%x" % (object_id << 1)}\")"
|
@@ -136,9 +232,9 @@ class Nanook
|
|
136
232
|
# Example response:
|
137
233
|
#
|
138
234
|
# {
|
139
|
-
#
|
140
|
-
#
|
141
|
-
#
|
235
|
+
# nano_1111111111111111111111111111111111111111111111111117353trpda: 3822372327060170000000000000000000000,
|
236
|
+
# nano_1111111111111111111111111111111111111111111111111awsq94gtecn: 30999999999999999999999999000000,
|
237
|
+
# nano_114nk4rwjctu6n6tr6g6ps61g1w3hdpjxfas4xj1tq6i8jyomc5d858xr1xi: 0
|
142
238
|
# }
|
143
239
|
#
|
144
240
|
# @return [Hash{Symbol=>Integer}] known representatives and their voting weight
|
@@ -165,7 +261,7 @@ class Nanook
|
|
165
261
|
#
|
166
262
|
# ==== Example:
|
167
263
|
#
|
168
|
-
# node.representatives_online # => ["
|
264
|
+
# node.representatives_online # => ["nano_111...", "nano_222"]
|
169
265
|
#
|
170
266
|
# @return [Array<String>] array of representative account ids
|
171
267
|
def representatives_online
|
@@ -208,6 +304,13 @@ class Nanook
|
|
208
304
|
count.to_f * 100 / total.to_f
|
209
305
|
end
|
210
306
|
|
307
|
+
# Returns node uptime in seconds
|
308
|
+
#
|
309
|
+
# @return [Integer] seconds of uptime
|
310
|
+
def uptime
|
311
|
+
rpc(:uptime)['seconds']
|
312
|
+
end
|
313
|
+
|
211
314
|
# This method is deprecated and will be removed in 3.0, as a node never
|
212
315
|
# reaches 100% synchronization.
|
213
316
|
#
|
data/lib/nanook/version.rb
CHANGED
data/lib/nanook/wallet.rb
CHANGED
@@ -33,7 +33,7 @@ class Nanook
|
|
33
33
|
# want to restore the wallet anywhere else on the nano network besides
|
34
34
|
# the node you originally created it on. The nano command line interface
|
35
35
|
# (CLI) is the only method for discovering a wallet's seed. See the
|
36
|
-
# {https://
|
36
|
+
# {https://developers.nano.org/docs/command-line-interface/#wallet_decrypt_unsafe
|
37
37
|
# --wallet_decrypt_unsafe CLI command}.
|
38
38
|
#
|
39
39
|
# === Initializing
|
@@ -67,7 +67,7 @@ class Nanook
|
|
67
67
|
#
|
68
68
|
# ==== Examples:
|
69
69
|
#
|
70
|
-
# wallet.account("
|
70
|
+
# wallet.account("nano_...") # => Nanook::WalletAccount
|
71
71
|
# wallet.account.create # => Nanook::WalletAccount
|
72
72
|
#
|
73
73
|
# @param [String] account optional String of an account (starting with
|
@@ -128,11 +128,11 @@ class Nanook
|
|
128
128
|
# Example response:
|
129
129
|
#
|
130
130
|
# {
|
131
|
-
# "
|
131
|
+
# "nano_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000"=>{
|
132
132
|
# "balance"=>2.5,
|
133
133
|
# "pending"=>1
|
134
134
|
# },
|
135
|
-
# "
|
135
|
+
# "nano_1e5aqegc1jb7qe964u4adzmcezyo6o146zb8hm6dft8tkp79za3sxwjym5rx"=>{
|
136
136
|
# "balance"=>51.4,
|
137
137
|
# "pending"=>0
|
138
138
|
# },
|
@@ -171,6 +171,9 @@ class Nanook
|
|
171
171
|
|
172
172
|
# Changes a wallet's seed.
|
173
173
|
#
|
174
|
+
# It's recommended to only change the seed of a wallet that contains
|
175
|
+
# no accounts.
|
176
|
+
#
|
174
177
|
# ==== Example:
|
175
178
|
#
|
176
179
|
# wallet.change_seed("000D1BA...") # => true
|
@@ -227,9 +230,9 @@ class Nanook
|
|
227
230
|
# Will return +true+ if the account exists in the wallet.
|
228
231
|
#
|
229
232
|
# ==== Example:
|
230
|
-
# wallet.contains?("
|
233
|
+
# wallet.contains?("nano_...") # => true
|
231
234
|
#
|
232
|
-
# @param account [String] id (will start with <tt>"
|
235
|
+
# @param account [String] id (will start with <tt>"nano_..."</tt>)
|
233
236
|
# @return [Boolean] indicating if the wallet contains the given account
|
234
237
|
def contains?(account)
|
235
238
|
wallet_required!
|
@@ -251,7 +254,7 @@ class Nanook
|
|
251
254
|
# on the nano network.
|
252
255
|
#
|
253
256
|
# Note, there may be a delay in receiving a response due to Proof of
|
254
|
-
# Work being done. From the {Nano RPC}[https://
|
257
|
+
# Work being done. From the {Nano RPC}[https://developers.nano.org/docs/rpc#send]:
|
255
258
|
#
|
256
259
|
# <i>Proof of Work is precomputed for one transaction in the
|
257
260
|
# background. If it has been a while since your last transaction it
|
@@ -260,8 +263,8 @@ class Nanook
|
|
260
263
|
#
|
261
264
|
# ==== Examples:
|
262
265
|
#
|
263
|
-
# wallet.pay(from: "
|
264
|
-
# wallet.pay(from: "
|
266
|
+
# wallet.pay(from: "nano_...", to: "nano_...", amount: 1.1, id: "myUniqueId123") # => "9AE2311..."
|
267
|
+
# wallet.pay(from: "nano_...", to: "nano_...", amount: 54000000000000, unit: :raw, id: "myUniqueId123") # => "9AE2311..."
|
265
268
|
#
|
266
269
|
# @param from [String] account id of an account in your wallet
|
267
270
|
# @param to (see Nanook::WalletAccount#pay)
|
@@ -292,11 +295,11 @@ class Nanook
|
|
292
295
|
# Example response:
|
293
296
|
#
|
294
297
|
# {
|
295
|
-
# :
|
298
|
+
# :nano_1111111111111111111111111111111111111111111111111117353trpda=>[
|
296
299
|
# "142A538F36833D1CC78B94E11C766F75818F8B940771335C6C1B8AB880C5BB1D",
|
297
300
|
# "718CC2121C3E641059BC1C2CFC45666C99E8AE922F7A807B7D07B62C995D79E2"
|
298
301
|
# ],
|
299
|
-
# :
|
302
|
+
# :nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3=>[
|
300
303
|
# "4C1FEEF0BEA7F50BE35489A1233FE002B212DEA554B55B1B470D78BD8F210C74"
|
301
304
|
# ]
|
302
305
|
# }
|
@@ -308,22 +311,22 @@ class Nanook
|
|
308
311
|
# Example response:
|
309
312
|
#
|
310
313
|
# {
|
311
|
-
# :
|
314
|
+
# :nano_1111111111111111111111111111111111111111111111111117353trpda=>[
|
312
315
|
# {
|
313
316
|
# :amount=>6.0,
|
314
|
-
# :source=>"
|
317
|
+
# :source=>"nano_3dcfozsmekr1tr9skf1oa5wbgmxt81qepfdnt7zicq5x3hk65fg4fqj58mbr",
|
315
318
|
# :block=>:"142A538F36833D1CC78B94E11C766F75818F8B940771335C6C1B8AB880C5BB1D"
|
316
319
|
# },
|
317
320
|
# {
|
318
321
|
# :amount=>12.0,
|
319
|
-
# :source=>"
|
322
|
+
# :source=>"nano_3dcfozsmekr1tr9skf1oa5wbgmxt81qepfdnt7zicq5x3hk65fg4fqj58mbr",
|
320
323
|
# :block=>:"242A538F36833D1CC78B94E11C766F75818F8B940771335C6C1B8AB880C5BB1D"
|
321
324
|
# }
|
322
325
|
# ],
|
323
|
-
# :
|
326
|
+
# :nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3=>[
|
324
327
|
# {
|
325
328
|
# :amount=>106.370018,
|
326
|
-
# :source=>"
|
329
|
+
# :source=>"nano_13ezf4od79h1tgj9aiu4djzcmmguendtjfuhwfukhuucboua8cpoihmh8byo",
|
327
330
|
# :block=>:"4C1FEEF0BEA7F50BE35489A1233FE002B212DEA554B55B1B470D78BD8F210C74"
|
328
331
|
# }
|
329
332
|
# ]
|
@@ -395,7 +398,7 @@ class Nanook
|
|
395
398
|
#
|
396
399
|
# ==== Example:
|
397
400
|
#
|
398
|
-
# wallet.default_representative # => "
|
401
|
+
# wallet.default_representative # => "nano_3pc..."
|
399
402
|
#
|
400
403
|
# @return [String] Representative account of the account
|
401
404
|
def default_representative
|
@@ -411,7 +414,7 @@ class Nanook
|
|
411
414
|
#
|
412
415
|
# ==== Example:
|
413
416
|
#
|
414
|
-
# wallet.change_default_representative("
|
417
|
+
# wallet.change_default_representative("nano_...") # => "nano_..."
|
415
418
|
#
|
416
419
|
# @param [String] representative the id of the representative account
|
417
420
|
# to set as this account's representative
|
@@ -470,7 +473,7 @@ class Nanook
|
|
470
473
|
# id: "2C3C570EA8898443C0FD04A1C385A3E3A8C985AD792635FCDCEBB30ADF6A0570",
|
471
474
|
# accounts: [
|
472
475
|
# {
|
473
|
-
# id: "
|
476
|
+
# id: "nano_11119gbh8hb4hj1duf7fdtfyf5s75okzxdgupgpgm1bj78ex3kgy7frt3s9n"
|
474
477
|
# frontier: "E71AF3E9DD86BBD8B4620EFA63E065B34D358CFC091ACB4E103B965F95783321",
|
475
478
|
# open_block: "643B77F1ECEFBDBE1CC909872964C1DBBE23A6149BD3CEF2B50B76044659B60F",
|
476
479
|
# representative_block: "643B77F1ECEFBDBE1CC909872964C1DBBE23A6149BD3CEF2B50B76044659B60F",
|
@@ -505,6 +508,19 @@ class Nanook
|
|
505
508
|
}.to_symbolized_hash
|
506
509
|
end
|
507
510
|
|
511
|
+
# Locks the wallet. A locked wallet cannot pocket pending transactions or make payments. See {#unlock}.
|
512
|
+
#
|
513
|
+
# ==== Example:
|
514
|
+
#
|
515
|
+
# wallet.lock #=> true
|
516
|
+
#
|
517
|
+
# @return [Boolean] indicates if the wallet was successfully locked
|
518
|
+
def lock
|
519
|
+
wallet_required!
|
520
|
+
response = rpc(:wallet_lock)
|
521
|
+
!response.empty? && response[:locked] == 1
|
522
|
+
end
|
523
|
+
|
508
524
|
# Returns +true+ if the wallet is locked.
|
509
525
|
#
|
510
526
|
# ==== Example:
|
@@ -113,14 +113,14 @@ class Nanook
|
|
113
113
|
# if successful, or a {Nanook::Error} if unsuccessful.
|
114
114
|
#
|
115
115
|
# Note, there may be a delay in receiving a response due to Proof
|
116
|
-
# of Work being done. From the {Nano RPC}[https://
|
116
|
+
# of Work being done. From the {Nano RPC}[https://developers.nano.org/docs/rpc#send]:
|
117
117
|
#
|
118
118
|
# <i>Proof of Work is precomputed for one transaction in the background. If it has been a while since your last transaction it will send instantly, the next one will need to wait for Proof of Work to be generated.</i>
|
119
119
|
#
|
120
120
|
# ==== Examples:
|
121
121
|
#
|
122
|
-
# account.pay(to: "
|
123
|
-
# account.pay(to: "
|
122
|
+
# account.pay(to: "nano_...", amount: 1.1, id: "myUniqueId123") # => "9AE2311..."
|
123
|
+
# account.pay(to: "nano_...", amount: 54000000000000, id: "myUniqueId123", unit: :raw) # => "9AE2311..."
|
124
124
|
#
|
125
125
|
# @param to [String] account id of the recipient of your payment
|
126
126
|
# @param amount [Integer|Float]
|
@@ -211,7 +211,7 @@ class Nanook
|
|
211
211
|
#
|
212
212
|
# ==== Example:
|
213
213
|
#
|
214
|
-
# account.change_representative("
|
214
|
+
# account.change_representative("nano_...") # => "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
|
215
215
|
#
|
216
216
|
# @param [String] representative the id of the representative account
|
217
217
|
# to set as this account's representative
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nanook
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luke Duncalfe
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-09-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -182,7 +182,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
182
182
|
version: '0'
|
183
183
|
requirements: []
|
184
184
|
rubyforge_project:
|
185
|
-
rubygems_version: 2.7.
|
185
|
+
rubygems_version: 2.7.6
|
186
186
|
signing_key:
|
187
187
|
specification_version: 4
|
188
188
|
summary: Library for managing a nano currency node, including making and receiving
|