ciri 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +8 -3
  3. data/README.md +5 -0
  4. data/Rakefile +24 -2
  5. data/ciri-rlp/.gitignore +11 -0
  6. data/ciri-rlp/.rspec +3 -0
  7. data/ciri-rlp/.travis.yml +5 -0
  8. data/ciri-rlp/CODE_OF_CONDUCT.md +74 -0
  9. data/ciri-rlp/Gemfile +6 -0
  10. data/ciri-rlp/Gemfile.lock +39 -0
  11. data/ciri-rlp/LICENSE.txt +21 -0
  12. data/ciri-rlp/README.md +98 -0
  13. data/ciri-rlp/Rakefile +6 -0
  14. data/ciri-rlp/bin/console +14 -0
  15. data/ciri-rlp/bin/setup +8 -0
  16. data/ciri-rlp/ciri-rlp.gemspec +28 -0
  17. data/{lib → ciri-rlp/lib}/ciri/rlp.rb +2 -2
  18. data/ciri-rlp/lib/ciri/rlp/decode.rb +144 -0
  19. data/ciri-rlp/lib/ciri/rlp/encode.rb +140 -0
  20. data/ciri-rlp/lib/ciri/rlp/serializable.rb +241 -0
  21. data/ciri-rlp/lib/ciri/rlp/version.rb +5 -0
  22. data/ciri-rlp/spec/ciri/fixture_spec.rb +95 -0
  23. data/ciri-rlp/spec/ciri/rlp/decode_spec.rb +68 -0
  24. data/ciri-rlp/spec/ciri/rlp/encode_spec.rb +72 -0
  25. data/ciri-rlp/spec/ciri/rlp/serializable_spec.rb +147 -0
  26. data/ciri-rlp/spec/ciri/rlp_spec.rb +5 -0
  27. data/ciri-rlp/spec/spec_helper.rb +14 -0
  28. data/ciri-utils/.gitignore +11 -0
  29. data/ciri-utils/.rspec +3 -0
  30. data/ciri-utils/.travis.yml +5 -0
  31. data/ciri-utils/CODE_OF_CONDUCT.md +74 -0
  32. data/ciri-utils/Gemfile +6 -0
  33. data/ciri-utils/Gemfile.lock +37 -0
  34. data/ciri-utils/LICENSE.txt +21 -0
  35. data/ciri-utils/README.md +61 -0
  36. data/ciri-utils/Rakefile +6 -0
  37. data/ciri-utils/bin/console +14 -0
  38. data/ciri-utils/bin/setup +8 -0
  39. data/ciri-utils/ciri-utils.gemspec +28 -0
  40. data/{lib → ciri-utils/lib}/ciri/utils.rb +9 -33
  41. data/{lib → ciri-utils/lib}/ciri/utils/logger.rb +0 -0
  42. data/{lib → ciri-utils/lib}/ciri/utils/number.rb +15 -12
  43. data/ciri-utils/lib/ciri/utils/version.rb +5 -0
  44. data/ciri-utils/spec/ciri/utils_spec.rb +5 -0
  45. data/ciri-utils/spec/spec_helper.rb +14 -0
  46. data/ciri.gemspec +6 -3
  47. data/lib/ciri/bloom_filter.rb +83 -0
  48. data/lib/ciri/chain.rb +67 -130
  49. data/lib/ciri/chain/header.rb +2 -2
  50. data/lib/ciri/chain/header_chain.rb +136 -0
  51. data/lib/ciri/chain/transaction.rb +1 -1
  52. data/lib/ciri/crypto.rb +2 -2
  53. data/lib/ciri/db/account_db.rb +145 -0
  54. data/lib/ciri/db/backend/memory.rb +24 -1
  55. data/lib/ciri/devp2p/peer.rb +1 -1
  56. data/lib/ciri/devp2p/rlpx/connection.rb +5 -5
  57. data/lib/ciri/eth/peer.rb +3 -3
  58. data/lib/ciri/eth/protocol_manage.rb +3 -3
  59. data/lib/ciri/eth/protocol_messages.rb +27 -26
  60. data/lib/ciri/ethash.rb +18 -3
  61. data/lib/ciri/evm.rb +101 -56
  62. data/lib/ciri/{utils/lib_c.rb → evm/errors.rb} +28 -18
  63. data/lib/ciri/evm/instruction.rb +3 -1
  64. data/lib/ciri/evm/{serialize.rb → log_entry.rb} +9 -27
  65. data/lib/ciri/evm/machine_state.rb +21 -2
  66. data/lib/ciri/evm/op.rb +19 -16
  67. data/lib/ciri/evm/state.rb +61 -0
  68. data/lib/ciri/evm/vm.rb +78 -102
  69. data/lib/ciri/forks.rb +1 -4
  70. data/lib/ciri/forks/base.rb +55 -0
  71. data/lib/ciri/forks/frontier.rb +37 -10
  72. data/lib/ciri/forks/frontier/cost.rb +186 -0
  73. data/lib/ciri/key.rb +1 -1
  74. data/lib/ciri/pow.rb +1 -1
  75. data/lib/ciri/rlp/decode.rb +6 -3
  76. data/lib/ciri/rlp/encode.rb +10 -10
  77. data/lib/ciri/rlp/serializable.rb +12 -9
  78. data/lib/ciri/serialize.rb +58 -0
  79. data/lib/ciri/trie.rb +362 -0
  80. data/lib/ciri/trie/nibbles.rb +97 -0
  81. data/lib/ciri/trie/nodes.rb +187 -0
  82. data/lib/ciri/{evm → types}/account.rb +20 -13
  83. data/lib/ciri/types/address.rb +16 -11
  84. data/lib/ciri/types/number.rb +73 -0
  85. data/lib/ciri/types/receipt.rb +57 -0
  86. data/lib/ciri/version.rb +1 -1
  87. metadata +82 -19
  88. data/lib/ciri/evm/forks/frontier.rb +0 -183
