github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/execution/contexts/identify_context.go (about)

     1  package contexts
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/hyperledger/burrow/acm/acmstate"
     7  	"github.com/hyperledger/burrow/execution/errors"
     8  	"github.com/hyperledger/burrow/execution/exec"
     9  	"github.com/hyperledger/burrow/execution/registry"
    10  	"github.com/hyperledger/burrow/logging"
    11  	"github.com/hyperledger/burrow/permission"
    12  	"github.com/hyperledger/burrow/txs/payload"
    13  )
    14  
    15  type IdentifyContext struct {
    16  	NodeWriter  registry.ReaderWriter
    17  	StateReader acmstate.Reader
    18  	Logger      *logging.Logger
    19  	tx          *payload.IdentifyTx
    20  }
    21  
    22  func (ctx *IdentifyContext) Execute(txe *exec.TxExecution, p payload.Payload) error {
    23  	var ok bool
    24  	ctx.tx, ok = p.(*payload.IdentifyTx)
    25  	if !ok {
    26  		return fmt.Errorf("payload must be IdentifyTx, but is: %v", txe.Envelope.Tx.Payload)
    27  	}
    28  
    29  	inputs, _, err := getInputs(ctx.StateReader, ctx.tx.Inputs)
    30  	if err != nil {
    31  		return err
    32  	}
    33  
    34  	// One of our inputs must have identify permissions
    35  	err = oneHasPermission(ctx.StateReader, permission.Identify, inputs, ctx.Logger)
    36  	if err != nil {
    37  		return errors.Wrap(err, "at least one input lacks permission for IdentifyTx")
    38  	}
    39  
    40  	// Registry updates must be consensual and binding so we requires signatures
    41  	// from the validator key of the node being added
    42  	validatorAddress := ctx.tx.Node.ValidatorPublicKey.GetAddress()
    43  	if _, ok := inputs[validatorAddress]; !ok {
    44  		return fmt.Errorf("IdentifyTx must be signed by node's validator key, but missing %v in inputs",
    45  			validatorAddress)
    46  	}
    47  
    48  	return ctx.NodeWriter.UpdateNode(ctx.tx.Node.TendermintNodeID, ctx.tx.Node)
    49  }