Skip to content
This repository was archived by the owner on May 23, 2023. It is now read-only.

Commit 64e9f63

Browse files
authored
Merge pull request #439 from LefterisJP/correct_turing
Shouldn't have a number equal to 2^256 in EVM
2 parents ff0f149 + cfd86bf commit 64e9f63

File tree

3 files changed

+81
-45
lines changed

3 files changed

+81
-45
lines changed

ethereum/blocks.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,15 @@
1515
from ethereum.pruning_trie import Trie
1616
from ethereum.securetrie import SecureTrie
1717
from ethereum import utils
18-
from ethereum.utils import address, int256, trie_root, hash32, to_string, big_endian_to_int
18+
from ethereum.utils import (
19+
address,
20+
int256,
21+
trie_root,
22+
hash32,
23+
to_string,
24+
big_endian_to_int,
25+
TT256,
26+
)
1927
from ethereum import processblock
2028
from ethereum.transactions import Transaction
2129
from ethereum import bloom
@@ -30,7 +38,6 @@
3038
else:
3139
from functools import lru_cache
3240

33-
3441
log = get_logger('eth.block')
3542
log_state = get_logger('eth.msg.state')
3643
Log = processblock.Log
@@ -920,7 +927,10 @@ def get_balance(self, address):
920927
921928
:param address: the address of the account (binary or hex string)
922929
"""
923-
return self._get_acct_item(address, 'balance')
930+
balance = self._get_acct_item(address, 'balance')
931+
if balance >= TT256:
932+
raise ValueError("balance too high")
933+
return balance
924934

925935
def set_balance(self, address, value):
926936
"""Set the balance of an account.
@@ -929,6 +939,8 @@ def set_balance(self, address, value):
929939
:param value: the new balance
930940
:returns: `True` if successful, otherwise `False`
931941
"""
942+
if value >= TT256:
943+
raise ValueError("value too high")
932944
self._set_acct_item(address, 'balance', value)
933945

934946
def delta_balance(self, address, value):
@@ -950,7 +962,7 @@ def transfer_value(self, from_addr, to_addr, value):
950962
:param value: the (positive) value to send
951963
:returns: `True` if successful, otherwise `False`
952964
"""
953-
assert value >= 0
965+
assert value >= 0 and value < TT256
954966
if self.delta_balance(from_addr, -value):
955967
return self.delta_balance(to_addr, value)
956968
return False

ethereum/tests/test_chain.py

Lines changed: 63 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@
66
from rlp.utils import decode_hex
77
from ethereum.utils import encode_hex
88
import ethereum.ethpow as ethpow
9-
import ethereum.utils as utils
9+
from ethereum.utils import (
10+
sha3,
11+
privtoaddr,
12+
denoms,
13+
dump_state,
14+
)
1015
from ethereum.chain import Chain
1116
from ethereum.db import EphemDB
1217
from ethereum.tests.utils import new_db
@@ -29,10 +34,10 @@ def env(db):
2934

3035
@pytest.fixture(scope="module")
3136
def accounts():
32-
k = utils.sha3(b'cow')
33-
v = utils.privtoaddr(k)
34-
k2 = utils.sha3(b'horse')
35-
v2 = utils.privtoaddr(k2)
37+
k = sha3(b'cow')
38+
v = privtoaddr(k)
39+
k2 = sha3(b'horse')
40+
v2 = privtoaddr(k2)
3641
return k, v, k2, v2
3742

3843

@@ -106,7 +111,7 @@ def get_transaction(gasprice=0, nonce=0):
106111
k, v, k2, v2 = accounts()
107112
tx = transactions.Transaction(
108113
nonce, gasprice, startgas=100000,
109-
to=v2, value=utils.denoms.finney * 10, data='').sign(k)
114+
to=v2, value=denoms.finney * 10, data='').sign(k)
110115
return tx
111116

112117

@@ -115,9 +120,19 @@ def store_block(blk):
115120
assert blocks.get_block(env(blk.db), blk.hash) == blk
116121

117122

118-
def test_transfer(db):
123+
@pytest.mark.parametrize('balance', [
124+
denoms.wei * 10000,
125+
denoms.babbage,
126+
denoms.lovelace,
127+
denoms.shannon,
128+
denoms.szabo,
129+
denoms.finney,
130+
denoms.ether,
131+
denoms.turing
132+
])
133+
def test_transfer(db, balance):
119134
k, v, k2, v2 = accounts()
120-
blk = blocks.genesis(env(db), start_alloc={v: {"balance": utils.denoms.ether * 1}})
135+
blk = blocks.genesis(env(db), start_alloc={v: {"balance": balance}})
121136
b_v = blk.get_balance(v)
122137
b_v2 = blk.get_balance(v2)
123138
value = 42
@@ -127,12 +142,20 @@ def test_transfer(db):
127142
assert blk.get_balance(v2) == b_v2 + value
128143

