Skip to content

Commit b230309

Browse files
committed
Pass accessList in extenal EVM calls
1 parent a0bdfe5 commit b230309

File tree

2 files changed

+17
-7
lines changed

2 files changed

+17
-7
lines changed

src/main/scala/io/iohk/ethereum/extvm/VMClient.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,6 @@ class VMClient(externalVmConfig: VmConfig.ExternalConfig, messageHandler: Messag
125125
Nil,
126126
resultMsg.gasRefund,
127127
if (resultMsg.error) Some(OutOfGas) else None,
128-
// FIXME handle accessed addresses and storage in extVM
129128
accessedResultTuple._1,
130129
accessedResultTuple._2
131130
)

src/main/scala/io/iohk/ethereum/extvm/VMServer.scala

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package io.iohk.ethereum.extvm
22

33
import java.nio.ByteOrder
4-
54
import akka.NotUsed
65
import akka.actor.ActorSystem
76
import akka.stream.OverflowStrategy
@@ -17,13 +16,12 @@ import scala.annotation.tailrec
1716
import scala.util.Failure
1817
import scala.util.Success
1918
import scala.util.Try
20-
2119
import com.google.protobuf.{ByteString => GByteString}
2220
import com.typesafe.config.ConfigFactory
23-
2421
import io.iohk.ethereum.domain.Address
2522
import io.iohk.ethereum.domain.BlockHeader
2623
import io.iohk.ethereum.extvm.Implicits._
24+
import io.iohk.ethereum.extvm.msg.{AccessListData, StorageEntry}
2725
import io.iohk.ethereum.utils._
2826
import io.iohk.ethereum.vm.BlockchainConfigForEvm
2927
import io.iohk.ethereum.vm.EvmConfig
@@ -106,6 +104,7 @@ class VMServer(messageHandler: MessageHandler) extends Logger {
106104
messageHandler.close()
107105
}
108106

107+
// scalastyle:off method.length
109108
private def constructContextFromMsg(contextMsg: msg.CallContext): ProgramContext[World, Storage] = {
110109
import ByteString.{empty => irrelevant} // used for irrelevant BlockHeader fields
111110

@@ -136,6 +135,10 @@ class VMServer(messageHandler: MessageHandler) extends Logger {
136135
val recipientAddr: Option[Address] =
137136
Option(contextMsg.recipientAddr).filterNot(_.isEmpty).map(bytes => Address(bytes: ByteString))
138137

138+
val (warmAddresses: Set[Address], warmStorage: Set[(Address, BigInt)]) = contextMsg.extraData.accessList
139+
.map(extractWarmAccessList)
140+
.getOrElse((Set.empty[Address], Set.empty[(Address, BigInt)]))
141+
139142
ProgramContext(
140143
callerAddr = contextMsg.callerAddr,
141144
originAddr = contextMsg.callerAddr,
@@ -152,11 +155,19 @@ class VMServer(messageHandler: MessageHandler) extends Logger {
152155
initialAddressesToDelete = Set(),
153156
evmConfig = vmConfig,
154157
originalWorld = world,
155-
// TODO ETCM-1202 use access list from CallContext
156-
warmAddresses = Set.empty,
157-
warmStorage = Set.empty
158+
warmAddresses = warmAddresses,
159+
warmStorage = warmStorage
158160
)
159161
}
162+
// scalastyle:on method.length
163+
164+
private def extractWarmAccessList(ald: AccessListData): (Set[Address], Set[(Address, BigInt)]) = {
165+
val warmAddresses: Set[Address] = ald.addresses.toSet.map((bs: GByteString) => Address(bs: ByteString))
166+
val warmStorage: Set[(Address, BigInt)] = ald.storageLocations.toSet.map { (se: StorageEntry) =>
167+
(Address(se.address: ByteString), se.storageLocation: BigInt)
168+
}
169+
(warmAddresses, warmStorage)
170+
}
160171

161172
private def buildResultMsg(result: ProgramResult[World, Storage]): msg.CallResult = {
162173

0 commit comments

Comments
 (0)