cairo-vm-go
cairo-vm-go copied to clipboard
Replace secp_utils usage of `big.Int` with uint256 library.
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.
Hi @rodrigo-pino may i be assigned to this issue? thanks!
Hi @TAdev0 is yours. This are the things you need to do:
- Swap the arithmetic that uses
big.Intforuint256. - Output should be actual values and not references to them. (a.k.a.
uint256instead of*uint256) - The functions
getBaseBig&getSecPBigshould 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!
We are using github.com/holiman/uint256 as our uint256 library which is already part of the VM packages
Thanks a lot for explanations, will be useful as this is my first Go contribution :)
@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?
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.