shilling 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.
- checksums.yaml +7 -0
- data/HISTORY.md +3 -0
- data/LICENSE.md +116 -0
- data/Manifest.txt +26 -0
- data/README.md +115 -0
- data/Rakefile +32 -0
- data/bin/shilling +17 -0
- data/lib/shilling.rb +103 -0
- data/lib/shilling/bank.rb +109 -0
- data/lib/shilling/block.rb +44 -0
- data/lib/shilling/blockchain.rb +47 -0
- data/lib/shilling/cache.rb +22 -0
- data/lib/shilling/ledger.rb +30 -0
- data/lib/shilling/node.rb +82 -0
- data/lib/shilling/pool.rb +42 -0
- data/lib/shilling/service.rb +113 -0
- data/lib/shilling/tool.rb +66 -0
- data/lib/shilling/transaction.rb +30 -0
- data/lib/shilling/version.rb +11 -0
- data/lib/shilling/views/_blockchain.erb +37 -0
- data/lib/shilling/views/_ledger.erb +15 -0
- data/lib/shilling/views/_peers.erb +24 -0
- data/lib/shilling/views/_pending_transactions.erb +23 -0
- data/lib/shilling/views/_wallet.erb +16 -0
- data/lib/shilling/views/index.erb +30 -0
- data/lib/shilling/views/style.scss +172 -0
- data/lib/shilling/wallet.rb +15 -0
- metadata +152 -0
@@ -0,0 +1,30 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
class Transaction
|
4
|
+
|
5
|
+
attr_reader :from, :to, :amount, :id
|
6
|
+
|
7
|
+
def initialize( from, to, amount, id=SecureRandom.uuid )
|
8
|
+
@from = from
|
9
|
+
@to = to
|
10
|
+
@amount = amount
|
11
|
+
@id = id
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.from_h( hash )
|
15
|
+
self.new *hash.values_at( 'from', 'to', 'amount', 'id' )
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_h
|
19
|
+
{ from: @from, to: @to, amount: @amount, id: @id }
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
def valid?
|
24
|
+
## check signature in the future; for now always true
|
25
|
+
true
|
26
|
+
end
|
27
|
+
|
28
|
+
end # class Transaction
|
29
|
+
|
30
|
+
Tx = Transaction ## add Tx shortcut / alias
|
@@ -0,0 +1,37 @@
|
|
1
|
+
<div class="blockchain">
|
2
|
+
<h2>
|
3
|
+
Blockchain<br>
|
4
|
+
<span><%= @node.bank.chain.size %> blocks</span>
|
5
|
+
</h2>
|
6
|
+
<form action="/mine" method="post">
|
7
|
+
<input type="submit" class="button" value="Mine a Block">
|
8
|
+
</form>
|
9
|
+
|
10
|
+
<div class="blocks">
|
11
|
+
<% @node.bank.chain.last(10).reverse.each do |block| %>
|
12
|
+
<div class="block">
|
13
|
+
<div class="header">
|
14
|
+
<%= block.index %> — <%= block.timestamp %><br>
|
15
|
+
</div>
|
16
|
+
<table>
|
17
|
+
<% block.transactions.each do |tx| %>
|
18
|
+
<tr>
|
19
|
+
<td class="id">
|
20
|
+
<%= tx.id[0..2] %>
|
21
|
+
</td>
|
22
|
+
<td>
|
23
|
+
$<%= tx.amount %>
|
24
|
+
</td>
|
25
|
+
<td>
|
26
|
+
<%= tx.from[0..15] %> → <%= tx.to[0..15] %>
|
27
|
+
</td>
|
28
|
+
</tr>
|
29
|
+
<% end %>
|
30
|
+
</table>
|
31
|
+
</div>
|
32
|
+
<% end %>
|
33
|
+
</div>
|
34
|
+
<p>
|
35
|
+
†: Miner Transaction - New $$ on the Market!
|
36
|
+
</p>
|
37
|
+
</div>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<div class="ledger">
|
2
|
+
<h2>Ledger</h2>
|
3
|
+
<table>
|
4
|
+
<tr>
|
5
|
+
<th>Address</th>
|
6
|
+
<th>Balance</th>
|
7
|
+
</tr>
|
8
|
+
<% @node.bank.ledger.wallets.each do |address, amount| %>
|
9
|
+
<tr>
|
10
|
+
<td><%= address[0..15] %></td>
|
11
|
+
<td>$<%= amount %></td>
|
12
|
+
</tr>
|
13
|
+
<% end %>
|
14
|
+
</table>
|
15
|
+
</div>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<div class="peers">
|
2
|
+
<h2>Peers</h2>
|
3
|
+
<% if @node.peers.any? %>
|
4
|
+
<ul>
|
5
|
+
<% @node.peers.each_with_index do |(host, port), i| %>
|
6
|
+
<li>
|
7
|
+
http://<%= host %>:<%= port %>
|
8
|
+
<form action="/peers/<%= i %>/delete" method="post">
|
9
|
+
<input type="submit" class="small" value="Remove" />
|
10
|
+
</form>
|
11
|
+
</li>
|
12
|
+
<% end %>
|
13
|
+
</ul>
|
14
|
+
<% else %>
|
15
|
+
<i>No peers</i>
|
16
|
+
<% end %>
|
17
|
+
<form action="/peers" method="post" class="peers-form">
|
18
|
+
<label for="host">http://</label>
|
19
|
+
<input type="text" name="host" id="host" placeholder="host" />
|
20
|
+
<label for="port">Port</label>
|
21
|
+
<input type="text" name="port" id="port" />
|
22
|
+
<input type="submit" class="button" value="Add Peer" />
|
23
|
+
</form>
|
24
|
+
</div>
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<div class="pending-transactions">
|
2
|
+
<h2>Pending Transactions</h2>
|
3
|
+
<% if @node.bank.pending.any? %>
|
4
|
+
<table>
|
5
|
+
<tr>
|
6
|
+
<th>From</th>
|
7
|
+
<th>To</th>
|
8
|
+
<th>$</th>
|
9
|
+
<th>Id</th>
|
10
|
+
</tr>
|
11
|
+
<% @node.bank.pending.each do |tx| %>
|
12
|
+
<tr>
|
13
|
+
<td><%= tx.from[0..15] %></td>
|
14
|
+
<td><%= tx.to[0..15] %></td>
|
15
|
+
<td><%= tx.amount %></td>
|
16
|
+
<td><%= tx.id[0..2] %></td>
|
17
|
+
</tr>
|
18
|
+
<% end %>
|
19
|
+
</table>
|
20
|
+
<% else %>
|
21
|
+
<i>No pending transactions</i>
|
22
|
+
<% end %>
|
23
|
+
</div>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
|
2
|
+
<div class="wallet">
|
3
|
+
<div class="details">
|
4
|
+
<h2>Address</h2>
|
5
|
+
<div><%= @node.wallet.address %></div>
|
6
|
+
<h2>Balance</h2>
|
7
|
+
<div class="balance">$<%= @node.bank.ledger.wallets[@node.wallet.address] || 0 %></div>
|
8
|
+
</div>
|
9
|
+
<form action="/send" method="post" class="transaction-form">
|
10
|
+
<label for="to">To</label>
|
11
|
+
<input type="text" name="to" id="to" placeholder="address" />
|
12
|
+
<label for="amount">Amount</label>
|
13
|
+
<input type="text" name="amount" id="amount" />
|
14
|
+
<input type="submit" class="button" value="Send" /><br>
|
15
|
+
</form>
|
16
|
+
</div>
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Central Bank Node</title>
|
5
|
+
<link rel="stylesheet" href="style.css">
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
|
9
|
+
<h1>Central Bank Node</h1>
|
10
|
+
|
11
|
+
<div class="columns">
|
12
|
+
<div class="left">
|
13
|
+
<%= erb :'_wallet' %>
|
14
|
+
<%= erb :'_pending_transactions' %>
|
15
|
+
<%= erb :'_peers' %>
|
16
|
+
<%= erb :'_ledger' %>
|
17
|
+
</div>
|
18
|
+
|
19
|
+
<div class="right">
|
20
|
+
<%= erb :'_blockchain' %>
|
21
|
+
</div>
|
22
|
+
</div>
|
23
|
+
|
24
|
+
<script>
|
25
|
+
var es = new EventSource('/events');
|
26
|
+
es.onmessage = function(e) { window.location.reload(false); };
|
27
|
+
</script>
|
28
|
+
|
29
|
+
</body>
|
30
|
+
</html>
|
@@ -0,0 +1,172 @@
|
|
1
|
+
|
2
|
+
body {
|
3
|
+
padding: 0;
|
4
|
+
margin: 0;
|
5
|
+
min-width: 960px;
|
6
|
+
|
7
|
+
font-family: 'menlo', monospace;
|
8
|
+
font-size: 14px;
|
9
|
+
|
10
|
+
background: #fff;
|
11
|
+
color: #2B2D2F;
|
12
|
+
}
|
13
|
+
|
14
|
+
|
15
|
+
.columns {
|
16
|
+
display: flex;
|
17
|
+
|
18
|
+
.left {
|
19
|
+
width: 66%;
|
20
|
+
}
|
21
|
+
|
22
|
+
.right {
|
23
|
+
width: 34%;
|
24
|
+
}
|
25
|
+
}
|
26
|
+
|
27
|
+
|
28
|
+
h1 {
|
29
|
+
font-size: 24px;
|
30
|
+
font-weight: normal;
|
31
|
+
padding-left: 15px;
|
32
|
+
margin-bottom: 20px;
|
33
|
+
}
|
34
|
+
|
35
|
+
|
36
|
+
h2 {
|
37
|
+
font-size: 16px;
|
38
|
+
}
|
39
|
+
|
40
|
+
h2 span {
|
41
|
+
font-size: 14px;
|
42
|
+
color: #597898;
|
43
|
+
font-weight: normal;
|
44
|
+
}
|
45
|
+
|
46
|
+
label {
|
47
|
+
display: inline-block;
|
48
|
+
width: 80px;
|
49
|
+
text-align: right;
|
50
|
+
padding-right: 10px;
|
51
|
+
}
|
52
|
+
|
53
|
+
input[type=text] {
|
54
|
+
display: inline-block;
|
55
|
+
font-size: 14px;
|
56
|
+
padding: 8px;
|
57
|
+
border-radius: 0;
|
58
|
+
border: 0;
|
59
|
+
}
|
60
|
+
|
61
|
+
table {
|
62
|
+
border-spacing: 0;
|
63
|
+
border-collapse: collapse;
|
64
|
+
|
65
|
+
th {
|
66
|
+
text-align: left;
|
67
|
+
}
|
68
|
+
|
69
|
+
td {
|
70
|
+
vertical-align: top;
|
71
|
+
padding: 5px 15px 5px 0;
|
72
|
+
}
|
73
|
+
}
|
74
|
+
|
75
|
+
|
76
|
+
ul {
|
77
|
+
list-style: none;
|
78
|
+
padding: 0;
|
79
|
+
margin: 0;
|
80
|
+
}
|
81
|
+
|
82
|
+
input[type=submit] {
|
83
|
+
font-size: 14px;
|
84
|
+
font-family: menlo, monospace;
|
85
|
+
border-radius: 5px;
|
86
|
+
padding: 8px 20px;
|
87
|
+
background: #FFDC00;
|
88
|
+
color: #2B2D2F;
|
89
|
+
border: 0;
|
90
|
+
}
|
91
|
+
|
92
|
+
input[type=submit].small {
|
93
|
+
font-size: 10px;
|
94
|
+
padding: 4px 10px;
|
95
|
+
}
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
.wallet {
|
100
|
+
padding: 15px;
|
101
|
+
background: #7FDBFF;
|
102
|
+
|
103
|
+
h2 {
|
104
|
+
margin-bottom: 0;
|
105
|
+
}
|
106
|
+
|
107
|
+
.balance {
|
108
|
+
font-size: 30px;
|
109
|
+
}
|
110
|
+
}
|
111
|
+
|
112
|
+
|
113
|
+
.pending-transactions {
|
114
|
+
padding: 15px;
|
115
|
+
background: #A3E6FF;
|
116
|
+
}
|
117
|
+
|
118
|
+
.peers {
|
119
|
+
padding: 15px;
|
120
|
+
background: #C6EFFF;
|
121
|
+
|
122
|
+
li form {
|
123
|
+
display: inline;
|
124
|
+
}
|
125
|
+
|
126
|
+
li {
|
127
|
+
padding: 5px 0px;
|
128
|
+
}
|
129
|
+
}
|
130
|
+
|
131
|
+
|
132
|
+
.ledger {
|
133
|
+
padding: 15px;
|
134
|
+
background: #E3F7FF;
|
135
|
+
}
|
136
|
+
|
137
|
+
|
138
|
+
.blockchain {
|
139
|
+
padding: 15px;
|
140
|
+
position: relative;
|
141
|
+
background: #001F3F;
|
142
|
+
color: #fff;
|
143
|
+
|
144
|
+
form {
|
145
|
+
position: absolute;
|
146
|
+
top: 30px;
|
147
|
+
right: 15px;
|
148
|
+
}
|
149
|
+
|
150
|
+
.blocks {
|
151
|
+
border: 1px solid #597898;
|
152
|
+
border-bottom: 0;
|
153
|
+
|
154
|
+
.block {
|
155
|
+
margin: 0;
|
156
|
+
border-bottom: 2px dashed #597898;
|
157
|
+
padding: 10px;
|
158
|
+
|
159
|
+
.header {
|
160
|
+
text-align: center;
|
161
|
+
padding: 0 8px 8px 8px;
|
162
|
+
color: #597898;
|
163
|
+
border-bottom: 1px solid #354c63;
|
164
|
+
margin-bottom: 10px;
|
165
|
+
}
|
166
|
+
|
167
|
+
.id {
|
168
|
+
color: #597898;
|
169
|
+
}
|
170
|
+
}
|
171
|
+
}
|
172
|
+
}
|
metadata
ADDED
@@ -0,0 +1,152 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: shilling
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Gerald Bauer
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-12-26 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: sinatra
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: sass
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: blockchain-lite
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.3.1
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.3.1
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rdoc
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '4.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '4.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: hoe
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '3.16'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.16'
|
83
|
+
description: shilling (or schilling) on the blockchain! rock-solid alpine dollar from
|
84
|
+
austria; print (mine) your own shillings; run your own federated shilling central
|
85
|
+
bank nodes w/ public distributed (hyper) ledger book on the blockchain peer-to-peer
|
86
|
+
over HTTP; revolutionize the world one block at a time with cryptos
|
87
|
+
email: ruby-talk@ruby-lang.org
|
88
|
+
executables:
|
89
|
+
- shilling
|
90
|
+
extensions: []
|
91
|
+
extra_rdoc_files:
|
92
|
+
- HISTORY.md
|
93
|
+
- LICENSE.md
|
94
|
+
- Manifest.txt
|
95
|
+
- README.md
|
96
|
+
files:
|
97
|
+
- HISTORY.md
|
98
|
+
- LICENSE.md
|
99
|
+
- Manifest.txt
|
100
|
+
- README.md
|
101
|
+
- Rakefile
|
102
|
+
- bin/shilling
|
103
|
+
- lib/shilling.rb
|
104
|
+
- lib/shilling/bank.rb
|
105
|
+
- lib/shilling/block.rb
|
106
|
+
- lib/shilling/blockchain.rb
|
107
|
+
- lib/shilling/cache.rb
|
108
|
+
- lib/shilling/ledger.rb
|
109
|
+
- lib/shilling/node.rb
|
110
|
+
- lib/shilling/pool.rb
|
111
|
+
- lib/shilling/service.rb
|
112
|
+
- lib/shilling/tool.rb
|
113
|
+
- lib/shilling/transaction.rb
|
114
|
+
- lib/shilling/version.rb
|
115
|
+
- lib/shilling/views/_blockchain.erb
|
116
|
+
- lib/shilling/views/_ledger.erb
|
117
|
+
- lib/shilling/views/_peers.erb
|
118
|
+
- lib/shilling/views/_pending_transactions.erb
|
119
|
+
- lib/shilling/views/_wallet.erb
|
120
|
+
- lib/shilling/views/index.erb
|
121
|
+
- lib/shilling/views/style.scss
|
122
|
+
- lib/shilling/wallet.rb
|
123
|
+
homepage: https://github.com/blockchainaustria/shilling.tools
|
124
|
+
licenses:
|
125
|
+
- Public Domain
|
126
|
+
metadata: {}
|
127
|
+
post_install_message:
|
128
|
+
rdoc_options:
|
129
|
+
- "--main"
|
130
|
+
- README.md
|
131
|
+
require_paths:
|
132
|
+
- lib
|
133
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
134
|
+
requirements:
|
135
|
+
- - ">="
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: '2.3'
|
138
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
139
|
+
requirements:
|
140
|
+
- - ">="
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: '0'
|
143
|
+
requirements: []
|
144
|
+
rubyforge_project:
|
145
|
+
rubygems_version: 2.5.2
|
146
|
+
signing_key:
|
147
|
+
specification_version: 4
|
148
|
+
summary: shilling (or schilling) on the blockchain! rock-solid alpine dollar from
|
149
|
+
austria; print (mine) your own shillings; run your own federated shilling central
|
150
|
+
bank nodes w/ public distributed (hyper) ledger book on the blockchain peer-to-peer
|
151
|
+
over HTTP; revolutionize the world one block at a time with cryptos
|
152
|
+
test_files: []
|