1

I've seen some answers showing how to get r, s, v values using web3.js but how to retrieve them using Solidity? Assuming I enter the signature into the contract.

ratib90486
  • 83
  • 5

1 Answers1

0

This is the code you can use:

function splitSignature(
        bytes memory sig
    ) public pure returns (bytes32 r, bytes32 s, uint8 v) {
        require(sig.length == 65, "invalid signature length");
    assembly {
        /*
        First 32 bytes stores the length of the signature

        add(sig, 32) = pointer of sig + 32
        effectively, skips first 32 bytes of signature

        mload(p) loads next 32 bytes starting at the memory address p into memory
        */

        // first 32 bytes, after the length prefix
        r := mload(add(sig, 32))
        // second 32 bytes
        s := mload(add(sig, 64))
        // final byte (first byte of the next 32 bytes)
        v := byte(0, mload(add(sig, 96)))
    }

    // implicitly return (r, s, v)
}

Full code : https://github.com/Zartaj0/BasicSignature/blob/main/Hardhat/contracts/Verify.sol

Zartaj Afser
  • 3,619
  • 1
  • 8
  • 25