ciri 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +8 -3
- data/README.md +5 -0
- data/Rakefile +24 -2
- data/ciri-rlp/.gitignore +11 -0
- data/ciri-rlp/.rspec +3 -0
- data/ciri-rlp/.travis.yml +5 -0
- data/ciri-rlp/CODE_OF_CONDUCT.md +74 -0
- data/ciri-rlp/Gemfile +6 -0
- data/ciri-rlp/Gemfile.lock +39 -0
- data/ciri-rlp/LICENSE.txt +21 -0
- data/ciri-rlp/README.md +98 -0
- data/ciri-rlp/Rakefile +6 -0
- data/ciri-rlp/bin/console +14 -0
- data/ciri-rlp/bin/setup +8 -0
- data/ciri-rlp/ciri-rlp.gemspec +28 -0
- data/{lib → ciri-rlp/lib}/ciri/rlp.rb +2 -2
- data/ciri-rlp/lib/ciri/rlp/decode.rb +144 -0
- data/ciri-rlp/lib/ciri/rlp/encode.rb +140 -0
- data/ciri-rlp/lib/ciri/rlp/serializable.rb +241 -0
- data/ciri-rlp/lib/ciri/rlp/version.rb +5 -0
- data/ciri-rlp/spec/ciri/fixture_spec.rb +95 -0
- data/ciri-rlp/spec/ciri/rlp/decode_spec.rb +68 -0
- data/ciri-rlp/spec/ciri/rlp/encode_spec.rb +72 -0
- data/ciri-rlp/spec/ciri/rlp/serializable_spec.rb +147 -0
- data/ciri-rlp/spec/ciri/rlp_spec.rb +5 -0
- data/ciri-rlp/spec/spec_helper.rb +14 -0
- data/ciri-utils/.gitignore +11 -0
- data/ciri-utils/.rspec +3 -0
- data/ciri-utils/.travis.yml +5 -0
- data/ciri-utils/CODE_OF_CONDUCT.md +74 -0
- data/ciri-utils/Gemfile +6 -0
- data/ciri-utils/Gemfile.lock +37 -0
- data/ciri-utils/LICENSE.txt +21 -0
- data/ciri-utils/README.md +61 -0
- data/ciri-utils/Rakefile +6 -0
- data/ciri-utils/bin/console +14 -0
- data/ciri-utils/bin/setup +8 -0
- data/ciri-utils/ciri-utils.gemspec +28 -0
- data/{lib → ciri-utils/lib}/ciri/utils.rb +9 -33
- data/{lib → ciri-utils/lib}/ciri/utils/logger.rb +0 -0
- data/{lib → ciri-utils/lib}/ciri/utils/number.rb +15 -12
- data/ciri-utils/lib/ciri/utils/version.rb +5 -0
- data/ciri-utils/spec/ciri/utils_spec.rb +5 -0
- data/ciri-utils/spec/spec_helper.rb +14 -0
- data/ciri.gemspec +6 -3
- data/lib/ciri/bloom_filter.rb +83 -0
- data/lib/ciri/chain.rb +67 -130
- data/lib/ciri/chain/header.rb +2 -2
- data/lib/ciri/chain/header_chain.rb +136 -0
- data/lib/ciri/chain/transaction.rb +1 -1
- data/lib/ciri/crypto.rb +2 -2
- data/lib/ciri/db/account_db.rb +145 -0
- data/lib/ciri/db/backend/memory.rb +24 -1
- data/lib/ciri/devp2p/peer.rb +1 -1
- data/lib/ciri/devp2p/rlpx/connection.rb +5 -5
- data/lib/ciri/eth/peer.rb +3 -3
- data/lib/ciri/eth/protocol_manage.rb +3 -3
- data/lib/ciri/eth/protocol_messages.rb +27 -26
- data/lib/ciri/ethash.rb +18 -3
- data/lib/ciri/evm.rb +101 -56
- data/lib/ciri/{utils/lib_c.rb → evm/errors.rb} +28 -18
- data/lib/ciri/evm/instruction.rb +3 -1
- data/lib/ciri/evm/{serialize.rb → log_entry.rb} +9 -27
- data/lib/ciri/evm/machine_state.rb +21 -2
- data/lib/ciri/evm/op.rb +19 -16
- data/lib/ciri/evm/state.rb +61 -0
- data/lib/ciri/evm/vm.rb +78 -102
- data/lib/ciri/forks.rb +1 -4
- data/lib/ciri/forks/base.rb +55 -0
- data/lib/ciri/forks/frontier.rb +37 -10
- data/lib/ciri/forks/frontier/cost.rb +186 -0
- data/lib/ciri/key.rb +1 -1
- data/lib/ciri/pow.rb +1 -1
- data/lib/ciri/rlp/decode.rb +6 -3
- data/lib/ciri/rlp/encode.rb +10 -10
- data/lib/ciri/rlp/serializable.rb +12 -9
- data/lib/ciri/serialize.rb +58 -0
- data/lib/ciri/trie.rb +362 -0
- data/lib/ciri/trie/nibbles.rb +97 -0
- data/lib/ciri/trie/nodes.rb +187 -0
- data/lib/ciri/{evm → types}/account.rb +20 -13
- data/lib/ciri/types/address.rb +16 -11
- data/lib/ciri/types/number.rb +73 -0
- data/lib/ciri/types/receipt.rb +57 -0
- data/lib/ciri/version.rb +1 -1
- metadata +82 -19
- data/lib/ciri/evm/forks/frontier.rb +0 -183
@@ -1,183 +0,0 @@
|
|
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/evm/op'
|
25
|
-
|
26
|
-
module Ciri
|
27
|
-
class EVM
|
28
|
-
module Forks
|
29
|
-
module Frontier
|
30
|
-
|
31
|
-
module Cost
|
32
|
-
# fee schedule, start with G
|
33
|
-
G_ZERO = 0
|
34
|
-
G_BASE = 2
|
35
|
-
G_VERYLOW = 3
|
36
|
-
G_LOW = 5
|
37
|
-
G_MID = 8
|
38
|
-
G_HIGH = 10
|
39
|
-
G_EXTCODE = 700
|
40
|
-
G_BALANCE = 400
|
41
|
-
G_SLOAD = 50
|
42
|
-
G_JUMPDEST = 1
|
43
|
-
G_SSET = 20000
|
44
|
-
G_RESET = 5000
|
45
|
-
R_SCLEAR = 15000
|
46
|
-
R_SELFDESTRUCT = 24000
|
47
|
-
G_SELFDESTRUCT = 0
|
48
|
-
G_CREATE = 32000
|
49
|
-
G_CODEDEPOSIT = 200
|
50
|
-
G_CALL = 700
|
51
|
-
G_CALLVALUE = 9000
|
52
|
-
G_CALLSTIPEND = 2300
|
53
|
-
G_NEWACCOUNT = 25000
|
54
|
-
G_EXP = 10
|
55
|
-
G_EXPBYTE = 10
|
56
|
-
G_MEMORY = 3
|
57
|
-
G_TXCREATE = 32000
|
58
|
-
G_TXDATAZERO = 4
|
59
|
-
G_TXDATANONZERO = 68
|
60
|
-
G_TRANSACTION = 21000
|
61
|
-
G_LOG = 375
|
62
|
-
G_LOGDATA = 8
|
63
|
-
G_TOPIC = 375
|
64
|
-
G_SHA3 = 30
|
65
|
-
G_SHA3WORD = 6
|
66
|
-
G_COPY = 3
|
67
|
-
G_BLOCKHASH = 20
|
68
|
-
G_QUADDIVISOR = 100
|
69
|
-
|
70
|
-
# operation code by group, for later calculation
|
71
|
-
W_ZERO = [OP::STOP, OP::RETURN, OP::REVERT]
|
72
|
-
W_BASE = [OP::ADDRESS, OP::ORIGIN, OP::CALLER, OP::CALLVALUE, OP::CALLDATASIZE, OP::CODESIZE, OP::GASPRICE,
|
73
|
-
OP::COINBASE, OP::TIMESTAMP, OP::NUMBER, OP::DIFFICULTY, OP::GASLIMIT, OP::RETURNDATASIZE,
|
74
|
-
OP::POP, OP::PC, OP::MSIZE, OP::GAS]
|
75
|
-
W_VERYLOW = [OP::ADD, OP::SUB, OP::NOT, OP::LT, OP::GT, OP::SLT, OP::SGT, OP::EQ, OP::ISZERO, OP::AND, OP::OR,
|
76
|
-
OP::XOR, OP::BYTE, OP::CALLDATALOAD, OP::MLOAD, OP::MSTORE, OP::MSTORE8,
|
77
|
-
*(1..32).map {|i| OP.get(OP::PUSH1 + i - 1).code}, # push1 - push32
|
78
|
-
*(1..16).map {|i| OP.get(OP::DUP1 + i - 1).code}, # dup1 - dup16
|
79
|
-
*(1..16).map {|i| OP.get(OP::SWAP1 + i - 1).code}] # swap1 - swap16
|
80
|
-
W_LOW = [OP::MUL, OP::DIV, OP::SDIV, OP::MOD, OP::SMOD, OP::SIGNEXTEND]
|
81
|
-
W_MID = [OP::ADDMOD, OP::MULMOD, OP::JUMP]
|
82
|
-
W_HIGH = [OP::JUMPI]
|
83
|
-
W_EXTCODE = [OP::EXTCODESIZE]
|
84
|
-
|
85
|
-
|
86
|
-
class << self
|
87
|
-
# C(σ,μ,I)
|
88
|
-
# calculate cost of current operation
|
89
|
-
def cost_of_operation(vm)
|
90
|
-
ms = vm.machine_state
|
91
|
-
instruction = vm.instruction
|
92
|
-
w = instruction.get_op(ms.pc)
|
93
|
-
if w == OP::SSTORE
|
94
|
-
cost_of_sstore(vm)
|
95
|
-
elsif w == OP::EXP && ms.get_stack(1, Integer) == 0
|
96
|
-
G_EXP
|
97
|
-
elsif w == OP::EXP && (x = ms.get_stack(1, Integer)) > 0
|
98
|
-
G_EXP + G_EXPBYTE * Utils.ceil_div(x.bit_length, 8)
|
99
|
-
elsif w == OP::CALLDATACOPY || w == OP::CODECOPY || w == OP::RETURNDATACOPY
|
100
|
-
G_VERYLOW + G_COPY * Utils.ceil_div(ms.get_stack(2, Integer), 32)
|
101
|
-
elsif w == OP::EXTCODECOPY
|
102
|
-
G_EXTCODE + G_COPY * Utils.ceil_div(ms.get_stack(3, Integer), 32)
|
103
|
-
elsif (OP::LOG0..OP::LOG4).include? w
|
104
|
-
G_LOG + G_LOGDATA * ms.get_stack(1, Integer) + (w - OP::LOG0) * G_TOPIC
|
105
|
-
elsif w == OP::CALL || w == OP::CALLCODE || w == OP::DELEGATECALL
|
106
|
-
1# cost_of_call(state, ms)
|
107
|
-
elsif w == OP::SELFDESTRUCT
|
108
|
-
cost_of_self_destruct(vm)
|
109
|
-
elsif w == OP::CREATE
|
110
|
-
G_CREATE
|
111
|
-
elsif w == OP::SHA3
|
112
|
-
G_SHA3 + G_SHA3WORD * Utils.ceil_div(ms.get_stack(1, Integer), 32)
|
113
|
-
elsif w == OP::JUMPDEST
|
114
|
-
G_JUMPDEST
|
115
|
-
elsif w == OP::SLOAD
|
116
|
-
G_SLOAD
|
117
|
-
elsif W_ZERO.include? w
|
118
|
-
G_ZERO
|
119
|
-
elsif W_BASE.include? w
|
120
|
-
G_BASE
|
121
|
-
elsif W_VERYLOW.include? w
|
122
|
-
G_VERYLOW
|
123
|
-
elsif W_LOW.include? w
|
124
|
-
G_LOW
|
125
|
-
elsif W_MID.include? w
|
126
|
-
G_MID
|
127
|
-
elsif W_HIGH.include? w
|
128
|
-
G_HIGH
|
129
|
-
elsif W_EXTCODE.include? w
|
130
|
-
G_EXTCODE
|
131
|
-
elsif w == OP::BALANCE
|
132
|
-
G_BALANCE
|
133
|
-
elsif w == OP::BLOCKHASH
|
134
|
-
G_BLOCKHASH
|
135
|
-
else
|
136
|
-
raise "can't compute cost for unknown op #{w}"
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
def cost_of_memory(i)
|
141
|
-
G_MEMORY * i + (i ** 2) / 512
|
142
|
-
end
|
143
|
-
|
144
|
-
def intrinsic_gas_of_transaction(t)
|
145
|
-
gas = (t.data.each_byte || '').reduce(0) {|sum, i| sum + i.zero? ? G_TXDATAZERO : G_TXDATANONZERO}
|
146
|
-
gas + (t.to.empty? ? G_TXCREATE : 0) + G_TRANSACTION
|
147
|
-
end
|
148
|
-
|
149
|
-
private
|
150
|
-
|
151
|
-
def cost_of_self_destruct(vm)
|
152
|
-
G_SELFDESTRUCT
|
153
|
-
end
|
154
|
-
|
155
|
-
def cost_of_call
|
156
|
-
|
157
|
-
end
|
158
|
-
|
159
|
-
def cost_of_sstore(vm)
|
160
|
-
ms = vm.machine_state
|
161
|
-
instruction = vm.instruction
|
162
|
-
|
163
|
-
key = ms.stack[0]
|
164
|
-
value = ms.stack[1]
|
165
|
-
account = vm.find_account instruction.address
|
166
|
-
|
167
|
-
value_exists = !Ciri::Utils.blank_binary?(value)
|
168
|
-
has_key = account && account.storage[key]
|
169
|
-
|
170
|
-
if value_exists && !has_key
|
171
|
-
G_SSET
|
172
|
-
else
|
173
|
-
G_RESET
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
end
|
181
|
-
end
|
182
|
-
end
|
183
|
-
end
|