129144

145+
def test_alloc_too_big(db):
146+
k, v, k2, v2 = accounts()
147+
blk = None
148+
with pytest.raises(ValueError):
149+
blk = blocks.genesis(env(db), start_alloc={v: {"balance": 2 ** 256}})
150+
assert blk is None
151+
152+
130153
def test_failing_transfer(db):
131154
k, v, k2, v2 = accounts()
132-
blk = blocks.genesis(env(db), start_alloc={v: {"balance": utils.denoms.ether * 1}})
155+
blk = blocks.genesis(env(db), start_alloc={v: {"balance": denoms.ether * 1}})
133156
b_v = blk.get_balance(v)
134157
b_v2 = blk.get_balance(v2)
135-
value = utils.denoms.ether * 2
158+
value = denoms.ether * 2
136159
# should fail
137160
success = blk.transfer_value(v, v2, value)
138161
assert not success
@@ -149,19 +172,19 @@ def test_serialize_block(db):
149172

150173
def test_genesis(db, alt_db):
151174
k, v, k2, v2 = accounts()
152-
blk = blocks.genesis(env(db), start_alloc={v: {"balance": utils.denoms.ether * 1}})
175+
blk = blocks.genesis(env(db), start_alloc={v: {"balance": denoms.ether * 1}})
153176
# sr = blk.state_root
154177
assert blk.state.db.db == db.db
155178
db.put(blk.hash, rlp.encode(blk))
156179
blk.state.db.commit()
157180
# assert sr in db
158181
db.commit()
159182
# assert sr in db
160-
blk2 = blocks.genesis(env(db), start_alloc={v: {"balance": utils.denoms.ether * 1}})
183+
blk2 = blocks.genesis(env(db), start_alloc={v: {"balance": denoms.ether * 1}})
161184
blk3 = blocks.genesis(env(db))
162185
assert blk == blk2
163186
assert blk != blk3
164-
blk2 = blocks.genesis(env(alt_db), start_alloc={v: {"balance": utils.denoms.ether * 1}})
187+
blk2 = blocks.genesis(env(alt_db), start_alloc={v: {"balance": denoms.ether * 1}})
165188
blk3 = blocks.genesis(env(alt_db))
166189
assert blk == blk2
167190
assert blk != blk3
@@ -184,21 +207,21 @@ def test_deserialize_commit(db):
184207

185208
def test_genesis_db(db, alt_db):
186209
k, v, k2, v2 = accounts()
187-
blk = blocks.genesis(env(db), start_alloc={v: {"balance": utils.denoms.ether * 1}})
210+
blk = blocks.genesis(env(db), start_alloc={v: {"balance": denoms.ether * 1}})
188211
store_block(blk)
189-
blk2 = blocks.genesis(env(db), start_alloc={v: {"balance": utils.denoms.ether * 1}})
212+
blk2 = blocks.genesis(env(db), start_alloc={v: {"balance": denoms.ether * 1}})
190213
blk3 = blocks.genesis(env(db))
191214
assert blk == blk2
192215
assert blk != blk3
193-
blk2 = blocks.genesis(env(alt_db), start_alloc={v: {"balance": utils.denoms.ether * 1}})
216+
blk2 = blocks.genesis(env(alt_db), start_alloc={v: {"balance": denoms.ether * 1}})
194217
blk3 = blocks.genesis(env(alt_db))
195218
assert blk == blk2
196219
assert blk != blk3
197220

198221

199222
def test_mine_block(db):
200223
k, v, k2, v2 = accounts()
201-
blk = mkquickgenesis({v: {"balance": utils.denoms.ether * 1}}, db)
224+
blk = mkquickgenesis({v: {"balance": denoms.ether * 1}}, db)
202225
store_block(blk)
203226
blk2 = mine_next_block(blk, coinbase=v)
204227
store_block(blk2)
@@ -220,21 +243,21 @@ def test_block_serialization_with_transaction_empty_genesis(db):
220243

