Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix(standalone): properly compute runtime random value #863

Merged
merged 1 commit into from
Nov 7, 2023

Conversation

birchmd
Copy link
Member

@birchmd birchmd commented Nov 7, 2023

Description

The Near runtime has a random value available to smart contracts via a cost function. Aurora exposes that random value to EVM smart contracts in two ways: (1) via a custom precompile, and (2) via EVM opcode 0x44 since it was changed from DIFFICULTY to PREVRANDAO after the merge. Therefore it is important for the standalone engine to be able to correctly provide the same random value as would be present on-chain.

In this PR I fix the standalone engine to be able to correctly reproduce the Near runtime random value based on the implementation present in nearcore. There will also be a follow-up PR to borealis-engine-lib to make use of this change in the Borealis Engine there.

The random value is computed as sha256(block_random_value || action_hash) where the block_random_value comes from the protocol-level VRF (this was the value which previously we were using directly) and the action_hash is derived from the (FunctionCall) Action that is being executed in the Near runtime. To have the action_hash available to the standalone engine I am adding a new field to TransactionMessage which stores this value.

In the tests the action_hash field is populated in a reasonable way, but not exactly as it would be in nearcore because there is no actual Action (we skip straight to the Wasm execution). However, in the follow-up PR in borealis-engine-lib the field will be populated from the Near data. Once this change is made, it will fix a bug in Borealis Engine where it was not correctly reproducing the execution of contracts involving randomness.

Performance / NEAR gas cost considerations

N/A : change is to standalone engine only.

Testing

The test for the random precompile has been updated to reflect this change. A test related to tracing is also changed to no longer depend on the randomness precompile because the test did not rely on the specifics of which precompile was used and now using randomness in the tests has extra setup steps.

@birchmd birchmd added C-bug Category: Something isn't working. A-standalone Area: the standalone engine EVM labels Nov 7, 2023
@birchmd birchmd requested a review from aleksuss November 7, 2023 16:51
@birchmd birchmd requested a review from mrLSD as a code owner November 7, 2023 16:51
Copy link
Member

@aleksuss aleksuss left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good work 👍🏻

@mrLSD
Copy link
Member

mrLSD commented Nov 7, 2023

LGTM!

@aleksuss aleksuss added this pull request to the merge queue Nov 7, 2023
Merged via the queue into develop with commit 4527320 Nov 7, 2023
24 checks passed
@aleksuss aleksuss deleted the fix/birchmd/standalone-random branch November 7, 2023 17:19
aleksuss pushed a commit that referenced this pull request Nov 28, 2023
## Description

The Near runtime has a random value available to smart contracts via a
cost function. Aurora exposes that random value to EVM smart contracts
in two ways: (1) via a custom precompile, and (2) via [EVM opcode
0x44](https://www.evm.codes/#44?fork=shanghai) since it was changed from
`DIFFICULTY` to `PREVRANDAO` after the merge. Therefore it is important
for the standalone engine to be able to correctly provide the same
random value as would be present on-chain.

In this PR I fix the standalone engine to be able to correctly reproduce
the Near runtime random value based on the implementation present in
nearcore. There will also be a follow-up PR to `borealis-engine-lib` to
make use of this change in the Borealis Engine there.

The random value is computed as `sha256(block_random_value ||
action_hash)` where the `block_random_value` comes from the
protocol-level VRF (this was the value which previously we were using
directly) and the `action_hash` is derived from the (`FunctionCall`)
`Action` that is being executed in the Near runtime. To have the
`action_hash` available to the standalone engine I am adding a new field
to `TransactionMessage` which stores this value.

In the tests the `action_hash` field is populated in a reasonable way,
but not exactly as it would be in nearcore because there is no actual
`Action` (we skip straight to the Wasm execution). However, in the
follow-up PR in `borealis-engine-lib` the field will be populated from
the Near data. Once this change is made, it will fix a bug in Borealis
Engine where it was not correctly reproducing the execution of contracts
involving randomness.

## Performance / NEAR gas cost considerations

N/A : change is to standalone engine only.

## Testing

The test for the random precompile has been updated to reflect this
change. A test related to tracing is also changed to no longer depend on
the randomness precompile because the test did not rely on the specifics
of which precompile was used and now using randomness in the tests has
extra setup steps.
@aleksuss aleksuss mentioned this pull request Nov 28, 2023
aleksuss added a commit that referenced this pull request Nov 28, 2023
## [3.4.0] 2023-11-28

### Additions

- Added a possibility to pass initialize arguments in json format to the
`new` transaction by [@aleksuss]. ([#871])
- The `SubmitResult` was made available for `ft_on_transfer`
transactions in the standalone engine by [@birchmd]. ([#869])
- The order of producing the exit precompile and XCC promises has been
changed to sequential by [@birchmd]. ([#868])

### Changes

- Removed the code hidden behind the feature that isn't used anymore by
[@joshuajbouw]. ([#870])
- The logic of unwrapping wNEAR has been changed to the Bridge's native
by [@birchmd]. ([#867])
- Bumped the `near-workspaces` to 0.9 by [@aleksuss]. ([#862])

### Fixes

- Add a method for upgrading XCC router contract by [@birchmd]. ([#866])
- Fixed a potential panic in the `ExitToNear` precompile by
[@guidovranken]. ([#865])
- Fixed a behaviour when the `ft_transfer` could occur before the
`near_withdraw` by [@birchmd]. ([#864])
- Fixed correctness of reproducing the NEAR runtime random value in the
standalone engine by [@birchmd]. ([#863])

[#862]: #862
[#863]: #863
[#864]: #864
[#865]: #865
[#866]: #866
[#867]: #867
[#868]: #868
[#869]: #869
[#870]: #870
[#871]: #871

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Michael Birch <michael.birch@aurora.dev>
Co-authored-by: Guido Vranken <guidovranken@users.noreply.github.com>
Co-authored-by: Joshua J. Bouw <joshua@aurora.dev>
aleksuss added a commit that referenced this pull request Nov 28, 2023
## [3.4.0] 2023-11-28

### Additions

- Added a possibility to pass initialize arguments in json format to the
`new` transaction by [@aleksuss]. ([#871])
- The `SubmitResult` was made available for `ft_on_transfer`
transactions in the standalone engine by [@birchmd]. ([#869])
- The order of producing the exit precompile and XCC promises has been
changed to sequential by [@birchmd]. ([#868])

### Changes

- Removed the code hidden behind the feature that isn't used anymore by
[@joshuajbouw]. ([#870])
- The logic of unwrapping wNEAR has been changed to the Bridge's native
by [@birchmd]. ([#867])
- Bumped the `near-workspaces` to 0.9 by [@aleksuss]. ([#862])

### Fixes

- Add a method for upgrading XCC router contract by [@birchmd]. ([#866])
- Fixed a potential panic in the `ExitToNear` precompile by
[@guidovranken]. ([#865])
- Fixed a behaviour when the `ft_transfer` could occur before the
`near_withdraw` by [@birchmd]. ([#864])
- Fixed correctness of reproducing the NEAR runtime random value in the
standalone engine by [@birchmd]. ([#863])

[#862]: #862
[#863]: #863
[#864]: #864
[#865]: #865
[#866]: #866
[#867]: #867
[#868]: #868
[#869]: #869
[#870]: #870
[#871]: #871

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Michael Birch <michael.birch@aurora.dev>
Co-authored-by: Guido Vranken <guidovranken@users.noreply.github.com>
Co-authored-by: Joshua J. Bouw <joshua@aurora.dev>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-standalone Area: the standalone engine EVM C-bug Category: Something isn't working.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants