コード例 #1
0
        public void TestSmartcontract()
        {
            Smartcontract smart = CreateSmartcontract("name", Utils.GenerateRandomString(81));

            Transaction trans        = new Transaction("0x14D57d59E7f2078A2b8dD334040C10468D2b5ddF", -1, Utils.GenerateRandomString(81)); //secure 1
            var         receiverAddr = "0xFe84b71404D9217522a619658E829CaABa397A20";

            trans.AddFee(0)
            .AddData("PayIn")
            .AddData("Str_" + receiverAddr)     //secure 2
            .AddOutput(100, "you")
            .Final(_settings);

            Computer comp = new Computer(smart);

            var maybe = comp.Run(trans);

            maybe.HasValue.Should().BeTrue();
            var result = maybe.Value;

            result.OutputValue[0].Should().Be(1);
            result.OutputReceiver[0].Should().Be(receiverAddr);

            var varList = comp.GetCompleteState();

            varList.GetFromRegister("Counter").GetValueAs <int>().Should().Be(1);
        }
コード例 #2
0
        private (Computer comp, Maybe <Transaction> result) RunHelper(string label, List <Expression> expList, Dictionary <string, ISCType> varList = null)
        {
            Smartcontract smart = new Smartcontract("cool name", Utils.GenerateRandomString(81));

            smart.AddExpression(new Expression(05, "Main"));

            expList.ForEach(x => smart.AddExpression(x));

            if (varList != null)
            {
                smart.Code.Variables = varList;
            }

            smart.Final(_settings);

            Transaction trans = new Transaction("me", 2, Utils.GenerateRandomString(81));

            trans.AddFee(0)
            .AddData(label)
            .Final(_settings);

            Computer comp   = new Computer(smart);
            var      result = comp.Run(trans);

            return(comp, result);
        }
コード例 #3
0
        private void AddSmartcontract(Smartcontract smart, long height)
        {
            string insertPool = "INSERT INTO Smartcontracts (Name, Hash, Code, _FROM, Signature, Fee, SendTo, ReceivingAddress, BlockID) " +
                                $"SELECT'{smart.Name}', '{smart.Hash}', '{smart.Code}', '{smart.From}','{smart.Signature}',{smart.TransactionFee},'{smart.SendTo}','{smart.ReceivingAddress}'," +
                                $" {IsNull(height)}" +
                                $" WHERE NOT EXISTS (SELECT 1 FROM Smartcontracts WHERE ReceivingAddress='{smart.ReceivingAddress}'); SELECT last_insert_rowid();";

            string sql = $"UPDATE Smartcontracts SET ID={height} WHERE ReceivingAddress='{smart.ReceivingAddress}';";

            int numOfAffected = NoQuerySQL(sql);

            //means we didnt had a smartcontract before
            if (numOfAffected == 0)
            {
                long smartID = -1;

                using (SQLiteDataReader reader = QuerySQL(insertPool))
                {
                    reader.Read();
                    smartID = (long)reader[0];
                }

                var state = smart.Code.Variables;

                foreach (var key in state.Keys)
                {
                    string updateVars = $"INSERT INTO Variables (Name,Value,SmartID) VALUES ('{key}','{state[key].GetValueAs<string>()}',{smartID});";
                    NoQuerySQL(updateVars);
                }
            }
        }
コード例 #4
0
        public static Computer CreateComputer(List <Expression> expList, Dictionary <string, ISCType> varDict = null, IXISettings settings = null)
        {
            var smart = new Smartcontract("Foo", Utils.GenerateRandomString(81))
                        .AddExpression(expList)
                        .AddVariable(varDict)
                        .SetFee(0);

            if (settings != null)
            {
                smart.Final(settings);
            }

            return(new Computer(smart));
        }
コード例 #5
0
        private static Smartcontract CreateSmartcontract()
        {
            var smart = new Smartcontract("me", "sendto");

            smart.AddExpression(new Expression(00, "asd", "asd", "asd"))
            .AddExpression(new Expression(00, "bbb", "bbb", "bbb"))
            .AddExpression(new Expression(00, "ccc", "ccc"))
            .AddExpression(new Expression(00, "ccc"))
            .AddExpression(new Expression(00))
            .AddVariable("lol", new SC_Int(1110))
            .AddVariable("lol2", new SC_String("lol3333"))
            .AddVariable("lol3", new SC_String("lol3"))
            .AddVariable("lol4", new SC_Int("2323222"))
            .Final(_settings);

            return(smart);
        }
