Exemple #1
0
        private void VectorToNode(VectorBlocks Vector, string Server, string MachineName)
        {
            VectorBlocks ReturnVector;

            do
            {
                ReturnVector = null;
                string ReturnObjectName = null;
                string ReturnXmlObject  = null;
                string ReturnFromUser   = null;
                object Obj             = null;
                var    XmlObjectVector = SendObjectSync((object)Vector, Server, null, MachineName);
                if (!string.IsNullOrEmpty(XmlObjectVector))
                {
                    object ReturmObj;
                    Converter.XmlToObject(XmlObjectVector, typeof(ObjectVector), out ReturmObj);
                    ObjectVector ObjVector = (ObjectVector)ReturmObj;
                    ReturnObjectName = ObjVector.ObjectName;
                    ReturnXmlObject  = ObjVector.XmlObject;
                    ReturnFromUser   = ObjVector.FromUser;
                    if (ReturnObjectName == "VectorBlocks")
                    {
                        Converter.XmlToObject(ReturnXmlObject, typeof(VectorBlocks), out Obj);
                        ReturnVector = (VectorBlocks)Obj;
                        if (ReturnVector.Blockchain == null)
                        {
                            ReturnVector.Blockchain = Vector.Blockchain;
                        }
                        if (ReturnVector.RequestSendBlocksFromPosition != -1)
                        {
                            var          BlocksToSend = GetBlocks(ReturnVector.RequestSendBlocksFromPosition, out ReadBlocksResult ReadBlocksResult);
                            VectorBlocks VectorToSend = new VectorBlocks()
                            {
                                Blockchain = this, Blocks = BlocksToSend, Position = ReturnVector.RequestSendBlocksFromPosition, ReadBlocksResult = ReadBlocksResult
                            };
                            VectorToNode(VectorToSend, Server, MachineName);
                        }
                        else
                        {
                            Vector = new VectorBlocks(); //Used to repeat the operation in case of partial reception of blocks
                            UpdateLocalBlockchain(ReturnVector, Vector);
                        }
                    }
                    else
                    {
                        ReturnObjectName = "String";
                        Converter.XmlToObject(ReturnXmlObject, typeof(string), out Obj);
                        string ErrorMessage = System.Convert.ToString(Obj);
                        Log("BlockchainError", 1000, ErrorMessage);
                    }
                }
            } while (ReturnVector != null && ReturnVector.ReadBlocksResult == ReadBlocksResult.Partial);
        }
Exemple #2
0
        public void SyncBlocksToNetwork(List <Block> Blocks, long Position)
        {
            VectorBlocks Vector = new VectorBlocks()
            {
                Blockchain = this, Blocks = Blocks, Position = Position
            };

            foreach (var Node in Setup.Network.NodeList)
            {
                if (Node.MachineName != Setup.Network.MachineName)
                {
                    VectorToNode(Vector, Node.Server, Node.MachineName);
                }
            }
        }
Exemple #3
0
 /// <summary>
 /// Synchronize the local blockchain, with the nodes remotely
 /// </summary>
 public void RequestAnyNewBlocks()
 {
     foreach (var Node in Setup.Network.NodeList)
     {
         if (Node.MachineName != Setup.Network.MasterServerMachineName)
         {
             long         CurrentLength = this.Length();
             VectorBlocks Vector        = new VectorBlocks()
             {
                 Blockchain = this, RequestSendBlocksFromPosition = CurrentLength
             };
             VectorToNode(Vector, Node.Server, Node.MachineName);
         }
     }
 }
Exemple #4
0
        private void VectorToNode(VectorBlocks Vector, string Server, string MachineName)
        {
            string ReturnObjectName = null;
            string ReturnXmlObject  = null;
            string ReturnFromUser   = null;
            object Obj             = null;
            var    XmlObjectVector = SendObjectSync((object)Vector, Server, null, MachineName);

            if (!string.IsNullOrEmpty(XmlObjectVector))
            {
                object ReturmObj;
                Converter.XmlToObject(XmlObjectVector, typeof(ObjectVector), out ReturmObj);
                ObjectVector ObjVector = (ObjectVector)ReturmObj;
                ReturnObjectName = ObjVector.ObjectName;
                ReturnXmlObject  = ObjVector.XmlObject;
                ReturnFromUser   = ObjVector.FromUser;
                if (ReturnObjectName == "VectorBlocks")
                {
                    Converter.XmlToObject(ReturnXmlObject, typeof(VectorBlocks), out Obj);
                    VectorBlocks ReturnVector = (VectorBlocks)Obj;
                    if (ReturnVector.Blockchain == null)
                    {
                        ReturnVector.Blockchain = Vector.Blockchain;
                    }
                    if (ReturnVector.RequestSendBlocksFromPosition != -1)
                    {
                        var          BlocksToSend = GetBlocks(ReturnVector.RequestSendBlocksFromPosition);
                        VectorBlocks VectorToSend = new VectorBlocks()
                        {
                            Blockchain = this, Blocks = BlocksToSend, Position = ReturnVector.RequestSendBlocksFromPosition
                        };
                        VectorToNode(VectorToSend, Server, MachineName);
                    }
                    else
                    {
                        UpdateLocalBlockchain(ReturnVector);
                    }
                }
                else
                {
                    ReturnObjectName = "String";
                    Converter.XmlToObject(ReturnXmlObject, typeof(string), out Obj);
                    string ErrorMessage = System.Convert.ToString(Obj);
                    Log("BlockchainError", 1000, ErrorMessage);
                }
            }
        }
