ciri 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.rspec +0 -1
  4. data/Gemfile.lock +11 -7
  5. data/LICENSE.txt +201 -21
  6. data/README.md +78 -25
  7. data/Rakefile +45 -17
  8. data/bin/bundle +105 -0
  9. data/bin/htmldiff +29 -0
  10. data/bin/ldiff +29 -0
  11. data/bin/rake +29 -0
  12. data/bin/rspec +29 -0
  13. data/ciri-crypto/.gitignore +11 -0
  14. data/ciri-crypto/.rspec +3 -0
  15. data/ciri-crypto/.travis.yml +5 -0
  16. data/ciri-crypto/CODE_OF_CONDUCT.md +74 -0
  17. data/ciri-crypto/Gemfile +6 -0
  18. data/ciri-crypto/Gemfile.lock +43 -0
  19. data/ciri-crypto/LICENSE.txt +201 -0
  20. data/ciri-crypto/README.md +58 -0
  21. data/ciri-crypto/Rakefile +6 -0
  22. data/ciri-crypto/bin/console +14 -0
  23. data/ciri-crypto/bin/setup +8 -0
  24. data/ciri-crypto/ciri-crypto.gemspec +40 -0
  25. data/ciri-crypto/lib/ciri/crypto/errors.rb +29 -0
  26. data/ciri-crypto/lib/ciri/crypto/signature.rb +71 -0
  27. data/ciri-crypto/lib/ciri/crypto/version.rb +5 -0
  28. data/{lib → ciri-crypto/lib}/ciri/crypto.rb +16 -69
  29. data/ciri-crypto/spec/ciri/crypto_spec.rb +56 -0
  30. data/ciri-crypto/spec/spec_helper.rb +14 -0
  31. data/ciri-rlp/Gemfile.lock +5 -5
  32. data/ciri-rlp/LICENSE.txt +201 -21
  33. data/ciri-rlp/README.md +1 -1
  34. data/ciri-rlp/ciri-rlp.gemspec +3 -3
  35. data/ciri-rlp/lib/ciri/rlp/decode.rb +10 -16
  36. data/ciri-rlp/lib/ciri/rlp/encode.rb +10 -16
  37. data/ciri-rlp/lib/ciri/rlp/serializable.rb +10 -16
  38. data/ciri-rlp/lib/ciri/rlp.rb +10 -16
  39. data/ciri-rlp/spec/ciri/fixture_spec.rb +10 -16
  40. data/ciri-rlp/spec/ciri/rlp/serializable_spec.rb +10 -16
  41. data/ciri-utils/Gemfile.lock +4 -4
  42. data/ciri-utils/LICENSE.txt +201 -21
  43. data/ciri-utils/README.md +1 -1
  44. data/ciri-utils/ciri-utils.gemspec +2 -2
  45. data/ciri-utils/lib/ciri/utils/logger.rb +10 -16
  46. data/ciri-utils/lib/ciri/utils/number.rb +10 -16
  47. data/ciri-utils/lib/ciri/utils/version.rb +1 -1
  48. data/ciri-utils/lib/ciri/utils.rb +3 -3
  49. data/ciri.gemspec +4 -3
  50. data/docker/{Base → Dockerfile} +9 -3
  51. data/lib/ciri/actor.rb +10 -16
  52. data/lib/ciri/bloom_filter.rb +11 -17
  53. data/lib/ciri/chain/block.rb +10 -16
  54. data/lib/ciri/chain/header.rb +12 -18
  55. data/lib/ciri/chain/header_chain.rb +8 -22
  56. data/lib/ciri/chain/transaction.rb +38 -33
  57. data/lib/ciri/chain.rb +27 -26
  58. data/lib/ciri/core_ext.rb +61 -0
  59. data/lib/ciri/db/account_db.rb +25 -21
  60. data/lib/ciri/db/backend/memory.rb +10 -16
  61. data/lib/ciri/db/backend/rocks.rb +10 -16
  62. data/lib/ciri/db/backend/rocks_db.rb +10 -16
  63. data/lib/ciri/devp2p/peer.rb +10 -16
  64. data/lib/ciri/devp2p/protocol.rb +10 -16
  65. data/lib/ciri/devp2p/protocol_io.rb +10 -16
  66. data/lib/ciri/devp2p/rlpx/connection.rb +10 -16
  67. data/lib/ciri/devp2p/rlpx/encryption_handshake.rb +13 -19
  68. data/lib/ciri/devp2p/rlpx/error.rb +10 -16
  69. data/lib/ciri/devp2p/rlpx/frame_io.rb +10 -16
  70. data/lib/ciri/devp2p/rlpx/message.rb +10 -16
  71. data/lib/ciri/devp2p/rlpx/node.rb +10 -16
  72. data/lib/ciri/devp2p/rlpx/protocol_handshake.rb +10 -16
  73. data/lib/ciri/devp2p/rlpx/protocol_messages.rb +10 -16
  74. data/lib/ciri/devp2p/rlpx/secrets.rb +10 -16
  75. data/lib/ciri/devp2p/rlpx.rb +10 -16
  76. data/lib/ciri/devp2p/server.rb +10 -16
  77. data/lib/ciri/eth/peer.rb +10 -16
  78. data/lib/ciri/eth/protocol_manage.rb +10 -16
  79. data/lib/ciri/eth/protocol_messages.rb +10 -16
  80. data/lib/ciri/eth/synchronizer.rb +10 -16
  81. data/lib/ciri/eth.rb +10 -16
  82. data/lib/ciri/ethash.rb +10 -16
  83. data/lib/ciri/evm/block_info.rb +25 -17
  84. data/lib/ciri/evm/errors.rb +13 -16
  85. data/lib/ciri/evm/execution_context.rb +136 -0
  86. data/lib/ciri/evm/instruction.rb +17 -24
  87. data/lib/ciri/evm/log_entry.rb +12 -18
  88. data/lib/ciri/evm/machine_state.rb +28 -33
  89. data/lib/ciri/evm/op.rb +52 -89
  90. data/lib/ciri/evm/op_call.rb +114 -0
  91. data/lib/ciri/evm/precompile_contract.rb +102 -0
  92. data/lib/ciri/evm/state.rb +28 -21
  93. data/lib/ciri/evm/sub_state.rb +18 -24
  94. data/lib/ciri/evm/vm.rb +128 -190
  95. data/lib/ciri/evm.rb +77 -85
  96. data/lib/ciri/forks/base.rb +28 -16
  97. data/lib/ciri/forks/byzantium.rb +43 -0
  98. data/lib/ciri/forks/config.rb +36 -0
  99. data/lib/ciri/forks/frontier/cost.rb +42 -33
  100. data/lib/ciri/forks/frontier.rb +47 -18
  101. data/lib/ciri/forks/homestead/cost.rb +195 -0
  102. data/lib/ciri/forks/homestead.rb +46 -0
  103. data/lib/ciri/forks.rb +12 -22
  104. data/lib/ciri/key.rb +14 -3
  105. data/lib/ciri/pow.rb +11 -17
  106. data/lib/ciri/rlp/decode.rb +10 -16
  107. data/lib/ciri/rlp/encode.rb +10 -16
  108. data/lib/ciri/rlp/serializable.rb +10 -16
  109. data/lib/ciri/serialize.rb +14 -17
  110. data/lib/ciri/trie/nibbles.rb +10 -16
  111. data/lib/ciri/trie/nodes.rb +12 -17
  112. data/lib/ciri/trie.rb +12 -18
  113. data/lib/ciri/types/account.rb +15 -17
  114. data/lib/ciri/types/address.rb +11 -17
  115. data/lib/ciri/types/errors.rb +10 -16
  116. data/lib/ciri/types/receipt.rb +12 -18
  117. data/lib/ciri/types/uint.rb +79 -0
  118. data/lib/ciri/version.rb +1 -1
  119. data/lib/ciri.rb +10 -16
  120. metadata +54 -10
  121. data/lib/ciri/types/number.rb +0 -73
