From bf3415e2bc7c240bf42ef104a55679528b4e22db Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Wed, 27 Apr 2022 22:57:10 +0300 Subject: [PATCH] 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. --- pkg/crypto/keys/publickey.go | 4 +--- pkg/vm/emit/emit.go | 8 ++++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/pkg/crypto/keys/publickey.go b/pkg/crypto/keys/publickey.go index 56c3f4a48..b1e3748c2 100644 --- a/pkg/crypto/keys/publickey.go +++ b/pkg/crypto/keys/publickey.go @@ -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() } diff --git a/pkg/vm/emit/emit.go b/pkg/vm/emit/emit.go index bff6807fd..1a8450f3f 100644 --- a/pkg/vm/emit/emit.go +++ b/pkg/vm/emit/emit.go @@ -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 }