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