@@ -1,24 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018, by Jiang Jinyang. <https://justjjy.com>
3
+ # Copyright 2018 Jiang Jinyang <https://justjjy.com>
4
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:
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
11
8
  #
12
- # The above copyright notice and this permission notice shall be included in
13
- # all copies or substantial portions of the Software.
9
+ # http://www.apache.org/licenses/LICENSE-2.0
14
10
  #
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.
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
22
16
 
23
17
 
24
18
  module Ciri
@@ -48,12 +42,12 @@ module Ciri
48
42
 
49
43
  # header hash
50
44
  def get_hash
51
- Utils.sha3(rlp_encode)
45
+ Utils.keccak(rlp_encode)
52
46
  end
53
47
 
54
48
  # mining_hash, used for mining
55
49
  def mining_hash
56
- Utils.sha3(rlp_encode skip_keys: [:mix_hash, :nonce])
50
+ Utils.keccak(rlp_encode skip_keys: [:mix_hash, :nonce])
57
51
  end
58
52
 
59
53
  end
@@ -10,12 +10,11 @@ module Ciri
10
10
  TD_SUFFIX = 't'
11
11
  NUM_SUFFIX = 'n'
12
12
 
13
- attr_reader :store, :byzantium_block, :homestead_block
13
+ attr_reader :store
14
14
 
