/// <summary> /// Send message once the bloom filter is set /// </summary> /// <param name="payload">Message to send</param> public void SendMessageAsync(Payload payload) { var node = AttachedNode; if(node == null) return; if(FilterState == SPV.FilterState.Loaded) node.SendMessageAsync(payload); else { _OnFilterLoaded.Add(() => node.SendMessageAsync(payload)); } }
public void ReadWrite(BitcoinStream stream) { if(Payload == null && stream.Serializing) throw new InvalidOperationException("Payload not affected"); if(stream.Serializing || (!stream.Serializing && !_SkipMagic)) stream.ReadWrite(ref magic); stream.ReadWrite(ref command); int length = 0; uint checksum = 0; bool hasChecksum = false; byte[] payloadBytes = stream.Serializing ? GetPayloadBytes(stream.ProtocolVersion, out length) : null; length = payloadBytes == null ? 0 : length; stream.ReadWrite(ref length); if(stream.ProtocolVersion >= ProtocolVersion.MEMPOOL_GD_VERSION) { if(stream.Serializing) checksum = Hashes.Hash256(payloadBytes, 0, length).GetLow32(); stream.ReadWrite(ref checksum); hasChecksum = true; } if(stream.Serializing) { stream.ReadWrite(ref payloadBytes, 0, length); } else { if(length > 0x02000000) //MAX_SIZE 0x02000000 Serialize.h { throw new FormatException("Message payload too big ( > 0x02000000 bytes)"); } payloadBytes = _Buffer == null || _Buffer.Length < length ? new byte[length] : _Buffer; stream.ReadWrite(ref payloadBytes, 0, length); if(hasChecksum) { if(!VerifyChecksum(checksum, payloadBytes, length)) { if(NodeServerTrace.Trace.Switch.ShouldTrace(TraceEventType.Verbose)) NodeServerTrace.Trace.TraceEvent(TraceEventType.Verbose, 0, "Invalid message checksum bytes"); throw new FormatException("Message checksum invalid"); } } BitcoinStream payloadStream = new BitcoinStream(payloadBytes); payloadStream.CopyParameters(stream); var payloadType = PayloadAttribute.GetCommandType(Command); var unknown = payloadType == typeof(UnknowPayload); if(unknown) NodeServerTrace.Trace.TraceEvent(TraceEventType.Warning, 0, "Unknown command received : " + Command); object payload = _PayloadObject; payloadStream.ReadWrite(payloadType, ref payload); if(unknown) ((UnknowPayload)payload)._Command = Command; Payload = (Payload)payload; } }
public void UpdatePayload(Payload payload, ProtocolVersion version) { if(payload == null) throw new ArgumentNullException("payload"); this._PayloadObject = payload; this.payload = payload.ToBytes(version); length = (uint)this.payload.Length; checksum = Hashes.Hash256(this.payload).GetLow32(); Command = payload.Command; }