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); }
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); }
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); } } }
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)); }
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); }
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)); } }
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); }
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); } }
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)); }
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); }
/// <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)); }