internal static VerificationResult VerifySignature(this ISignable signable) { UInt160[] hashes; try { hashes = signable.GetScriptHashesForVerifying(); } catch (InvalidOperationException) { return VerificationResult.LackOfInformation; } byte[][] scripts = signable.Scripts; if (hashes.Length != scripts.Length) return VerificationResult.InvalidSignature; for (int i = 0; i < hashes.Length; i++) { using (ScriptBuilder sb = new ScriptBuilder()) { byte[] script = sb.Add(scripts[i]).Add(ScriptOp.OP_DUP).Add(ScriptOp.OP_HASH160).Push(hashes[i]).Add(ScriptOp.OP_EQUALVERIFY).Add(ScriptOp.OP_EVAL).ToArray(); if (!ScriptEngine.Execute(script, signable.GetHashForSigning())) return VerificationResult.InvalidSignature; } } return VerificationResult.OK; }
public static byte[] CreateSignatureRedeemScript(ECPoint publicKey) { using (ScriptBuilder sb = new ScriptBuilder()) { sb.Push(publicKey.EncodePoint(true)); sb.Add(ScriptOp.OP_CHECKSIG); return sb.ToArray(); } }
public static byte[] CreateMultiSigRedeemScript(int m, params ECPoint[] publicKeys) { if (!(1 <= m && m <= publicKeys.Length && publicKeys.Length <= 1024)) throw new ArgumentException(); using (ScriptBuilder sb = new ScriptBuilder()) { sb.Push(m); for (int i = 0; i < publicKeys.Length; i++) { sb.Push(publicKeys[i].EncodePoint(true)); } sb.Push(publicKeys.Length); sb.Add(ScriptOp.OP_CHECKMULTISIG); return sb.ToArray(); } }
public Script[] GetScripts() { if (!Completed) throw new InvalidOperationException(); Script[] scripts = new Script[signatures.Length]; for (int i = 0; i < scripts.Length; i++) { using (ScriptBuilder sb = new ScriptBuilder()) { foreach (byte[] signature in signatures[i].OrderBy(p => p.Key).Select(p => p.Value)) { sb.Push(signature); } scripts[i] = new Script { StackScript = sb.ToArray(), RedeemScript = redeemScripts[i] }; } } return scripts; }
public Script GetScript() { if (!Completed) throw new InvalidOperationException(); using (ScriptBuilder sb = new ScriptBuilder()) { for (int i = 0; i < signatures.Length; i++) { if (signatures[i] != null) { sb.Push(signatures[i]); } } return new Script { StackScript = sb.ToArray(), RedeemScript = redeemScript }; } }