15
- def initialize(store, byzantium_block: nil, homestead_block: nil)
15
+ def initialize(store, fork_config: nil)
16
16
  @store = store
17
- @byzantium_block = byzantium_block
18
- @homestead_block = homestead_block
17
+ @fork_config = fork_config
19
18
  end
20
19
 
21
20
  def head
@@ -71,29 +70,16 @@ module Ciri
71
70
  def calculate_difficulty(header, parent_header)
72
71
  return header.difficulty if header.number == 0
73
72
 
73
+ fork_schema = @fork_config.choose_fork(header.number)
74
+ difficulty_time_factor = fork_schema.difficulty_time_factor(header, parent_header)
75
+
74
76
  x = parent_header.difficulty / 2048
75
- y = header.ommers_hash == Utils::BLANK_SHA3 ? 1 : 2
76
-
77
- # handle byzantium fork
78
- # https://github.com/ethereum/EIPs/blob/181867ae830df5419eb9982d2a24797b2dcad28f/EIPS/eip-609.md
79
- # https://github.com/ethereum/EIPs/blob/984cf5de90bbf5fbe7e49be227b0c2f9567e661e/EIPS/eip-100.md
80
- byzantium_fork = byzantium_block && header.number > byzantium_block
81
- # https://github.com/ethereum/EIPs/blob/984cf5de90bbf5fbe7e49be227b0c2f9567e661e/EIPS/eip-2.md
82
- homestead_fork = homestead_block && header.number > homestead_block
83
-
84
- time_factor = if byzantium_fork
85
- [y - (header.timestamp - parent_header.timestamp) / 9, -99].max
86
- elsif homestead_fork
87
- [1 - (header.timestamp - parent_header.timestamp) / 10, -99].max
88
- else
89
- (header.timestamp - parent_header.timestamp) < 13 ? 1 : -1
90
- end
91
77
 
92
78
  # difficulty bomb
93
- height = byzantium_fork ? [(header.number - 3000000), 0].max : header.number
79
+ height = fork_schema.difficulty_virtual_height(header.number)
94
80
  height_factor = 2 ** (height / 100000 - 2)
95
81
 
96
- difficulty = (parent_header.difficulty + x * time_factor + height_factor).to_i
82
+ difficulty = (parent_header.difficulty + x * difficulty_time_factor + height_factor).to_i
97
83
  [header.difficulty, difficulty].max
98
84
  end
99
85
 
@@ -1,35 +1,33 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018, by Jiang Jinyang. <https://justjjy.com>
3
+ # Copyright 2018 Jiang Jinyang <https://justjjy.com>
4
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:
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
11
8
  #
12
- # The above copyright notice and this permission notice shall be included in
13
- # all copies or substantial portions of the Software.
9
+ # http://www.apache.org/licenses/LICENSE-2.0
14
10
  #
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.
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
22
16
 
23
17
 
24
18
  require 'ciri/rlp'
25
19
  require 'ciri/crypto'
20
+ require 'ciri/key'
26
21
  require 'ciri/types/address'
22
+ require 'ciri/types/uint'
27
23
 
28
24
  module Ciri
29
25
  class Chain
30
26
 
31
27
  class Transaction
32
28
 
29
+ include Types
30
+
33
31
  class InvalidError < StandardError
34
32
  end
35
33
 
@@ -39,15 +37,15 @@ module Ciri
39
37
  include RLP::Serializable
40
38
 
