以太坊go-ethereum签名部分源码解析
golang标准库里的crypto/ecdsa椭圆曲线加密算法所提供的函数有:
ecdsa.PublicKey结构体通过持有一个elliptic,Curve接口的实现体,可以提供椭圆曲线的所有属性,和相关操作;PublicKey的成员(X,Y),对应于算法理论中公钥的坐标。
func GenerateKey(c elliptic.Curve, rand io.Reader) (*PrivateKey, error)
elliptic.Curve接口声明了椭圆曲线的相关操作方法,其中Add()方法就是椭圆曲线点倍积中的“点相加”操作,Double()就是点倍积中的“点翻倍”操作,ScalarMult()根本就是一个点倍积运算(参数k是标量),IsOnCurve()检查参数所代表的点是否在该椭圆曲线上;
elliptic.CurveParams结构体实现了curve接口的所有方法,另外用成员属性定义了一个具体的椭圆曲线,比如(Gx, Gy) 表示该椭圆曲线的基点,即算法理论中的G点; N 是与基点对应的可倍积阶数n;B是椭圆曲线几何方程中的参数b,注意此处ecdsa代码包中隐含的椭圆曲线方程为y^2 = x^3 - 3x + b,故只需一项参数b即可。
ecdsa.PrivateKey是暴露给外部使用的主要结构体类型,它其实是算法理论中的私钥和公钥的集合。它的成员D,才真正对应于算法理论中的(标量)私钥。
ecdsa.ecdsaSignature对应于生成的数字签名(r, s)。
// PublicKey represents an ECDSA public key.两个big.Int类型 type PublicKey struct { elliptic.Curve X, Y *big.Int } // PrivateKey represents a ECDSA private key. type PrivateKey struct { PublicKey D *big.Int } type ecdsaSignature struct { R, S *big.Int }
//@Time : 2018/3/23 11:33
//@Author: Greg Li
package main
import (
"encoding/hex"
"fmt"
"github.com/ethereum/go-ethereum/crypto"
)
func main() {
// 创建账户
key, err := crypto.GenerateKey()
if err !=nil {
fmt.Println(err)
}
// 私钥:64个字