@@ -0,0 +1,187 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (c) 2018, by Jiang Jinyang. <https://justjjy.com>
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in
13
+ # all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ # THE SOFTWARE.
22
+
23
+
24
+ require_relative 'nibbles'
25
+ require 'forwardable'
26
+
27
+ module Ciri
28
+ class Trie
29
+ module Nodes
30
+
31
+ class InvalidNode < StandardError
32
+ end
33
+
34
+ class Node
35
+ def null?
36
+ false
37
+ end
38
+
39
+ def branch?
40
+ false
41
+ end
42
+
43
+ class << self
44
+ def decode(hash_or_encoded)
45
+ if hash_or_encoded == BLANK_NODE_HASH || hash_or_encoded == Utils::BLANK_SHA3 || hash_or_encoded == ''.b
46
+ return NullNode::NULL
47
+ end
48
+ decoded = hash_or_encoded.is_a?(String) ? RLP.decode(hash_or_encoded) : hash_or_encoded
49
+ if decoded == ''.b
50
+ NullNode::NULL
51
+ elsif decoded.size == 2
52
+ key, value = decoded
53
+ nibbles = Nibbles.decode_nibbles(key)
54
+ if Nibbles.is_nibbles_terminated?(nibbles)
55
+ Leaf.new(key, value)
56
+ else
57
+ Extension.new(key, value)
58
+ end
59
+ elsif decoded.size == 17
60
+ Branch.new(decoded)
61
+ else
62
+ raise InvalidNode.new("can't determine node type: #{Utils.to_hex hash_or_encoded}")
63
+ end
64
+ end
65
+
66
+ def compute_leaf_key(nibbles)
67
+ Nibbles.encode_nibbles(Nibbles.add_nibbles_terminator(nibbles))
68
+ end
69
+
70
+ def compute_extension_key(nibbles)
71
+ Nibbles.encode_nibbles(nibbles)
72
+ end
73
+
74
+ def get_common_prefix_length(left_key, right_key)
75
+ left_key.zip(right_key).each_with_index do |(l_nibble, r_nibble), i|
76
+ return i if l_nibble != r_nibble
77
+ end
78
+
79
+ [left_key.size, right_key.size].min
80
+ end
81
+
82
+ def consume_common_prefix(left_key, right_key)
83
+ common_prefix_length = get_common_prefix_length(left_key, right_key)
84
+ common_prefix = left_key[0...common_prefix_length]
85
+ left_reminder = left_key[common_prefix_length..-1]
86
+ right_reminder = right_key[common_prefix_length..-1]
87
+ [common_prefix, left_reminder, right_reminder]
88
+ end
89
+
90
+ end
91
+
92
+ end
93
+
94
+ class NullNode < Node
95
+
96
+ NULL = NullNode.new
97
+
98
+ def initialize
99
+ raise NotImplementedError if @singleton
100
+ @singleton = true
101
+ end
102
+
103
+ def null?
104
+ true
105
+ end
106
+
107
+ def self.rlp_encode(_)
108
+ RLP.encode(''.b)
109
+ end
110
+
111
+ def to_s
112
+ ''.b
113
+ end
114
+ end
115
+
116
+ class Branch < Node
117
+
118
+ class << self
119
+ def new_with_value(branches: [NullNode::NULL] * 16, value:)
120
+ new(branches + [value])
121
+ end
122
+ end
123
+
124
+ extend Forwardable
125
+
126
+ def_delegators :@branches, :[], :[]=, :each, :all?, :any?
127
+
128
+ attr_reader :branches
129
+
130
+ def initialize(branches = [NullNode::NULL] * 16 + [''.b])
131
+ raise InvalidNode.new('branches size should be 17') if branches.size != 17
132
+ @branches = branches
133
+ end
134
+
135
+ def value
136
+ self[16]
137
+ end
138
+
139
+ def branch?
140
+ true
141
+ end
142
+
143
+ def self.rlp_encode(node)
144
+ RLP.encode_simple(node.branches)
145
+ end
146
+ end
147
+
148
+ class Extension < Node
149
+ attr_reader :key, :node_hash
150
+
151
+ def initialize(key, node_hash)
152
+ @key = key
153
+ @node_hash = node_hash
154
+ end
155
+
156
+ def extract_key
157
+ Nibbles.remove_nibbles_terminator(Nibbles.decode_nibbles key)
158
+ end
159
+
160
+ def self.rlp_encode(node)
161
+ RLP.encode_simple([node.key, node.node_hash])
162
+ end
163
+ end
164
+
165
+ class Leaf < Node
166
+
167
+ attr_reader :key, :value
168
+
169
+ def initialize(key, value)
170
+ @key = key
171
+ @value = value
172
+ end
173
+
174
+ def extract_key
175
+ Nibbles.remove_nibbles_terminator(Nibbles.decode_nibbles key)
176
+ end
177
+
178
+ def self.rlp_encode(node)
179
+ RLP.encode_simple([node.key, node.value])
180
+ end
181
+ end
182
+
183
+ BLANK_NODE_HASH = Utils.sha3(RLP.encode(''.b)).freeze
184
+
185
+ end
186
+ end
187
+ end
@@ -22,28 +22,35 @@
22
22
 