41
39
  schema [
42
- {nonce: Integer},
43
- {gas_price: Integer},
44
- {gas_limit: Integer},
45
- {to: Types::Address},
46
- {value: Integer},
47
- :data,
48
- {v: Integer},
49
- {r: Integer},
50
- {s: Integer}
40
+ {nonce: Integer},
41
+ {gas_price: Integer},
42
+ {gas_limit: Integer},
43
+ {to: Address},
44
+ {value: Integer},
45
+ :data,
46
+ {v: Integer},
47
+ {r: Integer},
48
+ {s: Integer}
51
49
  ]
52
50
 
53
51
  default_data v: 0, r: 0, s: 0, data: "\x00".b
@@ -56,7 +54,7 @@ module Ciri
56
54
  # @return address String
57
55
  def sender
58
56
  @sender ||= begin
59
- address = Types::Address.new(Utils.sha3(Crypto.ecdsa_recover(sign_hash(chain_id), signature)[1..-1])[-20..-1])
57
+ address = Key.ecdsa_recover(sign_hash(chain_id), signature).to_address
60
58
  address.validate
61
59
  address
62
60
  end
@@ -93,16 +91,15 @@ module Ciri
93
91
  if chain_id
94
92
  list += [chain_id, ''.b, ''.b]
95
93
  end
96
- Utils.sha3(RLP.encode_simple list)
94
+ Utils.keccak(RLP.encode_simple list)
97
95
  end
98
96
 
99
97
  def get_hash
100
- Utils.sha3 rlp_encode
98
+ Utils.keccak rlp_encode
101
99
  end
102
100
 
103
101
  # validate transaction
104
- # @param intrinsic_gas_of_transaction Proc
105
- def validate!(intrinsic_gas_of_transaction: nil)
102
+ def validate!(fork_schema: nil)
106
103
  begin
107
104
  sender
108
105
  rescue Ciri::Crypto::ECDSASignatureError => e
@@ -112,11 +109,19 @@ module Ciri
112
109
  end
113
110
 
114
111
  raise InvalidError.new('signature rvs error') unless signature.valid?
115
- raise InvalidError.new('signature s is low') unless signature.low_s?
112
+ # raise InvalidError.new('signature s is low') unless signature.low_s?
113
+ raise InvalidError.new('gas_price overflow') unless UInt256.valid?(gas_price)
114
+ raise InvalidError.new('nonce overflow') unless UInt256.valid?(nonce)
115
+ raise InvalidError.new('gas_limit overflow') unless UInt256.valid?(gas_limit)
116
+ raise InvalidError.new('value overflow') unless UInt256.valid?(value)
117
+
118
+ if fork_schema
119
+ if (reason = fork_schema.validate_transaction(self))
120
+ raise InvalidError.new(reason)
121
+ end
116
122
 
117
- if intrinsic_gas_of_transaction
118
123
  begin
119
- intrinsic_gas = intrinsic_gas_of_transaction[self]
124
+ intrinsic_gas = fork_schema.intrinsic_gas_of_transaction(self)
120
125
  rescue StandardError
121
126
  raise InvalidError.new 'intrinsic gas calculation error'
122
127
  end
data/lib/ciri/chain.rb CHANGED
@@ -1,29 +1,25 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018, by Jiang Jinyang. <https://justjjy.com>
3
+ # Copyright 2018 Jiang Jinyang <https://justjjy.com>
4
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:
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
11
8
  #
12
- # The above copyright notice and this permission notice shall be included in
13
- # all copies or substantial portions of the Software.
9
+ # http://www.apache.org/licenses/LICENSE-2.0
14
10
  #
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.
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
22
16
 
23
17
 
24
18
  require 'forwardable'
25
19
  require 'ciri/evm'
20
+ require 'ciri/evm/state'
26
21
  require 'ciri/utils/logger'
22
+ require 'ciri/forks'
27
23
  require_relative 'chain/header_chain'
28
24
  require_relative 'chain/block'
29
25
  require_relative 'chain/header'
@@ -55,18 +51,19 @@ module Ciri
55
51
 
56
52
  attr_reader :genesis, :network_id, :store, :header_chain
57
53
 
58
- def initialize(store, genesis:, network_id:, evm: nil, byzantium_block: nil, homestead_block: nil)
54
+ def initialize(store, genesis:, network_id:, fork_config:)
59
55
  @store = store
