diff --git a/core/vm/contracts.go b/core/vm/contracts.go index 928b5511ab..0c53b9d2c5 100644 --- a/core/vm/contracts.go +++ b/core/vm/contracts.go @@ -614,11 +614,19 @@ func (c *bigModExp) RequiredGas(input []byte) uint64 { } func (c *bigModExp) Run(input []byte) ([]byte, error) { - var ( - baseLen = new(uint256.Int).SetBytes(getData(input, 0, 32)).Uint64() - expLen = new(uint256.Int).SetBytes(getData(input, 32, 32)).Uint64() - modLen = new(uint256.Int).SetBytes(getData(input, 64, 32)).Uint64() - ) + // Extract lengths - they're 32-byte big-endian integers + // with the actual uint64 value in the last 8 bytes + var baseLen, expLen, modLen uint64 + if len(input) >= 32 { + baseLen = binary.BigEndian.Uint64(input[24:32]) + } + if len(input) >= 64 { + expLen = binary.BigEndian.Uint64(input[56:64]) + } + if len(input) >= 96 { + modLen = binary.BigEndian.Uint64(input[88:96]) + } + if len(input) > 96 { input = input[96:] } else {