ruby-ethereum 0.9.1 → 0.9.3
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/README.md +2 -0
- data/lib/ethereum/abi/contract_translator.rb +6 -6
- data/lib/ethereum/block.rb +38 -28
- data/lib/ethereum/cached_block.rb +1 -0
- data/lib/ethereum/chain.rb +1 -1
- data/lib/ethereum/db.rb +1 -0
- data/lib/ethereum/db/base_db.rb +1 -1
- data/lib/ethereum/db/ephem_db.rb +7 -2
- data/lib/ethereum/db/level_db.rb +129 -0
- data/lib/ethereum/db/overlay_db.rb +2 -1
- data/lib/ethereum/db/refcount_db.rb +16 -8
- data/lib/ethereum/ethash.rb +1 -0
- data/lib/ethereum/ffi/openssl.rb +1 -1
- data/lib/ethereum/tester/language.rb +12 -4
- data/lib/ethereum/tester/solidity_wrapper.rb +15 -5
- data/lib/ethereum/utils.rb +22 -0
- data/lib/ethereum/version.rb +1 -1
- metadata +24 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8c18a40778f44a8f514e98f791b5a5238fc5e5f8
|
4
|
+
data.tar.gz: 0589c28717d274a533bb50612b6dd0fc14e99e0a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 889d80e5709de13b79b5877003c943f8d8d114fec8d42788f8835b8c935920535eee15c0be0d899853fba6d5c0075530aa3269bc745f5410f7a238ba084723ad
|
7
|
+
data.tar.gz: 9a1b4ba43049ae72d983cf9ba48d551dd21a54c01d5bc481828360b0b4abf6ff2dcdb1f7175673d9805cc8a4e3e30156e603be9a3aef27b31e181b5e95c8d84c
|
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# ruby-ethereum
|
2
2
|
|
3
|
+
[](https://gitter.im/janx/ruby-ethereum?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
4
|
+
|
3
5
|
A Ruby implementation of [Ethereum](https://ethereum.org).
|
4
6
|
|
5
7
|
## Install Secp256k1
|
@@ -140,12 +140,6 @@ module Ethereum
|
|
140
140
|
o
|
141
141
|
end
|
142
142
|
|
143
|
-
private
|
144
|
-
|
145
|
-
def logger
|
146
|
-
@logger ||= Logger.new 'eth.abi.contract_translator'
|
147
|
-
end
|
148
|
-
|
149
143
|
def method_id(name, encode_types)
|
150
144
|
Utils.big_endian_to_int Utils.keccak256(get_sig(name, encode_types))[0,4]
|
151
145
|
end
|
@@ -154,6 +148,12 @@ module Ethereum
|
|
154
148
|
Utils.big_endian_to_int Utils.keccak256(get_sig(name, encode_types))
|
155
149
|
end
|
156
150
|
|
151
|
+
private
|
152
|
+
|
153
|
+
def logger
|
154
|
+
@logger ||= Logger.new 'eth.abi.contract_translator'
|
155
|
+
end
|
156
|
+
|
157
157
|
def get_sig(name, encode_types)
|
158
158
|
"#{name}(#{encode_types.map {|x| canonical_name(x) }.join(',')})"
|
159
159
|
end
|
data/lib/ethereum/block.rb
CHANGED
@@ -38,6 +38,7 @@ module Ethereum
|
|
38
38
|
blk = RLP.decode env.db.get(hash), sedes: Block, env: env
|
39
39
|
CachedBlock.create_cached blk
|
40
40
|
end
|
41
|
+
lru_cache :find, 1024
|
41
42
|
|
42
43
|
def verify(block, parent)
|
43
44
|
block2 = RLP.decode RLP.encode(block), sedes: Block, env: parent.env, parent: parent
|
@@ -175,13 +176,17 @@ module Ethereum
|
|
175
176
|
start_alloc.each do |addr, data|
|
176
177
|
addr = Utils.normalize_address addr
|
177
178
|
|
178
|
-
block.set_balance addr, data[:wei] if data[:wei]
|
179
|
-
block.set_balance addr, data[:balance] if data[:balance]
|
180
|
-
block.set_code addr, data[:code] if data[:code]
|
181
|
-
block.set_nonce addr, data[:nonce] if data[:nonce]
|
179
|
+
block.set_balance addr, Utils.parse_int_or_hex(data[:wei]) if data[:wei]
|
180
|
+
block.set_balance addr, Utils.parse_int_or_hex(data[:balance]) if data[:balance]
|
181
|
+
block.set_code addr, Utils.decode_hex(Utils.remove_0x_head(data[:code])) if data[:code]
|
182
|
+
block.set_nonce addr, Utils.parse_int_or_hex(data[:nonce]) if data[:nonce]
|
182
183
|
|
183
184
|
if data[:storage]
|
184
|
-
data[:storage].each
|
185
|
+
data[:storage].each do |k, v|
|
186
|
+
k = Utils.big_endian_to_int Utils.decode_hex(Utils.remove_0x_head(k))
|
187
|
+
v = Utils.big_endian_to_int Utils.decode_hex(Utils.remove_0x_head(v))
|
188
|
+
block.set_storage_data addr, k, v
|
189
|
+
end
|
185
190
|
end
|
186
191
|
|
187
192
|
end
|
@@ -228,7 +233,7 @@ module Ethereum
|
|
228
233
|
making = options.has_key?(:making) ? options.delete(:making) : false
|
229
234
|
|
230
235
|
raise ArgumentError, "No Env object given" unless env.instance_of?(Env)
|
231
|
-
raise ArgumentError, "No database object given" unless env.db.is_a?(DB::BaseDB)
|
236
|
+
raise ArgumentError, "No database object given. db=#{env.db}" unless env.db.is_a?(DB::BaseDB)
|
232
237
|
|
233
238
|
@env = env
|
234
239
|
@db = env.db
|
@@ -329,6 +334,10 @@ module Ethereum
|
|
329
334
|
@transaction_count.times.map {|i| get_transaction(i) }
|
330
335
|
end
|
331
336
|
|
337
|
+
def uncles_hash
|
338
|
+
Utils.keccak256_rlp(uncles)
|
339
|
+
end
|
340
|
+
|
332
341
|
##
|
333
342
|
# Validate the uncles of this block.
|
334
343
|
#
|
@@ -810,6 +819,7 @@ module Ethereum
|
|
810
819
|
loop do
|
811
820
|
begin
|
812
821
|
receipts.push get_receipt(i)
|
822
|
+
i += 1
|
813
823
|
rescue IndexError
|
814
824
|
return receipts
|
815
825
|
end
|
@@ -1105,6 +1115,27 @@ module Ethereum
|
|
1105
1115
|
end
|
1106
1116
|
alias :inspect :to_s
|
1107
1117
|
|
1118
|
+
def validate_transaction(tx)
|
1119
|
+
raise UnsignedTransactionError.new(tx) unless tx.sender
|
1120
|
+
|
1121
|
+
acct_nonce = get_nonce tx.sender
|
1122
|
+
raise InvalidNonce, "#{tx}: nonce actual: #{tx.nonce} target: #{acct_nonce}" if acct_nonce != tx.nonce
|
1123
|
+
|
1124
|
+
min_gas = get_intrinsic_gas tx
|
1125
|
+
raise InsufficientStartGas, "#{tx}: startgas actual: #{tx.startgas} target: #{min_gas}" if tx.startgas < min_gas
|
1126
|
+
|
1127
|
+
total_cost = tx.value + tx.gasprice * tx.startgas
|
1128
|
+
balance = get_balance tx.sender
|
1129
|
+
raise InsufficientBalance, "#{tx}: balance actual: #{balance} target: #{total_cost}" if balance < total_cost
|
1130
|
+
|
1131
|
+
accum_gas = gas_used + tx.startgas
|
1132
|
+
raise BlockGasLimitReached, "#{tx}: gaslimit actual: #{accum_gas} target: #{gas_limit}" if accum_gas > gas_limit
|
1133
|
+
|
1134
|
+
tx.check_low_s if number >= config[:homestead_fork_blknum]
|
1135
|
+
|
1136
|
+
true
|
1137
|
+
end
|
1138
|
+
|
1108
1139
|
private
|
1109
1140
|
|
1110
1141
|
def logger
|
@@ -1181,28 +1212,7 @@ module Ethereum
|
|
1181
1212
|
raise ValueError, "Extra data cannot exceed #{config[:max_extradata_length]} bytes" if header.extra_data.size > config[:max_extradata_length]
|
1182
1213
|
raise ValueError, "Coinbase cannot be empty address" if header.coinbase.false?
|
1183
1214
|
raise ValueError, "State merkle root of block #{self} not found in database" unless @state.root_hash_valid?
|
1184
|
-
raise
|
1185
|
-
end
|
1186
|
-
|
1187
|
-
def validate_transaction(tx)
|
1188
|
-
raise UnsignedTransactionError.new(tx) unless tx.sender
|
1189
|
-
|
1190
|
-
acct_nonce = get_nonce tx.sender
|
1191
|
-
raise InvalidNonce, "#{tx}: nonce actual: #{tx.nonce} target: #{acct_nonce}" if acct_nonce != tx.nonce
|
1192
|
-
|
1193
|
-
min_gas = get_intrinsic_gas tx
|
1194
|
-
raise InsufficientStartGas, "#{tx}: startgas actual: #{tx.startgas} target: #{min_gas}" if tx.startgas < min_gas
|
1195
|
-
|
1196
|
-
total_cost = tx.value + tx.gasprice * tx.startgas
|
1197
|
-
balance = get_balance tx.sender
|
1198
|
-
raise InsufficientBalance, "#{tx}: balance actual: #{balance} target: #{total_cost}" if balance < total_cost
|
1199
|
-
|
1200
|
-
accum_gas = gas_used + tx.startgas
|
1201
|
-
raise BlockGasLimitReached, "#{tx}: gaslimit actual: #{accum_gas} target: #{gas_limit}" if accum_gas > gas_limit
|
1202
|
-
|
1203
|
-
tx.check_low_s if number >= config[:homestead_fork_blknum]
|
1204
|
-
|
1205
|
-
true
|
1215
|
+
raise InvalidNonce, "PoW check failed" if !genesis? && nonce.true? && !header.check_pow
|
1206
1216
|
end
|
1207
1217
|
|
1208
1218
|
##
|
data/lib/ethereum/chain.rb
CHANGED
data/lib/ethereum/db.rb
CHANGED
data/lib/ethereum/db/base_db.rb
CHANGED
data/lib/ethereum/db/ephem_db.rb
CHANGED
@@ -2,14 +2,19 @@
|
|
2
2
|
|
3
3
|
module Ethereum
|
4
4
|
module DB
|
5
|
-
class EphemDB
|
5
|
+
class EphemDB
|
6
|
+
include BaseDB
|
6
7
|
|
7
8
|
def initialize
|
8
9
|
@db = {}
|
9
10
|
end
|
10
11
|
|
11
12
|
def get(k)
|
12
|
-
|
13
|
+
if has_key?(k)
|
14
|
+
@db[k]
|
15
|
+
else
|
16
|
+
raise KeyError, k.inspect
|
17
|
+
end
|
13
18
|
end
|
14
19
|
|
15
20
|
def put(k, v)
|
@@ -0,0 +1,129 @@
|
|
1
|
+
# -*- encoding : ascii-8bit -*-
|
2
|
+
|
3
|
+
require 'leveldb'
|
4
|
+
|
5
|
+
module Ethereum
|
6
|
+
module DB
|
7
|
+
class LevelDB
|
8
|
+
include BaseDB
|
9
|
+
|
10
|
+
# FIXME: workaround, because leveldb gem doesn't allow put empty string
|
11
|
+
EMPTY_STRING = Utils.keccak256('').freeze
|
12
|
+
|
13
|
+
def initialize(dbfile)
|
14
|
+
logger.info "opening LevelDB", path: dbfile
|
15
|
+
|
16
|
+
@dbfile = dbfile
|
17
|
+
reopen
|
18
|
+
|
19
|
+
@commit_counter = 0
|
20
|
+
@uncommited = {}
|
21
|
+
end
|
22
|
+
|
23
|
+
def reopen
|
24
|
+
@db = ::LevelDB::DB.new @dbfile
|
25
|
+
end
|
26
|
+
|
27
|
+
def get(k)
|
28
|
+
logger.trace 'getting entry', key: Utils.encode_hex(k)[0,8]
|
29
|
+
|
30
|
+
if @uncommited.has_key?(k)
|
31
|
+
raise KeyError, 'key not in db' unless @uncommited[k]
|
32
|
+
logger.trace "from uncommited"
|
33
|
+
return @uncommited[k]
|
34
|
+
end
|
35
|
+
|
36
|
+
logger.trace "from db"
|
37
|
+
raise KeyError, k.inspect unless @db.exists?(k)
|
38
|
+
v = @db.get(k)
|
39
|
+
o = decompress v
|
40
|
+
@uncommited[k] = o
|
41
|
+
|
42
|
+
o
|
43
|
+
end
|
44
|
+
|
45
|
+
def put(k, v)
|
46
|
+
logger.trace 'putting entry', key: Utils.encode_hex(k)[0,8], size: v.size
|
47
|
+
@uncommited[k] = v
|
48
|
+
end
|
49
|
+
|
50
|
+
def commit
|
51
|
+
logger.debug "committing", db: self
|
52
|
+
|
53
|
+
@db.batch do |b|
|
54
|
+
@uncommited.each do |k, v|
|
55
|
+
if v
|
56
|
+
b.put k, compress(v)
|
57
|
+
else
|
58
|
+
b.delete k
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
logger.debug 'committed', db: self, num: @uncommited.size
|
63
|
+
@uncommited = {}
|
64
|
+
end
|
65
|
+
|
66
|
+
def delete(k)
|
67
|
+
logger.trace 'deleting entry', key: key
|
68
|
+
@uncommited[k] = nil
|
69
|
+
end
|
70
|
+
|
71
|
+
def has_key?(k)
|
72
|
+
get(k)
|
73
|
+
true
|
74
|
+
rescue KeyError
|
75
|
+
false
|
76
|
+
end
|
77
|
+
alias :include? :has_key?
|
78
|
+
|
79
|
+
def ==(other)
|
80
|
+
other.instance_of?(self.class) && db == other.db
|
81
|
+
end
|
82
|
+
|
83
|
+
def to_s
|
84
|
+
"<DB at #{@db} uncommited=#{@uncommited.size}>"
|
85
|
+
end
|
86
|
+
alias inspect to_s
|
87
|
+
|
88
|
+
def inc_refcount(k, v)
|
89
|
+
put k, v
|
90
|
+
end
|
91
|
+
|
92
|
+
def dec_refcount(k)
|
93
|
+
# do nothing
|
94
|
+
end
|
95
|
+
|
96
|
+
def revert_refcount_changes(epoch)
|
97
|
+
# do nothing
|
98
|
+
end
|
99
|
+
|
100
|
+
def commit_refcount_changes(epoch)
|
101
|
+
# do nothing
|
102
|
+
end
|
103
|
+
|
104
|
+
def cleanup(epoch)
|
105
|
+
# do nothing
|
106
|
+
end
|
107
|
+
|
108
|
+
def put_temporarily(k, v)
|
109
|
+
inc_refcount(k, v)
|
110
|
+
dec_refcount(k)
|
111
|
+
end
|
112
|
+
|
113
|
+
private
|
114
|
+
|
115
|
+
def logger
|
116
|
+
@logger ||= Logger.new 'db.leveldb'
|
117
|
+
end
|
118
|
+
|
119
|
+
def decompress(x)
|
120
|
+
x == EMPTY_STRING ? '' : x
|
121
|
+
end
|
122
|
+
|
123
|
+
def compress(x)
|
124
|
+
x.empty? ? EMPTY_STRING : x
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
@@ -2,19 +2,23 @@
|
|
2
2
|
|
3
3
|
module Ethereum
|
4
4
|
module DB
|
5
|
-
class RefcountDB
|
5
|
+
class RefcountDB
|
6
|
+
include BaseDB
|
6
7
|
|
7
8
|
DEATH_ROW_OFFSET = 2**62
|
8
9
|
|
9
10
|
ZERO_ENCODED = Utils.encode_int(0)
|
10
11
|
ONE_ENCODED = Utils.encode_int(1)
|
11
12
|
|
13
|
+
attr_accessor :ttl
|
14
|
+
|
12
15
|
def initialize(db)
|
13
16
|
@db = db
|
14
17
|
@journal = []
|
15
18
|
@death_row = []
|
16
19
|
@kv = @db.respond_to?(:kv) ? @db.kv : nil
|
17
|
-
|
20
|
+
|
21
|
+
self.ttl = 500
|
18
22
|
end
|
19
23
|
|
20
24
|
##
|
@@ -57,7 +61,7 @@ module Ethereum
|
|
57
61
|
raise AssertError, "refcount must be greater than zero!" unless refcount > 0
|
58
62
|
|
59
63
|
@journal.push [node_object[0], k]
|
60
|
-
new_refcount = Utils.
|
64
|
+
new_refcount = Utils.encode_int(refcount-1)
|
61
65
|
ref_put k, RLP.encode([new_refcount, node_object[1]])
|
62
66
|
|
63
67
|
@death_row.push k if new_refcount == ZERO_ENCODED
|
@@ -100,14 +104,14 @@ module Ethereum
|
|
100
104
|
logger.debug "#{pruned} nodes successfully pruned"
|
101
105
|
|
102
106
|
@db.delete "deathrow:#{epoch}" rescue nil
|
103
|
-
@db.delete "journal:#{epoch
|
107
|
+
@db.delete "journal:#{epoch - ttl}" rescue nil
|
104
108
|
end
|
105
109
|
|
106
110
|
##
|
107
111
|
# Commit changes to the journal and death row to the database.
|
108
112
|
#
|
109
113
|
def commit_refcount_changes(epoch)
|
110
|
-
timeout_epoch = epoch +
|
114
|
+
timeout_epoch = epoch + ttl
|
111
115
|
death_row_nodes = RLP.decode(@db.get("deathrow:#{timeout_epoch}")) rescue []
|
112
116
|
|
113
117
|
@death_row.each do |node_key|
|
@@ -127,7 +131,7 @@ module Ethereum
|
|
127
131
|
@db.put "deathrow:#{timeout_epoch}", RLP.encode(death_row_nodes)
|
128
132
|
|
129
133
|
journal = RLP.decode(@db.get("journal:#{epoch}")) rescue []
|
130
|
-
journal.
|
134
|
+
journal.concat @journal
|
131
135
|
@journal = []
|
132
136
|
@db.put "journal:#{epoch}", RLP.encode(journal)
|
133
137
|
end
|
@@ -136,7 +140,7 @@ module Ethereum
|
|
136
140
|
# Revert changes made during an epoch
|
137
141
|
#
|
138
142
|
def revert_refcount_changes(epoch)
|
139
|
-
timeout_epoch = epoch +
|
143
|
+
timeout_epoch = epoch + ttl
|
140
144
|
|
141
145
|
@db.delete("deathrow:#{timeout_epoch}") rescue nil
|
142
146
|
|
@@ -166,7 +170,11 @@ module Ethereum
|
|
166
170
|
end
|
167
171
|
|
168
172
|
def ref_get(k)
|
169
|
-
|
173
|
+
if has_key?(k)
|
174
|
+
@db.get ref_key(k)
|
175
|
+
else
|
176
|
+
raise KeyError, k.inspect
|
177
|
+
end
|
170
178
|
end
|
171
179
|
|
172
180
|
def ref_put(k, v)
|
data/lib/ethereum/ethash.rb
CHANGED
data/lib/ethereum/ffi/openssl.rb
CHANGED
@@ -8,10 +8,18 @@ module Ethereum
|
|
8
8
|
def all
|
9
9
|
return @all if @all
|
10
10
|
|
11
|
-
@all = {
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
@all = {}
|
12
|
+
|
13
|
+
begin
|
14
|
+
require 'serpent'
|
15
|
+
@all[:serpent] = Serpent
|
16
|
+
rescue LoadError
|
17
|
+
# do nothing
|
18
|
+
end
|
19
|
+
|
20
|
+
if SolidityWrapper.solc_path
|
21
|
+
@all[:solidity] = SolidityWrapper
|
22
|
+
end
|
15
23
|
|
16
24
|
@all
|
17
25
|
end
|
@@ -38,10 +38,10 @@ module Ethereum
|
|
38
38
|
names
|
39
39
|
end
|
40
40
|
|
41
|
-
def combined(code)
|
41
|
+
def combined(code, format='bin')
|
42
42
|
out = Tempfile.new 'solc_output_'
|
43
43
|
|
44
|
-
pipe = IO.popen([solc_path, '--add-std', '--optimize', '--combined-json',
|
44
|
+
pipe = IO.popen([solc_path, '--add-std', '--optimize', '--combined-json', "abi,#{format},devdoc,userdoc"], 'w', [:out, :err] => out)
|
45
45
|
pipe.write code
|
46
46
|
pipe.close_write
|
47
47
|
raise CompileError, 'compilation failed' unless $?.success?
|
@@ -66,15 +66,25 @@ module Ethereum
|
|
66
66
|
##
|
67
67
|
# Returns binary of last contract in code.
|
68
68
|
#
|
69
|
-
def compile(code, contract_name='')
|
70
|
-
sorted_contracts = combined code
|
69
|
+
def compile(code, contract_name='', format='bin')
|
70
|
+
sorted_contracts = combined code, format
|
71
71
|
if contract_name.true?
|
72
72
|
idx = sorted_contracts.map(&:first).index(contract_name)
|
73
73
|
else
|
74
74
|
idx = -1
|
75
75
|
end
|
76
76
|
|
77
|
-
|
77
|
+
output = sorted_contracts[idx][1][format]
|
78
|
+
case format
|
79
|
+
when 'bin'
|
80
|
+
Utils.decode_hex output
|
81
|
+
when 'asm'
|
82
|
+
output['.code']
|
83
|
+
when 'opcodes'
|
84
|
+
output
|
85
|
+
else
|
86
|
+
raise ArgumentError
|
87
|
+
end
|
78
88
|
end
|
79
89
|
|
80
90
|
##
|
data/lib/ethereum/utils.rb
CHANGED
@@ -187,5 +187,27 @@ module Ethereum
|
|
187
187
|
keccak256_rlp([normalize_address(sender), nonce])[12..-1]
|
188
188
|
end
|
189
189
|
|
190
|
+
def remove_0x_head(s)
|
191
|
+
s[0,2] == '0x' ? s[2..-1] : s
|
192
|
+
end
|
193
|
+
|
194
|
+
def parse_int_or_hex(s)
|
195
|
+
if s.is_a?(Numeric)
|
196
|
+
s
|
197
|
+
elsif s[0,2] == '0x'
|
198
|
+
big_endian_to_int decode_hex(normalize_hex_without_prefix(s))
|
199
|
+
else
|
200
|
+
s.to_i
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
def normalize_hex_without_prefix(s)
|
205
|
+
if s[0,2] == '0x'
|
206
|
+
(s.size % 2 == 1 ? '0' : '') + s[2..-1]
|
207
|
+
else
|
208
|
+
s
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
190
212
|
end
|
191
213
|
end
|
data/lib/ethereum/version.rb
CHANGED
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-ethereum
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jan Xie
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-06-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rlp
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 0.7.3
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 0.7.3
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: ethash
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0.
|
47
|
+
version: '0.4'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0.
|
54
|
+
version: '0.4'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: lru_redux
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0.1'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: leveldb
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 0.1.9
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 0.1.9
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: rake
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -164,20 +178,6 @@ dependencies:
|
|
164
178
|
- - "~>"
|
165
179
|
- !ruby/object:Gem::Version
|
166
180
|
version: '0.3'
|
167
|
-
- !ruby/object:Gem::Dependency
|
168
|
-
name: pry-byebug
|
169
|
-
requirement: !ruby/object:Gem::Requirement
|
170
|
-
requirements:
|
171
|
-
- - "~>"
|
172
|
-
- !ruby/object:Gem::Version
|
173
|
-
version: '2.0'
|
174
|
-
type: :development
|
175
|
-
prerelease: false
|
176
|
-
version_requirements: !ruby/object:Gem::Requirement
|
177
|
-
requirements:
|
178
|
-
- - "~>"
|
179
|
-
- !ruby/object:Gem::Version
|
180
|
-
version: '2.0'
|
181
181
|
description: Ethereum's implementation in ruby.
|
182
182
|
email:
|
183
183
|
- jan.h.xie@gmail.com
|
@@ -207,6 +207,7 @@ files:
|
|
207
207
|
- lib/ethereum/db.rb
|
208
208
|
- lib/ethereum/db/base_db.rb
|
209
209
|
- lib/ethereum/db/ephem_db.rb
|
210
|
+
- lib/ethereum/db/level_db.rb
|
210
211
|
- lib/ethereum/db/overlay_db.rb
|
211
212
|
- lib/ethereum/db/refcount_db.rb
|
212
213
|
- lib/ethereum/env.rb
|
@@ -276,7 +277,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
276
277
|
version: '0'
|
277
278
|
requirements: []
|
278
279
|
rubyforge_project:
|
279
|
-
rubygems_version: 2.
|
280
|
+
rubygems_version: 2.5.1
|
280
281
|
signing_key:
|
281
282
|
specification_version: 4
|
282
283
|
summary: Core library of the Ethereum project, ruby version.
|