60
- @header_chain = HeaderChain.new(store, byzantium_block: byzantium_block, homestead_block: homestead_block)
56
+ @header_chain = HeaderChain.new(store, fork_config: fork_config)
61
57
  @genesis = genesis
62
58
  @network_id = network_id
63
- @evm = evm
59
+ @fork_config = fork_config
64
60
  load_or_init_store
65
61
  end
66
62
 
67
63
  # run block
68
- def import_block(block)
69
- validate_block(block)
64
+ def import_block(block, validate: true)
65
+ debug("import block #{block.header.number}")
66
+ validate_block(block) if validate
70
67
  write_block(block)
71
68
 
72
69
  # update state
@@ -84,16 +81,19 @@ module Ciri
84
81
  end
85
82
  end
86
83
 
84
+ parent_header = @header_chain.get_header(block.header.parent_hash)
85
+ state = EVM::State.new(store, state_root: parent_header.state_root, chain: self)
86
+ evm = EVM.new(state: state, fork_schema: @fork_config.choose_fork(block.header.number))
87
87
  # valid transactions and gas
88
88
  begin
89
- receipts = @evm.transition(block)
89
+ receipts = evm.transition(block)
90
90
  rescue EVM::InvalidTransition => e
91
91
  raise InvalidBlockError.new(e.message)
92
92
  end
93
93
 
94
94
  # verify state root
95
- if @evm.state_root != block.header.state_root
96
- error("incorrect state_root, evm: #{Utils.to_hex @evm.state_root}, header: #{Utils.to_hex block.header.state_root} height: #{block.header.number}")
95
+ if evm.state_root != block.header.state_root
96
+ error("incorrect state_root, evm: #{Utils.to_hex evm.state_root}, header: #{Utils.to_hex block.header.state_root} height: #{block.header.number}")
97
97
  raise InvalidBlockError.new("incorrect state_root")
98
98
  end
99
99
 
@@ -132,7 +132,7 @@ module Ciri
132
132
 
133
133
  # insert blocks in order
134
134
  # blocks must be ordered from lower height to higher height
135
- def insert_blocks(blocks)
135
+ def insert_blocks(blocks, validate: true)
136
136
  prev_block = blocks[0]
137
137
  blocks[1..-1].each do |block|
138
138
  unless block.number == prev_block.number + 1 && block.parent_hash == prev_block.get_hash
@@ -141,7 +141,7 @@ module Ciri
141
141
  end
142
142
 
143
143
  blocks.each do |block|
144
- write_block block
144
+ import_block(block, validate: validate)
145
145
  end
146
146
  end
147
147
 
@@ -181,6 +181,7 @@ module Ciri
181
181
  private
182
182
 
183
183
  def is_kin?(ommer, parent, n)
184
+ return false if parent.nil?
184
185
  return false if n == 0
185
186
  return true if get_header(ommer.parent_hash) == get_header(parent.header.parent_hash) &&
186
187
  ommer != parent.header &&
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2018 Jiang Jinyang <https://justjjy.com>
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+
18
+ require 'ciri/utils'
19
+
20
+ module Ciri
21
+ # Core extension module for convenient
22
+ module CoreExt
23
+
24
+ refine(String) do
25
+ def to_hex
26
+ Utils.to_hex(self)
27
+ end
28
+
29
+ alias encode_hex to_hex
30
+
31
+ def decode_hex
32
+ Utils.to_bytes(self)
33
+ end
34
+
35
+ def keccak
36
+ Utils.keccak(self)
37
+ end
38
+
39
+ def decode_big_endian
40
+ Utils.big_endian_decode(self)
41
+ end
42
+
43
+ alias decode_number decode_big_endian
44
+
45
+ def pad_zero(size)
46
+ self.rjust(size, "\x00".b)
47
+ end
48
+ end
49
+
50
+ refine(Integer) do
51
+ def ceil_div(size)
52
+ Utils.ceil_div(self, size)
53
+ end
54
+
55
+ def encode_big_endian
56
+ Utils.big_endian_encode(self)
57
+ end
58
+ end
59
+
60
+ end
61
+ end
@@ -1,31 +1,28 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018, by Jiang Jinyang. <https://justjjy.com>
3
+ # Copyright 2018 Jiang Jinyang <https://justjjy.com>
4
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:
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
11
8
  #
