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

Commit 9188be1

Browse files
vubkonradkonrad
authored andcommitted
EIP 86
Cherry-pick 427e4fb
1 parent cd24f18 commit 9188be1

File tree

2 files changed

+26
-9
lines changed

2 files changed

+26
-9
lines changed

ethereum/processblock.py

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
from ethereum import specials
88
from ethereum import bloom
99
from ethereum import vm as vm
10-
from ethereum.exceptions import InvalidNonce, InsufficientStartGas, UnsignedTransaction, \
11-
BlockGasLimitReached, InsufficientBalance
12-
from ethereum.utils import safe_ord, mk_contract_address
10+
from ethereum.exceptions import *
11+
from ethereum.utils import safe_ord, normalize_address, mk_contract_address, \
12+
mk_metropolis_contract_address, int_to_addr, big_endian_to_int
1313
from ethereum import transactions
1414
import ethereum.config as config
1515

@@ -81,7 +81,10 @@ def rp(what, actual, target):
8181

8282
# (1) The transaction signature is valid;
8383
if not tx.sender: # sender is set and validated on Transaction initialization
84-
raise UnsignedTransaction(tx)
84+
if block.number >= config.default_config["METROPOLIS_FORK_BLKNUM"]:
85+
tx._sender = normalize_address(config.default_config["METROPOLIS_ENTRY_POINT"])
86+
else:
87+
raise UnsignedTransaction(tx)
8588
if block.number >= config.default_config["HOMESTEAD_FORK_BLKNUM"]:
8689
tx.check_low_s()
8790

@@ -222,6 +225,8 @@ def __init__(self, block, tx):
222225
self.get_code = block.get_code
223226
self.get_balance = block.get_balance
224227
self.set_balance = block.set_balance
228+
self.get_nonce = block.get_nonce
229+
self.set_nonce = block.set_nonce
225230
self.set_storage_data = block.set_storage_data
226231
self.get_storage_data = block.get_storage_data
227232
self.log_storage = lambda x: block.account_to_dict(x)['storage']
@@ -299,10 +304,21 @@ def create_contract(ext, msg):
299304
log_msg.debug('CONTRACT CREATION')
300305
#print('CREATING WITH GAS', msg.gas)
301306
sender = decode_hex(msg.sender) if len(msg.sender) == 40 else msg.sender
302-
if ext.tx_origin != msg.sender:
303-
ext._block.increment_nonce(msg.sender)
304-
nonce = utils.encode_int(ext._block.get_nonce(msg.sender) - 1)
305-
msg.to = mk_contract_address(sender, nonce)
307+
code = msg.data.extract_all()
308+
if ext._block.number >= ext._block.METROPOLIS_FORK_BLKNUM:
309+
msg.to = mk_metropolis_contract_address(msg.sender, code)
310+
if ext.get_code(msg.to):
311+
if ext.get_nonce(msg.to) >= 2**40:
312+
ext.set_nonce(msg.to, (ext.get_nonce(msg.to) + 1) % 2**160)
313+
msg.to = normalize_address((ext.get_nonce(msg.to) - 1) % 2**160)
314+
else:
315+
ext.set_nonce(msg.to, (big_endian_to_int(msg.to) + 2) % 2**160)
316+
msg.to = normalize_address((ext.get_nonce(msg.to) - 1) % 2**160)
317+
else:
318+
if ext.tx_origin != msg.sender:
319+
ext._block.increment_nonce(msg.sender)
320+
nonce = utils.encode_int(ext._block.get_nonce(msg.sender) - 1)
321+
msg.to = mk_contract_address(sender, nonce)
306322
b = ext.get_balance(msg.to)
307323
if b > 0:
308324
ext.set_balance(msg.to, b)
@@ -311,7 +327,6 @@ def create_contract(ext, msg):
311327
ext._block.reset_storage(msg.to)
312328
msg.is_create = True
313329
# assert not ext.get_code(msg.to)
314-
code = msg.data.extract_all()
315330
msg.data = vm.CallData([], 0, 0)
316331
snapshot = ext._block.snapshot()
317332
res, gas, dat = _apply_msg(ext, msg, code)

ethereum/utils.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ def bytearray_to_bytestr(value):
6868
def mk_contract_address(sender, nonce):
6969
return sha3(rlp.encode([normalize_address(sender), nonce]))[12:]
7070

71+
def mk_metropolis_contract_address(sender, initcode):
72+
return sha3(normalize_address(sender) + initcode)[12:]
7173

7274
def safe_ord(value):
7375
if isinstance(value, int):

0 commit comments

Comments
 (0)