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 }