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

hardhat_api: Implement hardhat_setCode method #149

Closed
4 tasks
dutterbutter opened this issue Sep 28, 2023 · 1 comment · Fixed by #171
Closed
4 tasks

hardhat_api: Implement hardhat_setCode method #149

dutterbutter opened this issue Sep 28, 2023 · 1 comment · Fixed by #171
Labels
hardhat_api 👷 Indicates hardhat namespace api tasks medium 🚩 Indicates moderately difficult item p1 🟠 Indicates high priority item

Comments

@dutterbutter
Copy link
Collaborator

Description:

We need to implement the hardhat_setCode method. This function modifies the bytecode stored at a specified account's address.

// Interface in the `trait`
#[rpc(name = "hardhat_setCode")]
fn set_code(
    &self,
    address: Address, // The address where the given code should be stored
    code: Vec<u8>, // The bytecode to store at the given address
) -> BoxFuture<Result<()>>;

// Actual code in the `impl`
fn set_code(
    &self,
    address: Address,
    code: Vec<u8>,
) -> BoxFuture<Result<()>> {
    // TODO: Solution here
}

Expected command and response:

Command:

curl -X POST http://localhost:8011 \
     -H "Content-Type: application/json" \
     --data '{
       "jsonrpc": "2.0",
       "id": 1,
       "method": "hardhat_setCode",
       "params": ["0x0d2026b3EE6eC71FC6746ADb6311F6d3Ba1C000B", "0xa1a2a3..."]
     }'

Response:

{"jsonrpc":"2.0", "result":true, "id":1}

