-
Notifications
You must be signed in to change notification settings - Fork 46
Description
Assume the following:
token.balance_of('stu') = 10
def transfer(from, to, amount):
from_balance = get_balance_row(from)
to_balance = get_balance_row(to)
if from_balance >= amount:
write_balance_row(to, to_balance + amount)
write_balance_row(from, from_balance - amount)
rows affected in order:
[
(READ, from),
(READ, to),
(WRITE, to),
(WRITE, from)
]
Subtree block from MN-Africa:
transfer('raghu', 'stu', 1)
[
(READ, 'raghu'),
(READ, 'stu'),
(WRITE, 'stu'),
(WRITE, 'raghu')
]
Subtree block from MN-Asia:
transfer('stu', 'davis', 1)
[
(READ, 'stu'),
(READ, 'davis'),
(WRITE, 'davis'),
(WRITE, 'stu')
]
Subtree block from MN-America:
def funky_town(from, to_1, to_2, to_3):
from_balance = get_balance_row(from)
if from_balance < 10:
transfer(from, to_1)
elif from_balance > 10:
transfer(from, to_2)
else: # balance == 10
transfer(from, to_3)
funky_town('stuart', 'raghu', 'davis', 'falcon'
Delegate Africa gets subtrees in order:
transfer('raghu', 'stu', 10)
transfer('stu', 'davis', 1)
funky_town('stuart', 'raghu', 'davis', 'falcon'
rows affected:
[
(READ, 'raghu'),
(READ, 'stu'),
(WRITE, 'stu'),
(WRITE, 'raghu')
],
[
(READ, 'stu'),
(READ, 'davis'),
(WRITE, 'davis'),
(WRITE, 'stu')
],
[ # funky_town
(READ, 'stu'), # balance == 19, transfer to falcon
(READ, 'stu'),
(READ, 'raghu'),
(WRITE, 'raghu'),
(WRITE, 'stu')
]
Delegate Asia gets subtrees in order:
transfer('stu', 'davis', 1)
funky_town('stuart', 'raghu', 'davis', 'falcon'
transfer('raghu', 'stu', 10)
rows affected:
[
(READ, 'stu'),
(READ, 'davis'),
(WRITE, 'davis'),
(WRITE, 'stu')
],
[ # funky_town
(READ, 'stu'), # balance == 9, transfer to davis
(READ, 'stu'),
(READ, 'davis'),
(WRITE, 'davis'),
(WRITE, 'stu')
],
[
(READ, 'raghu'),
(READ, 'stu'),
(WRITE, 'stu'),
(WRITE, 'raghu')
]
Delegate America gets subtrees in order:
funky_town('stuart', 'raghu', 'davis', 'falcon'
transfer('raghu', 'stu', 1)
transfer('stu', 'davis', 1)
rows affected:
[ # funky_town
(READ, 'stu'), # balance == 10, transfer to falcon
(READ, 'stu'),
(READ, 'falcon'),
(WRITE, 'falcon'),
(WRITE, 'stu')
],
[
(READ, 'raghu'),
(READ, 'stu'),
(WRITE, 'stu'),
(WRITE, 'raghu')
],
[
(READ, 'stu'),
(READ, 'davis'),
(WRITE, 'davis'),
(WRITE, 'stu')
]
Under this system, by describing smart contracts as READs and WRITEs, we can find the collisions and rerun them.