|
1 | 1 | package container
|
2 | 2 |
|
3 | 3 | import (
|
| 4 | + "fmt" |
| 5 | + |
| 6 | + "github.com/nspcc-dev/neo-go/pkg/network/payload" |
4 | 7 | "github.com/nspcc-dev/neo-go/pkg/vm/opcode"
|
5 | 8 | "github.com/nspcc-dev/neofs-node/pkg/morph/event"
|
6 | 9 | )
|
@@ -42,34 +45,79 @@ const (
|
42 | 45 | // in `Container` contract. Is used as identificator for notary
|
43 | 46 | // put container requests.
|
44 | 47 | PutNotaryEvent = "put"
|
| 48 | + |
| 49 | + // PutNotaryEvent is an ID of notary "put named container" notification. |
| 50 | + PutNamedNotaryEvent = "putNamed" |
45 | 51 | )
|
46 | 52 |
|
47 |
| -// ParsePutNotary from NotaryEvent into container event structure. |
48 |
| -func ParsePutNotary(ne event.NotaryEvent) (event.Event, error) { |
| 53 | +func parsePutNotary(ev *Put, raw *payload.P2PNotaryRequest, ops []event.Op) error { |
49 | 54 | var (
|
50 |
| - ev Put |
51 | 55 | currentOp opcode.Opcode
|
| 56 | + fieldNum = 0 |
52 | 57 | )
|
53 | 58 |
|
54 |
| - fieldNum := 0 |
55 |
| - |
56 |
| - for _, op := range ne.Params() { |
| 59 | + for _, op := range ops { |
57 | 60 | currentOp = op.Code()
|
58 | 61 |
|
59 | 62 | switch {
|
60 | 63 | case opcode.PUSHDATA1 <= currentOp && currentOp <= opcode.PUSHDATA4:
|
61 | 64 | if fieldNum == expectedItemNumPut {
|
62 |
| - return nil, event.UnexpectedArgNumErr(PutNotaryEvent) |
| 65 | + return event.UnexpectedArgNumErr(PutNotaryEvent) |
63 | 66 | }
|
64 | 67 |
|
65 |
| - putFieldSetters[fieldNum](&ev, op.Param()) |
| 68 | + putFieldSetters[fieldNum](ev, op.Param()) |
66 | 69 | fieldNum++
|
67 | 70 | default:
|
68 |
| - return nil, event.UnexpectedOpcode(PutNotaryEvent, op.Code()) |
| 71 | + return event.UnexpectedOpcode(PutNotaryEvent, op.Code()) |
69 | 72 | }
|
70 | 73 | }
|
71 | 74 |
|
72 |
| - ev.notaryRequest = ne.Raw() |
| 75 | + ev.notaryRequest = raw |
| 76 | + |
| 77 | + return nil |
| 78 | +} |
| 79 | + |
| 80 | +// ParsePutNotary from NotaryEvent into container event structure. |
| 81 | +func ParsePutNotary(ne event.NotaryEvent) (event.Event, error) { |
| 82 | + var ev Put |
| 83 | + |
| 84 | + err := parsePutNotary(&ev, ne.Raw(), ne.Params()) |
| 85 | + if err != nil { |
| 86 | + return nil, err |
| 87 | + } |
| 88 | + |
| 89 | + return ev, nil |
| 90 | +} |
| 91 | + |
| 92 | +// ParsePutNamedNotary parses PutNamed event structure from generic event.NotaryEvent. |
| 93 | +func ParsePutNamedNotary(ne event.NotaryEvent) (event.Event, error) { |
| 94 | + ops := ne.Params() |
| 95 | + |
| 96 | + const putNamedAdditionalArgs = 2 // PutNamed has same args as Put + (name, zone) (2) |
| 97 | + |
| 98 | + if len(ops) != expectedItemNumPut+putNamedAdditionalArgs { |
| 99 | + return nil, event.UnexpectedArgNumErr(PutNamedNotaryEvent) |
| 100 | + } |
| 101 | + |
| 102 | + var ( |
| 103 | + ev PutNamed |
| 104 | + err error |
| 105 | + ) |
| 106 | + |
| 107 | + ev.zone, err = event.StringFromOpcode(ops[0]) |
| 108 | + if err != nil { |
| 109 | + return nil, fmt.Errorf("parse arg zone: %w", err) |
| 110 | + } |
| 111 | + |
| 112 | + ev.name, err = event.StringFromOpcode(ops[1]) |
| 113 | + if err != nil { |
| 114 | + return nil, fmt.Errorf("parse arg name: %w", err) |
| 115 | + } |
| 116 | + |
| 117 | + err = parsePutNotary(&ev.Put, ne.Raw(), ops[putNamedAdditionalArgs:]) |
| 118 | + if err != nil { |
| 119 | + return nil, err |
| 120 | + } |
73 | 121 |
|
74 | 122 | return ev, nil
|
75 | 123 | }
|
0 commit comments