23
23
 
24
24
  require 'ciri/utils'
25
+ require 'ciri/trie'
26
+ require 'ciri/rlp'
25
27
 
26
28
  module Ciri
27
- class EVM
29
+ module Types
30
+
31
+ class Account
32
+ include RLP::Serializable
33
+
34
+ schema [
35
+ {nonce: Integer},
36
+ {balance: Integer},
37
+ :storage_root,
38
+ :code_hash
39
+ ]
40
+
41
+ default_data code_hash: Utils::BLANK_SHA3, storage_root: Trie::BLANK_NODE_HASH
28
42
 
29
- Account = Struct.new(:address, :balance, :code, :nonce, :storage, keyword_init: true) do
30
43
  # EMPTY(σ,a) ≡ σ[a]c =KEC􏰁()􏰂∧σ[a]n =0∧σ[a]b =0
31
44
  def empty?
32
- code == Utils::BLANK_SHA3 && nonce == 0 && balance == 0
45
+ code_hash == Utils::BLANK_SHA3 && nonce == 0 && balance == 0
33
46
  end
34
47
 
35
- def self.new_empty(address)
36
- Account.new(address: address, balance: 0, nonce: 0, storage: {})
48
+ class << self
49
+ def new_empty
50
+ Account.new(balance: 0, nonce: 0)
51
+ end
37
52
  end
