zold 0.9.9 → 0.9.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +6 -1
- data/Procfile +1 -1
- data/README.md +28 -13
- data/fixtures/scripts/push-and-pull.sh +1 -1
- data/lib/zold/commands/fetch.rb +2 -2
- data/lib/zold/commands/merge.rb +1 -1
- data/lib/zold/commands/node.rb +4 -0
- data/lib/zold/commands/pay.rb +4 -2
- data/lib/zold/http.rb +10 -1
- data/lib/zold/node/front.rb +12 -5
- data/lib/zold/txn.rb +2 -1
- data/lib/zold/version.rb +1 -1
- data/wp/wp.pdf +0 -0
- data/wp/wp.tex +20 -11
- data/zold.gemspec +1 -0
- metadata +15 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eb875c3b804c4d045fc34d2e00ad415d2d29a370
|
4
|
+
data.tar.gz: 9562b642f01203ff7560dcd43d72c7edab08cb2d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ac0fc271a65b8fd7284398dba3e67ab515f7d06942e12a10d27e654433907191ab1abeabb9767384296bb5259ff3387cb4ecf3a59b917d6f9c6b1a09a4ea698b
|
7
|
+
data.tar.gz: 5be7344fecc4fc4d9376b16c45c43a5a25ca6a451386b4ecca734a73358c3257c91e8e5a1a98fd73323c683c4c81be854b8497548ea0529ae4c81e6e9ed24edc
|
data/.rubocop.yml
CHANGED
@@ -27,7 +27,12 @@ Metrics/PerceivedComplexity:
|
|
27
27
|
Max: 25
|
28
28
|
Metrics/LineLength:
|
29
29
|
Max: 120
|
30
|
+
Layout/MultilineOperationIndentation:
|
31
|
+
Enabled: false
|
30
32
|
|
31
|
-
#
|
33
|
+
# @todo #64:30min Let's get rid of this and find a way to pass that
|
34
|
+
# $log global variable to all tests. Now it's defined inside test__helper.rb,
|
35
|
+
# but there should be a better solution. I posted a question about it:
|
36
|
+
# https://stackoverflow.com/questions/50418822
|
32
37
|
Style/GlobalVars:
|
33
38
|
Enabled: false
|
data/Procfile
CHANGED
@@ -1 +1 @@
|
|
1
|
-
web: LC_ALL=UTF-8 ./bin/zold node --no-colors --verbose --trace --bind-port=$PORT --port=80 --host=b1.zold.io --threads=0 --standalone --invoice=JKFq17yipfjLtX@0000000000000000
|
1
|
+
web: LC_ALL=UTF-8 ./bin/zold node --no-colors --verbose --trace --bind-port=$PORT --port=80 --host=b1.zold.io --threads=0 --standalone --invoice=JKFq17yipfjLtX@0000000000000000 --never-reboot
|
data/README.md
CHANGED
@@ -1,15 +1,15 @@
|
|
1
|
-
<img src="http://www.zold.io/logo.svg" width="
|
1
|
+
<img src="http://www.zold.io/logo.svg" width="92px" height="92px"/>
|
2
2
|
|
3
3
|
[![EO principles respected here](http://www.elegantobjects.org/badge.svg)](http://www.elegantobjects.org)
|
4
4
|
[![Managed by Zerocracy](https://www.0crat.com/badge/C91QJT4CF.svg)](https://www.0crat.com/p/C91QJT4CF)
|
5
5
|
[![DevOps By Rultor.com](http://www.rultor.com/b/yegor256/Zold)](http://www.rultor.com/p/yegor256/Zold)
|
6
6
|
[![We recommend RubyMine](http://www.elegantobjects.org/rubymine.svg)](https://www.jetbrains.com/ruby/)
|
7
7
|
|
8
|
-
[![Build Status](https://travis-ci.org/
|
8
|
+
[![Build Status](https://travis-ci.org/yegor256/zold.svg)](https://travis-ci.org/yegor256/zold)
|
9
9
|
[![Build status](https://ci.appveyor.com/api/projects/status/ypctxm5ohrtp2kr4?svg=true)](https://ci.appveyor.com/project/yegor256/zold)
|
10
10
|
[![PDD status](http://www.0pdd.com/svg?name=yegor256/zold)](http://www.0pdd.com/p?name=yegor256/zold)
|
11
11
|
[![Gem Version](https://badge.fury.io/rb/zold.svg)](http://badge.fury.io/rb/zold)
|
12
|
-
[![Test Coverage](https://img.shields.io/codecov/c/github/
|
12
|
+
[![Test Coverage](https://img.shields.io/codecov/c/github/yegor256/zold.svg)](https://codecov.io/github/yegor256/zold?branch=master)
|
13
13
|
|
14
14
|
[![Dependency Status](https://gemnasium.com/yegor256/zold.svg)](https://gemnasium.com/yegor256/zold)
|
15
15
|
[![Maintainability](https://api.codeclimate.com/v1/badges/7489c1d2bacde40ffc09/maintainability)](https://codeclimate.com/github/yegor256/zold/maintainability)
|
@@ -23,35 +23,39 @@ The license is [MIT](https://github.com/yegor256/zold/blob/master/LICENSE.txt).
|
|
23
23
|
|
24
24
|
## How to Use
|
25
25
|
|
26
|
-
|
26
|
+
First, install [Ruby 2.3+](https://www.ruby-lang.org/en/documentation/installation/),
|
27
|
+
[Rubygems](https://rubygems.org/pages/download), and
|
28
|
+
the [gem](https://rubygems.org/gems/zold):
|
27
29
|
|
28
30
|
```bash
|
29
31
|
$ sudo apt-get install ruby-dev rubygems zlib1g-dev
|
30
32
|
$ gem install zold
|
31
33
|
```
|
32
34
|
|
33
|
-
|
35
|
+
To make sure it's installed, try:
|
34
36
|
|
35
37
|
```bash
|
36
38
|
$ zold --help
|
37
39
|
```
|
38
40
|
|
39
|
-
You will need PGP keys in `~/.ssh`.
|
41
|
+
You will need PGP private and public keys in `~/.ssh`.
|
42
|
+
If you don't have them yet, run this in order to generate a new pair
|
43
|
+
(just hit <kbd>Enter</kbd> when it asks you for a password):
|
40
44
|
|
41
45
|
```bash
|
42
46
|
$ ssh-keygen -t rsa -b 4096
|
43
47
|
```
|
44
48
|
|
45
|
-
|
46
|
-
|
49
|
+
Then, create a new wallet (instead of `5f96e731e48ae21f` there will be your
|
50
|
+
personal wallet ID, use it everywhere below):
|
47
51
|
|
48
52
|
```bash
|
49
53
|
$ zold create
|
50
54
|
5f96e731e48ae21f
|
51
55
|
```
|
52
56
|
|
53
|
-
Then, give
|
54
|
-
When the payment is sent, ask him or her for the
|
57
|
+
Then, give this ID to your friend, who is going to pay you.
|
58
|
+
When the payment is sent, ask him or her for the ID of the wallet
|
55
59
|
the payment has been sent from and then fetch that wallet
|
56
60
|
(let's say it is `5555444433332222`):
|
57
61
|
|
@@ -79,10 +83,21 @@ $ zold push 5f96e731e48ae21f
|
|
79
83
|
That's it.
|
80
84
|
|
81
85
|
You also can contribute to Zold by running a node on your server.
|
82
|
-
In order to do that just run
|
86
|
+
In order to do that just run (with your own wallet ID, of course,
|
87
|
+
and your own public IP address instead of `4.4.4.4`):
|
83
88
|
|
84
89
|
```bash
|
85
|
-
$ zold node --invoice=5f96e731e48ae21f
|
90
|
+
$ zold node --trace --verbose --invoice=5f96e731e48ae21f --host=4.4.4.4
|
91
|
+
```
|
92
|
+
|
93
|
+
Then, open the page `4.4.4.4:4096` in your browser.
|
94
|
+
If you see a simple JSON document, everything is fine.
|
95
|
+
Next, hit <kbd>Ctrl</kbd>+<kbd>c</kbd> and run this line, in order
|
96
|
+
to start the node and make sure it will be online even when you log off
|
97
|
+
(replace `CMD` with the command you just executed before):
|
98
|
+
|
99
|
+
```bash
|
100
|
+
$ nohup bash -c 'while CMD; do gem install zold; done' &
|
86
101
|
```
|
87
102
|
|
88
103
|
Grateful users of the system will pay "taxes" to your wallet
|
@@ -91,7 +106,7 @@ for the maintenance of their wallets.
|
|
91
106
|
## How to Contribute
|
92
107
|
|
93
108
|
It is a Ruby command line gem. First, install
|
94
|
-
[Ruby](https://www.ruby-lang.org/en/documentation/installation/)
|
109
|
+
[Ruby 2.3+](https://www.ruby-lang.org/en/documentation/installation/),
|
95
110
|
[Rubygems](https://rubygems.org/pages/download),
|
96
111
|
and
|
97
112
|
[Bundler](https://bundler.io/).
|
@@ -9,7 +9,7 @@ port=`python -c 'import socket; s=socket.socket(); s.bind(("", 0)); print(s.gets
|
|
9
9
|
|
10
10
|
mkdir server
|
11
11
|
cd server
|
12
|
-
zold --trace
|
12
|
+
zold node --trace --invoice=NOPREFIX@ffffffffffffffff \
|
13
13
|
--host=localhost --port=${port} --bind-port=${port} \
|
14
14
|
--threads=0 --standalone &
|
15
15
|
pid=$!
|
data/lib/zold/commands/fetch.rb
CHANGED
@@ -72,7 +72,7 @@ Available options:"
|
|
72
72
|
@remotes.error(r[:host], r[:port])
|
73
73
|
end
|
74
74
|
end
|
75
|
-
@log.debug("#{total} copies fetched, there are #{cps.all.count} available locally")
|
75
|
+
@log.debug("#{total} copies of #{id} fetched, there are #{cps.all.count} available locally")
|
76
76
|
end
|
77
77
|
|
78
78
|
def fetch_one(id, r, cps, opts)
|
@@ -84,7 +84,7 @@ Available options:"
|
|
84
84
|
uri = URI("#{r[:home]}wallet/#{id}")
|
85
85
|
res = Http.new(uri).get
|
86
86
|
if res.code == '404'
|
87
|
-
@log.info("#{address} wallet #{Rainbow('not found').red}")
|
87
|
+
@log.info("#{address} wallet #{id} #{Rainbow('not found').red}")
|
88
88
|
return false
|
89
89
|
end
|
90
90
|
unless res.code == '200'
|
data/lib/zold/commands/merge.rb
CHANGED
@@ -71,7 +71,7 @@ Available options:"
|
|
71
71
|
if modified
|
72
72
|
@log.debug("#{cps.count} copies merged successfully into #{wallet.path}")
|
73
73
|
else
|
74
|
-
@log.debug("Nothing changed in #{wallet.
|
74
|
+
@log.debug("Nothing changed in #{wallet.id} after merge of #{cps.count} copies")
|
75
75
|
end
|
76
76
|
modified
|
77
77
|
end
|
data/lib/zold/commands/node.rb
CHANGED
@@ -61,6 +61,9 @@ module Zold
|
|
61
61
|
o.bool '--standalone',
|
62
62
|
'Never communicate with other nodes (mostly for testing)',
|
63
63
|
default: false
|
64
|
+
o.bool '--never-reboot',
|
65
|
+
'Don\'t reboot when a new version shows up in the network',
|
66
|
+
default: false
|
64
67
|
o.bool '--help', 'Print instructions'
|
65
68
|
end
|
66
69
|
if opts.help?
|
@@ -94,6 +97,7 @@ module Zold
|
|
94
97
|
:entrance, Entrance.new(wallets, remotes, copies, address, log: @log)
|
95
98
|
)
|
96
99
|
Zold::Front.set(:port, opts['bind-port'])
|
100
|
+
Zold::Front.set(:reboot, !opts['never-rebootw'])
|
97
101
|
invoice = opts[:invoice]
|
98
102
|
unless invoice.include?('@')
|
99
103
|
require_relative 'pull'
|
data/lib/zold/commands/pay.rb
CHANGED
@@ -59,8 +59,9 @@ Available options:"
|
|
59
59
|
end
|
60
60
|
mine = Args.new(opts, @log).take || return
|
61
61
|
raise 'Payer wallet ID is required as the first argument' if mine[0].nil?
|
62
|
-
|
63
|
-
|
62
|
+
id = Id.new(mine[0])
|
63
|
+
from = @wallets.find(id)
|
64
|
+
raise "Wallet #{id} doesn't exist, do 'pull' first" unless from.exists?
|
64
65
|
raise 'Recepient\'s invoice or wallet ID is required as the second argument' if mine[1].nil?
|
65
66
|
invoice = mine[1]
|
66
67
|
unless invoice.include?('@')
|
@@ -89,6 +90,7 @@ Available options:"
|
|
89
90
|
key = Zold::Key.new(file: opts['private-key'])
|
90
91
|
txn = from.sub(amount, invoice, key, details)
|
91
92
|
@log.debug("#{amount} sent from #{from} to #{txn.bnf}: #{details}")
|
93
|
+
@log.debug("Don't forget to do 'zold push #{from}'")
|
92
94
|
@log.info(txn.id)
|
93
95
|
txn
|
94
96
|
end
|
data/lib/zold/http.rb
CHANGED
@@ -30,8 +30,16 @@ require_relative 'score'
|
|
30
30
|
module Zold
|
31
31
|
# Http page
|
32
32
|
class Http
|
33
|
+
# HTTP header we add to each HTTP request, in order to inform
|
34
|
+
# the other node about the score. If the score is big enough,
|
35
|
+
# the remote node will add us to its list of remote nodes.
|
33
36
|
SCORE_HEADER = 'X-Zold-Score'.freeze
|
34
37
|
|
38
|
+
# HTTP header we add, in order to inform the node about our
|
39
|
+
# version. This is done mostly in order to let the other node
|
40
|
+
# reboot itself, if the version is higher.
|
41
|
+
VERSION_HEADER = 'X-Zold-Version'.freeze
|
42
|
+
|
35
43
|
def initialize(uri, score = Score::ZERO)
|
36
44
|
@uri = uri
|
37
45
|
@score = score
|
@@ -66,7 +74,8 @@ module Zold
|
|
66
74
|
'User-Agent': "Zold #{VERSION}",
|
67
75
|
'Connection': 'close'
|
68
76
|
}
|
69
|
-
headers[
|
77
|
+
headers[Http::VERSION_HEADER] = VERSION
|
78
|
+
headers[Http::SCORE_HEADER] = score.reduced(4).to_s if @score.valid? && @score.value >= 3 && !score.expired?
|
70
79
|
headers
|
71
80
|
end
|
72
81
|
end
|
data/lib/zold/node/front.rb
CHANGED
@@ -23,7 +23,7 @@ STDOUT.sync = true
|
|
23
23
|
require 'json'
|
24
24
|
require 'sinatra/base'
|
25
25
|
require 'webrick'
|
26
|
-
|
26
|
+
require 'semantic'
|
27
27
|
require_relative '../version'
|
28
28
|
require_relative '../wallet'
|
29
29
|
require_relative '../log'
|
@@ -45,6 +45,7 @@ module Zold
|
|
45
45
|
set :lock, false
|
46
46
|
set :show_exceptions, false
|
47
47
|
set :server, 'webrick'
|
48
|
+
set :reboot, false # to be injected at node.rb
|
48
49
|
set :home, nil? # to be injected at node.rb
|
49
50
|
set :logging, true # to be injected at node.rb
|
50
51
|
set :log, nil? # to be injected at node.rb
|
@@ -57,11 +58,16 @@ module Zold
|
|
57
58
|
end
|
58
59
|
|
59
60
|
before do
|
60
|
-
if request.env[Http::
|
61
|
-
|
62
|
-
|
63
|
-
|
61
|
+
if request.env[Http::VERSION_HEADER] &&
|
62
|
+
Semantic::Version.new(VERSION) < Semantic::Version.new(request.env[Http::VERSION_HEADER]) &&
|
63
|
+
!settings.remotes.empty? && settings.reboot
|
64
|
+
exit(0)
|
64
65
|
end
|
66
|
+
return unless request.env[Http::SCORE_HEADER]
|
67
|
+
return unless settings.remotes.empty?
|
68
|
+
s = Score.parse(request.env[Http::SCORE_HEADER])
|
69
|
+
error(400, 'The score is invalid') unless s.valid?
|
70
|
+
settings.remotes.add(s.host, s.port) if s.value > 3
|
65
71
|
end
|
66
72
|
|
67
73
|
after do
|
@@ -85,6 +91,7 @@ module Zold
|
|
85
91
|
score: score.to_h,
|
86
92
|
uptime: `uptime`.strip,
|
87
93
|
wallets: settings.wallets.all.count,
|
94
|
+
remotes: settings.remotes.all.count,
|
88
95
|
farm: settings.farm.to_json,
|
89
96
|
date: `date --iso-8601=seconds -u`.strip,
|
90
97
|
hours_alive: ((Time.now - settings.start) / (60 * 60)).round(2),
|
data/lib/zold/txn.rb
CHANGED
data/lib/zold/version.rb
CHANGED
data/wp/wp.pdf
CHANGED
Binary file
|
data/wp/wp.tex
CHANGED
@@ -20,6 +20,7 @@
|
|
20
20
|
\AfterEndEnvironment{minted}{\end{mdframed}}
|
21
21
|
\usepackage{xcolor}
|
22
22
|
\usepackage{graphicx}
|
23
|
+
\pagecolor{black!3}
|
23
24
|
\newcommand\dd[1]{\colorbox{gray!30}{\texttt{#1}}}
|
24
25
|
\usepackage{hyperref}
|
25
26
|
\hypersetup{colorlinks=true,allcolors=blue!40!black}
|
@@ -107,7 +108,7 @@ The first problem is that transaction processing is rather slow.%
|
|
107
108
|
and is therefore inappropriate for fast payments.''
|
108
109
|
It is inevitable, since
|
109
110
|
``processing speed is at odds with the security aspects of the underlying
|
110
|
-
proof-of-work based consensus mechanism''~\
|
111
|
+
proof-of-work based consensus mechanism'' according to~\textcite{kiayias2015}.
|
111
112
|
|
112
113
|
The second problem, as noted by~\textcite{popov2017}, is that ``it is not easy to get rid
|
113
114
|
of fees in the blockchain infrastructure since they serve
|
@@ -132,11 +133,13 @@ Unlike \emph{all} other crypto currencies, there is no central ledger in Zold.
|
|
132
133
|
Each wallet has its own personal ledger.
|
133
134
|
All transactions in each ledger are confirmed by
|
134
135
|
\href{https://en.wikipedia.org/wiki/RSA_(cryptosystem)}{RSA signatures} of their owners.
|
136
|
+
Section~\ref{sec:wallets} explains how it works.
|
135
137
|
|
136
138
|
\textbf{Proof of work}.
|
137
139
|
Similar to many other digital currencies---including Bitcoin, Etherium, Plancoin, Monero, Trinity, Plancoin, Dero,
|
138
140
|
and many others---Zold nodes find consensus by comparing the amount of CPU power invested
|
139
141
|
by each of them into finding hash suffixes, performing certain expensive and meaningless calculations.
|
142
|
+
Section~\ref{sec:score} describes the algorithm being used.
|
140
143
|
|
141
144
|
\textbf{Root Wallet}.
|
142
145
|
Zold is a pre-mined%
|
@@ -180,7 +183,7 @@ EOS, NEO, Loki,%
|
|
180
183
|
and many others.
|
181
184
|
The only way to get ZLD is to receive it from someone else.
|
182
185
|
The root wallet belongs to the issuer and may have a negative balance,
|
183
|
-
which can grow according to a pre-defined restrictive formula.
|
186
|
+
which can grow according to a pre-defined restrictive formula, explained in Section~\ref{sec:formula}.
|
184
187
|
All other wallets may only have positive balances.
|
185
188
|
|
186
189
|
\textbf{Taxes}.
|
@@ -188,14 +191,16 @@ Unlike many other payment systems, Zold doesn't require its users
|
|
188
191
|
to pay transaction fees. Instead, wallets have to pay regular ``taxes'' for the
|
189
192
|
service of their maintenances. Taxes amounts depend on the amount
|
190
193
|
of transactions in a wallet and the age of the wallet.
|
194
|
+
Section~\ref{sec:taxes} provides more details.
|
191
195
|
|
192
196
|
\textbf{No Trust}.
|
193
197
|
The network of communicating nodes maintains wallets of users.
|
194
198
|
Anyone can add a node to the network.
|
195
199
|
It is assumed that any node may contain corrupted data, either by mistake or intentionally.
|
200
|
+
Section~\ref{sec:remotes} explains how nodes communicate and rate each other.
|
196
201
|
|
197
202
|
\textbf{Open Source}.
|
198
|
-
Zold is a command line tool. Its entire code base is open
|
203
|
+
Zold is a command line tool. Its entire code base is open
|
199
204
|
and hosted at the GitHub \href{https://github.com/yegor256/zold}{yegor256/zold}
|
200
205
|
repository.
|
201
206
|
|
@@ -224,7 +229,7 @@ A user may make up any number, even using
|
|
224
229
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
225
230
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
226
231
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
227
|
-
\section{Proof of Work}
|
232
|
+
\section{Proof of Work}\label{sec:score}
|
228
233
|
|
229
234
|
The system consists of nodes (server machines), which maintain the data.
|
230
235
|
In order to guarantee data consistency among all distributed nodes
|
@@ -314,7 +319,7 @@ the score. All nodes in the network must have the same strength of their scores.
|
|
314
319
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
315
320
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
316
321
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
317
|
-
\section{Wallets}
|
322
|
+
\section{Wallets}\label{sec:wallets}
|
318
323
|
|
319
324
|
There is no central ledger in Zold, like in many other digital currencies.
|
320
325
|
Instead, each user has their own \emph{wallets} (any number of them) with their own ledgers inside.
|
@@ -388,7 +393,7 @@ The order of transactions is not important, as long as their final balance is po
|
|
388
393
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
389
394
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
390
395
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
391
|
-
\section{Mining Formula}
|
396
|
+
\section{Mining Formula}\label{sec:formula}
|
392
397
|
|
393
398
|
The only way to get ZLD is to receive it from the \emph{root} wallet
|
394
399
|
with a system pre-defined ID \dd{0000000000000000}.
|
@@ -420,7 +425,7 @@ The limitation is hardwired in Zold software and can't be eliminated.
|
|
420
425
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
421
426
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
422
427
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
423
|
-
\section{Taxes}
|
428
|
+
\section{Taxes}\label{sec:taxes}
|
424
429
|
|
425
430
|
Each wallet must have to pay \emph{taxes} in order to be promoted by nodes.
|
426
431
|
The maximum amount of tax debt a node can tolerate is 1 ZLD. This means
|
@@ -456,7 +461,7 @@ Duplicate tax payments are ignored.
|
|
456
461
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
457
462
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
458
463
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
459
|
-
\section{Remote Nodes}
|
464
|
+
\section{Remote Nodes}\label{sec:remotes}
|
460
465
|
|
461
466
|
Each node maintains a list of \emph{remote nodes} (their host names and TCP port numbers),
|
462
467
|
their scores and their availability information. When the node is just installed,
|
@@ -549,7 +554,7 @@ Then, it \emph{promotes} the wallet to all known remote nodes.
|
|
549
554
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
550
555
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
551
556
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
552
|
-
\section{RESTful API}
|
557
|
+
\section{RESTful API}\label{sec:api}
|
553
558
|
|
554
559
|
There is a limited set of RESTful API entry points in each node.
|
555
560
|
Each response has \dd{Content-Type},
|
@@ -619,7 +624,7 @@ or
|
|
619
624
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
620
625
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
621
626
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
622
|
-
\section{Incentives}
|
627
|
+
\section{Incentives}\label{sec:incentives}
|
623
628
|
|
624
629
|
It is obvious that anonymous users will participate in Zold and maintain
|
625
630
|
their nodes only if they have enough financial motivation to do that. Simply
|
@@ -662,7 +667,7 @@ each node is interested to push wallets further.
|
|
662
667
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
663
668
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
664
669
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
665
|
-
\section{Threats
|
670
|
+
\section{Threats and Responses}\label{sec:threats}
|
666
671
|
|
667
672
|
It is obvious that a distributed system that consists of anonymous nodes
|
668
673
|
even theorecially can't be 100\% safe, reliable, secure and trustworthy.
|
@@ -717,6 +722,10 @@ The only sensitive part is the private key of the wallet. If that file
|
|
717
722
|
is lost, the wallet can't pay anything anymore. This is the file all
|
718
723
|
wallet owners must keep safe.
|
719
724
|
|
725
|
+
\section{Conclusion}
|
726
|
+
|
727
|
+
To be written...
|
728
|
+
|
720
729
|
\printbibliography%
|
721
730
|
|
722
731
|
\end{document}
|
data/zold.gemspec
CHANGED
@@ -50,6 +50,7 @@ Gem::Specification.new do |s|
|
|
50
50
|
s.add_runtime_dependency 'rake', '12.0.0'
|
51
51
|
s.add_runtime_dependency 'rubocop', '~>0.52.0'
|
52
52
|
s.add_runtime_dependency 'rubocop-rspec', '1.5.1'
|
53
|
+
s.add_runtime_dependency 'semantic', '~>1.5.0'
|
53
54
|
s.add_runtime_dependency 'sinatra', '~>2.0.1'
|
54
55
|
s.add_runtime_dependency 'slop', '~>4.4'
|
55
56
|
s.add_runtime_dependency 'xcop', '~>0.5'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zold
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yegor Bugayenko
|
@@ -122,6 +122,20 @@ dependencies:
|
|
122
122
|
- - '='
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: 1.5.1
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: semantic
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 1.5.0
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 1.5.0
|
125
139
|
- !ruby/object:Gem::Dependency
|
126
140
|
name: sinatra
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|