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  }