38
53
 
39
- def self.find_account(state, address)
40
- state[address.to_s] || new_empty(address.to_s)
41
- end
42
-
43
- def self.account_dead?(state, address)
44
- account = state[address.to_s]
45
- account.nil? || account.empty?
46
- end
47
54
  end
48
55
 
49
56
  end
@@ -28,21 +28,26 @@ module Ciri
28
28
  module Types
29
29
  class Address
30
30
 
31
- include RLP::Serializable
31
+ class << self
32
+ def rlp_encode(address)
33
+ RLP.encode(address.to_s)
34
+ end
35
+
36
+ def rlp_decode(data)
37
+ address = self.new(RLP.decode(data))
38
+ address.validate
39
+ address
40
+ end
41
+ end
42
+
32
43
  include Errors
33
44
 
34
45
  def initialize(address)
35
46
  @address = address.to_s
36
47
  end
37
48
 
38
- def rlp_encode!
39
- RLP.encode(@address)
40
- end
41
-
42
- def self.rlp_decode!(data)
43
- address = self.new(RLP.decode(data))
44
- address.validate
45
- address
49
+ def ==(other)
50
+ self.class == other.class && to_s == other.to_s
46
51
  end
47
52
 
48
53
  def to_s
@@ -52,11 +57,11 @@ module Ciri
52
57
  alias to_str to_s
53
58
 
54
59
  def to_hex
55
- Utils.data_to_hex to_s
60
+ Utils.to_hex to_s
56
61
  end
57
62
 
58
63
  def empty?
59
- @address.empty?
64
+ @address.empty? || @address.each_byte.reduce(0, :+).zero?
60
65
  end
61
66
 
62
67
  def validate
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (c) 2018, by Jiang Jinyang. <https://justjjy.com>
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in
13
+ # all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ # THE SOFTWARE.
22
+
23
+ require 'ciri/utils'
24
+ require 'ciri/rlp'
25
+
26
+ module Ciri
27
+ module Types
28
+
29
+ class Number
30
+ class << self
31
+ attr_reader :size
32
+
33
+ def rlp_encode(item)
34
+ RLP.encode new(item).to_bytes
35
+ end
36
+
37
+ def rlp_decode(encoded)
38
+ Utils.big_endian_decode(RLP.decode(encoded))
39
+ end
40
+ end
41
+
42
+ @size = 0
43
+
44
+ def initialize(value)
45
+ raise "can't initialize size #{self.class.size} number" if self.class.size <= 0
46
+ @value = value
47
+ end
48
+
49
+ def serialized
50
+ Utils.big_endian_encode(@value, size: bytes_size)
51
+ end
52
+
53
+ alias to_bytes serialized
54
+
55
+ def bytes_size
56
+ self.class.size
57
+ end
58
+
59
+ def to_i
60
+ @value
61
+ end
62
+ end
63
+
64
+ class Int32 < Number
65
+ @size = 32
66
+ end
67
+
68
+ class Int256 < Number
69
+ @size = 256
70
+ end
71
+
72
+ end
73
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (c) 2018, by Jiang Jinyang. <https://justjjy.com>
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in
13
+ # all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ # THE SOFTWARE.
22
+
23
+
24
+ require 'ciri/rlp'
25
+ require 'ciri/bloom_filter'
26
+ require 'ciri/types/number'
27
+
28
+ module Ciri
29
+ module Types
30
+
31
+ class Receipt
32
+
33
+ include RLP::Serializable
34
+
35
+ schema [
36
+ :state_root,
37
+ {gas_used: Integer},
38
+ {bloom: Types::Int256},
39
+ :logs,
40
+ ]
41
+
42
+ def initialize(state_root:, gas_used:, logs:, bloom: nil)
43
+ bloom ||= begin
44
+ blooms = logs.reduce([]) {|list, log| list.append *log.to_blooms}
45
+ BloomFilter.from_iterable(blooms).to_i
46
+ end
47
+ super(state_root: state_root, gas_used: gas_used, logs: logs, bloom: bloom)
48
+ end
49
+
50
+ def bloom_filter
51
+ BloomFilter.new(bloom)
52
+ end
53
+
54
+ end
55
+
56
+ end
57
+ end
data/lib/ciri/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ciri
4
- VERSION = "0.0.1"
4
+ VERSION = "0.0.2"
5
5
  end
