cairo-vm-go icon indicating copy to clipboard operation
cairo-vm-go copied to clipboard

Replace secp_utils usage of `big.Int` with uint256 library.

Open rodrigo-pino opened this issue 1 year ago • 6 comments

In ./pkg/hintrunner/utils/secp_utils.go there are utilities for elliptic curves. They used big.Int unnecessarily because all values are smaller than 2**256 - 1.

The task is to replace all use of big.Int with uint256 which is waaaaaaay faster.

rodrigo-pino avatar Apr 15 '24 08:04 rodrigo-pino

Hi @rodrigo-pino may i be assigned to this issue? thanks!

TAdev0 avatar Apr 15 '24 17:04 TAdev0

Hi @TAdev0 is yours. This are the things you need to do:

  1. Swap the arithmetic that uses big.Int for uint256.
  2. Output should be actual values and not references to them. (a.k.a. uint256 instead of *uint256)
  3. The functions getBaseBig & getSecPBig should return a constant and not perform any operation. Currently, they are: (i) creating a big int and (ii) setting it up using a string. They should return a uint256 without any of these operations. Also, it makes no sense they return a boolean as a second output.

Tell me if you need help with anything!

rodrigo-pino avatar Apr 17 '24 09:04 rodrigo-pino

We are using github.com/holiman/uint256 as our uint256 library which is already part of the VM packages

rodrigo-pino avatar Apr 17 '24 09:04 rodrigo-pino

Thanks a lot for explanations, will be useful as this is my first Go contribution :)

TAdev0 avatar Apr 17 '24 09:04 TAdev0

@rodrigo-pino @cicr99 now all hints are implemented, we can discuss the scope of this issue should we replace big.Int absolutely everywhere its possible with uint256?

TAdev0 avatar Jun 22 '24 12:06 TAdev0

I am applying to this issue via OnlyDust platform.

My background and how it can be leveraged

I have a strong background in backend software engineering with expertise in languages such as Go and Solidity. My experience with optimizing code for performance and efficiency, especially in systems where every millisecond counts, aligns well with the task at hand. Additionally, I have worked with cryptographic primitives, which include elliptic curve cryptography, making me familiar with the operations and optimizations necessary in this domain.

How I plan on tackling this issue

To approach the problem of replacing big.Int with uint256, I would first ensure I understand the precise usage of big.Int in the current codebase, particularly how it handles elliptic curve operations in secp_utils.go. Given that big.Int is a general-purpose library for handling arbitrarily large integers, it adds unnecessary overhead when dealing with values smaller than 2**256 - 1. This is where uint256 can provide a significant performance boost due to its fixed-size nature, which allows for more efficient operations at the CPU level.

Tchisom17 avatar Sep 19 '24 15:09 Tchisom17