Skip to content

Commit a0bdfe5

Browse files
committed
Update protobuf extvm to 'Berlin'
1 parent 4ddead8 commit a0bdfe5

File tree

5 files changed

+38
-6
lines changed

5 files changed

+38
-6
lines changed

nix/overlay.nix

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ rev: final: prev: {
1414
# ourselves instead.
1515
mantis-extvm-pb = builtins.fetchGit {
1616
url = "https://github.com/input-output-hk/mantis-extvm-pb";
17-
rev = "8f52caba70afc95ce669e9d61f773468db54557e";
17+
rev = "ae19e1fd9d3c0deba63c894be128d67e9519fe1f";
1818
};
1919

2020
writeBashChecked = final.writers.makeScriptWriter {

src/main/protobuf/extvm

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

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,17 @@ class VMClient(externalVmConfig: VmConfig.ExternalConfig, messageHandler: Messag
105105
resultMsg: msg.CallResult
106106
): ProgramResult[W, S] = {
107107
val updatedWorld = applyAccountChanges[W, S](world, resultMsg)
108+
109+
val accessedResultTuple = resultMsg.accessList
110+
.map { accessList =>
111+
val addresses: Set[Address] = accessList.addresses.map(a => a: Address).toSet
112+
val locations: Set[(Address, BigInt)] = accessList.storageLocations.map { loc =>
113+
(loc.address: Address, loc.storageLocation: BigInt)
114+
}.toSet
115+
(addresses, locations)
116+
}
117+
.getOrElse((Set.empty[Address], Set.empty[(Address, BigInt)]))
118+
108119
ProgramResult(
109120
resultMsg.returnData,
110121
resultMsg.gasRemaining,
@@ -115,8 +126,8 @@ class VMClient(externalVmConfig: VmConfig.ExternalConfig, messageHandler: Messag
115126
resultMsg.gasRefund,
116127
if (resultMsg.error) Some(OutOfGas) else None,
117128
// FIXME handle accessed addresses and storage in extVM
118-
Set.empty,
119-
Set.empty
129+
accessedResultTuple._1,
130+
accessedResultTuple._2
120131
)
121132
}
122133

@@ -155,6 +166,23 @@ class VMClient(externalVmConfig: VmConfig.ExternalConfig, messageHandler: Messag
155166
case _ => Config.Empty
156167
}
157168

169+
val txType =
170+
if (ctx.warmAddresses.isEmpty && ctx.warmStorage.isEmpty) msg.CallContext.TxType.LEGACY
171+
else msg.CallContext.TxType.ACCESSLIST
172+
173+
val extraData = txType match {
174+
case msg.CallContext.TxType.LEGACY => msg.CallContext.ExtraData.Empty
175+
case msg.CallContext.TxType.ACCESSLIST =>
176+
msg.CallContext.ExtraData.AccessList(
177+
msg
178+
.AccessListData()
179+
.withAddresses(ctx.warmAddresses.toSeq.map(_.bytes))
180+
.withStorageLocations(
181+
ctx.warmStorage.toSeq.map(x => msg.StorageEntry(address = x._1, storageLocation = x._2))
182+
)
183+
)
184+
}
185+
158186
msg.CallContext(
159187
callerAddr = ctx.callerAddr,
160188
recipientAddr = ctx.recipientAddr.map(_.bytes).getOrElse(ByteString.empty): ByteString,
@@ -163,7 +191,9 @@ class VMClient(externalVmConfig: VmConfig.ExternalConfig, messageHandler: Messag
163191
gasPrice = ctx.gasPrice,
164192
gasProvided = ctx.startGas,
165193
blockHeader = Some(blockHeader),
166-
config = config
194+
config = config,
195+
txType = txType,
196+
extraData = extraData
167197
)
168198
}
169199

@@ -178,6 +208,7 @@ class VMClient(externalVmConfig: VmConfig.ExternalConfig, messageHandler: Messag
178208
constantinopleBlockNumber = blockchainConfig.constantinopleBlockNumber,
179209
petersburgBlockNumber = blockchainConfig.petersburgBlockNumber,
180210
istanbulBlockNumber = blockchainConfig.istanbulBlockNumber,
211+
berlinBlockNumber = blockchainConfig.berlinBlockNumber,
181212
maxCodeSize = blockchainConfig.maxCodeSize.map(bigintToGByteString).getOrElse(ByteString()),
182213
accountStartNonce = blockchainConfig.accountStartNonce,
183214
chainId = ByteString(blockchainConfig.chainId)

src/test/scala/io/iohk/ethereum/extvm/VMClientSpec.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ class VMClientSpec extends AnyFlatSpec with Matchers with MockFactory {
170170
constantinopleBlockNumber = forkBlockNumbers.constantinopleBlockNumber,
171171
petersburgBlockNumber = forkBlockNumbers.petersburgBlockNumber,
172172
istanbulBlockNumber = forkBlockNumbers.istanbulBlockNumber,
173+
berlinBlockNumber = forkBlockNumbers.berlinBlockNumber,
173174
maxCodeSize = blockchainConfig.maxCodeSize.get,
174175
accountStartNonce = blockchainConfig.accountStartNonce,
175176
chainId = ByteString(blockchainConfig.chainId)

src/test/scala/io/iohk/ethereum/extvm/VMServerSpec.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ class VMServerSpec extends AnyFlatSpec with Matchers with MockFactory {
122122
chainId = ByteString(blockchainConfig.chainId)
123123
)
124124
val ethereumConfigMsg: Hello.Config.EthereumConfig = msg.Hello.Config.EthereumConfig(ethereumConfig)
125-
val helloMsg: Hello = msg.Hello(version = "2.1", config = ethereumConfigMsg)
125+
val helloMsg: Hello = msg.Hello(version = "2.2", config = ethereumConfigMsg)
126126

127127
val messageHandler: MessageHandler = mock[MessageHandler]
128128
val vmServer = new VMServer(messageHandler)

0 commit comments

Comments
 (0)