221244
def test_mine_block_with_transaction(db):
222245
k, v, k2, v2 = accounts()
223-
blk = mkquickgenesis({v: {"balance": utils.denoms.ether * 1}}, db=db)
246+
blk = mkquickgenesis({v: {"balance": denoms.ether * 1}}, db=db)
224247
store_block(blk)
225248
tx = get_transaction()
226249
blk = mine_next_block(blk, transactions=[tx])
227250
assert tx in blk.get_transactions()
228251
assert blk.get_transaction(0) == tx
229252
with pytest.raises(IndexError):
230253
blk.get_transaction(1)
231-
assert blk.get_balance(v) == utils.denoms.finney * 990
232-
assert blk.get_balance(v2) == utils.denoms.finney * 10
254+
assert blk.get_balance(v) == denoms.finney * 990
255+
assert blk.get_balance(v2) == denoms.finney * 10
233256

234257

235258
def test_mine_block_with_transaction2(db):
236259
k, v, k2, v2 = accounts()
237-
blk = mkquickgenesis({v: {"balance": utils.denoms.ether * 1}}, db)
260+
blk = mkquickgenesis({v: {"balance": denoms.ether * 1}}, db)
238261
store_block(blk)
239262
tx = get_transaction()
240263
blk2 = mine_next_block(blk, coinbase=v, transactions=[tx])
@@ -253,18 +276,18 @@ def test_mine_block_with_transaction2(db):
253276

254277
def test_mine_block_with_transaction3(db):
255278
k, v, k2, v2 = accounts()
256-
blk = mkquickgenesis({v: {"balance": utils.denoms.ether * 1}}, db)
279+
blk = mkquickgenesis({v: {"balance": denoms.ether * 1}}, db)
257280
store_block(blk)
258281
tx = get_transaction()
259282
blk = mine_next_block(blk, transactions=[tx])
260283
assert tx in blk.get_transactions()
261-
assert blk.get_balance(v) == utils.denoms.finney * 990
262-
assert blk.get_balance(v2) == utils.denoms.finney * 10
284+
assert blk.get_balance(v) == denoms.finney * 990
285+
assert blk.get_balance(v2) == denoms.finney * 10
263286

264287

265288
def test_block_serialization_same_db(db):
266289
k, v, k2, v2 = accounts()
267-
blk = mkquickgenesis({v: {"balance": utils.denoms.ether * 1}}, db)
290+
blk = mkquickgenesis({v: {"balance": denoms.ether * 1}}, db)
268291
assert blk.hash == rlp.decode(rlp.encode(blk), blocks.Block, env=env(db)).hash
269292
store_block(blk)
270293
blk2 = mine_next_block(blk)
@@ -299,20 +322,20 @@ def test_block_serialization_with_transaction_other_db():
299322
k, v, k2, v2 = accounts()
300323
a_db, b_db = db(), db()
301324
# mine two blocks
302-
a_blk = mkquickgenesis({v: {"balance": utils.denoms.ether * 1}}, db=a_db)
325+
a_blk = mkquickgenesis({v: {"balance": denoms.ether * 1}}, db=a_db)
303326
store_block(a_blk)
304327
tx = get_transaction()
305328
logger.debug('a: state_root before tx %r' % hx(a_blk.state_root))
306-
logger.debug('a: state:\n%s' % utils.dump_state(a_blk.state))
329+
logger.debug('a: state:\n%s' % dump_state(a_blk.state))
307330
a_blk2 = mine_next_block(a_blk, transactions=[tx])
308331
logger.debug('a: state_root after tx %r' % hx(a_blk2.state_root))
309-
logger.debug('a: state:\n%s' % utils.dump_state(a_blk2.state))
332+
logger.debug('a: state:\n%s' % dump_state(a_blk2.state))
310333
assert tx in a_blk2.get_transactions()
311334
store_block(a_blk2)
312335
assert tx in a_blk2.get_transactions()
313336
logger.debug('preparing receiving chain ---------------------')
314337
# receive in other db
315-
b_blk = mkquickgenesis({v: {"balance": utils.denoms.ether * 1}}, b_db)
338+
b_blk = mkquickgenesis({v: {"balance": denoms.ether * 1}}, b_db)
316339
store_block(b_blk)
317340

318341
assert b_blk.number == 0
@@ -332,15 +355,15 @@ def test_block_serialization_with_transaction_other_db():
332355

333356
def test_transaction(db):
334357
k, v, k2, v2 = accounts()
335-
blk = mkquickgenesis({v: {"balance": utils.denoms.ether * 1}}, db=db)
358+
blk = mkquickgenesis({v: {"balance": denoms.ether * 1}}, db=db)
336359
store_block(blk)
337360
blk = mine_next_block(blk)
338361
tx = get_transaction()
339362
assert tx not in blk.get_transactions()
340363
success, res = processblock.apply_transaction(blk, tx)
341364
assert tx in blk.get_transactions()
342-
assert blk.get_balance(v) == utils.denoms.finney * 990
343-
assert blk.get_balance(v2) == utils.denoms.finney * 10
365+
assert blk.get_balance(v) == denoms.finney * 990
366+
assert blk.get_balance(v2) == denoms.finney * 10
344367

