mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2024-11-25 23:42:23 +00:00
services: allow non-empty inv scripts for contract-based notary witness
This commit is contained in:
parent
75d7891ca1
commit
807fa4a720
2 changed files with 12 additions and 5 deletions
|
@ -376,8 +376,9 @@ the steps to create a signature request:
|
|||
9. Construct the list of main transactions witnesses (that will be `Scripts`
|
||||
transaction field). Use the following rules:
|
||||
- Contract-based witness should have `Invocation` script that pushes arguments
|
||||
on stack (it may be empty) and empty `Verification` script. Currently, **only
|
||||
empty** `Invocation` scripts are supported for contract-based witnesses.
|
||||
on stack (it may be empty) and empty `Verification` script. If multiple notary
|
||||
requests provide different `Invocation` scripts then the first one will be used
|
||||
to construct contract-based witness.
|
||||
- **Notary contract witness** (which is also a contract-based witness) should
|
||||
have empty `Verification` script. `Invocation` script should be of the form
|
||||
[opcode.PUSHDATA1, 64, make([]byte, 64)...], i.e. to be a placeholder for
|
||||
|
|
|
@ -220,12 +220,18 @@ func (n *Notary) OnNewRequest(payload *payload.P2PNotaryRequest) {
|
|||
}
|
||||
mainHash := hash.NetSha256(uint32(n.Network), r.main).BytesBE()
|
||||
for i, w := range payload.MainTransaction.Scripts {
|
||||
if r.witnessInfo[i].typ == Contract || // check that we need to fill that witness
|
||||
len(w.InvocationScript) == 0 || // check that signature for this witness was provided
|
||||
r.witnessInfo[i].nSigsLeft == 0 { // check that signature wasn't yet added (consider receiving the same payload multiple times)
|
||||
if len(w.InvocationScript) == 0 || // check that signature for this witness was provided
|
||||
(r.witnessInfo[i].nSigsLeft == 0 && r.witnessInfo[i].typ != Contract) { // check that signature wasn't yet added (consider receiving the same payload multiple times)
|
||||
continue
|
||||
}
|
||||
switch r.witnessInfo[i].typ {
|
||||
case Contract:
|
||||
// Need to check even if r.main.Scripts[i].InvocationScript is already filled in.
|
||||
err := n.Config.Chain.VerifyWitness(r.main.Signers[i].Account, r.main, &w, n.Config.Chain.GetPolicer().GetMaxVerificationGAS())
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
r.main.Scripts[i].InvocationScript = w.InvocationScript
|
||||
case Signature:
|
||||
if r.witnessInfo[i].pubs[0].Verify(w.InvocationScript[2:], mainHash) {
|
||||
r.main.Scripts[i] = w
|
||||
|
|
Loading…
Reference in a new issue