I'm confused about the cost of the sha256 function, because my understanding of the cost from the yellow paper ( https://ethereum.github.io/yellowpaper/paper.pdf (Appendix E. Precompiled Contracts) ) doesn't match my experiments of executing the sha256 hash function in Remix.
Here's my understanding of how much sha256 should cost for a 'word' (a 256-bit input):
From the yellow paper:
We define
Ξ_{SHA256}
as a precompiled contract implementing the SHA2-256 hash function. Its gas usage is dependent on the input data size, a factor rounded up to the nearest number of words.
The gas requirement (g_r
) is stated as:
g_r = 60 + ( 12 * ( |I_d| / 32) )
(where I've edited the notation to look nicer in markdown without latex).
Elsewhere in the paper, it defines I_d
as:
I_d
, the byte array that is the input data to this execution; if the execution agent is a transaction, this would be the transaction data.
So my interpretation of gas cost for a word of 256-bits (32-bytes) is:
g_r = 60 + ( 12 * 32 / 32 ) = 60 + 12 = 72 gas
However:
I've explored the gas costs of the following simple function in Remix:
function hash() public pure returns (uint256 a) {
a = 1234;
a = uint256(sha256(abi.encodePacked(a)));
}
This has a transaction cost of 22789 gas
of which the execution cost is 1517 gas
.
Now, some of this will be extraneous storage costs to store a
on the stack (and other stuff).
'Commenting out' the hashing line (// a = uint256(sha256(abi.encodePacked(a)));
), for a very rough comparison, gives a transaction cost of 21486 gas
of which the execution cost is 214 gas
.
So a very approx. experimental cost of sha256 appears to be 1517 - 214 = 1303 gas
. I'm surprised at how high this cost is (given my understanding that sha256 should be just 72 gas
).
Any help would be appreciated in understanding the actual cost of sha256 :)