345368

346369
def test_transaction_serialization():
@@ -353,12 +376,12 @@ def test_transaction_serialization():
353376

354377
def test_invalid_transaction(db):
355378
k, v, k2, v2 = accounts()
356-
blk = mkquickgenesis({v2: {"balance": utils.denoms.ether * 1}}, db=db)
379+
blk = mkquickgenesis({v2: {"balance": denoms.ether * 1}}, db=db)
357380
store_block(blk)
358381
tx = get_transaction()
359382
blk = mine_next_block(blk, transactions=[tx])
360383
assert blk.get_balance(v) == 0
361-
assert blk.get_balance(v2) == utils.denoms.ether * 1
384+
assert blk.get_balance(v2) == denoms.ether * 1
362385
assert tx not in blk.get_transactions()
363386

364387

@@ -371,7 +394,7 @@ def test_prevhash(db):
371394

372395
def test_genesis_chain(db):
373396
k, v, k2, v2 = accounts()
374-
blk = mkquickgenesis({v: {"balance": utils.denoms.ether * 1}}, db=db)
397+
blk = mkquickgenesis({v: {"balance": denoms.ether * 1}}, db=db)
375398
chain = Chain(env=env(blk.db), genesis=blk)
376399

377400
assert chain.has_block(blk.hash)
@@ -392,7 +415,7 @@ def test_genesis_chain(db):
392415

393416
def test_simple_chain(db):
394417
k, v, k2, v2 = accounts()
395-
blk = mkquickgenesis({v: {"balance": utils.denoms.ether * 1}}, db=db)
418+
blk = mkquickgenesis({v: {"balance": denoms.ether * 1}}, db=db)
396419
store_block(blk)
397420
chain = Chain(env=env(blk.db), genesis=blk)
398421
tx = get_transaction()
@@ -437,15 +460,15 @@ def test_add_side_chain(db, alt_db):
437460
"""
438461
k, v, k2, v2 = accounts()
439462
# Remote: mine one block
440-
R0 = mkquickgenesis({v: {"balance": utils.denoms.ether * 1}}, db=db)
463+
R0 = mkquickgenesis({v: {"balance": denoms.ether * 1}}, db=db)
441464
store_block(R0)
442465
tx0 = get_transaction(nonce=0)
443466
R1 = mine_next_block(R0, transactions=[tx0])
444467
store_block(R1)
445468
assert tx0.hash in [x.hash for x in R1.get_transactions()]
446469

447470
# Local: mine two blocks
448-
L0 = mkquickgenesis({v: {"balance": utils.denoms.ether * 1}}, alt_db)
471+
L0 = mkquickgenesis({v: {"balance": denoms.ether * 1}}, alt_db)
449472
chain = Chain(env=env(L0.db), genesis=L0)
450473
tx0 = get_transaction(nonce=0)
451474
L1 = mine_next_block(L0, transactions=[tx0])
@@ -470,7 +493,7 @@ def test_add_longer_side_chain(db, alt_db):
470493
"""
471494
k, v, k2, v2 = accounts()
472495
# Remote: mine one block
473-
blk = mkquickgenesis({v: {"balance": utils.denoms.ether * 1}}, db=db)
496+
blk = mkquickgenesis({v: {"balance": denoms.ether * 1}}, db=db)
474497
store_block(blk)
475498
remote_blocks = [blk]
476499
for i in range(3):
@@ -479,7 +502,7 @@ def test_add_longer_side_chain(db, alt_db):
479502
store_block(blk)
480503
remote_blocks.append(blk)
481504
# Local: mine two blocks
482-
L0 = mkquickgenesis({v: {"balance": utils.denoms.ether * 1}}, db=alt_db)
505+
L0 = mkquickgenesis({v: {"balance": denoms.ether * 1}}, db=alt_db)
483506
chain = Chain(env=env(L0.db), genesis=L0)
484507
tx0 = get_transaction(nonce=0)
485508
L1 = mine_next_block(L0, transactions=[tx0])

ethereum/utils.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,8 @@ def __init__(self):
481481
self.szabo = 10 ** 12
482482
self.finney = 10 ** 15
483483
self.ether = 10 ** 18
484-
self.turing = 2 ** 256
484+
self.turing = 2 ** 256 - 1
485+
485486

486487
denoms = Denoms()
487488

0 commit comments

Comments
 (0)