Requirements:

  1. Implement the Method:

    • The method should accept address of type Address and code of type Vec<u8>.
    • Return an acknowledgment once the bytecode has been set for the given address.
  2. Unit Tests:

    • Write unit tests ensuring the hardhat_setCode method functions correctly.
    • Test with different addresses and bytecode values, including invalid or non-existent ones.
    • Properly handle potential exceptions and errors.
  3. Inline Documentation:

    • Write inline Rust documentation (/// comments) explaining the purpose and usage of the hardhat_setCode method.
    • Include details about parameters, return values, and any possible exceptions or errors.
    • Update SUPPORTED_APIS.md with updated documentation and examples.
    • (Optional) Add request to test_endpoints.http for easier manual verification.

Task Checklist:

  • Implement the hardhat_setCode method.
  • Write unit tests for the hardhat_setCode method.
  • Add inline documentation for the hardhat_setCode method.
  • Update documentation for the hardhat_dropTransaction endpoint in SUPPORTED_APIS.md.

Additional Notes:

If you're an external contributor wanting to work on this issue, please comment below to notify us. If you have questions about the requirements or need any assistance related to the implementation, don't hesitate to ask!

@dutterbutter dutterbutter added the hardhat_api 👷 Indicates hardhat namespace api tasks label Sep 28, 2023
@MexicanAce MexicanAce added p2 🟡 Indicates moderately high priority item p1 🟠 Indicates high priority item medium 🚩 Indicates moderately difficult item and removed p2 🟡 Indicates moderately high priority item labels Oct 5, 2023
@MexicanAce
Copy link
Collaborator

Bumping to P1 as it's useful for tests in era-contracts repo

@github-project-automation github-project-automation bot moved this to Done 🏁 in Progress Board Oct 13, 2023
IAvecilla added a commit to lambdaclass/era-test-node that referenced this issue Feb 29, 2024
* Initial new implementation

* Fix compilation error

* Implementation of add operation for big integers (matter-labs#136)

* Implement Big UInt Left Shift (matter-labs#139)

* Add `bigUIntShl` implementation

* Add constants

* Fix compilation

* Implement Big UInt Right Shift (matter-labs#137)

* Add `bigUIntShr` implementation

* Add constants

* Implement Big UInt Bitwise Or for modexp (matter-labs#135)

* Implement bigUIntBitOr

* Fix bigUIntBitOr

* Fix bigUIntBitOr

Co-authored-by: Ivan Litteri <67517699+ilitteri@users.noreply.github.com>

* Fix missing closing brackets

---------

Co-authored-by: Ivan Litteri <67517699+ilitteri@users.noreply.github.com>

* Implement big uint conditional select for modexp (matter-labs#148)

* Implement bigUIntCondSelect

* Fix missing curly braces

Co-authored-by: Ivan Litteri <67517699+ilitteri@users.noreply.github.com>

* Implement Big UInt Right Shift (matter-labs#137)

* Add `bigUIntShr` implementation

* Add constants

* Implement Big UInt Bitwise Or for modexp (matter-labs#135)

* Implement bigUIntBitOr

* Fix bigUIntBitOr

* Fix bigUIntBitOr

Co-authored-by: Ivan Litteri <67517699+ilitteri@users.noreply.github.com>

* Fix missing closing brackets

---------

Co-authored-by: Ivan Litteri <67517699+ilitteri@users.noreply.github.com>

---------

Co-authored-by: Ivan Litteri <67517699+ilitteri@users.noreply.github.com>

* Implement mul operation for big UInts (matter-labs#151)

* First implementation of mul operation for bigints

* Fix multiplication for big integers

* Fix some merge issues

* Improve comments and function docs

* Delete whitespaces

* Substraction with borrow (matter-labs#149)

* First substraction draft

* Fix compile problems

* Working implementation

* Updated code

* Updated code

* Update subtract implementation

* Remove console_log

* Add docs for function

* Update function docs

* Remove tests from from ModExp.yul

* Fix typo

* Restore horrible whitespaces to avoid an ugly merge conflict

* Update precompiles/Modexp.yul

Co-authored-by: Ivan Litteri <67517699+ilitteri@users.noreply.github.com>

* Revert "Update precompiles/Modexp.yul"

This reverts commit 582bc41a0bb7fb02a1a68717fdf83c6fe432d422.

---------

Co-authored-by: Joaquín P. Centeno <jpcenteno@users.noreply.github.com>
Co-authored-by: Ivan Litteri <67517699+ilitteri@users.noreply.github.com>

* Refactor `modexp` reimplementation (matter-labs#156)

* Make Big UInt API functions naming consistent

* Refactor `bigUIntAdd` variable names

* Refactor `bigUIntMul` variable names

* Refactor `subLimbsWithBorrow`

* Refactor `bigUintSubtractionWithBorrow`

* Refactor `bigUIntAdd`

* Fix `bigUIntSubWithBorrow`

* Format `storeLimbValueAtOffset`

* Refactor `bigUIntBitOr`

Made it consistent with the rest of the code convention and naming

* Refactor `bigUIntCondSelect`

Made it consistent with the rest of the code convention and naming

* Reorder `overflowingSubWithBorrow`

* Move comment to modexp API Docs section

* Biguint division (matter-labs#159)

* Division draft

* Non working draft

* Fix compile errors

* Use proper pointers for quotient and remainder

* Add fix note, some more changes

* Add comment

* Implement `big_uint_bit_size`

* Increase pointer to prevent it from steping over console_log

* WIP divrem

* Fix loop and zero initializer

* Push test cases

* Add other test case

* Add docs and tests for `big_uint_inplace_or_1`

* Fix bug related to bit shifting

* Fix borrow return in big uint sub function

* Delete playground file used for debugging

* Fix sub with borrow function

* Add playground again to check more big integer division tests

* Remove playground used for testing

* Write documentation for new shift functions

* Improve naming and documentation for new helper functions

* Rename bigUIntOrWith1 to bigUintInPlaceOrWith1

* Add tmp buffer parameters to bigUIntDivRem. Improve docs.

* Simplify subLimbsWithBorrow

Co-authored-by: Ivan Litteri <67517699+ilitteri@users.noreply.github.com>

* Remove `mul` call from `bigUIntInPlaceOrWith1`

Co-authored-by: Ivan Litteri <67517699+ilitteri@users.noreply.github.com>

* Remove multiplications from copyBigUint

Co-authored-by: Ivan Litteri <67517699+ilitteri@users.noreply.github.com>

* Optimize bigUIntBitSize loop

Co-authored-by: Ivan Litteri <67517699+ilitteri@users.noreply.github.com>

* Simplify zeroWithLimbSizeAt

---------

Co-authored-by: Francisco Krause Arnim <fkrausear@gmail.com>
Co-authored-by: IAvecilla <iavecilla@fi.uba.ar>
Co-authored-by: Ivan Litteri <67517699+ilitteri@users.noreply.github.com>

* Implement mul mod operation for big UInts (matter-labs#161)

* Division draft

* Non working draft

* Fix compile errors

* Use proper pointers for quotient and remainder

* Add fix note, some more changes

* Add comment

* Implement `big_uint_bit_size`

* Increase pointer to prevent it from steping over console_log

* WIP divrem

* Fix loop and zero initializer

* Push test cases

* Add other test case

* Add docs and tests for `big_uint_inplace_or_1`

* Fix bug related to bit shifting

* Fix borrow return in big uint sub function

* Delete playground file used for debugging

* Fix sub with borrow function

* Add playground again to check more big integer division tests

* Remove playground used for testing

* Write documentation for new shift functions

* Improve naming and documentation for new helper functions

* Rename bigUIntOrWith1 to bigUintInPlaceOrWith1

* Add tmp buffer parameters to bigUIntDivRem. Improve docs.

* Add big uint mul mod skeleton

* Remove wrong comment

* Update algorithm comment

* Add limb size doubling and divide by two for mul mod operation

* Functions to duplicate and halve limb size work in place

* Use camelCase

* Remove console_log

* Add docs

* Update doc

---------

Co-authored-by: Francisco Krause Arnim <fkrausear@gmail.com>
Co-authored-by: Joaquín P. Centeno <jpcenteno@users.noreply.github.com>

* Add parseCallData function

* Add function to left-pad big uints

* Remove console log function

* Change left padding functions for big uints to not work in place

* Add `parseCalldata` function (matter-labs#168)

* Remove redundant parse call data declaration

* Free memory pointer (matter-labs#169)

* Add free memory pointer function

* Update precompiles/Modexp.yul

Co-authored-by: Ivan Litteri <67517699+ilitteri@users.noreply.github.com>

* Update precompiles/Modexp.yul

Co-authored-by: Ivan Litteri <67517699+ilitteri@users.noreply.github.com>

---------

Co-authored-by: Ivan Litteri <67517699+ilitteri@users.noreply.github.com>

* Start parsing the input calldata

* Correctly parse call data

* Add left pad steps for modexp inputs

* Add pad if needed function

* Modexp for big UInts skeleton (matter-labs#164)

* WIP: modexp skeleton

* Use of mul mod function for big integers

* imlement aux function to check if big uint is larger than 1

* minor fix

* Restore modexp from target branch

* Fix mul mod

* Finish modexp implementation

* Remove playground used for debugging

* Update modexp with final state of modular exponentiation function

* Fix merge issue

* Change all names to camel case

* fix typo

Co-authored-by: Francisco Krause Arnim <56402156+fkrause98@users.noreply.github.com>

---------

Co-authored-by: IAvecilla <iavecilla@fi.uba.ar>
Co-authored-by: Ivan Litteri <67517699+ilitteri@users.noreply.github.com>
Co-authored-by: Francisco Krause Arnim <56402156+fkrause98@users.noreply.github.com>

* Add simple integration

* Fix calldata buffer in zero check

* Uncomment checks for base cases

* Fix result length to match with mod length

* Fix condition in parse call data

* Update test assertions with new test node updates

* Add comment for tests with a temp patch

* Fix modexp result length

* Fix limb amount for modexp operands

* Clean sratch buffers in each iteration

* Clean sratch buffers for every operation

* Remove unused functions

* Delete free memory pointer usage and calculate pointers manually

* Replace all mul operations for shifts to improve gas usage

* Include basic optimizations

* Add optimizations for reminder calculations

* Add small improvement for main loop in modular exp

* Add temporary fix for modexp test

* Add modex reference script

* Remove unnecesary memory stores

* Reduce iterations in rem function

* Compilation fix

* Print gas used on tests

* Add build script to create gas reports

* Save gas used for each test of the precompiles

* Add aux functions to write lines in each report

* Merge main

* Fix tests lint

* Fix lint in test utils

* Change L1 url

---------

Co-authored-by: Nacho Avecilla <nachoavecilla@gmail.com>
Co-authored-by: Joaquín Centeno <jpcenteno@users.noreply.github.com>
Co-authored-by: Francisco Krause Arnim <56402156+fkrause98@users.noreply.github.com>
Co-authored-by: Francisco Krause Arnim <fkrausear@gmail.com>
Co-authored-by: IAvecilla <iavecilla@fi.uba.ar>
Co-authored-by: Javier Chatruc <jrchatruc@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
hardhat_api 👷 Indicates hardhat namespace api tasks medium 🚩 Indicates moderately difficult item p1 🟠 Indicates high priority item
Projects
No open projects
Status: Done 🏁
Development

Successfully merging a pull request may close this issue.

2 participants