emit: introduce CheckSig function

Which allows to create verification scripts without keys.PublicKey which is
convenient in some cases where we already have serialized key and don't want
to waste time decompressing it.
This commit is contained in:
Roman Khimov 2022-04-27 22:57:10 +03:00
parent 8983d25f7f
commit bf3415e2bc
2 changed files with 9 additions and 3 deletions

View file

@ -12,7 +12,6 @@ import (
"github.com/btcsuite/btcd/btcec"
lru "github.com/hashicorp/golang-lru"
"github.com/nspcc-dev/neo-go/pkg/core/interop/interopnames"
"github.com/nspcc-dev/neo-go/pkg/crypto/hash"
"github.com/nspcc-dev/neo-go/pkg/encoding/address"
"github.com/nspcc-dev/neo-go/pkg/io"
@ -319,8 +318,7 @@ func (p *PublicKey) GetVerificationScript() []byte {
buf.WriteB(0xAC) // CHECKSIG
return buf.Bytes()
}
emit.Bytes(buf.BinWriter, b)
emit.Syscall(buf.BinWriter, interopnames.SystemCryptoCheckSig)
emit.CheckSig(buf.BinWriter, b)
return buf.Bytes()
}

View file

@ -219,6 +219,14 @@ func AppCall(w *io.BinWriter, scriptHash util.Uint160, operation string, f callf
AppCallNoArgs(w, scriptHash, operation, f)
}
// CheckSig emits a single-key verification script using given []bytes as a key.
// It does not check for key correctness, so you can get an invalid script if the
// data passed is not really a public key.
func CheckSig(w *io.BinWriter, key []byte) {
Bytes(w, key)
Syscall(w, interopnames.SystemCryptoCheckSig)
}
func isInstructionJmp(op opcode.Opcode) bool {
return opcode.JMP <= op && op <= opcode.CALLL || op == opcode.ENDTRYL
}