以太坊地址和公钥_以太坊: 私钥、公钥、地址的生成过程

生成私钥。其实在go-ethereum中的私钥、公钥只是ecdsa的简单包装。

// 第一种方法: 使用go-ethereum包装的方法

prv ,err := ecies.GenerateKey(rand.Reader, crypto.S256(), nil)

if err != nil {

panic(err)

}

// 第二种方法: 使用golang标准库方法

priv ,err := ecdsa.GenerateKey(crypto.S256(), rand.Reader)

if err != nil {

panic(err)

}

主函数PubkeyToAddress()

func PubkeyToAddress(p ecdsa.PublicKey) common.Address {

pubBytes := FromECDSAPub(&p)

return common.BytesToAddress(Keccak256(pubBytes[1:])[12:])

}

子函数FromECDSAPub()

func FromECDSAPub(pub *ecdsa.PublicKey) []byte {

if pub == nil || pub.X == nil || pub.Y == nil {

return nil

}

return elliptic.Marshal(S256(), pub.X, pub.Y)

}

// S256()是特定的椭圆曲线,在程序启动的时候进行初始化,后来调用只是获取其引用而已。

// elliptic.Marshal(...)为标准库函数,按照非压缩形式得到相应的[]byte

func Marshal(curve Curve, x, y *big.Int) []byte {

byteLen := (curve.Params().BitSize + 7) >> 3

ret := make([]byte, 1+2*byteLen)

ret[0] = 4 // uncompressed point

xBytes := x.Bytes()

copy(ret[1+byteLen-len(xBytes):], xBytes)

yBytes := y.Bytes()

copy(ret[1+2*byteLen-len(yBytes):], yBytes)

return ret

}

子函数Keccak256()

// 对除了符号位(第一个字节)的其他字节数组进行sha3处理.

// sha3的结果共有32字节。

// 取sha3结果的最后20字节,生成地址。在以太坊中,地址为: type Address [AddressLength]byte

func Keccak256(data ...[]byte) []byte {

d := sha3.NewKeccak256()

for _, b := range data {

d.Write(b)

}

return d.Sum(nil)

}

子函数BytesToAddress()

// BytesToAddress其实就是字节拷贝

func BytesToAddress(b []byte) Address {

var a Address

a.SetBytes(b)

return a

}

// SetBytes()考虑到了字节数量不匹配的情况

func (a *Address) SetBytes(b []byte) {

if len(b) > len(a) {

b = b[len(b)-AddressLength:]

}

copy(a[AddressLength-len(b):], b)

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值