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