コード例 #6
0
        private Maybe <Smartcontract> GetSmartcontract(string receivingAddr)
        {
            string sql = $"SELECT * FROM Smartcontracts WHERE ReceivingAddress='{receivingAddr}';";

            using (SQLiteDataReader reader = QuerySQL(sql))
            {
                if (!reader.Read())
                {
                    return(Maybe <Smartcontract> .None);
                }

                Smartcontract smart = reader.ToSmartcontract();

                //we also need to add the variables:
                //using(SQLiteDataReader reader = QuerySQL($"SELECT * FROM Variables WHERE "))
                smart.Code.Variables = GetVariablesFromDB((long)reader[0]);
                return(Maybe <Smartcontract> .Some(smart));
            }
        }
コード例 #7
0
        private Smartcontract CreateSimpleSmartcontract()
        {
            Smartcontract smart = new Smartcontract("Cool", "You");

            smart.SetFee(3)
            .AddVariable("Test", new SC_Int(0))
            .AddExpression(05, "Main")
            .AddExpression(new Expression(01, "Str_Hallo", "Test"))
            .AddExpression(new Expression(00, "Test", "Test1"))
            .AddExpression(new Expression(01, "Int_3", "R_1"))
            .AddExpression(new Expression(01, "Int_3", "R_2"))
            .AddExpression(new Expression(04, "R_1", "R_2", "R_3"))
            //we add now metadata
            .AddExpression(new Expression(11, "Int_0", "R_8"))
            .AddExpression(new Expression(11, "Int_1", "R_7"))
            .AddExpression(new Expression(11, "Int_2", "R_6"))
            .AddExpression(new Expression(11, "Int_3", "R_5"))
            .Final(_settings);

            return(smart);
        }
コード例 #8
0
        private void UpdateSmartcontract(Smartcontract smart)
        {
            //get smart id first
            var maybeID = GetSmartcontractID(smart.ReceivingAddress);

            if (!maybeID.HasValue)
            {
                throw new ArgumentException("Smartcontract with the given receiving address doesnt exist");
            }

            var id = maybeID.Value;

            //update the states:
            var state = smart.Code.Variables;

            foreach (var key in state.Keys)
            {
                string updateVars =
                    $"UPDATE Variables SET Value='{state[key].GetValueAs<string>()}' WHERE  ID={id} AND Name='{key}';";
                NoQuerySQL(updateVars);
            }
        }
コード例 #9
0
        public Smartcontract GenerateSmartcontract(string sendTo, IXISettings settings)
        {
            //we first take the code and lex it
            var lexedCode = Lexing(_code);

            var name = lexedCode.Line.Split(' ')[0];

            var smart = new Smartcontract(name, sendTo);

            var list = new List <string>();

            SearchForNode(list, lexedCode);

            list.SelectMany(x => {
                var helper = new ExpressionHelper(x);

                if (helper.Contains("["))
                {
                    var arrayList = new List <string>();
                    for (int i = 0; i < int.Parse(helper[helper.Length - 2]); i++)
                    {
                        arrayList.Add(helper[1] + "_" + i);
                    }

                    return(arrayList);
                }
                else
                {
                    return(new List <string>()
                    {
                        helper[1]
                    });
                }
            }).ToList().ForEach(x => smart.AddVariable(x, new SC_Int()));

            return(smart.AddExpression(Parse(lexedCode).Compile()).Final(settings));
        }
コード例 #10
0
        public void Scenario(IXICore ixiCore)
        {
            //we need to create chainsettings first!
            ChainSettings cSett = new ChainSettings(1000, 0, 0, 2, 30, 1000, 5);

            //create genesis transaction
            Transaction genTrans = new Transaction("ME", -1, Utils.GetTransactionPoolAddress(0, _coinName));

            genTrans.SetGenesisInformation(cSett)
            .Final(_settings)
            .Upload();

            //create genesis block
            Block genBlock = new Block(0, Utils.GenerateRandomString(81), _coinName);

            genBlock.Add(genTrans)
            .Final(_settings)
            .GenerateProofOfWork(ixiCore)
            .Upload();

            var result0 = ixiCore.DownloadChain(genBlock.SendTo, genBlock.Hash);

            result0.Should().NotBeNull();
            result0.Should().Be(genBlock);

            Console.WriteLine("=============================================================\n\n");
            //now creating block height 1

            //get pool addr
            string poolAddr = Utils.GetTransactionPoolAddress(1, _coinName, cSett.TransactionPoolInterval);

            //upload simple transaction on 1. block
            Transaction simpleTrans = new Transaction(_settings.PublicKey, 1, poolAddr);

            simpleTrans.AddFee(0)
            .Final(_settings)
            .Upload();

            //add smartcontract
            Smartcontract smart = CreateSmartcontract("cool contract", poolAddr)
                                  .Final(_settings)
                                  .Upload();

            Block block1 = new Block(genBlock.Height + 1, genBlock.NextAddress, _coinName);

            block1.Add(simpleTrans)
            .Add(smart)
            .Final(_settings)
            .GenerateProofOfWork(ixiCore)
            .Upload();

            var result1 = ixiCore.DownloadChain(block1.SendTo, block1.Hash);

            result1.Should().NotBeNull();
            result1.Should().Be(block1);

            Console.WriteLine("=============================================================\n\n");

            //now creating second block to trigger stuff!
            Transaction triggerTrans = new Transaction(_settings.PublicKey, 2, poolAddr);

            triggerTrans.AddFee(0)
            .AddOutput(100, smart.ReceivingAddress)
            .AddData("PayIn")
            .AddData("Str_0x14D57d59E7f2078A2b8dD334040C10468D2b5ddF")
            .Final(_settings)
            .Upload();

            Block block2 = new Block(2, block1.NextAddress, _coinName);

            block2.Add(triggerTrans)
            .Final(_settings)
            .GenerateProofOfWork(ixiCore)
            .Upload();

            var result2 = ixiCore.DownloadChain(block2.SendTo, block2.Hash);

            result2.Should().NotBeNull();
            result2.Should().Be(block2);

            Console.WriteLine("=============================================================\n\n");

            //now we add another block and trigger smartcontract again!
            //first create transaction
            Transaction triggerTrans2 = new Transaction(_settings.PublicKey, 2, poolAddr);

            triggerTrans2.AddFee(0)
            .AddOutput(100, smart.ReceivingAddress)
            .AddData("PayIn")
            .AddData("Str_0x14D57d59E7f2078A2b8dD334040C10468D2b5ddF")
            .Final(_settings)
            .Upload();

            Block block3 = new Block(3, block2.NextAddress, _coinName);

            block3.Add(triggerTrans2)
            .Final(_settings)
            .GenerateProofOfWork(ixiCore)
            .Upload();

            var latest = ixiCore.DownloadChain(block3.SendTo, block3.Hash);

            latest.Should().NotBeNull();
            latest.Should().Be(block3);

            Console.WriteLine("=============================================================\n\n");

            var maybeSmartcontract = ixiCore.GetSmartcontract(smart.ReceivingAddress);

            Console.WriteLine("Coinname: " + _coinName);
            Console.WriteLine("GenesisAddress: " + genBlock.SendTo);
            Console.WriteLine("GenesisHash: " + genBlock.Hash);

            maybeSmartcontract.HasValue.Should().BeTrue();
            maybeSmartcontract.Value.Code.Variables.Values.Select(x => x.GetValueAs <string>()).Should().Contain("2");

            ixiCore.GetBalance(smart.ReceivingAddress).Should().Be(198);
            ixiCore.GetBalance("0x14D57d59E7f2078A2b8dD334040C10468D2b5ddF").Should().Be(2);
        }
コード例 #11
0
 /// <summary>
 /// Verifies the receiving address of a smartcontract
 /// </summary>
 /// <param name="smart"></param>
 /// <returns></returns>
 public static bool VerifyReceivingAddress(this Smartcontract smart)
 {
     return(smart.Hash.GetPublicKey().Equals(smart.ReceivingAddress));
 }