ciri 0.0.2 → 0.0.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.
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'