github.com/mavryk-network/mvgo@v1.19.9/signer/memory.go (about) 1 // Copyright (c) 2020-2022 Blockwatch Data Inc. 2 // Author: alex@blockwatch.cc 3 4 package signer 5 6 import ( 7 "context" 8 "errors" 9 10 "github.com/mavryk-network/mvgo/codec" 11 "github.com/mavryk-network/mvgo/mavryk" 12 ) 13 14 var ErrAddressMismatch = errors.New("signer: address mismatch") 15 16 type MemorySigner struct { 17 key mavryk.PrivateKey 18 } 19 20 func NewFromKey(k mavryk.PrivateKey) *MemorySigner { 21 return &MemorySigner{ 22 key: k, 23 } 24 } 25 26 func (s MemorySigner) ListAddresses(_ context.Context) ([]mavryk.Address, error) { 27 return []mavryk.Address{s.key.Address()}, nil 28 } 29 30 func (s MemorySigner) GetKey(_ context.Context, addr mavryk.Address) (mavryk.Key, error) { 31 pk := s.key.Public() 32 if !pk.Address().Equal(addr) { 33 return mavryk.InvalidKey, ErrAddressMismatch 34 } 35 return pk, nil 36 } 37 38 func (s MemorySigner) SignMessage(_ context.Context, addr mavryk.Address, msg string) (mavryk.Signature, error) { 39 if !s.key.Address().Equal(addr) { 40 return mavryk.InvalidSignature, ErrAddressMismatch 41 } 42 op := codec.NewOp(). 43 WithBranch(mavryk.ZeroBlockHash). 44 WithContents(&codec.FailingNoop{ 45 Arbitrary: msg, 46 }) 47 digest := mavryk.Digest(op.Bytes()) 48 return s.key.Sign(digest[:]) 49 } 50 51 func (s MemorySigner) SignOperation(_ context.Context, addr mavryk.Address, op *codec.Op) (mavryk.Signature, error) { 52 if !s.key.Address().Equal(addr) { 53 return mavryk.InvalidSignature, ErrAddressMismatch 54 } 55 err := op.Sign(s.key) 56 return op.Signature, err 57 } 58 59 func (s MemorySigner) SignBlock(_ context.Context, addr mavryk.Address, head *codec.BlockHeader) (mavryk.Signature, error) { 60 if !s.key.Address().Equal(addr) { 61 return mavryk.InvalidSignature, ErrAddressMismatch 62 } 63 err := head.Sign(s.key) 64 return head.Signature, err 65 }