metadata CHANGED
@@ -1,45 +1,59 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ciri
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jiang Jinyang
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-06-21 00:00:00.000000000 Z
11
+ date: 2018-07-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: ffi
14
+ name: ciri-utils
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.9.23
19
+ version: 0.1.0
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: 1.9.23
26
+ version: 0.1.0
27
27
  - !ruby/object:Gem::Dependency
28
- name: lru_redux
28
+ name: ciri-rlp
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 1.1.0
33
+ version: 0.1.1
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 1.1.0
40
+ version: 0.1.1
41
41
  - !ruby/object:Gem::Dependency
42
- name: digest-sha3
42
+ name: ffi
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 1.9.23
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 1.9.23
55
+ - !ruby/object:Gem::Dependency
56
+ name: lru_redux
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - "~>"
@@ -136,7 +150,8 @@ dependencies:
136
150
  - - "~>"
137
151
  - !ruby/object:Gem::Version
138
152
  version: '3.0'
139
- description: Ciri project intent to implement a full feature set ethereum client.
153
+ description: Ciri aims to be a feature complete, long maintained and stable Ethereum
154
+ client.
140
155
  email:
141
156
  - jjyruby@gmail.com
142
157
  executables: []
@@ -155,15 +170,59 @@ files:
155
170
  - Rakefile
156
171
  - bin/console
157
172
  - bin/setup
173
+ - ciri-rlp/.gitignore
174
+ - ciri-rlp/.rspec
175
+ - ciri-rlp/.travis.yml
176
+ - ciri-rlp/CODE_OF_CONDUCT.md
177
+ - ciri-rlp/Gemfile
178
+ - ciri-rlp/Gemfile.lock
179
+ - ciri-rlp/LICENSE.txt
180
+ - ciri-rlp/README.md
181
+ - ciri-rlp/Rakefile
182
+ - ciri-rlp/bin/console
183
+ - ciri-rlp/bin/setup
184
+ - ciri-rlp/ciri-rlp.gemspec
185
+ - ciri-rlp/lib/ciri/rlp.rb
186
+ - ciri-rlp/lib/ciri/rlp/decode.rb
187
+ - ciri-rlp/lib/ciri/rlp/encode.rb
188
+ - ciri-rlp/lib/ciri/rlp/serializable.rb
189
+ - ciri-rlp/lib/ciri/rlp/version.rb
190
+ - ciri-rlp/spec/ciri/fixture_spec.rb
191
+ - ciri-rlp/spec/ciri/rlp/decode_spec.rb
192
+ - ciri-rlp/spec/ciri/rlp/encode_spec.rb
193
+ - ciri-rlp/spec/ciri/rlp/serializable_spec.rb
194
+ - ciri-rlp/spec/ciri/rlp_spec.rb
195
+ - ciri-rlp/spec/spec_helper.rb
196
+ - ciri-utils/.gitignore
197
+ - ciri-utils/.rspec
198
+ - ciri-utils/.travis.yml
199
+ - ciri-utils/CODE_OF_CONDUCT.md
200
+ - ciri-utils/Gemfile
201
+ - ciri-utils/Gemfile.lock
202
+ - ciri-utils/LICENSE.txt
203
+ - ciri-utils/README.md
204
+ - ciri-utils/Rakefile
205
+ - ciri-utils/bin/console
206
+ - ciri-utils/bin/setup
207
+ - ciri-utils/ciri-utils.gemspec
208
+ - ciri-utils/lib/ciri/utils.rb
209
+ - ciri-utils/lib/ciri/utils/logger.rb
210
+ - ciri-utils/lib/ciri/utils/number.rb
211
+ - ciri-utils/lib/ciri/utils/version.rb
212
+ - ciri-utils/spec/ciri/utils_spec.rb
213
+ - ciri-utils/spec/spec_helper.rb
158
214
  - ciri.gemspec
