func (curve *KoblitzCurve) getDoublingPointsH() [][3]fieldVal {
	curValue := curve.Gx
	s256 := sha256.New()
	s256.Write(new(big.Int).Add(curValue, big.NewInt(2)).Bytes())  
	potentialXValue := make([]byte, 33)
	binary.LittleEndian.PutUint32(potentialXValue, 2)
	for i, elem := range s256.Sum(nil) {
		potentialXValue[i+1] = elem
	}
	gen2, err := ParsePubKey(potentialXValue, S256())
	if err != nil {
		log.Fatalf("Could not create H %v\n", err)
	}
	doublingPoints := make([][3]fieldVal, curve.BitSize)
	px, py := curve.bigAffineToField(gen2.X, gen2.Y)
	pz := new(fieldVal).SetInt(1)
	for i := 0; i < curve.BitSize; i++ {
		doublingPoints[i] = [3]fieldVal{*px, *py, *pz}
		curve.doubleJacobian(px, py, pz, px, py, pz)
	}
	return doublingPoints
}
getDoublingPointsH returns all the possible H^(2^i) for i in
0..n-1 where n is the curve's bit size (256 in the case of secp256k1)
the coordinates are recorded as Jacobian coordinates.

H comes from whatever Willy does in crypto.go.
package btcec
import (
	"crypto/sha256"
	"encoding/binary"
	"log"
	"math/big"
)
var secp256k1BytePoints = ""
var secp256k1BytePointsH = ""
func (curve *KoblitzCurve) getDoublingPoints() [][3]fieldVal {
	doublingPoints := make([][3]fieldVal, curve.BitSize)
	px, py := curve.bigAffineToField(curve.Gx, curve.Gy)
	pz := new(fieldVal).SetInt(1)
	for i := 0; i < curve.BitSize; i++ {
		doublingPoints[i] = [3]fieldVal{*px, *py, *pz}
		curve.doubleJacobian(px, py, pz, px, py, pz)
	}
	return doublingPoints
}