github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/swarm/storage/feed/sign.go (about)

     1  
     2  //<developer>
     3  //    <name>linapex 曹一峰</name>
     4  //    <email>linapex@163.com</email>
     5  //    <wx>superexc</wx>
     6  //    <qqgroup>128148617</qqgroup>
     7  //    <url>https://jsq.ink</url>
     8  //    <role>pku engineer</role>
     9  //    <date>2019-03-16 19:16:44</date>
    10  //</624450119428739072>
    11  
    12  
    13  package feed
    14  
    15  import (
    16  	"crypto/ecdsa"
    17  
    18  	"github.com/ethereum/go-ethereum/common"
    19  	"github.com/ethereum/go-ethereum/crypto"
    20  )
    21  
    22  const signatureLength = 65
    23  
    24  //签名是具有签名大小的静态字节数组的别名
    25  type Signature [signatureLength]byte
    26  
    27  //签名者签名源更新有效负载
    28  type Signer interface {
    29  	Sign(common.Hash) (Signature, error)
    30  	Address() common.Address
    31  }
    32  
    33  //GenericSigner实现了签名者接口
    34  //在大多数情况下,可能应该使用普通签名者。
    35  type GenericSigner struct {
    36  	PrivKey *ecdsa.PrivateKey
    37  	address common.Address
    38  }
    39  
    40  //NewGenericSigner生成一个签名者,该签名者将使用提供的私钥对所有内容进行签名。
    41  func NewGenericSigner(privKey *ecdsa.PrivateKey) *GenericSigner {
    42  	return &GenericSigner{
    43  		PrivKey: privKey,
    44  		address: crypto.PubkeyToAddress(privKey.PublicKey),
    45  	}
    46  }
    47  
    48  //在提供的数据上签名
    49  //它包装了ethereum crypto.sign()方法
    50  func (s *GenericSigner) Sign(data common.Hash) (signature Signature, err error) {
    51  	signaturebytes, err := crypto.Sign(data.Bytes(), s.PrivKey)
    52  	if err != nil {
    53  		return
    54  	}
    55  	copy(signature[:], signaturebytes)
    56  	return
    57  }
    58  
    59  //地址返回签名者私钥的公钥
    60  func (s *GenericSigner) Address() common.Address {
    61  	return s.address
    62  }
    63  
    64  //getuseraddr提取源更新签名者的地址
    65  func getUserAddr(digest common.Hash, signature Signature) (common.Address, error) {
    66  	pub, err := crypto.SigToPub(digest.Bytes(), signature[:])
    67  	if err != nil {
    68  		return common.Address{}, err
    69  	}
    70  	return crypto.PubkeyToAddress(*pub), nil
    71  }
    72