Skip to content

Commit 34c08ed

Browse files
[ETCM-912] Add accessedAddresses and accessedStorageKeys to ProgramState
1 parent 0ff4215 commit 34c08ed

File tree

2 files changed

+29
-12
lines changed

2 files changed

+29
-12
lines changed

src/main/scala/io/iohk/ethereum/vm/PrecompiledContracts.scala

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -63,18 +63,22 @@ object PrecompiledContracts {
6363

6464
private def getContract(context: ProgramContext[_, _]): Option[PrecompiledContract] =
6565
context.recipientAddr.flatMap { addr =>
66-
val ethFork = context.evmConfig.blockchainConfig.ethForkForBlockNumber(context.blockHeader.number)
67-
val etcFork = context.evmConfig.blockchainConfig.etcForkForBlockNumber(context.blockHeader.number)
68-
69-
if (ethFork >= EthForks.Istanbul || etcFork >= EtcForks.Phoenix) {
70-
istanbulPhoenixContracts.get(addr)
71-
} else if (ethFork >= EthForks.Byzantium || etcFork >= EtcForks.Atlantis) {
72-
// byzantium and atlantis hard fork introduce the same set of precompiled contracts
73-
byzantiumAtlantisContracts.get(addr)
74-
} else
75-
contracts.get(addr)
66+
getContracts(context).get(addr)
7667
}
7768

69+
def getContracts(context: ProgramContext[_, _]): Map[Address, PrecompiledContract] = {
70+
val ethFork = context.evmConfig.blockchainConfig.ethForkForBlockNumber(context.blockHeader.number)
71+
val etcFork = context.evmConfig.blockchainConfig.etcForkForBlockNumber(context.blockHeader.number)
72+
73+
if (ethFork >= EthForks.Istanbul || etcFork >= EtcForks.Phoenix) {
74+
istanbulPhoenixContracts
75+
} else if (ethFork >= EthForks.Byzantium || etcFork >= EtcForks.Atlantis) {
76+
// byzantium and atlantis hard fork introduce the same set of precompiled contracts
77+
byzantiumAtlantisContracts
78+
} else
79+
contracts
80+
}
81+
7882
sealed trait PrecompiledContract {
7983
protected def exec(inputData: ByteString): Option[ByteString]
8084
protected def gas(inputData: ByteString, etcFork: EtcFork, ethFork: EthFork): BigInt

src/main/scala/io/iohk/ethereum/vm/ProgramState.scala

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,12 @@ object ProgramState {
1919
world = context.world,
2020
staticCtx = context.staticCtx,
2121
addressesToDelete = context.initialAddressesToDelete,
22-
originalWorld = context.originalWorld
22+
originalWorld = context.originalWorld,
23+
accessedAddresses = PrecompiledContracts.getContracts(context).keySet ++ Set(
24+
context.originAddr,
25+
context.recipientAddr.getOrElse(context.callerAddr)
26+
),
27+
accessedStorageKeys = Set.empty
2328
)
2429
}
2530

@@ -58,7 +63,9 @@ case class ProgramState[W <: WorldStateProxy[W, S], S <: Storage[S]](
5863
halted: Boolean = false,
5964
staticCtx: Boolean = false,
6065
error: Option[ProgramError] = None,
61-
originalWorld: W
66+
originalWorld: W,
67+
accessedAddresses: Set[Address],
68+
accessedStorageKeys: Set[(Address, BigInt)]
6269
) {
6370

6471
def config: EvmConfig = env.evmConfig
@@ -126,6 +133,12 @@ case class ProgramState[W <: WorldStateProxy[W, S], S <: Storage[S]](
126133
def revert(data: ByteString): ProgramState[W, S] =
127134
copy(error = Some(RevertOccurs), returnData = data, halted = true)
128135

136+
def addAccessedAddress(addr: Address): ProgramState[W, S] =
137+
copy(accessedAddresses = accessedAddresses.+(addr))
138+
139+
def addAccessedStorageKey(addr: Address, storageKey: BigInt): ProgramState[W, S] =
140+
copy(accessedStorageKeys = accessedStorageKeys.+((addr, storageKey)))
141+
129142
def toResult: ProgramResult[W, S] =
130143
ProgramResult[W, S](
131144
returnData,

0 commit comments

Comments
 (0)