lisk 0.2.0 → 0.3.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/bin/debug +2 -1
- data/examples/payout.rb +73 -0
- data/{example.rb → examples/status.rb} +19 -16
- data/lib/lisk.rb +3 -1
- data/lib/lisk/client.rb +83 -36
- data/lib/lisk/legacy.rb +102 -0
- data/lib/lisk/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 915e70fda8a22aecbe253bfc7af695ce480f0411
|
4
|
+
data.tar.gz: 4936943b9255d984bc0669f6056c2294742643fb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e1bbda2e1c0b9e08207ad2986483815884b5d7d947d613b3c94b74240b7da8ede1981b8e5a0c8301323ff62abea1ac4ae1a6b86ffb39e61939dffb282748266c
|
7
|
+
data.tar.gz: fc4bba4a3049851f79df439beeb9cab8852c08ad6b8929878248560af50dffef3e7b1748ad770825b86b548f7529ffc027cf470e89be94cb63659415f79d35b9
|
data/bin/debug
CHANGED
data/examples/payout.rb
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'lisk'
|
4
|
+
|
5
|
+
# Try to connect a local Lisk client on test network.
|
6
|
+
# Warning: Think twice and test thoroughly before enabling this on main network!
|
7
|
+
client = Lisk::Client.new "127.0.0.1", 7000
|
8
|
+
|
9
|
+
# The pre-1.0.0 legacy API connected to the client.
|
10
|
+
legacy_api = Lisk::Legacy.new client
|
11
|
+
|
12
|
+
# Only proceed if the client is connected, active, and fully synchronized.
|
13
|
+
if legacy_api.ping
|
14
|
+
|
15
|
+
# Get the desired delegate by name.
|
16
|
+
delegate = legacy_api.delegates_get_by_name "4fryn"
|
17
|
+
p "Delegate #{delegate["username"]} is rank \##{delegate["rank"]} with #{delegate["approval"]}\% approval and #{delegate["productivity"]}\% productivity."
|
18
|
+
|
19
|
+
# Get a list of voters for a delegate.
|
20
|
+
deleagte_public_key = delegate["publicKey"]
|
21
|
+
deleagte_address = delegate["address"]
|
22
|
+
deleagte_voters = legacy_api.delegates_voters deleagte_public_key
|
23
|
+
|
24
|
+
# Get the total vote weight of our delegate
|
25
|
+
deleagte_total_weight = delegate["vote"].to_f
|
26
|
+
|
27
|
+
# Get the forging rewards from balance
|
28
|
+
payout_balance = legacy_api.accounts_get_balance deleagte_address
|
29
|
+
payout_balance = payout_balance["balance"].to_f
|
30
|
+
|
31
|
+
# Our pool is sharing 80%, and keeping 20%
|
32
|
+
pool_share = 0.80
|
33
|
+
|
34
|
+
# Filter out voters with out any Lisk
|
35
|
+
voter_threshold = 0
|
36
|
+
|
37
|
+
_debug_payout_sum = 0
|
38
|
+
|
39
|
+
# Iterate all voters
|
40
|
+
deleagte_voters.each do | voter |
|
41
|
+
voter_balance = voter["balance"].to_f
|
42
|
+
|
43
|
+
# Only handle voters with balance above threshold
|
44
|
+
if voter_balance > voter_threshold # and not voter["address"].eql? deleagte_address
|
45
|
+
voter_share = voter["balance"].to_f / deleagte_total_weight
|
46
|
+
payout = voter_share * payout_balance * pool_share
|
47
|
+
# @TODO: do some handling of dust amounts
|
48
|
+
# @TODO: do sanity checks and create transactions here ...
|
49
|
+
p "Sending #{payout / 1e8} LSK to voter #{voter["address"]}..."
|
50
|
+
_debug_payout_sum += payout
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# @TODO: sending 20% delegate share to her private address
|
55
|
+
p "Sending #{payout_balance * 0.20 / 1e8} LSK to delegate private funds..."
|
56
|
+
|
57
|
+
# Should not fail
|
58
|
+
_debug_payout_sum += payout_balance * 0.20
|
59
|
+
_debug_payout_diff = payout_balance - _debug_payout_sum
|
60
|
+
fail if not _debug_payout_diff === 0
|
61
|
+
|
62
|
+
|
63
|
+
else
|
64
|
+
p 'Lisk node disconnected, inactive, or not fully synchronized ...'
|
65
|
+
end
|
66
|
+
|
67
|
+
#account = Lisk::Account.new("14524922419337843943L")
|
68
|
+
#client.get_address(account)
|
69
|
+
#block = Lisk::Block.new("11145685198263496703")
|
70
|
+
#delegate = Lisk::Delegate.new("lightcurve")
|
71
|
+
#client.get_address(delegate)
|
72
|
+
#client.get_voters(delegate)
|
73
|
+
#transaction = Lisk::Transaction.new("10153999325502978458")
|
@@ -6,22 +6,31 @@ require 'lisk'
|
|
6
6
|
client = Lisk::Client.new
|
7
7
|
|
8
8
|
# Configure host and port of the Lisk client
|
9
|
-
client.configure "127.0.0.1", 8000
|
9
|
+
client = client.configure "127.0.0.1", 8000
|
10
10
|
|
11
11
|
# Same as above, just in one line
|
12
12
|
client = Lisk::Client.new "127.0.0.1", 8000
|
13
13
|
|
14
|
-
|
15
|
-
|
14
|
+
# The pre-1.0.0 legacy API connected to the client
|
15
|
+
legacy_api = Lisk::Legacy.new client
|
16
|
+
|
17
|
+
# Only proceed if the client is connected, active, and fully synchronized
|
18
|
+
if legacy_api.ping
|
19
|
+
|
20
|
+
# Lisk version API example
|
21
|
+
version = legacy_api.version
|
16
22
|
p "Lisk node version #{version["version"]} build #{version["build"]}..."
|
17
23
|
|
18
|
-
status
|
24
|
+
# Lisk node status API example
|
25
|
+
status = legacy_api.status
|
19
26
|
p "Lisk node is connected: #{status["success"]}... Blockchain loaded: #{status["loaded"]}..."
|
20
27
|
|
21
|
-
syncing
|
28
|
+
# Lisk node syncing API example
|
29
|
+
syncing = legacy_api.sync
|
22
30
|
p "Lisk node is syncing: #{syncing["syncing"]}... #{syncing["blocks"]} remaining blocks to latest block #{syncing["height"]}..."
|
23
31
|
|
24
|
-
peers
|
32
|
+
# Lisk node peers API example
|
33
|
+
peers = legacy_api.peers
|
25
34
|
cond = 0
|
26
35
|
disd = 0
|
27
36
|
band = 0
|
@@ -37,16 +46,10 @@ if client.ping
|
|
37
46
|
end
|
38
47
|
p "Lisk node saw #{peers.count} peers... #{cond} connected, #{disd} disconnected, #{band} banned..."
|
39
48
|
|
40
|
-
|
49
|
+
# Lisk blockchain API example
|
50
|
+
chain = legacy_api.chain
|
41
51
|
p "Lisk chain latest block: #{chain["height"]}... total supply: #{chain["supply"] / 1e8}... block reward: #{chain["reward"] / 1e8}"
|
52
|
+
|
42
53
|
else
|
43
|
-
p 'Lisk node disconnected or
|
54
|
+
p 'Lisk node disconnected, inactive, or not fully synchronized ...'
|
44
55
|
end
|
45
|
-
|
46
|
-
#account = Lisk::Account.new("14524922419337843943L")
|
47
|
-
#client.get_address(account)
|
48
|
-
#block = Lisk::Block.new("11145685198263496703")
|
49
|
-
#delegate = Lisk::Delegate.new("lightcurve")
|
50
|
-
#client.get_address(delegate)
|
51
|
-
#client.get_voters(delegate)
|
52
|
-
#transaction = Lisk::Transaction.new("10153999325502978458")
|
data/lib/lisk.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
require "lisk/version"
|
2
2
|
require "todonotes"
|
3
3
|
|
4
|
+
# The Lisk API Ruby wrapper gem.
|
4
5
|
module Lisk
|
5
6
|
require "lisk/client"
|
7
|
+
require "lisk/legacy"
|
6
8
|
|
7
|
-
#
|
9
|
+
# Handles unimplemented methods
|
8
10
|
def self.method_missing
|
9
11
|
todo "#{self}::#{__method__} METHOD MISSING"
|
10
12
|
end
|
data/lib/lisk/client.rb
CHANGED
@@ -2,69 +2,116 @@ require "net/http"
|
|
2
2
|
require "uri"
|
3
3
|
require "json"
|
4
4
|
|
5
|
+
# The Lisk API Ruby wrapper gem.
|
5
6
|
module Lisk
|
7
|
+
|
8
|
+
# A simple HTTP client connecting to a Lisk Core API node.
|
6
9
|
class Client
|
7
10
|
|
8
|
-
|
11
|
+
# Host and port of the API endpoint.
|
12
|
+
attr_accessor :host, :port, :ssl
|
9
13
|
|
14
|
+
# Initializes the Lisk HTTP client and defaults to localhost port 8000.
|
10
15
|
def initialize host = "127.0.0.1", port = 8000
|
11
16
|
@host = host
|
12
17
|
@port = port
|
18
|
+
@ssl = false
|
19
|
+
if self.is_alive?
|
20
|
+
return self
|
21
|
+
else
|
22
|
+
return nil
|
23
|
+
end
|
13
24
|
end
|
14
25
|
|
26
|
+
# Allows reconfiguring of the Lisk HTTP client's host and port.
|
15
27
|
def configure host, port
|
16
28
|
if not host.empty? or not port.empty?
|
17
29
|
@host = host
|
18
30
|
@port = port
|
31
|
+
@ssl = false
|
32
|
+
if self.is_alive?
|
33
|
+
return self
|
34
|
+
else
|
35
|
+
return nil
|
36
|
+
end
|
37
|
+
else
|
38
|
+
return nil
|
19
39
|
end
|
20
40
|
end
|
21
41
|
|
22
|
-
def query endpoint
|
23
|
-
node = ::Net::HTTP.new @host, @port
|
24
|
-
uri = URI.parse "http://#{host}:#{port}/api/#{endpoint}"
|
25
|
-
request = ::Net::HTTP::Get.new uri
|
26
|
-
response = node.request request
|
27
|
-
result = JSON::parse response.body
|
28
|
-
end
|
29
|
-
|
30
42
|
# Get the status of last received block.
|
31
43
|
# Returns true if block was received in the past 120 seconds.
|
32
|
-
def
|
33
|
-
|
34
|
-
|
44
|
+
def is_alive?
|
45
|
+
connected = self.query_get "loader/status/ping"
|
46
|
+
connected["success"]
|
35
47
|
end
|
36
48
|
|
37
|
-
#
|
38
|
-
def
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
49
|
+
# Handles GET requests to the given Lisk Core API endpoint
|
50
|
+
def query_get endpoint, params = nil
|
51
|
+
if not @ssl
|
52
|
+
# fixme "#{self}::#{__method__} Allow HTTPS requests"
|
53
|
+
begin
|
54
|
+
node = ::Net::HTTP.new @host, @port
|
55
|
+
uri = URI.parse "http://#{host}:#{port}/api/#{endpoint}"
|
56
|
+
if not params.nil?
|
57
|
+
uri.query = URI.encode_www_form params
|
58
|
+
end
|
59
|
+
request = ::Net::HTTP::Get.new uri
|
60
|
+
response = node.request request
|
61
|
+
result = JSON::parse response.body
|
62
|
+
rescue Timeout::Error => e
|
63
|
+
p "Can't connect to the Lisk node: Timeout!"
|
64
|
+
rescue Errno::EHOSTUNREACH => e
|
65
|
+
p "Can't connect to the Lisk node: Host Unreachable!"
|
66
|
+
rescue Errno::ECONNREFUSED => e
|
67
|
+
p "Can't connect to the Lisk node: Connection Refused!"
|
68
|
+
end
|
54
69
|
end
|
55
70
|
end
|
56
71
|
|
57
|
-
#
|
58
|
-
def
|
59
|
-
|
72
|
+
# Handles POST requests to the given Lisk Core API endpoint
|
73
|
+
def query_post endpoint, params
|
74
|
+
if not @ssl
|
75
|
+
# fixme "#{self}::#{__method__} Allow HTTPS requests"
|
76
|
+
begin
|
77
|
+
node = ::Net::HTTP.new @host, @port
|
78
|
+
uri = URI.parse "http://#{host}:#{port}/api/#{endpoint}"
|
79
|
+
uri.query = URI.encode_www_form params
|
80
|
+
request = ::Net::HTTP::POST.new uri
|
81
|
+
response = node.request request
|
82
|
+
result = JSON::parse response.body
|
83
|
+
rescue Timeout::Error => e
|
84
|
+
p "Can't connect to the Lisk node: Timeout!"
|
85
|
+
rescue Errno::EHOSTUNREACH => e
|
86
|
+
p "Can't connect to the Lisk node: Host Unreachable!"
|
87
|
+
rescue Errno::ECONNREFUSED => e
|
88
|
+
p "Can't connect to the Lisk node: Connection Refused!"
|
89
|
+
end
|
90
|
+
end
|
60
91
|
end
|
61
92
|
|
62
|
-
#
|
63
|
-
def
|
64
|
-
|
93
|
+
# Handles PUT requests to the given Lisk Core API endpoint
|
94
|
+
def query_put endpoint, params
|
95
|
+
if not @ssl
|
96
|
+
# fixme "#{self}::#{__method__} Allow HTTPS requests"
|
97
|
+
begin
|
98
|
+
node = ::Net::HTTP.new @host, @port
|
99
|
+
uri = URI.parse "http://#{host}:#{port}/api/#{endpoint}"
|
100
|
+
uri.query = URI.encode_www_form params
|
101
|
+
request = ::Net::HTTP::Put.new uri
|
102
|
+
response = node.request request
|
103
|
+
result = JSON::parse response.body
|
104
|
+
rescue Timeout::Error => e
|
105
|
+
p "Can't connect to the Lisk node: Timeout!"
|
106
|
+
rescue Errno::EHOSTUNREACH => e
|
107
|
+
p "Can't connect to the Lisk node: Host Unreachable!"
|
108
|
+
rescue Errno::ECONNREFUSED => e
|
109
|
+
p "Can't connect to the Lisk node: Connection Refused!"
|
110
|
+
end
|
111
|
+
end
|
65
112
|
end
|
66
113
|
|
67
|
-
#
|
114
|
+
# Handles unimplemented methods
|
68
115
|
def method_missing(name, *args, &block)
|
69
116
|
todo "#{self}::#{name} METHOD MISSING"
|
70
117
|
end
|
data/lib/lisk/legacy.rb
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
# The Lisk API Ruby wrapper gem.
|
2
|
+
module Lisk
|
3
|
+
|
4
|
+
# Implements legacy APIs of the Lisk Core pre-1.0.0 node
|
5
|
+
class Legacy
|
6
|
+
|
7
|
+
# A "lisk/client" connecting to a Lisk Core API node.
|
8
|
+
attr_accessor :client
|
9
|
+
|
10
|
+
# Initializing the legacy API with a legacy Lisk Core API client.
|
11
|
+
def initialize client
|
12
|
+
if not client.nil?
|
13
|
+
@client = client
|
14
|
+
return self
|
15
|
+
else
|
16
|
+
return nil
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Get the status of last received block.
|
21
|
+
# Returns true if block was received in the past 120 seconds.
|
22
|
+
def ping
|
23
|
+
ping = @client.query_get "loader/status/ping"
|
24
|
+
ping["success"]
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns the sync status of the blockchain.
|
28
|
+
def status
|
29
|
+
status = @client.query_get "loader/status"
|
30
|
+
end
|
31
|
+
|
32
|
+
# Get the synchronization status of the client.
|
33
|
+
def sync
|
34
|
+
sync = @client.query_get "loader/status/sync"
|
35
|
+
end
|
36
|
+
|
37
|
+
# Gets list of peers.
|
38
|
+
def peers
|
39
|
+
peers = @client.query_get "peers"
|
40
|
+
if peers["success"]
|
41
|
+
return peers["peers"]
|
42
|
+
else
|
43
|
+
return nil
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# Gets version and build time.
|
48
|
+
def version
|
49
|
+
version = @client.query_get "peers/version"
|
50
|
+
end
|
51
|
+
|
52
|
+
# Gets status of height, fee, milestone, blockreward and supply.
|
53
|
+
def chain
|
54
|
+
chain = @client.query_get "blocks/getStatus"
|
55
|
+
end
|
56
|
+
|
57
|
+
# Gets delegate by username.
|
58
|
+
def delegates_get_by_name user_name
|
59
|
+
params = { :username => user_name }
|
60
|
+
delegate = @client.query_get "delegates/get", params
|
61
|
+
if delegate["success"]
|
62
|
+
return delegate["delegate"]
|
63
|
+
else
|
64
|
+
return nil
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Gets delegate by public key.
|
69
|
+
def delegates_get_by_key public_key
|
70
|
+
params = { :publicKey => public_key }
|
71
|
+
delegate = @client.query_get "delegates/get", params
|
72
|
+
if delegate["success"]
|
73
|
+
return delegate["delegate"]
|
74
|
+
else
|
75
|
+
return nil
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# Gets voters of delegate.
|
80
|
+
def delegates_voters public_key
|
81
|
+
params = { :publicKey => public_key }
|
82
|
+
voters = @client.query_get "delegates/voters", params
|
83
|
+
if voters["success"]
|
84
|
+
return voters["accounts"]
|
85
|
+
else
|
86
|
+
return nil
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# Request the balance of an account.
|
91
|
+
def accounts_get_balance address
|
92
|
+
params = { :address => address }
|
93
|
+
balance = @client.query_get "accounts/getBalance", params
|
94
|
+
end
|
95
|
+
|
96
|
+
# Handles unimplemented methods
|
97
|
+
def method_missing(name, *args, &block)
|
98
|
+
todo "#{self}::#{name} METHOD MISSING"
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
end
|
data/lib/lisk/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lisk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- 4fryn Dings
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-10-
|
11
|
+
date: 2017-10-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -84,9 +84,11 @@ files:
|
|
84
84
|
- bin/console
|
85
85
|
- bin/debug
|
86
86
|
- bin/setup
|
87
|
-
-
|
87
|
+
- examples/payout.rb
|
88
|
+
- examples/status.rb
|
88
89
|
- lib/lisk.rb
|
89
90
|
- lib/lisk/client.rb
|
91
|
+
- lib/lisk/legacy.rb
|
90
92
|
- lib/lisk/version.rb
|
91
93
|
- lisk.gemspec
|
92
94
|
homepage: https://github.com/4fryn/lisk.rb
|