Exemple #5
0
 /// <summary>
 /// Synchronize the local blockchain, with the nodes remotely
 /// </summary>
 public void RequestAnyNewBlocks()
 {
     NodeExecute((Node Node) =>
     {
         try
         {
             long CurrentLength  = this.Length();
             VectorBlocks Vector = new VectorBlocks()
             {
                 Blockchain = this, RequestSendBlocksFromPosition = CurrentLength
             };
             VectorToNode(Vector, Node.Address, Node.MachineName);
             return(true);
         }
         catch (Exception)
         {
             return(false);
         }
     });
 }
Exemple #6
0
 /// <summary>
 /// Synchronize the blocks written locally and transmit it to the nodes of the network
 /// </summary>
 /// <param name="Blocks">The blocks</param>
 /// <param name="Position">Base 0 position</param>
 public void SyncBlocksToNetwork(List <Block> Blocks, long Position)
 {
     NodeExecute((Node Node) =>
     {
         try
         {
             VectorBlocks Vector = new VectorBlocks()
             {
                 Blockchain = this, Blocks = Blocks, Position = Position
             };
             if (Node.MachineName != Setup.Network.MachineName)
             {
                 VectorToNode(Vector, Node.Address, Node.MachineName);
             }
             return(true);
         }
         catch (Exception)
         {
             return(false);
         }
     });
 }
Exemple #7
0
        /// <summary>
        /// Add to the local blockchain the blocks received from the server
        /// This function is normally called by the Page.Load event when a Vector is received remotely
        /// </summary>
        /// <param name="Vector">Parameter that is used to send blocks or to request blocks</param>
        /// <param name="SetReturnVector">This parameter returns a vector containing possible blocks to be synchronized on the local blockchain</param>
        /// <returns></returns>
        public static bool UpdateLocalBlockchain(VectorBlocks Vector, VectorBlocks SetReturnVector = null)
        {
            Blockchain Blockchain    = Vector.Blockchain;
            long       CurrentLength = Blockchain.Length();

            if (CurrentLength == 0)
            {
                Blockchain.Save();
            }

            if (Vector.RequestSendBlocksFromPosition != -1 && SetReturnVector != null)
            {
                if (CurrentLength > Vector.RequestSendBlocksFromPosition)
                {
                    SetReturnVector.Blockchain = Blockchain;
                    SetReturnVector.Blocks     = Blockchain.GetBlocks(Vector.RequestSendBlocksFromPosition);
                    SetReturnVector.Position   = Vector.RequestSendBlocksFromPosition;
                }
                else if (CurrentLength < Vector.RequestSendBlocksFromPosition)
                {
                    SetReturnVector.Blockchain = Blockchain;
                    SetReturnVector.RequestSendBlocksFromPosition = CurrentLength;
                    //qui non mi ricordo cosa stavo facendo, probabilmente devo continuare da qui
                    //VectorToNode()
                }
            }
            else if (Vector.Position != -1)
            {
                if (CurrentLength > Vector.Position)
                {
                    if (SetReturnVector != null)
                    {
                        SetReturnVector.Blockchain = Blockchain;
                        SetReturnVector.Blocks     = Blockchain.GetBlocks(Vector.Position);
                        SetReturnVector.Position   = Vector.Position;
                    }
                    else
                    {
                        Blockchain.Truncate(Vector.Position);
                        CurrentLength = Vector.Position;
                    }
                }

                if (CurrentLength == Vector.Position)
                {
                    foreach (String Record in Vector.Records)
                    {
                        if (!Blockchain.AddRecord(Record))
                        {
                            // Error in blockchain
                            return(false);
                        }
                    }
                }
                else if (CurrentLength < Vector.Position)
                {
                    // Send a request of th missed blocks
                    if (SetReturnVector != null)
                    {
                        SetReturnVector.Blockchain = Blockchain;
                        SetReturnVector.RequestSendBlocksFromPosition = CurrentLength;
                    }
                }
            }
            return(true);
        }