159
215
  - docker/Base
160
216
  - lib/ciri.rb
161
217
  - lib/ciri/actor.rb
218
+ - lib/ciri/bloom_filter.rb
162
219
  - lib/ciri/chain.rb
163
220
  - lib/ciri/chain/block.rb
164
221
  - lib/ciri/chain/header.rb
222
+ - lib/ciri/chain/header_chain.rb
165
223
  - lib/ciri/chain/transaction.rb
166
224
  - lib/ciri/crypto.rb
225
+ - lib/ciri/db/account_db.rb
167
226
  - lib/ciri/db/backend/memory.rb
168
227
  - lib/ciri/db/backend/rocks.rb
169
228
  - lib/ciri/db/backend/rocks_db.rb
@@ -188,29 +247,33 @@ files:
188
247
  - lib/ciri/eth/synchronizer.rb
189
248
  - lib/ciri/ethash.rb
190
249
  - lib/ciri/evm.rb
191
- - lib/ciri/evm/account.rb
192
250
  - lib/ciri/evm/block_info.rb
193
- - lib/ciri/evm/forks/frontier.rb
251
+ - lib/ciri/evm/errors.rb
194
252
  - lib/ciri/evm/instruction.rb
253
+ - lib/ciri/evm/log_entry.rb
195
254
  - lib/ciri/evm/machine_state.rb
196
255
  - lib/ciri/evm/op.rb
197
- - lib/ciri/evm/serialize.rb
256
+ - lib/ciri/evm/state.rb
198
257
  - lib/ciri/evm/sub_state.rb
199
258
  - lib/ciri/evm/vm.rb
200
259
  - lib/ciri/forks.rb
260
+ - lib/ciri/forks/base.rb
201
261
  - lib/ciri/forks/frontier.rb
262
+ - lib/ciri/forks/frontier/cost.rb
202
263
  - lib/ciri/key.rb
203
264
  - lib/ciri/pow.rb
204
- - lib/ciri/rlp.rb
205
265
  - lib/ciri/rlp/decode.rb
206
266
  - lib/ciri/rlp/encode.rb
207
267
  - lib/ciri/rlp/serializable.rb
268
+ - lib/ciri/serialize.rb
269
+ - lib/ciri/trie.rb
270
+ - lib/ciri/trie/nibbles.rb
271
+ - lib/ciri/trie/nodes.rb
272
+ - lib/ciri/types/account.rb
208
273
  - lib/ciri/types/address.rb
209
274
  - lib/ciri/types/errors.rb
210
- - lib/ciri/utils.rb
211
- - lib/ciri/utils/lib_c.rb
212
- - lib/ciri/utils/logger.rb
213
- - lib/ciri/utils/number.rb
275
+ - lib/ciri/types/number.rb
276
+ - lib/ciri/types/receipt.rb
214
277
  - lib/ciri/version.rb
215
278
  homepage: https://github.com/ciri-ethereum/ciri
216
279
  licenses:
@@ -235,5 +298,5 @@ rubyforge_project:
235
298
  rubygems_version: 2.7.3
236
299
  signing_key:
237
300
  specification_version: 4
238
- summary: Ciri ethereum client.
301
+ summary: Ciri project intent to implement a full feature set Ethereum client.
239
302
  test_files: []