Exemple #1
0
        public void Scripts()
        {
            var tv2s = new List <TV2>();
            var json = JArray.Parse(File.ReadAllText(@"..\..\..\data\script_tests.json"));

            foreach (var r in json.Children <JToken>().Where(c => c.Count() >= 4))
            {
                if (r[0].Type == JTokenType.String)
                {
                    var sig   = r[0].Value <string>();
                    var pub   = r[1].Value <string>();
                    var flags = r[2].Value <string>();
                    var error = r[3].Value <string>();
                    tv2s.Add(new TV2(sig, pub, flags, error));
                }
            }

            var tv2sSorted = tv2s.OrderBy(tv => tv.opcodes.Length + (int)tv.opcodes.LastOrDefault() / 256.0).ToList();

            var opcodes = tv2sSorted.Select(tv => tv.keyopcode).Distinct().OrderBy(o => o).ToArray();

            var noOpcode = new List <TV2>();
            var byOpcode = new Dictionary <KzOpcode, List <TV2> >();

            foreach (var tv in tv2sSorted)
            {
                var o    = tv.keyopcode;
                var list = o.HasValue ? null : noOpcode;
                if (list == null && !byOpcode.TryGetValue(o.Value, out list))
                {
                    list = new List <TV2>();
                    byOpcode.Add(o.Value, list);
                }
                list.Add(tv);
            }

            var i = 0;

            foreach (var opcode in opcodes)
            {
                var list = opcode.HasValue ? byOpcode[opcode.Value] : noOpcode;
                foreach (var tv in list)
                {
                    i++;
                    var tv2 = new TV2(tv.sig, tv.pub, tv.flags, tv.error);
                    Console.WriteLine($"{opcode} {i}");
                    Console.WriteLine($"Sig: {tv.scriptSig.ToHexString()} => {tv.scriptSig}");
                    Console.WriteLine($"Pub: {tv.scriptPub.ToHexString()} => {tv.scriptPub}");
                    var ok = KzScriptInterpreter.VerifyScript(tv.scriptSig, tv.scriptPub, tv.scriptFlags, null, out KzScriptError error);

                    var correct = (ok && tv.scriptError == KzScriptError.OK) || tv.scriptError == error;

                    // All test cases do not pass yet. This condition is here to make sure things don't get worse :-)
                    if (i < 900)
                    {
                        Assert.True(correct);
                    }
                }
            }
        }
Exemple #2
0
        void SigHash(List <TestVector> tvs)
        {
            var i = 0;

            foreach (var tv in tvs)
            {
                i++;
                var tx = KzTransaction.ParseHex(tv.rawTx);
                var(scriptCodeOk, scriptCode) = KzScript.ParseHex(tv.rawScript, withoutLength: true);
                Assert.True(tx != null && scriptCodeOk);

                var shreg = KzScriptInterpreter.ComputeSignatureHash(scriptCode, tx, tv.nIn, tv.sigHashType, KzAmount.Zero).ToString();
                Assert.Equal(tv.sigHashRegHex, shreg);

                var shold = KzScriptInterpreter.ComputeSignatureHash(scriptCode, tx, tv.nIn, tv.sigHashType, KzAmount.Zero, 0).ToString();
                Assert.Equal(tv.sigHashOldHex, shold);
            }
        }
Exemple #3
0
            public TV2(params string[] args)
            {
                sig   = args[0];
                pub   = args[1];
                flags = args[2];
                error = args[3];

                scriptSig   = KzScript.ParseTestScript(sig);
                scriptPub   = KzScript.ParseTestScript(pub);
                scriptFlags = KzScriptInterpreter.ParseFlags(flags);
                scriptError = ToScriptError(error);

                opcodes = scriptSig.Decode().Select(o => o.Code)
                          .Concat(scriptPub.Decode().Select(o => o.Code))
                          .Distinct()
                          .OrderBy(o => o).ToArray();

                keyopcode = opcodes.Length == 0 ? (KzOpcode?)null : opcodes.Last();
            }