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

Commit 427e4fb

Browse files
vubvub
authored andcommitted
EIP 86
1 parent f1cf0fa commit 427e4fb

File tree

3 files changed

+30
-7
lines changed

3 files changed

+30
-7
lines changed

ethereum/config.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@
4646
# Homestead fork
4747
HOMESTEAD_FORK_BLKNUM=1150000,
4848
HOMESTEAD_DIFF_ADJUSTMENT_CUTOFF=10,
49+
# Metropolis fork
50+
METROPOLIS_FORK_BLKNUM=9999999,
51+
METROPOLIS_ENTRY_POINT=2**160 - 1,
4952
)
5053
assert default_config['NEPHEW_REWARD'] == \
5154
default_config['BLOCK_REWARD'] // 32

ethereum/processblock.py

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
from ethereum import bloom
99
from ethereum import vm as vm
1010
from ethereum.exceptions import *
11-
from ethereum.utils import safe_ord, normalize_address, mk_contract_address
11+
from ethereum.utils import safe_ord, normalize_address, mk_contract_address, \
12+
mk_metropolis_contract_address, int_to_addr, big_endian_to_int
1213
from ethereum import transactions
1314
import ethereum.config as config
1415

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

8182
# (1) The transaction signature is valid;
8283
if not tx.sender: # sender is set and validated on Transaction initialization
83-
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)
8488
if block.number >= config.default_config["HOMESTEAD_FORK_BLKNUM"]:
8589
tx.check_low_s()
8690

@@ -197,6 +201,8 @@ def __init__(self, block, tx):
197201
self.get_code = block.get_code
198202
self.get_balance = block.get_balance
199203
self.set_balance = block.set_balance
204+
self.get_nonce = block.get_nonce
205+
self.set_nonce = block.set_nonce
200206
self.set_storage_data = block.set_storage_data
201207
self.get_storage_data = block.get_storage_data
202208
self.log_storage = lambda x: block.account_to_dict(x)['storage']
@@ -274,10 +280,21 @@ def create_contract(ext, msg):
274280
log_msg.debug('CONTRACT CREATION')
275281
#print('CREATING WITH GAS', msg.gas)
276282
sender = decode_hex(msg.sender) if len(msg.sender) == 40 else msg.sender
277-
if ext.tx_origin != msg.sender:
278-
ext._block.increment_nonce(msg.sender)
279-
nonce = utils.encode_int(ext._block.get_nonce(msg.sender) - 1)
280-
msg.to = mk_contract_address(sender, nonce)
283+
code = msg.data.extract_all()
284+
if ext._block.number >= ext._block.METROPOLIS_FORK_BLKNUM:
285+
msg.to = mk_metropolis_contract_address(msg.sender, code)
286+
if ext.get_code(msg.to):
287+
if ext.get_nonce(msg.to) >= 2**40:
288+
ext.set_nonce(msg.to, (ext.get_nonce(msg.to) + 1) % 2**160)
289+
msg.to = normalize_address((ext.get_nonce(msg.to) - 1) % 2**160)
290+
else:
291+
ext.set_nonce(msg.to, (big_endian_to_int(msg.to) + 2) % 2**160)
292+
msg.to = normalize_address((ext.get_nonce(msg.to) - 1) % 2**160)
293+
else:
294+
if ext.tx_origin != msg.sender:
295+
ext._block.increment_nonce(msg.sender)
296+
nonce = utils.encode_int(ext._block.get_nonce(msg.sender) - 1)
297+
msg.to = mk_contract_address(sender, nonce)
281298
b = ext.get_balance(msg.to)
282299
if b > 0:
283300
ext.set_balance(msg.to, b)
@@ -286,7 +303,6 @@ def create_contract(ext, msg):
286303
ext._block.reset_storage(msg.to)
287304
msg.is_create = True
288305
# assert not ext.get_code(msg.to)
289-
code = msg.data.extract_all()
290306
msg.data = vm.CallData([], 0, 0)
291307
snapshot = ext._block.snapshot()
292308
res, gas, dat = _apply_msg(ext, msg, code)

ethereum/utils.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ def to_string_for_regexp(value):
6262
def mk_contract_address(sender, nonce):
6363
return sha3(rlp.encode([normalize_address(sender), nonce]))[12:]
6464

65+
def mk_metropolis_contract_address(sender, initcode):
66+
return sha3(normalize_address(sender) + initcode)[12:]
6567

6668
def safe_ord(value):
6769
if isinstance(value, int):
@@ -136,6 +138,8 @@ def check_and_strip_checksum(x):
136138

137139

138140
def normalize_address(x, allow_blank=False):
141+
if isinstance(x, (int, long)):
142+
return int_to_addr(x)
139143
if allow_blank and x == '':
140144
return ''
141145
if len(x) in (42, 50) and x[:2] == '0x':

0 commit comments

Comments
 (0)