Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 19 additions & 0 deletions docs/TUTORIAL.md
Original file line number Diff line number Diff line change
Expand Up @@ -848,6 +848,25 @@ Verify a signature against a public key:
require(checkSig(s, pk));
```

**`CheckSigFromStack(datasig signature, byte[32] digest, pubkey publicKey): bool`**

Verify a 64-byte Schnorr signature against a 32-byte digest supplied by the
contract. Hash the message explicitly with the hash function required by your
protocol:

```javascript
require(CheckSigFromStack(oracleSig, sha256(oracleMessage), oraclePk));
```

**`CheckSigFromStackECDSA(datasig signature, byte[32] digest, byte[33] publicKey): bool`**

Verify a compact 64-byte ECDSA signature against a 32-byte digest and compressed
33-byte ECDSA public key:

```javascript
require(CheckSigFromStackECDSA(oracleSig, sha256(oracleMessage), oraclePk));
```

### Type Conversion Functions

**`byte[](value): bytes`**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@
(function_call
(identifier) @function.builtin
(#match? @function.builtin
"^(readInputState|readInputStateWithTemplate|validateOutputState|validateOutputStateWithTemplate|verifyOutputState|verifyOutputStates|OpSha256|sha256|OpTxSubnetId|OpTxGas|OpTxPayloadLen|OpTxPayloadSubstr|OpOutpointTxId|OpOutpointIndex|OpTxInputScriptSigLen|OpTxInputScriptSigSubstr|OpTxInputSeq|OpTxInputIsCoinbase|OpTxInputSpkLen|OpTxInputSpkSubstr|OpTxOutputSpkLen|OpTxOutputSpkSubstr|OpAuthOutputCount|OpAuthOutputIdx|OpInputCovenantId|OpOutputCovenantId|OpCovInputCount|OpCovInputIdx|OpCovOutputCount|OpCovOutputIdx|OpNum2Bin|OpBin2Num|OpChainblockSeqCommit|checkDataSig|checkSig|checkMultiSig|blake2b)$"))
"^(readInputState|readInputStateWithTemplate|validateOutputState|validateOutputStateWithTemplate|verifyOutputState|verifyOutputStates|OpSha256|sha256|OpTxSubnetId|OpTxGas|OpTxPayloadLen|OpTxPayloadSubstr|OpOutpointTxId|OpOutpointIndex|OpTxInputScriptSigLen|OpTxInputScriptSigSubstr|OpTxInputSeq|OpTxInputIsCoinbase|OpTxInputSpkLen|OpTxInputSpkSubstr|OpTxOutputSpkLen|OpTxOutputSpkSubstr|OpAuthOutputCount|OpAuthOutputIdx|OpInputCovenantId|OpOutputCovenantId|OpCovInputCount|OpCovInputIdx|OpCovOutputCount|OpCovOutputIdx|OpNum2Bin|OpBin2Num|OpChainblockSeqCommit|CheckSigFromStack|CheckSigFromStackECDSA|checkSig|checkMultiSig|blake2b)$"))

(unary_suffix) @property

Expand Down
3 changes: 1 addition & 2 deletions extensions/vscode/queries/highlights.scm
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@
(function_call
(identifier) @function.builtin
(#match? @function.builtin
"^(readInputState|readInputStateWithTemplate|validateOutputState|validateOutputStateWithTemplate|verifyOutputState|verifyOutputStates|OpSha256|sha256|OpTxSubnetId|OpTxGas|OpTxPayloadLen|OpTxPayloadSubstr|OpOutpointTxId|OpOutpointIndex|OpTxInputScriptSigLen|OpTxInputScriptSigSubstr|OpTxInputSeq|OpTxInputIsCoinbase|OpTxInputSpkLen|OpTxInputSpkSubstr|OpTxOutputSpkLen|OpTxOutputSpkSubstr|OpAuthOutputCount|OpAuthOutputIdx|OpInputCovenantId|OpOutputCovenantId|OpCovInputCount|OpCovInputIdx|OpCovOutputCount|OpCovOutputIdx|OpNum2Bin|OpBin2Num|OpChainblockSeqCommit|checkDataSig|checkSig|checkMultiSig|blake2b)$"))
"^(readInputState|readInputStateWithTemplate|validateOutputState|validateOutputStateWithTemplate|verifyOutputState|verifyOutputStates|OpSha256|sha256|OpTxSubnetId|OpTxGas|OpTxPayloadLen|OpTxPayloadSubstr|OpOutpointTxId|OpOutpointIndex|OpTxInputScriptSigLen|OpTxInputScriptSigSubstr|OpTxInputSeq|OpTxInputIsCoinbase|OpTxInputSpkLen|OpTxInputSpkSubstr|OpTxOutputSpkLen|OpTxOutputSpkSubstr|OpAuthOutputCount|OpAuthOutputIdx|OpInputCovenantId|OpOutputCovenantId|OpCovInputCount|OpCovInputIdx|OpCovOutputCount|OpCovOutputIdx|OpNum2Bin|OpBin2Num|OpChainblockSeqCommit|CheckSigFromStack|CheckSigFromStackECDSA|checkSig|checkMultiSig|blake2b)$"))

(unary_suffix) @property

Expand Down Expand Up @@ -100,7 +100,6 @@
"new"
"require"
"return"
"yield"
"console.log"
] @keyword

Expand Down
2 changes: 1 addition & 1 deletion extensions/zed/languages/silverscript/highlights.scm
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@
(function_call
(identifier) @function.builtin
(#match? @function.builtin
"^(readInputState|readInputStateWithTemplate|validateOutputState|validateOutputStateWithTemplate|verifyOutputState|verifyOutputStates|OpSha256|sha256|OpTxSubnetId|OpTxGas|OpTxPayloadLen|OpTxPayloadSubstr|OpOutpointTxId|OpOutpointIndex|OpTxInputScriptSigLen|OpTxInputScriptSigSubstr|OpTxInputSeq|OpTxInputIsCoinbase|OpTxInputSpkLen|OpTxInputSpkSubstr|OpTxOutputSpkLen|OpTxOutputSpkSubstr|OpAuthOutputCount|OpAuthOutputIdx|OpInputCovenantId|OpOutputCovenantId|OpCovInputCount|OpCovInputIdx|OpCovOutputCount|OpCovOutputIdx|OpNum2Bin|OpBin2Num|OpChainblockSeqCommit|checkDataSig|checkSig|checkMultiSig|blake2b)$"))
"^(readInputState|readInputStateWithTemplate|validateOutputState|validateOutputStateWithTemplate|verifyOutputState|verifyOutputStates|OpSha256|sha256|OpTxSubnetId|OpTxGas|OpTxPayloadLen|OpTxPayloadSubstr|OpOutpointTxId|OpOutpointIndex|OpTxInputScriptSigLen|OpTxInputScriptSigSubstr|OpTxInputSeq|OpTxInputIsCoinbase|OpTxInputSpkLen|OpTxInputSpkSubstr|OpTxOutputSpkLen|OpTxOutputSpkSubstr|OpAuthOutputCount|OpAuthOutputIdx|OpInputCovenantId|OpOutputCovenantId|OpCovInputCount|OpCovInputIdx|OpCovOutputCount|OpCovOutputIdx|OpNum2Bin|OpBin2Num|OpChainblockSeqCommit|CheckSigFromStack|CheckSigFromStackECDSA|checkSig|checkMultiSig|blake2b)$"))

(unary_suffix) @property

Expand Down
1 change: 1 addition & 0 deletions silverscript-lang/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,4 @@ semver = "1.0"

[dev-dependencies]
kaspa-addresses.workspace = true
sha2 = "0.10"
27 changes: 17 additions & 10 deletions silverscript-lang/src/compiler/compile.rs
Original file line number Diff line number Diff line change
Expand Up @@ -469,6 +469,8 @@ fn infer_expr_type_ref_for_comparison<'i>(
| "ScriptPubKeyP2SHFromRedeemScript"
| "OpInputCovenantId"
| "OpOutputCovenantId"
| "CheckSigFromStack"
| "CheckSigFromStackECDSA"
| "OpTxGas"
| "OpTxPayloadLen"
| "OpTxInputIndex"
Expand Down Expand Up @@ -3589,7 +3591,8 @@ fn compile_call_expr<'i>(
}
"blake2b" => compile_blake2b_call(&mut ctx, args),
"checkSig" => compile_checksig_call(&mut ctx, args),
"checkDataSig" => compile_checkdatasig_call(&mut ctx, args),
"CheckSigFromStack" => compile_checksigfromstack_call(&mut ctx, name, args, OpCheckSigFromStack),
"CheckSigFromStackECDSA" => compile_checksigfromstack_call(&mut ctx, name, args, OpCheckSigFromStackECDSA),
_ => compile_unknown_function_call(name),
}
}
Expand Down Expand Up @@ -3800,16 +3803,20 @@ fn compile_checksig_call<'i>(ctx: &mut CompileCallContext<'_, 'i>, args: &[Expr<
Ok(())
}

fn compile_checkdatasig_call<'i>(ctx: &mut CompileCallContext<'_, 'i>, args: &[Expr<'i>]) -> Result<(), CompilerError> {
for arg in args {
compile_call_arg_with_context(ctx, arg)?;
}
for _ in 0..args.len() {
ctx.builder.add_op(OpDrop)?;
*ctx.stack_depth -= 1;
fn compile_checksigfromstack_call<'i>(
ctx: &mut CompileCallContext<'_, 'i>,
name: &str,
args: &[Expr<'i>],
opcode: u8,
) -> Result<(), CompilerError> {
if args.len() != 3 {
return Err(CompilerError::Unsupported(format!("{name}() expects 3 arguments (signature, digest, publicKey)")));
}
ctx.builder.add_op(OpTrue)?;
*ctx.stack_depth += 1;
compile_call_arg_with_context(ctx, &args[0])?;
compile_call_arg_with_context(ctx, &args[1])?;
compile_call_arg_with_context(ctx, &args[2])?;
ctx.builder.add_op(opcode)?;
*ctx.stack_depth -= 2;
Ok(())
}

Expand Down
2 changes: 1 addition & 1 deletion silverscript-lang/src/compiler/debug_value_types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ fn builtin_call_value_type(name: &str) -> &'static str {
| "OpCovInputIdx"
| "OpCovOutputCount"
| "OpCovOutputIdx" => "int",
"OpTxInputIsCoinbase" => "bool",
"OpTxInputIsCoinbase" | "checkSig" | "CheckSigFromStack" | "CheckSigFromStackECDSA" => "bool",
"blake2b" | "sha256" | "OpSha256" => "byte[32]",
"bytes"
| "OpTxSubnetId"
Expand Down
Loading