美文网首页Ethereum
以太坊: 私钥、公钥、地址的生成过程

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

作者: qishuai | 来源:发表于2018-12-13 16:37 被阅读0次
  1. 生成私钥。其实在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)
    }
    
  2. 主函数PubkeyToAddress()

    func PubkeyToAddress(p ecdsa.PublicKey) common.Address {
     pubBytes := FromECDSAPub(&p)
     return common.BytesToAddress(Keccak256(pubBytes[1:])[12:])
    }
    
  3. 子函数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
    }
    
  4. 子函数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)
    }
    
  5. 子函数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)
    }
    

相关文章

  • 【iOS】以太坊公钥、地址生成

    本文背景导入私钥生成钱包 (私钥 => 公钥 => 地址) 以太坊地址的生成过程如下: 由secp256k1曲线生...

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

    生成私钥。其实在go-ethereum中的私钥、公钥只是ecdsa的简单包装。// 第一种方法: 使用go-eth...

  • 以太坊地址生成

    通过椭圆曲线算法生成钥匙对(公钥和私钥),以太坊采用的是secp256k1曲线。公钥采用uncompressed模...

  • ETH Address,jquery.validate验证

    先了解下ETH address的生成规则:通过椭圆曲线算法生成钥匙对(公钥和私钥),以太坊采用的是secp256k...

  • 区块链钱包技术原理

    区块链的技术原理: 钱包助记词生成种子(Seed),种子生成私钥。私钥推导出公钥,公钥节选部分生成钱包地址。 同时...

  • 优一区块链知识学习笔记5

    公钥和私钥 公钥加密,私钥解密 私钥→椭圆曲线乘法→公钥→单向加密哈希函数→比特币地址(过程不可逆) 私钥:随机选...

  • 以太坊账户

    以一个账户举例: 路径: m/44'/60'/0'/0 助记词: 私钥: 公钥: 地址: 以太坊钱包使用户用来管理...

  • OpenSSL(二)

    更多参考文章地址 生成私钥(默认为 pkcs1 格式) 生成结果: 根据私钥生成公钥 生成结果: 将私钥的 pkc...

  • 用https请求如何配置key、csr、crt

    - key 私钥 = 明文 自己生成的 - csr 公钥 = 由私钥生成 - crt 证书 = 公钥 +...

  • 以太坊解析-(1) 公钥私钥地址字符串公钥推导

    以太坊中私钥和HASH都为32位,公钥为65位其中第一位是压缩字节0x04,压缩公钥为33字节,地址是是公钥的后6...

网友评论

    本文标题:以太坊: 私钥、公钥、地址的生成过程

    本文链接:https://www.haomeiwen.com/subject/fbsbhqtx.html