12
- # The above copyright notice and this permission notice shall be included in
13
- # all copies or substantial portions of the Software.
9
+ # http://www.apache.org/licenses/LICENSE-2.0
14
10
  #
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.
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
22
16
 
23
17
 
18
+ require 'ciri/core_ext'
24
19
  require 'ciri/trie'
25
20
  require 'ciri/types/account'
26
21
  require 'ciri/serialize'
27
22
  require 'ciri/utils/logger'
28
23
 
24
+ using Ciri::CoreExt
25
+
29
26
  module Ciri
30
27
  module DB
31
28
  class AccountDB
@@ -38,7 +35,7 @@ module Ciri
38
35
  def initialize(db, root_hash: nil)
39
36
  @db = db
40
37
  root_hash ||= Trie::BLANK_NODE_HASH
41
- @trie = Trie.new(db: @db, root_hash: root_hash, prune: true)
38
+ @trie = Trie.new(db: @db, root_hash: root_hash, prune: false)
42
39
  end
43
40
 
44
41
  def root_hash
@@ -48,7 +45,7 @@ module Ciri
48
45
  def store(address, key, value)
49
46
  account = find_account address
50
47
  trie = Trie.new(db: @db, root_hash: account.storage_root)
51
-
48
+ debug("#{address.to_hex}[#{key}] -> #{value}")
52
49
  converted_key = convert_key Utils.big_endian_encode(key, size: 32)
53
50
 
54
51
  if value && value != 0
@@ -97,7 +94,7 @@ module Ciri
97
94
  def set_account_code(address, code)
98
95
  code ||= ''.b
99
96
  account = find_account(address)
100
- account.code_hash = Utils.sha3(code)
97
+ account.code_hash = Utils.keccak(code)
101
98
  update_account(address, account)
102
99
  db[account.code_hash] = code
103
100
  end
@@ -119,7 +116,14 @@ module Ciri
119
116
  end
120
117
  end
121
118
 
119
+ def account_exist?(address)
120
+ rlp_encoded_account = @trie[convert_key address]
121
+ non_exists = rlp_encoded_account.nil? || rlp_encoded_account.size == 0
122
+ !non_exists
123
+ end
124
+
122
125
  def delete_account(address)
126
+ debug "delete #{address.to_s.to_hex}"
123
127
  @trie.delete(convert_key address)
124
128
  end
125
129
 
@@ -131,13 +135,13 @@ module Ciri
131
135
 
132
136
  def update_account(address, account)
133
137
  debug 'update account'
134
- debug Utils.to_hex(address)
138
+ debug address.to_hex
135
139
  debug account.serializable_attributes
136
140
  @trie[convert_key address] = Types::Account.rlp_encode account
137
141
  end
138
142
 
139
143
  def convert_key(key)
140
- Utils.sha3 key.to_s
144
+ Utils.keccak key.to_s
141
145
  end
142
146
 
143
147
  end
@@ -1,24 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018, by Jiang Jinyang. <https://justjjy.com>
3
+ # Copyright 2018 Jiang Jinyang <https://justjjy.com>
4
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:
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
11
8
  #
12
- # The above copyright notice and this permission notice shall be included in
13
- # all copies or substantial portions of the Software.
9
+ # http://www.apache.org/licenses/LICENSE-2.0
14
10
  #
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.
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
22
16
 
23
17
 
24
18
  require_relative 'rocks_db'
@@ -1,24 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018, by Jiang Jinyang. <https://justjjy.com>
3
+ # Copyright 2018 Jiang Jinyang <https://justjjy.com>
4
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:
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
11
8
  #
12
- # The above copyright notice and this permission notice shall be included in
13
- # all copies or substantial portions of the Software.
9
+ # http://www.apache.org/licenses/LICENSE-2.0
14
10
  #
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.
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
22
16
 
23
17
 
24
18
  require_relative 'rocks_db'
@@ -1,24 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018, by Jiang Jinyang. <https://justjjy.com>
3
+ # Copyright 2018 Jiang Jinyang <https://justjjy.com>
4
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:
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
11
8
  #
12
- # The above copyright notice and this permission notice shall be included in
13
- # all copies or substantial portions of the Software.
9
+ # http://www.apache.org/licenses/LICENSE-2.0
14
10
  #
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.
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
22
16
 
23
17
 
24
18
  require 'ffi'