github.com/Finschia/finschia-sdk@v0.48.1/x/evidence/spec/03_messages.md (about) 1 <!-- 2 order: 3 3 --> 4 5 # Messages 6 7 ## MsgSubmitEvidence 8 9 Evidence is submitted through a `MsgSubmitEvidence` message: 10 11 ```protobuf 12 // MsgSubmitEvidence represents a message that supports submitting arbitrary 13 // Evidence of misbehavior such as equivocation or counterfactual signing. 14 message MsgSubmitEvidence { 15 string submitter = 1; 16 google.protobuf.Any evidence = 2; 17 } 18 ``` 19 20 Note, the `Evidence` of a `MsgSubmitEvidence` message must have a corresponding 21 `Handler` registered with the `x/evidence` module's `Router` in order to be processed 22 and routed correctly. 23 24 Given the `Evidence` is registered with a corresponding `Handler`, it is processed 25 as follows: 26 27 ```go 28 func SubmitEvidence(ctx Context, evidence Evidence) error { 29 if _, ok := GetEvidence(ctx, evidence.Hash()); ok { 30 return sdkerrors.Wrap(types.ErrEvidenceExists, evidence.Hash().String()) 31 } 32 if !router.HasRoute(evidence.Route()) { 33 return sdkerrors.Wrap(types.ErrNoEvidenceHandlerExists, evidence.Route()) 34 } 35 36 handler := router.GetRoute(evidence.Route()) 37 if err := handler(ctx, evidence); err != nil { 38 return sdkerrors.Wrap(types.ErrInvalidEvidence, err.Error()) 39 } 40 41 ctx.EventManager().EmitEvent( 42 sdk.NewEvent( 43 types.EventTypeSubmitEvidence, 44 sdk.NewAttribute(types.AttributeKeyEvidenceHash, evidence.Hash().String()), 45 ), 46 ) 47 48 SetEvidence(ctx, evidence) 49 return nil 50 } 51 ``` 52 53 First, there must not already exist valid submitted `Evidence` of the exact same 54 type. Secondly, the `Evidence` is routed to the `Handler` and executed. Finally, 55 if there is no error in handling the `Evidence`, an event is emitted and it is persisted to state.